diff --git a/docs-on-gh-pages/.buildinfo b/docs-on-gh-pages/.buildinfo new file mode 100644 index 000000000..a0c1125e8 --- /dev/null +++ b/docs-on-gh-pages/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 6a2e56249b5ebd343d2015b55a5f06c2 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs-on-gh-pages/.doctrees/ReleaseNotes.doctree b/docs-on-gh-pages/.doctrees/ReleaseNotes.doctree new file mode 100644 index 000000000..ca5fda33f Binary files /dev/null and b/docs-on-gh-pages/.doctrees/ReleaseNotes.doctree differ diff --git a/docs-on-gh-pages/.doctrees/advanced_topics.doctree b/docs-on-gh-pages/.doctrees/advanced_topics.doctree new file mode 100644 index 000000000..4fd3c7071 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/advanced_topics.doctree differ diff --git a/docs-on-gh-pages/.doctrees/contributing.doctree b/docs-on-gh-pages/.doctrees/contributing.doctree new file mode 100644 index 000000000..2942a6ca0 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/contributing.doctree differ diff --git a/docs-on-gh-pages/.doctrees/datamodel_syntax.doctree b/docs-on-gh-pages/.doctrees/datamodel_syntax.doctree new file mode 100644 index 000000000..c03acef36 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/datamodel_syntax.doctree differ diff --git a/docs-on-gh-pages/.doctrees/design.doctree b/docs-on-gh-pages/.doctrees/design.doctree new file mode 100644 index 000000000..f9e5ba7d0 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/design.doctree differ diff --git a/docs-on-gh-pages/.doctrees/doc.doctree b/docs-on-gh-pages/.doctrees/doc.doctree new file mode 100644 index 000000000..355a66674 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/doc.doctree differ diff --git a/docs-on-gh-pages/.doctrees/doc_title.doctree b/docs-on-gh-pages/.doctrees/doc_title.doctree new file mode 100644 index 000000000..5325ff792 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/doc_title.doctree differ diff --git a/docs-on-gh-pages/.doctrees/environment.pickle b/docs-on-gh-pages/.doctrees/environment.pickle new file mode 100644 index 000000000..9c7af7098 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/environment.pickle differ diff --git a/docs-on-gh-pages/.doctrees/examples.doctree b/docs-on-gh-pages/.doctrees/examples.doctree new file mode 100644 index 000000000..f79dd2cad Binary files /dev/null and b/docs-on-gh-pages/.doctrees/examples.doctree differ diff --git a/docs-on-gh-pages/.doctrees/frame.doctree b/docs-on-gh-pages/.doctrees/frame.doctree new file mode 100644 index 000000000..3f0d429f0 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/frame.doctree differ diff --git a/docs-on-gh-pages/.doctrees/index.doctree b/docs-on-gh-pages/.doctrees/index.doctree new file mode 100644 index 000000000..95db61f22 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/index.doctree differ diff --git a/docs-on-gh-pages/.doctrees/templates.doctree b/docs-on-gh-pages/.doctrees/templates.doctree new file mode 100644 index 000000000..4da459bf6 Binary files /dev/null and b/docs-on-gh-pages/.doctrees/templates.doctree differ diff --git a/docs-on-gh-pages/.doctrees/userdata.doctree b/docs-on-gh-pages/.doctrees/userdata.doctree new file mode 100644 index 000000000..d60880e2b Binary files /dev/null and b/docs-on-gh-pages/.doctrees/userdata.doctree differ diff --git a/docs-on-gh-pages/ReleaseNotes.html b/docs-on-gh-pages/ReleaseNotes.html new file mode 100644 index 000000000..21aa55bc5 --- /dev/null +++ b/docs-on-gh-pages/ReleaseNotes.html @@ -0,0 +1,3488 @@ + + + + + + + v00-17-04 — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

v00-17-04

+
    +
  • 2023-12-14 tmadlener (PR#527)

    +
      +
    • Split the ClassGenerator into a base class (mixin) and two specific c++ and julia code generators that only deal with their language specific needs.

      +
        +
      • Instantiate and configure the correct reader in the podio_class_generator.py main script depending on the desired language.

      • +
      +
    • +
    • Slightly cleanup the MemberVariable to declutter its __init__ method a bit.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#530)

    +
      +
    • Remove the reading of the deprecated old-style format of component definitions in the YAML files.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#485)

    +
      +
    • Remove the deprecated EventStore functionality as announced in #429

    • +
    +
  • +
  • 2023-12-12 tmadlener (PR#529)

    +
      +
    • Switch the relation range tests to use Frame based I/O.

    • +
    +
  • +
  • 2023-12-06 tmadlener (PR#526)

    +
      +
    • Switch the edm4hep workflows to an LCG stack with a recent enough version of CMake. Necessary after key4hep/EDM4hep#235

    • +
    +
  • +
  • 2023-12-05 jmcarcell (PR#523)

    +
      +
    • Remove comment with file name and line number. It’s very unlikely it remains up to date when either the name or the content of the files changes

    • +
    +
  • +
  • 2023-12-04 jmcarcell (PR#521)

    +
      +
    • Do not import ROOT when using podio-dump --help, otherwise it can take a while depending on the system only to print the help.

    • +
    +
  • +
  • 2023-12-04 tmadlener (PR#514)

    +
      +
    • Introduce the MaybeSharedPtr to manage the Obj* in the user facing handle classes.

      +
        +
      • This splits the control block and the managed object into two distinct entities with potentially different lifetimes, which allows to fix #174 and #492.

      • +
      • This increases the size of the user facing handle classes by a factor two, since they are now effectively two pointers instead of one, even if the control block will not be initialized in case a handle is obtained from a collection.

      • +
      +
    • +
    • Remove the ObjBase base class and make the ObjectID a member of the Obj classes.

    • +
    • Make the user facing handle class constructors from an Obj* private as users will not have access to raw Obj* in any case.

      +
        +
      • Introduce a static makeEmpty method for the generated classes in order to create an empty handle, which is also used internally to handle unpersisted relations.

      • +
      +
    • +
    • Enable more existing test cases in sanitizer workflows now that it has become possible to do so.

    • +
    +
  • +
  • 2023-12-04 Ananya Gupta (PR#473)

    +
      +
    • Added Julia code generation support in the existing Python interface.

    • +
    • Implemented a new design structure for generated Julia code.

    • +
    • Added default parameters in constructor definitions with support for Abstract types (for builtins).

    • +
    • Created _sort_components_and_datatypes function to perform topological sort on components and datatypes.

    • +
    • Created _has_static_arrays_import to check for the need of using Static Arrays in the generated julia code.

    • +
    • Added –lang (-l) programming language argument to specify the programming language for code generation, current choices: cpp and julia, default: cpp.

    • +
    • Added –upstream-edm code generation support for julia.

    • +
    • Added tests in the unit test suite, covering the Julia code generation of the example data models.

    • +
    • Added documentation for julia code generation.

    • +
    • Added ENABLE_JULIA toggle option. By default it is OFF.

    • +
    +
  • +
  • 2023-12-01 jmcarcell (PR#520)

    +
      +
    • Add an error message when there is an std::bad_function_call, which currently shows +a stacktrace and is quite uninformative.

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#519)

    +
      +
    • Make generated member getter functions return by value for builtin types. Keep return by const reference for all other types. Fixes #518

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#488)

    +
      +
    • Add python bindings for the RNTuple reader and writer

    • +
    • Make podio-dump understand RNTuple based files

    • +
    • Fix missing storage of datamodel definitions for RNTuple based files

    • +
    +
  • +
+
+
+

v00-17-03

+
    +
  • 2023-11-14 tmadlener (PR#513)

    +
      +
    • Introduce checks in ROOTFrameWriter::writeFrame and ROOTNTupleWriter::writeFrame that ensure consistent contents for all Frames of a given category. If inconsistent contents are found an exception is thrown. Before these changes this might lead to a crash or to unreadable files. Fixes #382

    • +
    • Refactor ROOTNTupleWriter internals to have only one map that keeps track of categories instead of two maps and a set that need to be kept consistent.

    • +
    +
  • +
+
+
+

v00-17-02

+
    +
  • 2023-11-08 jmcarcell (PR#511)

    +
      +
    • Decouple generation tools and files from the rest of the podio python files by creating a new folder called podio_gen. This is a transparent change for users that only use the generator script.

      +
        +
      • This makes the configuration / generation times negligible again, because we don’t load libraries unnecessarily any longer for the generation.

      • +
      +
    • +
    • Simplify the python bindings (podio) __init__.py and remove the test_utils from it.

    • +
    • Move the tests for writing frames in python to the tests folder, where they belong and also test the SIO python writer.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#510)

    +
      +
    • Fix legacy tests; an extra argument was being passed and default in the .cpp file example_frame.root was being used which (almost) always exists (because there is a another test creating it) so it was hard to notice.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#509)

    +
      +
    • Add an option for using clang format and set it to off by default. It is significantly slower to run cmake with this option on.

    • +
    +
  • +
  • 2023-11-02 jmcarcell (PR#508)

    +
      +
    • Use the cmake ExternalData module to manage test data. This lets cmake take care of downloading the tests by hash so they can be version controlled. In addition, it’s possible to set up a local store using -DExternalData_OBJECT_STORES=/path/to/store and it will download the test files there if they are not there but otherwise use them from there, so building from scratch won’t download the test files again.

    • +
    +
  • +
  • 2023-10-16 jmcarcell (PR#507)

    +
      +
    • Copy .clang-format to the dumpmodel test directory and fix some tests when the build directory is not a subdirectory of the main directory. In some tests clang-format will try to find a .clang-format looking in the directories above and if it doesn’t exist it will format files differently and some tests will fail.

    • +
    +
  • +
+
+
+

v00-17-01

+
    +
  • 2023-10-12 tmadlener (PR#505)

    +
      +
    • Bump the pylint version for CI to 2.17.7

    • +
    +
  • +
  • 2023-10-11 tmadlener (PR#502)

    +
      +
    • Add a deleteBuffers function that is populated at generation time to the CollectionReadBuffers to make it possible to dispose of unconsumed buffers. This fixes the main leaks described in #500

    • +
    • Make the ROOTFrameData clean up all unconsumed buffers at desctruction.

    • +
    • Make sure to delete buffers that are no longer necessary in the CollectionData constructor. This fixes some more leaks described in #500

    • +
    +
  • +
  • 2023-10-08 Wouter Deconinck (PR#503)

    +
      +
    • Install podio-vis

    • +
    +
  • +
  • 2023-10-04 jmcarcell (PR#497)

    +
      +
    • Move podio_PYTHON_DIR to the top level CMakeLists so that it is set even when BUILD_TESTING is off

    • +
    +
  • +
  • 2023-10-02 jmcarcell (PR#496)

    +
      +
    • Add an operator != to fix negative comparisons since after https://github.com/AIDASoft/podio/pull/493 now id() returns a podioObjectID

    • +
    +
  • +
  • 2023-09-29 tmadlener (PR#493)

    +
      +
    • Make [Mutable]Object::id() return a podio::ObjectID instead of unsigned, since the latter has become useless with #412. Fixes #438

    • +
    • Add an operator<<(std::ostream&) for podio::ObjectID

    • +
    +
  • +
+
+
+

v00-17

+
    +
  • 2023-09-22 Juraj Smiesko (PR#491)

    +
      +
    • podio-dump: print warning if requested entry not present in the file

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#490)

    +
      +
    • Fix bugs in python imports when podio is built without SIO support. Fixes #489

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#486)

    +
      +
    • Make sure to initialize ObjectIDs to untracked to properly track whether they have been added to a Frame or not

    • +
    • Change CollectionIDTable interfaces of name and collectionID to return optional to signal whether a collection (ID) is known to the table. This is a breaking change if you use the CollectionIDTable!

      +
        +
      • Avoids having to do the lookup twice to check existence and a subsequent retrieval

      • +
      +
    • +
    • Fix bug of overly shared CollectionIDTable in ROOTNTupleReader that was uncovered by the CollectionIDTable switch to optional returns.

    • +
    • Switch tests from EventStore to Frame based I/O.

    • +
    • Fix bug in Frame based I/O that lead to crashes when trying to resolve relations to unpersisted objects.

    • +
    +
  • +
  • 2023-09-18 tmadlener (PR#484)

    +
      +
    • Make the podio python bindings import structure “feel more pythonic”

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#483)

    +
      +
    • Clarify error message in case of not implemented schema changes

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#482)

    +
      +
    • rename CMake macro createBuffers into create_buffers

    • +
    +
  • +
  • 2023-09-13 jmcarcell (PR#481)

    +
      +
    • Rename the cmake executable or target unittest to unittest_podio, to avoid possible collisions since the unittest name is relatively common

    • +
    +
  • +
  • 2023-09-13 Benedikt Hegner (PR#480)

    +
      +
    • Move the code generation of buffers into the ‘create_buffers’ macro

    • +
    +
  • +
  • 2023-09-13 Thomas Madlener (PR#472)

    +
      +
    • Allow comparison of data schemata across versions

    • +
    • Provide syntax to clarify user intentions in schema evolution

    • +
    • Provide schema evolution implementation based on ROOT backend

    • +
    • Include infrastructure for future support for schema evolution in other backends

    • +
    • Documentation for schema evolution functionality

    • +
    +
  • +
  • 2023-09-11 tmadlener (PR#477)

    +
      +
    • Use nlohmann/json_fwd.hpp in headers to reduce unnecessary template instantiations. Fixes #475

    • +
    +
  • +
  • 2023-09-08 tmadlener (PR#478)

    +
      +
    • Add empty method to CollectionBase

    • +
    • Add operator== to the collection iterators

    • +
    +
  • +
  • 2023-09-08 Dmitry Kalinkin (PR#465)

    +
      +
    • Introduce member typedefs to the user facing classes.

      +
        +
      • Object’s collection type can now be referenced as Object::collection_type. Conversely, the object type is reachable as ObjectCollection::value_type. The mutable objects can be reached via Object::mutable_type.

      • +
      +
    • +
    +
  • +
  • 2023-08-30 tmadlener (PR#471)

    +
      +
    • Initialize the branch names to be index based for reading (i.e. legacy behavior) for all releases of the v00-16 series.

    • +
    +
  • +
  • 2023-08-22 Andre Sailer (PR#469)

    +
      +
    • Tests: update required catch2 version to 3.4 for builds with c++20

    • +
    • CI: use clang16 on el9 (alma9), instead of clang12 on cs7, using c++20

    • +
    • CI: disable key4hep-release-based tests (tabulate available)

    • +
    +
  • +
  • 2023-08-22 Benedikt Hegner (PR#445)

    +
      +
    • Allow to specify units as part of the datamodel definition

    • +
    +
  • +
  • 2023-07-26 tmadlener (PR#463)

    +
      +
    • Make sure to only access vector member buffers of collections of datatypes with VectorMembers if they actually exist. This is necessary to make subset collections of such datatypes work in I/O. Fixes #462

    • +
    • Add a test that reproduces the original issue and is fixed by this.

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#461)

    +
      +
    • Make sure the ROOTFrameReader on the master branch can read v00-16-06 files

    • +
    • Add v00-16-06 to the legacy versions that are tested

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#447)

    +
      +
    • Add a python wrapper around the different available Frame writers.

    • +
    • Add a put method to the Frame wrapper that allows to add collections to the Frame without having to explicitly use cppyy.gbl.std.move. Fixes #432

    • +
    • Add test cases that write via python bindings and read via c++.

    • +
    +
  • +
  • 2023-07-20 tmadlener (PR#457)

    +
      +
    • Simplify the test setup for SIO in CMake and make it explicit on the ENABLE_SIO option rather than on the presence of targets.

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#456)

    +
      +
    • Cache podio_PYTHON_DIR

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#455)

    +
      +
    • Rename CMAKE_BINARY_DIR to PROJECT_BINARY_DIR

    • +
    +
  • +
  • 2023-07-18 tmadlener (PR#439)

    +
      +
    • Introduce the FrameCategories.h header that puts a few of the conventions and otherwise hardcoded strings into variables / functions.

    • +
    +
  • +
  • 2023-07-14 jmcarcell (PR#454)

    +
      +
    • Rename CMAKE_{SOURCE,BIN}_DIR to PROJECT_{SOURCE,BIN}_DIR

    • +
    +
  • +
  • 2023-07-14 tmadlener (PR#452)

    +
      +
    • Extend the pre-processor condition for the to_json functionality to not be visible in rootcling or the root interpreter. Fixes #435

    • +
    +
  • +
  • 2023-07-13 Benedikt Hegner (PR#450)

    +
      +
    • Add optional description and author fields to component definition

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#449)

    +
      +
    • Fix the pre-commit workflow by making it run on top of the key4hep nightlies that come with a recent enough root version to be able to work with the RNTuple addition (#395)

    • +
    • Fix a few minor complaints from newer versions of clang-format, clang-tidy and pylint

    • +
    • Enable building the RNTuple backend for more workflows (anything that comes with a new enough ROOT essentially).

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#448)

    +
      +
    • Remove the lcio datalayout which has been untouched (and unbuilt) for quite a few years.

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#446)

    +
      +
    • Make calling finish for the SIOFrameWriter non-mandatory. See #442 for other related changes.

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#442)

    +
      +
    • Allow not calling finish() when using the writers

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#395)

    +
      +
    • Add support for the new RNTuple format by adding a writer, reader and tests.

    • +
    +
  • +
  • 2023-06-30 Ananya Gupta (PR#437)

    +
      +
    • Modified parse function definition to incorporate missing description in member definition error message. Fixes #436

    • +
    +
  • +
  • 2023-06-27 Thomas Madlener (PR#413)

    +
      +
    • Introduce podio::SchemaEvolution that can hold schema evolution functions and that offers an evolveBuffers method that does the schema evolution on these buffers before collections are created.

    • +
    • Add hooks in podio::Frame to call this when collections are read from the FrameData.

    • +
    +
  • +
  • 2023-06-23 tmadlener (PR#434)

    +
      +
    • Properly handle the slightly different branch contents before v00-16-04. Fixes #433

    • +
    • Add tests that use the ROOTLegacyReader to actually read the downloaded legacy files

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#428)

    +
      +
    • Split the tests directory into several (more or less) topical sub-directories to declutter the main test CMakeLists.txt a bit

    • +
    • Move commonly used functionality into cmake/podioTests.cmake (e.g. setting up a test environment)

    • +
    • Move python unittests config to the python directory

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#427)

    +
      +
    • Delay library loading as long as possible, mainly for quicker responses for --help

    • +
    • Add a --version flag for dumping the podio version

    • +
    • Display collections and parameters in alphabetical order and automatically adjust column widths to fit contents (using the tabulate package).

    • +
    +
  • +
  • 2023-06-09 Thomas Madlener (PR#402)

    +
      +
    • Add public static constexpr char* type names to the collections and make the getXXXName() methods return string_views to these strings. This is a breaking change to the interface of the collections if you explicitly rely on them being std::string

      +
        +
      • typeName: the full type name of the collection (returned also by getTypeName)

      • +
      • valueTypeName: the (immutable) type name of the objects of the collection (returned by getValueTypeName)

      • +
      • dataTypeName: the type name of the data PODs (returned by getDataTypeName)

      • +
      +
    • +
    • Make unittest environment properly use PODIO_SIOBLOCK_PATH

    • +
    • USE_EXTERNAL_CATCH2 now can also be set to AUTO to look for a suitable version of Catch2 before falling back and fetching and building it’s own version instead of a hard fail.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#426)

    +
      +
    • Check if PODIO_SIOBLOCK_PATH exists in the environment and use that to look for SIO Blocks libraries before falling back to LD_LIBRARY_PATH. This makes it possible to make slightly more robust environments if several (incompatible) podio installations are visible on LD_LIBRARY_PATH

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#425)

    +
      +
    • Add a SKIP_CATCH_DISCOVERY cmake option to skip the unittest discovery of Catch2 to avoid running the catch discovery in an unsuitable environment.

    • +
    • Make environment for unittests more specific to avoid catching too much of the underlying environment.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#412)

    +
      +
    • Using string hashes as CollectionID based on MurmurHash

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#423)

    +
      +
    • Add some more structure to make it easier to add more legacy tests.

      +
        +
      • Use this to download more legacy files automatically

      • +
      • Restructure CMake config to make this possible

      • +
      +
    • +
    • Add tests for Frame based root I/O reading files that have been produced with prior versions of podio

    • +
    • Add more tests for EventStore based root I/O reading files that have been produced with prior versions of podio

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#421)

    +
      +
    • Make the collections appear in alphabetical order in root files, using a case insensitive sorting of the collections that are written.

    • +
    +
  • +
  • 2023-06-05 Thomas Madlener (PR#405)

    +
      +
    • Make the branch names for relations and vector members more legible and valid c++ variable names to improve interoperability with RDataFrame. Fixes #169

      +
        +
      • The branch names will have the following structure: _<collection-name>_<relation-name>, resp. _<collection-name>_<vectormember-name>, where relation-name, resp.vectormember-name are taken from the YAML definitions.

      • +
      • Subset collections will have a single branch with <collection-name>_objIdx. This makes it easier to disambiguate them from normal collections.

      • +
      +
    • +
    • This is a breaking change if you use the root files directly! If you use the podio Readers/Writers everything should be transparent

    • +
    +
  • +
  • 2023-05-30 tmadlener (PR#422)

    +
      +
    • Fix small bug in Frame python bindings where set but empty parameters could crash podio-dump when trying to access a non-existent element

    • +
    +
  • +
+
+
+

v00-16-05

+
    +
  • 2023-05-23 tmadlener (PR#420)

    +
      +
    • Fix a version check inside the ROOTReader to avoid segmentation violations

    • +
    +
  • +
+
+
+

v00-16-04

+
    +
  • 2023-05-23 tmadlener (PR#417)

    +
      +
    • Fix an issue with reading multiple files via the ROOTFrameReader (#411)

      +
        +
      • Add documentation for API of opening file(s)

      • +
      • Add tests for reading multiple files

      • +
      +
    • +
    +
  • +
  • 2023-05-22 tmadlener (PR#418)

    +
      +
    • Bring back the public templated getMap functionality for podio::GenericParameters as they are already used in DD4hep (see AIDASoft/DD4hep#1112).

      +
        +
      • Mark the existing getXYZMap as deprecated but keep them for a brief transition period.

      • +
      • These have been removed in #415.

      • +
      +
    • +
    +
  • +
  • 2023-05-19 jmcarcell (PR#416)

    +
      +
    • Remove selection rules for classes that don’t exist anymore

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#415)

    +
      +
    • Remove the deprecated getters and setters from the generic parameters

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#410)

    +
      +
    • Remove the square that is run when cmake runs

    • +
    +
  • +
  • 2023-05-09 tmadlener (PR#414)

    +
      +
    • Fix off-by-one error in UserDataCollection::print that caused the first element to be printed twice.

    • +
    +
  • +
  • 2023-05-09 Thomas Madlener (PR#394)

    +
      +
    • Introduce a CollectionBufferFactory that can create the necessary buffers from a collection type, a schema version and a subset collection flag.

      +
        +
      • Use this factory throughout all existing Readers

      • +
      • Remove createBuffers and createSchemaEvolvableBuffers from podio::CollectionBase interface

      • +
      +
    • +
    • Make the minimum allowed schema_version 1 in the yaml definition files. Default to 1 if no schema_version is provided

    • +
    • Add a schemaVersion to the DatamodelDefinition.h header that is generated and that can be accessed via {{ package_name }}::meta::schemaVersion. Use this to propagate schema information to the necessary places.

    • +
    • Make SIOBlocks write the current schema version, such that on reading they can generate the appropriate buffers for the version on file.

    • +
    +
  • +
  • 2023-04-22 Christopher Dilks (PR#408)

    +
      +
    • fix type inconsistency between Collection::size() and index for const object accessors

    • +
    +
  • +
  • 2023-04-21 jmcarcell (PR#387)

    +
      +
    • Make sure that the dump model round trip tests work without ENABLE_SIO

    • +
    • Actually test the extension model dumping

    • +
    +
  • +
  • 2023-04-12 Thomas Madlener (PR#400)

    +
      +
    • Fix a bug in SIOFrameData::getAvailableCollections to also work with Frames where some of the collections have not been written and that could lead to a seg fault.

    • +
    • Add a test for this in c++ (previously only covered in python unittests of Frame).

    • +
    +
  • +
  • 2023-04-05 Thomas Madlener (PR#399)

    +
      +
    • Add PODIO_ENABLE_SIO=1 to the public target_compile_definitions for podioSioIO so that all dependent targets automatically get it as well. This should make it easier to use SIO dependent features in dependencies.

    • +
    • Consistently use a scope for target_link_libraries in tests.

    • +
    +
  • +
  • 2023-04-03 Paul Gessinger-Befurt (PR#398)

    +
      +
    • Do not reject building if ROOT was built with C++20 (instead of C++17).

    • +
    +
  • +
  • 2023-04-03 Thomas Madlener (PR#397)

    +
      +
    • Remove the GENERATED property from generated files in CMake to avoid inconsistent removal of headers and source files with the clean target. Fixes #396

    • +
    +
  • +
  • 2023-03-15 Benedikt Hegner (PR#341)

    +
      +
    • Adding infrastructure for schema evolution

    • +
    • Added explicit version tracking to the metadata

    • +
    • Data model comparison tool w/ simple heuristics to identify potential omissions / mistakes (e.g. checking for the limits of the ROOT backend)

    • +
    • Changed handling of backwards compatibility for the collection info metadata

    • +
    +
  • +
+
+
+

v00-16-03

+
    +
  • 2023-03-14 jmcarcell (PR#391)

    +
      +
    • Catch an exception when a clang-format flag is not found

    • +
    +
  • +
  • 2023-03-14 jmcarcell (PR#390)

    +
      +
    • Modify the initial clang-format check to try to run with all the arguments that will be used later

    • +
    +
  • +
  • 2023-03-13 jmcarcell (PR#389)

    +
      +
    • Add .cache to the gitignore

    • +
    +
  • +
  • 2023-03-07 Thomas Madlener (PR#358)

    +
      +
    • Embed the EDM definition in JSON format into the shared core datamodel libraries

      +
        +
      • Generate an additional DatamodelDefinition.h header file containing the string literal json encoded definition

      • +
      • Statically register this to the newly introduced DatamodelRegistry and make collections aware of which datamodel they belong to

      • +
      +
    • +
    • Collect all EDM definitions from all collections that are written with a writer and write all these definitions to the resulting file

      +
        +
      • Currently only done for the FrameWriters

      • +
      +
    • +
    • Give podio-dump the necessary functionality to retrieve the stored models and dump them in YAML format again

      +
        +
      • Add roundtrip tests that compare the generated code from the original model and the one that has been dumped from a data file to ensure that all components work as intended.

      • +
      +
    • +
    • See the advanced topics documentation for more details.

    • +
    +
  • +
  • 2023-03-06 Dmitry Kalinkin (PR#384)

    +
      +
    • Added an operator for conversion to std::string for podio::version::Version

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#378)

    +
      +
    • Introduce deprecation warnings for the EventStore based I/O model as it will be removed in favor of the Frame based one

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#372)

    +
      +
    • Make double a supported type of GenericParameters. A similar thing has been added to LCIO in iLCSoft/LCIO#143 to support storing event weights that need double precision.

    • +
    • Add more unittests to the GenericParameters covering also the available constructors.

    • +
    +
  • +
  • 2023-02-27 Thomas Madlener (PR#380)

    +
      +
    • Add getParameters method to the Frame and deprecate getGenericParametersForWrite which offered the exact same functionality.

      +
        +
      • Make it easily possible to get all parameters that are currently stored in a Frame via an “official” channel

      • +
      • Replace all internal usages.

      • +
      +
    • +
    • Add a getParameterKeys templated method to get the keys for different parameter types that are currently stored in the Frame.

    • +
    +
  • +
  • 2023-02-22 jmcarcell (PR#377)

    +
      +
    • Add a visualization tool that converts a YAML description to a graph

    • +
    +
  • +
  • 2023-02-21 jmcarcell (PR#376)

    +
      +
    • Fix tests without SIO

    • +
    +
  • +
  • 2023-02-14 Thomas Madlener (PR#375)

    +
      +
    • Fix the PODIO_VERSION preprocessor macro to be actually usable in a preprocessor context. Fixes #374

    • +
    • Make podio_VERSION preprocessor constant something that can be used in a preprocessor context (now the same as PODIO_BUILD_VERSION

    • +
    • Add test that ensures that the macro and the constant are actually used in a preprocessor context.

    • +
    +
  • +
  • 2023-02-13 Juraj Smiesko (PR#373)

    +
      +
    • Adding ID to the short podio-dump output

    • +
    +
  • +
  • 2023-02-06 Nathan Brei (PR#369)

    +
      +
    • Mark non-templated definitions of Frame::Frame, Frame::get, Frame::put and Frame::putParameters as inline to fix linker errors.

    • +
    +
  • +
  • 2023-02-02 jmcarcell (PR#364)

    +
      +
    • Make workflows not trigger twice on pushes to PRs

    • +
    +
  • +
  • 2023-01-26 jmcarcell (PR#368)

    +
      +
    • CMAKE: Add option PODIO_RELAX_PYVER to allow relaxing the required match of python version with the one that ROOT has been built with to only check major and minor versions

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#363)

    +
      +
    • Move sio utility functionality defined in SIOFrameWriter.cc to private sioUtils.h header and use it also in the legacy SIOWriter.

    • +
    • Fix cmake configure dependencies (missed in #343) for datamodel generation macro.

    • +
    • Use defaultdict instead of hand rolling one in class generator.

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#361)

    +
      +
    • Add basic I/O tests for datatypes defined in the extension datamodel. Fixes #319

    • +
    +
  • +
  • 2023-01-11 jmcarcell (PR#355)

    +
      +
    • Change the readers so that when the file is missing they won’t crash

    • +
    +
  • +
  • 2023-01-10 jmcarcell (PR#365)

    +
      +
    • Fix the pre-commit workflow

    • +
    +
  • +
  • 2022-12-23 jmcarcell (PR#362)

    +
      +
    • Rename the variable match to avoid collisions with a python keyword from Python 3.10 onwards

    • +
    +
  • +
+
+
+

v00-16-02

+
    +
  • 2022-12-19 Thomas Madlener (PR#360)

    +
      +
    • Make the log output of loading the SIOBlock libraries more informative by also providing the absolute paths to the loaded (and rejected) shared libraries.

    • +
    +
  • +
  • 2022-12-16 Thomas Madlener (PR#333)

    +
      +
    • Initialize the unique_ptr<mutex> in the constructor initializer list instead of in the member variable declaration. This is more likely a bug in nvcc (or maybe a c++17 feature not yet supported by nvcc). Fixes key4hep/k4Clue#34

    • +
    • Pass --disable-new-dtags to the linker when using PODIO_SET_RPATH, to set RPATH and not RUNPATH in the binaries.

    • +
    • Pin the ubuntu version for runners that build on ubuntu to not accidentally go out of sync with the underlying LCG releases.

    • +
    • Disable the podio tests in the edm4hep workflows (see #359).

    • +
    +
  • +
+
+
+

v00-16-01

+
    +
  • 2022-12-06 jmcarcell (PR#356)

    +
      +
    • Fix path in the README

    • +
    • Use the functionality in argparse to choose between options

    • +
    +
  • +
  • 2022-12-06 Benedikt Hegner (PR#346)

    +
      +
    • Switched tp Apache 2.0 license to facilitate integration in experiment stacks.

    • +
    +
  • +
  • 2022-12-05 Thomas Madlener (PR#357)

    +
      +
    • Put <prefix>/bin onto PATH in order to make podio-dump available from environments created with env.sh

    • +
    +
  • +
  • 2022-12-02 jmcarcell (PR#354)

    +
      +
    • Make env.sh setup script POSIX compliant to run in shells other than bash

      +
        +
      • Change == to =

      • +
      • Change tabs to spaces (two) to avoid mix of spaces and tabs for indenting

      • +
      • Add <prefix>/include to ROOT_INCLUDE_PATH (as it is required since #343)

      • +
      +
    • +
    +
  • +
  • 2022-11-16 Thomas Madlener (PR#351)

    +
      +
    • Fix bug in Frame python bindings where empty collections were considered as non-existing. Replacing the original check relying on some implicit boolean conversions (which also caught empty collections) to an explicit check against nullptr.

    • +
    • Make podio-dump more robust in installations without SIO support, by guarding the corresponding import.

    • +
    +
  • +
  • 2022-11-14 Thomas Madlener (PR#344)

    +
      +
    • Make podio-dump work with new Frame based I/O (fixes #339)

    • +
    • Keep existing functionality intact by using the legacy readers introduced in #345.

    • +
    +
  • +
  • 2022-11-11 Thomas Madlener (PR#345)

    +
      +
    • Add a ROOTLegacyReader and a SIOLegacyReader that read files that have been written prior to #287 into podio::Frames and offers the same interface as the frame readers

      +
        +
      • Also including python bindings for it

      • +
      +
    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#349)

    +
      +
    • Fix bug in setting relations in nested get calls in podio::Frame. Fixes #348

    • +
    • Adapt the read test to actually check this. Previously this went unnoticed, because the necessary relations were already set in a previous call.

    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#343)

    +
      +
    • Add python bindings for Frame based I/O

      +
        +
      • Available from podio.root_io and podio.sio_io, where a Reader and a Writer is implemented for each.

      • +
      • Wrapper around podio::Frame. Requires that the podio/Frame.h header is available somewhere on the ROOT_INCLUDE_PATH.

      • +
      +
    • +
    • Add necessary functionality for python bindings to C++ API

      +
        +
      • untyped Frame::get method for getting collections

      • +
      • New constructor from FrameDataT&&

      • +
      • functionality to inspect file and Frame contents more easily

      • +
      +
    • +
    • Reorganize python code into structure that follows the usual python packaging conventions a bit more closely

      +
        +
      • Introduce the podio module. Make CMake generate the __init__.py with the correct version

      • +
      • Move everything except the generator script into module. Additionally also keep an EventStore wrapper to not break existing code.

      • +
      +
    • +
    • Refactor the CMakeLists.txt that is responsible for building the core and all required I/O libraries

      +
        +
      • Build more dictionaries for more python bindings.

      • +
      +
    • +
    +
  • +
  • 2022-11-02 Thomas Madlener (PR#342)

    +
      +
    • Migrate to actions/checkout@v3 as advised by github

    • +
    • Use the checkout action to clone the dependencies in the edm4hep workflow instead of doing an explicit clone in the body of the action

    • +
    +
  • +
  • 2022-11-02 Dmitry Kalinkin (PR#327)

    +
      +
    • fix typo in documentation

    • +
    +
  • +
  • 2022-10-24 Juraj Smiesko (PR#340)

    +
      +
    • Adding reading of specific entry from frame

    • +
    +
  • +
  • 2022-10-21 Thomas Madlener (PR#335)

    +
      +
    • Update the github-action-cvmfs and run-lcg-view actions to their latest available version to pick up the latest improvements (caching of dependencies, log groups)

    • +
    • Introduce log groups in github actions for easier to interpret outputs

    • +
    • Switch to LCG_102 for lcg based build environments

    • +
    • Add a workflow that builds and tests EDM4hep after building podio

    • +
    +
  • +
+
+
+

v00-16

+
    +
  • 2022-10-04 Thomas Madlener (PR#337)

    +
      +
    • Make the notebook pattern functionality return std::vectors instead of std::array to avoid having to specify a static size. Fixes #332

    • +
    • Backwards incompatible change as the return type as well as the call signature for the notebook pattern change.

    • +
    +
  • +
  • 2022-09-27 Andre Sailer (PR#336)

    +
      +
    • podioConfig.cmake: silence warning about cmake policy CMP00012

    • +
    • CMake: explicitly look for catch2 version 3 and fail at cmake instead of compile step

    • +
    +
  • +
  • 2022-09-27 Thomas Madlener (PR#334)

    +
      +
    • Fix a warning/error message from ROOT from attempts to stream the std::mutex members of GenericParameters by marking them as transient for the dictionary generation.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#323)

    +
      +
    • Add a podio-dump python script (installed to <prefix>/bin that can be used to dump event contents to stdout. By default prints an overview over the collections and their types, but can also be used to dump full events, via the -d or --detailed flag. Use --help to get all available options and their descriptions.

    • +
    • To allow podio-dump to work with all available backends also add support for reading SIO via the PythonEventStore.

      +
        +
      • Split off the necessary c++ functionality into a separate podioPythonStore library (+ necessary ROOT dictionaries).

      • +
      +
    • +
    • Add a print function to the collections for easier dumping from the python side.

    • +
    • Add a print function to the GenericParameters

    • +
    • Make goToEvent is a part of the IReader interface and correctly implemented it for the SIOReader.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#287)

    +
      +
    • Introduce the podio::Frame as a generalized, thread-safe (event) data container.

      +
        +
      • This first version offers all necessary functionality and an almost finalized interface, i.e. we plan to keep this as stable as possible, but we might still change things if it turns out that there are better ways to do some things

      • +
      • For details about the basic interface and the underlying design considerations please consult the corresponding documentation

      • +
      +
    • +
    • This will be the only way to work with podio data starting from version 1.0

      +
        +
      • For now the current I/O implementations remain in place unchanged, but they will be deprecated (and removed) in the not too distant future

      • +
      +
    • +
    +
  • +
+
+
+

v00-15

+
    +
  • 2022-08-09 Thomas Madlener (PR#312)

    +
      +
    • Add support for converting objects and collections to JSON using nlohmann/json.

      +
        +
      • To enable JSON support it is necessary to build the datamodel with PODIO_JSON_OUTPUT and to link against the nlohmann/json library.

      • +
      +
    • +
    +
  • +
  • 2022-08-05 Wouter Deconinck (PR#318)

    +
      +
    • CMake: PODIO_ADD_ROOT_IO_DICT: Bugfix for data models in OUTPUT_FOLDER not equal to source dir in root dictionary generation cmake macro.

      +
        +
      • Now SELECTION_XML can be passed either as absolute path or relative to OUTPUT_FOLDER.

      • +
      +
    • +
    +
  • +
  • 2022-08-03 Thomas Madlener (PR#317)

    +
      +
    • Make it possible to pass an upstream datamodel to the class generator such that datatypes and components defined there can be used in an unrelated datamodel. This makes it possible to extend datamodels and to prototype new datatypes with the aim of upstreaming them eventually without having to redefine all the necessary components.

    • +
    • Refactor the internals of the config reader / class generator slightly to make it possible to hold multiple datamodels in memory

    • +
    +
  • +
  • 2022-08-02 Thomas Madlener (PR#316)

    +
      +
    • Remove macOS CI workflows because github hosted runners will deprecate macOS 10.15 (announcement) and later versions of macOS no longer support fuse and as a consequence CVMFS.

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#315)

    +
      +
    • Make the is_trivial_type flag available in the template engine behave as expected (it behaved exactly oppositely to what was documented and what one would intuitively expect). The flag was originally introduced in #288

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#283)

    +
      +
    • Allow users to define default values for member variables, instead of default initializing all of them.

      +
        +
      • The syntax for specifying a default value is - <type> <name>{<init-value>} // <description>.

      • +
      • The passed value is not validated in any way. Apart from a very basic syntax check, there is no validation that the provided default initialization values are actually valid. This means that generated code might not compile.

      • +
      +
    • +
    • Remove some of the python2 compatibility and do some cleanup

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#276)

    +
      +
    • Remove support for having std::string members in datatypes and components, as they break PODness and it seems that this feature was not in use in any case.

    • +
    • Make ROOTReader slightly more robust against missing datatypes in dictionaries when reading files.

    • +
    +
  • +
  • 2022-06-22 Valentin Volkl (PR#307)

    +
      +
    • hotfix for https://github.com/AIDASoft/podio/issues/290: revert a clang-tidy change to make sure that there are no unknown symbols in podioDict

    • +
    +
  • +
  • 2022-06-21 Thomas Madlener (PR#282)

    +
      +
    • Add a PODIO_USE_CLANG_FORMAT option to the cmake configuration to toggle the autodiscovery of clang-format and a .clang-format configuration file. This option is also available for downstream packages that use podio to generate their EDM.

      +
        +
      • The default is AUTO, where we try to discover a suitable clang-format version as well as a .clang-format file and use it if we find it.

      • +
      • If set to OFF podio will not try to see whether clang-format and a .clang-format file are available and will also not try to format the code accordingly.

      • +
      • If set to ON podio will actually require a suitable clang-format version and the presence of a .clang-format file and will fail at the cmake stage if not present.

      • +
      +
    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#305)

    +
      +
    • Make sure generator warnings are printed

    • +
    • Add a deprecation warning for the upcoming removal of support of std::string in data types. (See also #276)

    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#294)

    +
      +
    • Remove the EventStore, CollectionIDTable and version::Version members from the SIOCollectionIDTableBlock to make it easier to use in the Frame context

    • +
    • Move the podio:version::build_version into its own SIOVersionBlock

    • +
    • This is a breaking change for the SIO backend and it will not be able to read files that have been written prior to this

    • +
    +
  • +
+
+
+

v00-14-02

+
    +
  • 2022-06-15 Thomas Madlener (PR#304)

    +
      +
    • Use the releases v3.0.1 version of Catch2 instead of an unreleased commit

    • +
    +
  • +
  • 2022-06-15 Thomas Madlener (PR#303)

    +
      +
    • Default initialize the array for the vectorized access.

    • +
    +
  • +
  • 2022-06-14 soumil (PR#296)

    +
      +
    • Add instructions on how to run pre-commit locally to the documentation

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#295)

    +
      +
    • Mark CollectionBase::prepareForWrite as const and make sure that the generated implementations are thread safe.

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#286)

    +
      +
    • Make sure that vector member buffers for writing point to the correct place even if a collection has been moved, by resetting them when the buffers are requested.

    • +
    • Add checks for this to the unittests, as this is sort of an interface for I/O backends.

    • +
    +
  • +
  • 2022-06-13 Kalina Stoimenova (PR#301)

    +
      +
    • Fixed the text in the cmake message for code generation to point to the correct readme file

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#300)

    +
      +
    • Newer versions of pylint have removed a few options and a few checks that aimed at python2-python3 compatibility.

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#299)

    +
      +
    • Explicitly add constructors to CollectionBase

    • +
    • Make sure to not use an unset LD_LIBRARY_PATH for detecting sio blocks shared libraries.

    • +
    +
  • +
  • 2022-06-02 soumil (PR#293)

    +
      +
    • Removing python2 compatibility imports

    • +
    • Removing ordered loading (obsolete) function

    • +
    +
  • +
  • 2022-06-01 Thomas Madlener (PR#285)

    +
      +
    • Fix potential bug in setting the collection ID for subset collections

    • +
    +
  • +
  • 2022-05-30 soumil (PR#291)

    +
      +
    • Replace the obj_needs_destructor flag in the generator code and templates with the is_trivial_type flag, since that is the more appropriate name. (Fixes #288)

    • +
    +
  • +
  • 2022-05-27 Thomas Madlener (PR#274)

    +
      +
    • Add documentation for the Jinja2 templates and the code generation process in general to make working with these parts of PODIO easier.

    • +
    +
  • +
  • 2022-05-23 Thomas Madlener (PR#262)

    +
      +
    • Make the getters and setters for the GenericParameters templated functions and add a deprecation warning for the untemplated ones.

    • +
    • Define a SupportedGenericDataTypes tuple defining the types (and vectors of those) that can be stored in GenericParameters

    • +
    • Add a podio/utilities/TypeHelpers.h header with some type handling helpers.

    • +
    +
  • +
  • 2022-05-20 Thomas Madlener (PR#277)

    +
      +
    • Avoid fetching the (remote) legacy input file for tests unnecessarily every time cmake is run.

    • +
    +
  • +
  • 2022-05-17 Thomas Madlener (PR#284)

    +
      +
    • Make sure the EventStore doesn’t try to read event meta data multiple times per event

    • +
    • Add a empty method to GenericParameters to check if any parameters are stored.

    • +
    +
  • +
  • 2022-04-04 Thomas Madlener (PR#280)

    +
      +
    • Only use --color option for diff in clang-format wrapper script if it is supported by the underlying diffutils.

    • +
    +
  • +
  • 2022-04-02 Thomas Madlener (PR#254)

    +
      +
    • Add a .clang-format and .clang-tidy config file for consistent formatting and following a few coding guidelines.

    • +
    • Add pre-commit hooks that run clang-tidy and clang-format

    • +
    • Make all currently present files follow the formatting and guidelines of the present configuration.

    • +
    • Make the PODIO_GENERATE_DATAMODEL macro look for a .clang-format file and the presence of clang-formatand automatically format all the generated files if both are there.

    • +
    +
  • +
  • 2022-04-01 Thomas Madlener (PR#279)

    +
      +
    • Fix test environment to work again in newest Key4hep release by unsetting ROOT_INCLUDE_PATH in the test environment to avoid potential clashes with existing other installations in the environment.

    • +
    • Add CI build against the Key4hep nightlies.

    • +
    • Switch to use the Catch2 installation from Key4hep for the workflows.

    • +
    +
  • +
  • 2022-03-31 Thomas Madlener (PR#253)

    +
      +
    • Add a basic setup for pre-commit and replace the python linting github workflow with one that is run via pre-commit.

      +
        +
      • Add additional checks for consistent line-endings and removal of trailing whitespaces.

      • +
      +
    • +
    • Update pylint and flake8 config to no longer check for python2/python3 compatibility but instead follow the same guidelines as e.g. in ILCDirac.

    • +
    • Fix all issues that were uncovered.

    • +
    +
  • +
  • 2022-03-23 Thomas Madlener (PR#270)

    +
      +
    • Remove duplicated printing of component members in the std::ostream& operator<< overloads of the datatypes. Fixes #269

    • +
    • Add an example datatype that broke compilation before these fixes.

    • +
    +
  • +
  • 2022-03-18 Andre Sailer (PR#265)

    +
      +
    • CI: use clang12 and gcc11 for tests based on dev stacks

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14

+
    +
  • 2021-10-13 Thomas Madlener (PR#234)

    +
      +
    • Make sure that #include <cstdint> is present when using fixed with integers in datatypes

    • +
    +
  • +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-14-00

+
    +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-13-02

+
    +
  • 2021-10-08 Thomas Madlener (PR#224)

    +
      +
    • Make the clone function always return a mutable object, also when called on an immutable object (Fixes #219)

    • +
    +
  • +
  • 2021-09-22 Thomas Madlener (PR#214)

    +
      +
    • Make the CMake datamodel generation macro use the python interpreter that is also found by CMake to avoid accidentally picking up an unsuitable system provided version that might be on PATH.

    • +
    +
  • +
  • 2021-09-21 Frank Gaede (PR#213)

    +
      +
    • add possibility to store additional user data as collections of fundamental types in PODIO files

      +
        +
      • uses std::vector<basic_type>

      • +
      • stored in simple branch in root (and simple block in SIO)

      • +
      • all fundamental types supported in PODIO (except bool) can be written

      • +
      +
    • +
    • example code:

    • +
    +
      auto& usrInts = store.create<podio::UserDataCollection<uint64_t> >("userInts");
    +  auto& usrDoubles = store.create<podio::UserDataCollection<double> >("userDoubles");
    +  // ...
    +
    +  // add some unsigned ints
    +  usrInts.resize( i + 1 ) ;
    +  int myInt = 0 ;
    +  for( auto& iu : usrInts ){
    +    iu = myInt++  ;
    +  }
    +  // and some user double values
    +  unsigned nd = 100 ;
    +  usrDoubles.resize( nd ) ;
    +  for(unsigned id=0 ; id<nd ; ++id){
    +    usrDoubles[id] = 42. ;
    +  }
    +
    +
    +
      +
    • should replace https://github.com/key4hep/EDM4hep/pull/114 in a more efficient way

    • +
    +
  • +
  • 2021-09-21 tmadlener (PR#143)

    +
      +
    • Generate an additional podio_generated_files.cmake file containing all generated source files as a header and sources list and make the code generation macro include this file to get the headers and source files.

      +
        +
      • Now only the files generated for the current settings are picked up by cmake

      • +
      • Makes it possible to have additional files in the folders where the generated files are placed, since these are no longer globbed over.

      • +
      +
    • +
    +
  • +
  • 2021-09-10 Thomas Madlener (PR#217)

    +
      +
    • Make the Obj destructors = default where possible, i.e. if a datatype has no relations to handle

    • +
    • Make the assignment operators of the user facing classes use the “copy-and-swap” idiom

    • +
    • Fix the problem where OneToOneRelations needed to be from the same namespace as the datatype they are used in (#216)

    • +
    +
  • +
  • 2021-09-06 Thomas Madlener (PR#211)

    +
      +
    • Fix test dependencies to allow running tests in parallel via ctest -jN

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#210)

    +
      +
    • Fix a few small issues in the datamodel yaml file validation. These do not change the behavior of code generation, they just try to catch problems earlier

      +
        +
      • Make sure that OneToManyRelations and OneToOneRelations have the same restrictions

      • +
      • Only allow components, builtins and arrays of those as Members

      • +
      +
    • +
    • Make the API of validate slightly more generic by taking a dict instead of multiple arguments.

    • +
    • Make the generator exit with an easier to read error message in case of a validation problem instead of printing a full backtrace.

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#197)

    +
      +
    • Introduce a podio::CollectionBuffers class that contains everything that is necessary for I/O of a given collection. This is a breaking change in the collection interface

    • +
    • Introduce and generate a CollectionData class for each datatype that only manages the storage of a given collection.

      +
        +
      • Exposes only the Obj entries of each collection as well as the necessary functionality to add a new object (and its relations) to the collection.

      • +
      +
    • +
    • Implement “subset” collections that behave exactly the same as normal collections apart from an additional function call when creating them.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#206)

    +
      +
    • Switch to Catch2 v3 test library and by default assume that it is available. Use the ‘USE_EXTERNAL_CATCH2` cmake option to control whether podio should use an external installation or if it should fetch and build it internally instead.

    • +
    • Remove catch.hpp header that was previously shipped, since it is no longer needed.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#201)

    +
      +
    • Make assignment operator increase the reference count to avoid possible heap-after-free usage. (Fixes #200)

    • +
    +
  • +
+
+
+

v00-13-01

+
    +
  • 2021-06-03 Thomas Madlener (PR#195)

    +
      +
    • Fix possible circular and self-includes in generated header files.

    • +
    +
  • +
  • 2021-06-03 Thomas Madlener (PR#194)

    +
      +
    • Make it possible to do indexed access on a RelationRange, making the interface more akin to a const std::vector

    • +
    +
  • +
  • 2021-05-31 tmadlener (PR#193)

    +
      +
    • Make collection element access const correct.

    • +
    +
  • +
  • 2021-05-31 Thomas Madlener (PR#192)

    +
      +
    • Fix const-correctness problems of meta data access via EventStore.

    • +
    +
  • +
  • 2021-05-28 Benedikt Hegner (PR#191)

    +
      +
    • Fix bug in validity check so that transient and persistent collections are treated the same

    • +
    +
  • +
  • 2021-05-28 Thomas Madlener (PR#186)

    +
      +
    • Add support for fixed width integer type members in components and datatypes.

      +
        +
      • Now possible to use int16_t, int32_t, int64_t, uint16_t, uint32_t and uint64_t as members. Other fixed width integer types that are potentially defined in <cstdint> are not considered valid as the intended use case is really only fixed width integers for now. These are rejected at the datamodel validation step.

      • +
      • Fixed width integers are considered to be “builtin” types for podio.

      • +
      +
    • +
    +
  • +
  • 2021-05-04 Valentin Volkl (PR#189)

    +
      +
    • [cmake] fix test dependencies: read_and_write.cpp reads the file example.root that is created by the write test. If the dependency is not declared, running the tests concurrently can lead to spurious test failures.

    • +
    +
  • +
  • 2021-04-28 tmadlener (PR#180)

    +
      +
    • Improve the branch look-up logic in ROOTReader and ROOTWriter. Triggered by a performance degradation in v6.22/06, where this logic was changed inside ROOT and our use case was affected badly. All ROOT versions profit from these changes as it is in general more efficient than the previous implementation.

    • +
    +
  • +
  • 2021-03-30 tmadlener (PR#182)

    +
      +
    • Use run-lcg-view github action and switch to more recent LCG releases to run CI.

    • +
    • Update README to include status of CI

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#185)

    +
      +
    • extended .gitignore

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#184)

    +
      +
    • Clean up AsciiWriter comments

    • +
    +
  • +
  • 2021-03-23 tmadlener (PR#183)

    +
      +
    • Use SIO targets in cmake, which are exported starting with v00-01 (iLCSoft/SIO#15)

    • +
    +
  • +
  • 2021-02-23 Marko Petric (PR#181)

    +
      +
    • Add coverity nightly scan based on run-lcg-view action

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#175)

    +
      +
    • Fully qualify return types for OneToOneRelation getters in generated .cc file for objects and Const objects. This fixes a bug described in https://github.com/AIDASoft/podio/issues/168#issuecomment-770751871 and now allows to mix different namespaces in the generated code. This allows to more easily extend already existing datamodels by compiling and linking against them.

    • +
    +
  • +
  • 2021-02-23 Dmitry Romanov (PR#173)

    +
      +
    • Added IO Handler argument to schema generation example in README

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#171)

    +
      +
    • Fix compiler warnings, that were uncovered by #153 and described in #170. Fix them in the core classes and also in the generated ones.

    • +
    • Enforce no new warnings with Werror in the CI builds.

    • +
    +
  • +
  • 2021-02-15 Joseph C Wang (PR#156)

    +
      +
    • Readers/writers are now noncopyable

    • +
    +
  • +
  • 2021-02-02 Joseph C Wang (PR#154)

    +
      +
    • Disable operator = for collections so that it maintains one copy of collections, fixes #111

    • +
    +
  • +
  • 2021-01-26 tmadlener (PR#172)

    +
      +
    • Fix deprecated brew install commands in mac workflow

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#165)

    +
      +
    • Add a convenience RelationRange::emtpy function for easily checking whether a range is empty.

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#162)

    +
      +
    • Fix cmake problem #161 on Ubuntu

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#155)

    +
      +
    • Add some benchmarking tools, including TimedReader and TimedWriter decorators that allow to wrap (interface conforming) readers and writers and record the times different operations take. The times are recorded on two levels: setup times, like constructing a reader or “one-time” calls and per event times, for things that happen each event (e.g. writeEvent or readCollection). Additionally the BenchmarkRecorder in principle also allows to track additional things outside of these decorators.

    • +
    +
  • +
+
+
+

v00-13

+
    +
  • 2020-12-03 Marko Petric (PR#153)

    +
      +
    • Set rpath for macOS and externalize compiler and linker flags

    • +
    • Search for the same version of python as was used for building ROOT

    • +
    +
  • +
  • 2020-12-03 Joseph C Wang (PR#152)

    +
      +
    • Make EventStore non-copyable

    • +
    +
  • +
  • 2020-12-03 tmadlener (PR#144)

    +
      +
    • Decouple the writers and the EventStore to allow to write collections that have previously been read from a file.

    • +
    +
  • +
  • 2020-11-24 Valentin Volkl (PR#149)

    +
      +
    • [cmake] add find_package_handle_standard_args() to podio config

    • +
    +
  • +
  • 2020-11-18 Frank Gaede (PR#147)

    +
      +
    • fix for MacOs when using SIO I/O with podio +- need to link edm-core library to edm-sioBlocks library

    • +
    +
  • +
  • 2020-11-10 Thomas Madlener (PR#130)

    +
      +
    • Add SIO as a second I/O backend (as alternative to ROOT) that can be enabled with ENABLE_SIO. If enabled, a separate podioSioIO library is built that allows reading and writing sio files. For serializing the different datatypes, additional code is generated to build an SioBlocks library that is loaded at runtime (if found somewhere on LD_LIBRARY_PATH). To facilitate the whole process at the cmake level, new cmake functions are provided to generate the core datamodel library PODIO_ADD_DATAMODEL_CORE_LIBRARY, to (conditionally) define the ROOT dictionary target PODIO_ADD_ROOT_IO_DICT and to (conditionally) define the Sio Blocks library target PODIO_ADD_SIO_IO_BLOCKS. The I/O backends that are supported by podio are exported via the PODIO_IO_HANDLERS list variable.

    • +
    • podio_generate_datamodel.py now additionally takes the I/O handlers that should be generated as arguments. This is also reflected in an additional argument to PODIO_GENERATE_DATAMODEL. To have backwards compatibility, this additional argument defaults to ROOT in both cases and downstream packages should work as usual without changes.

    • +
    +
  • +
  • 2020-10-06 tmadlener (PR#133)

    +
      +
    • Make ROOTReader handle file switches properly for meta data reading.

    • +
    +
  • +
  • 2020-09-29 tmadlener (PR#141)

    +
      +
    • Update CI actions to use LCG 96, 97, 98 for mac, centos7 and ubuntu1804

    • +
    • Make python bindings work with root 6.22 (and onwards)

    • +
    • Make sure that root has been built with c++17 at the cmake stage

    • +
    • Require at least CMake 3.12

    • +
    +
  • +
  • 2020-09-18 tmadlener (PR#134)

    +
      +
    • Make the EventStore actually take ownership of the metadata passed to it by the readers. (see #139)

    • +
    • Make the collections properly clean up data of VectorMembers (see #139)

    • +
    • Fix small memory leak in the EventStore for the CollectionIDTable.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#128)

    +
      +
    • Fix a possible nullptr access in the Writers and make registerForWrite return a boolean to make it easier to check from the calling site.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#127)

    +
      +
    • cleanup of GenericParameters for meta data +- remove mutable from internal maps

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#126)

    +
      +
    • No longer install python unittest files

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#125)

    +
      +
    • improve CollectionIDTable +- previously used a std::recursive_mutex which is unnecessary in this case +- made whatever can be made const const and now use std::distance to calculate the index.

    • +
    +
  • +
  • 2020-08-28 tmadlener (PR#129)

    +
      +
    • Reduce memory footprint by clearing intermediately used I/O buffers.

    • +
    +
  • +
+
+
+

v00-12

+
    +
  • 2020-08-11 Frank Gaede (PR#124)

    +
      +
    • minor bug fix for macos: +- add <sstream> to write.cpp +- fixes #123

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#122)

    +
      +
    • Update README to reflect the new requirements (i.e. jinja2)

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#121)

    +
      +
    • Update Ubuntu CI script to install the python requirements via pip.

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#120)

    +
      +
    • Use jinja2 template engine to generate c++ code. This makes it possible to more cleanly separate the generation of the c++ code and all the necessary pre-processing. Now only the pre-processing is done in python, while the complete generation is done using jinja2. This should make it much easier to make changes to the generated c++ code.

    • +
    +
  • +
  • 2020-08-05 tmadlener (PR#117)

    +
      +
    • Refactoring of the podio class generator to improve its readability. This refactoring is mainly focusing on reducing the size of some methods to make them easier to grasp as well as trying to more cleanly separate the validation of the inputs and the c++ code generation. The validation is stricter than the current version and will potentially break things. Specifically, the handling of ExtraCode and ConstExtraCode is now implemented according to the documentation. In the previous version this has somewhat diverged from there. The yaml declaration of components has been made equivalent to the ones of the datatypes but “old-style” definitions are still handled properly. In the latter case a deprecation warning is emitted. The generated c++ code is functionally equivalent, but not equal character by character. The differences are mainly whitespace, but at some places also some of the generated code has been updated to more recent c++ capabilities. Additionally, some tests for the validation are added. They are not really exhaustive and should be considered to serve mainly documenting purposes for the moment.

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#107)

    +
      +
    • Introduce range wrapper for OneToManyRelations and VectorMembers to allow range-based for loops

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#106)

    +
      +
    • Fix the possibility of running into infinite loops in the ostream operator with cyclical references

    • +
    +
  • +
  • 2020-08-03 Frank Gaede (PR#102)

    +
      +
    • add test example read_and_write.cpp

      +
        +
      • simple use case for reading in an event an writing (parts of it) to another file

      • +
      • currently fails with segmentation fault (to be fixed)

      • +
      +
    • +
    +
  • +
  • 2020-08-03 Valentin Volkl (PR#98)

    +
      +
    • add ubuntu ci build

    • +
    +
  • +
+
+
+

v00-11

+
    +
  • 2020-07-21 tmadlener (PR#101)

    +
      +
    • Fix bug where ConstObject with empty OneToManyRelations give an invalid iterator range, #100

    • +
    +
  • +
  • 2020-06-23 Andre Sailer (PR#99)

    +
      +
    • Point to libpodioDict.so instead of libpodio.so in rootmap file

    • +
    +
  • +
  • 2020-06-03 Frank Gaede (PR#92)

    +
      +
    • implement reading/writing of meta data for runs, events and collections

      +
        +
      • based on GenericParameters that hold named parameters of type int, float, string or vectors if these (copied from lcio::LCParameters)

      • +
      • meta data for the three types is always written

      • +
      • it is read only on request

      • +
      +
    • +
    • example for writing:

    • +
    +
       auto& evtMD = store.getEventMetaData() ;
    +    evtMD.setValue( "UserEventWeight" , (float) 100.*i ) ;
    +
    +
    +
      +
    • example for reading:

    • +
    +
      auto& evtMD = store.getEventMetaData() ;
    +  float evtWeight = evtMD.getFloatVal( "UserEventWeight" ) ;
    +
    +
    +
      +
    • addresses #49

    • +
    +
  • +
  • 2020-05-26 Andre Sailer (PR#91)

    +
      +
    • Ensure podioRootIO is linked against podioDict even when linker uses as-needed by default, fixes #90

    • +
    +
  • +
  • 2020-05-26 Thomas Madlener (PR#89)

    +
      +
    • Updated README and env.sh to reflect changes in install process

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#88)

    +
      +
    • change add relation naming addXxxx -> addToXxxxs

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#87)

    +
      +
    • update minimum required CMake version to 3.8

    • +
    • remove obsolete Jenkinsfile

    • +
    • make CPack config optional: cmake variable ENABLE_CPACK defaults to OFF

    • +
    • update Readme with Spack instructions

    • +
    +
  • +
  • 2020-04-14 Frank Gaede (PR#83)

    +
      +
    • allow automatic change of version in CMakeLists.txt

      +
        +
      • fixes #82

      • +
      +
    • +
    +
  • +
+
+
+

v00-10

+
    +
  • 2020-04-03 Frank Gaede (PR#81)

    +
      +
    • make compatible with macos and clang

      +
        +
      • use -Wl,-undefined,dynamic_lookup w/ AppleClang

        +
          +
        • make the same, default behavior on linux explicit w/ -Wl,--allow-shlib-undefined

        • +
        +
      • +
      • add ROOT::Core to TestDataModel library

      • +
      +
    • +
    +
  • +
  • 2020-04-03 Marko Petric (PR#80)

    +
      +
    • add a macOS test to GitHub actions

    • +
    +
  • +
  • 2020-04-03 Valentin Volkl (PR#75)

    +
      +
    • Fixes in python code for 2-3 compatibility

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#74)

    +
      +
    • Fix exception when podio_class_generator is called with -q/–quiet

    • +
    • Printout about includes only in verbose mode

    • +
    • Do not print warnings in quiet mode

    • +
    • Print each warning only once

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#73)

    +
      +
    • Added PODIO_GENERATE_DATAMODEL Cmake macro to call the class generator at the right time. see podioMacros for the signature

    • +
    +
  • +
  • 2020-03-11 Marko Petric (PR#72)

    +
      +
    • Update CI to use GitHub actions

    • +
    • Add test against a Python 3 LCG view

    • +
    • Remove travis

    • +
    • Add tests for Python 3 compatibility and flake8

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#70)

    +
      +
    • ClassGenerator: add option “includeSubfolder”, to always use `#include “<packagename>/<object>.h” etc. if set to “True”

    • +
    • Added sorting and “uniquing” of include lists. Some duplicates still occur because two different lists are used on occasion

    • +
    • Added $PACKAGE_NAME_ to include guards

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#69)

    +
      +
    • Move all Root dependencies (RootReader, RootWriter) of the podio Library into podioRootIO, rename podioDict to podioDict

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#68)

    +
      +
    • Add podioMacros.cmake to contain PODIO_GENERATE_DICTIONARY

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#67)

    +
      +
    • Change Yaml loader to preserve order of members as given in the yaml

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#65)

    +
      +
    • podio_class_generator: only write files if their content changed

    • +
    +
  • +
  • 2019-10-15 Valentin Volkl (PR#64)

    +
      +
    • Add BUILD_TESTS CMake option for building tests

    • +
    +
  • +
  • 2019-10-15 Pere Mato (PR#63)

    +
      +
    • Fix to avoid deprecated STL classes in C++17

    • +
    +
  • +
+
+
+

v00-09-02

+
    +
  • 2019-09-27 Frank Gaede (PR#60)

    +
      +
    • fixed the code generation for members with multi word types (long long, unsigned long,…) +- add example to ExampleHit: +- unsigned long long cellID // cellID

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59)

    +
      +
    • move templates inside the python directory when installing +- fixes: #58

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59) +/

  • +
  • 2019-09-27 Frank Gaede (PR#57)

    +
      +
    • allow for numbers in namespace and class names +- generate type name string for CollectionBase::getValueTypeName()
      +- fixes #56

    • +
    +
  • +
  • 2019-09-26 Frank Gaede (PR#55)

    +
      +
    • cache collection pointers for fast access in EventStore::get()

      +
        +
      • added EventStore::getFast(int id)

      • +
      • considerably speeds up XXCollection::setReferences() +when reading back collections

      • +
      +
    • +
    +
  • +
  • 2019-09-26 Ben Morgan (PR#54)

    +
      +
    • improve the CMake

      +
        +
      1. Consistent use of CMake usage requirements to propagate include and link dependencies

      2. +
      3. Full use of the CMakePackageConfigHelpers module to generate the podioConfig.cmake file and associated podioTargets.cmake

      4. +
      5. Automatically refind the ROOT dependency

      6. +
      7. Standardize install paths for CMake and template files +A podio client can, in CMake, do

      8. +
      +
    • +
    +
    find_package(podio REQUIRED)
    +add_executable(foo foo.cc)
    +target_link_libraries(foo podio::podio)
    +
    +
    +

    and all include/link paths will be set correctly.

    +
  • +
  • 2019-08-21 Javier Cervantes Villanueva (PR#51) +Do not install tests

    +
      +
    • Allow tests to run after the build phase

    • +
    • Paths have been modified to point to binary or source directories

    • +
    • Before, tests had to be run only after running make install

    • +
    • Test are not installed anymore

    • +
    • Fail tests if any error is reported (ROOT Interpreter error may not be considered by CMake)

    • +
    +
  • +
  • 2019-05-10 Frank Gaede (PR#45)

    +
      +
    • updated documentation

      +
        +
      • add guidelines for contributing

      • +
      +
    • +
    • reverted some name changes in tests/examples (fixes #44)

      +
        +
      • read-one now again called read

      • +
      +
    • +
    • enamble dryrun again for generate-edm test

    • +
    +
  • +
  • 2019-04-09 Marko Petric (PR#43)

    +
      +
    • Implementation of CI based on LCG views, as suggested in #42

    • +
    +
  • +
  • 2019-04-09 Graeme A Stewart (PR#41)

    +
      +
    • Improve convenience setup scripts and build instructions +- remove FCC specific code from init.sh +- factorise environment setup to env.sh +- updated README.md

    • +
    +
  • +
  • 2019-03-24 Javier Cervantes (PR#40)

    +
      +
    • ROOTReader now supports multiple inputs thanks to new implementation based on TChain

    • +
    • ROOTReader now supports opening files via xrootd (root:///eospublic.cern.ch//eos... for example)

    • +
    • Improved CMake and CPack configuration, sticking more closely to HSF template

    • +
    +
  • +
+
+
+

v00-09

+
    +
  • 2018-12-20 Frank Gaede (PR#39)

    +
      +
    • add some fixes and improvements

      +
        +
      • fix forward declarations in Object template when using a namespace for the EDM

      • +
      • fix array getter names when using the get/set syntax

      • +
      • add missing treatment for include statements in component’s header files

      • +
      • handle array members in ostream operators

      • +
      +
    • +
    • add CollectionBase::size() member function

      +
        +
      • allows to access collection size w/o knowing the concrete type

      • +
      • method is already generated in implementation classes

      • +
      +
    • +
    +
  • +
  • 2018-12-06 Frank Gaede (PR#38)

    +
      +
    • add code generation for I/O of vector members +- vector members are treated analogous to the reference vectors,i.e. +streamed as one large vector per collection

    • +
    • updated tests/datamodel accordingly (using clang-format)

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#37)

    +
      +
    • handle references and vector members in collection’s ostream operators

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#36)

    +
      +
    • add github templates for releaase notes, issues and contribution guidelines

    • +
    • add ReleaseNotes.md +- contains all commit logs so far (v00-08)

    • +
    +
  • +
+
+
+

v00-08

+
    +
  • 2017-11-02 hegner

    +
      +
    • Merge pull request #32 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-09-13 Colin Bernet

    +
      +
    • Merge pull request #60 from cbernet/nofile_fix

    • +
    +
  • +
  • 2017-09-12 Colin

    +
      +
    • fixed segv when opening a non accessible input file

    • +
    • fix test in interactive mode. write program had been moved

    • +
    +
  • +
  • 2017-06-21 Colin Bernet

    +
      +
    • Merge pull request #59 from cbernet/pyeventstore_filename

    • +
    +
  • +
  • 2017-06-20 Colin

    +
      +
    • can now get the name of the current file (useful when reporting exceptions)

    • +
    +
  • +
  • 2017-05-29 hegner

    +
      +
    • Merge pull request #58 from jlingema/clangf

    • +
    +
  • +
  • 2017-05-29 Joschka Lingemann

    +
      +
    • Fix bug introduced with clang format class gen would crash if clang-format was not used

    • +
    +
  • +
  • 2017-05-23 hegner

    +
      +
    • Merge pull request #53 from jlingema/array

    • +
    • Merge pull request #55 from jlingema/clangf

    • +
    • Merge pull request #57 from jlingema/fixWarnings

    • +
    +
  • +
  • 2017-05-22 Joschka Lingemann

    +
      +
    • Regenerate test datamodel

    • +
    • Add override statements

    • +
    +
  • +
  • 2017-04-20 Joschka Lingemann

    +
      +
    • Only call clang-format if it is in PATH

    • +
    +
  • +
  • 2017-04-11 Joschka Lingemann

    +
      +
    • Add language hints for syntax highlighting in docs

    • +
    • Add options of class generator to README

    • +
    • Add test for clang format

    • +
    • Add clang to path in init

    • +
    • Add clang-format application as option, closes #54

    • +
    +
  • +
  • 2017-04-07 Joschka Lingemann

    +
      +
    • Regenerated datamodel

    • +
    • Fix test in read and write for array of struct

    • +
    • Fixes in parser for arrays of struct

    • +
    • Add test for array of struct

    • +
    • Add includes for arrays of PODs

    • +
    +
  • +
  • 2017-04-04 Benedikt Hegner

    +
      +
    • temporarily disable outputstream for arrays

    • +
    +
  • +
  • 2017-04-04 hegner

    +
      +
    • Merge pull request #26 from gaede/add_ascii_io

    • +
    • Merge branch ‘master’ into add_ascii_io

    • +
    +
  • +
  • 2017-03-24 zaborowska

    +
      +
    • Merge pull request #52 from jlingema/array

    • +
    +
  • +
  • 2017-03-24 Joschka Lingemann

    +
      +
    • Add ROOT version requirement

    • +
    +
  • +
  • 2017-03-21 hegner

    +
      +
    • Merge pull request #30 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-03-20 hegner

    +
      +
    • Merge pull request #50 from jlingema/array

    • +
    +
  • +
  • 2017-03-13 Joschka Lingemann

    +
      +
    • Increase version requirement in README

    • +
    • Removing FindROOT macro, using standard use-file

    • +
    • Migrate to LCG_88

    • +
    • silence warning of unsigned -> int

    • +
    • Merge remote branch ‘origin/master’ into array

    • +
    +
  • +
  • 2017-03-02 Joschka Lingemann

    +
      +
    • Add implementation for array members

    • +
    +
  • +
  • 2017-02-15 Joschka Lingemann

    +
      +
    • Add test for datatype with array-member.

    • +
    +
  • +
  • 2017-02-21 zaborowska

    +
      +
    • Merge pull request #49 from jlingema/cvmfs

    • +
    +
  • +
  • 2017-02-21 Joschka Lingemann

    +
      +
    • Remove unused variable, add check if PODIO is set.

    • +
    • Move to cvmfs

    • +
    • Set ROOT_INCLUDE_PATH of pyunittest to avoid failure if FCC env is set.

    • +
    +
  • +
  • 2016-12-12 zaborowska

    +
      +
    • Merge pull request #47 from jlingema/master

    • +
    +
  • +
  • 2016-12-09 Joschka Lingemann

    +
      +
    • Regenerated datamodel with check against invalid collections.

    • +
    • Add check against OneToManyRelations to invalid collections

    • +
    • Move to LCG_87

    • +
    +
  • +
  • 2016-12-09 hegner

    +
      +
    • Merge pull request #46 from jlingema/master

    • +
    +
  • +
  • 2016-12-06 Joschka Lingemann

    +
      +
    • Require C++14.

    • +
    +
  • +
  • 2016-11-07 hegner

    +
      +
    • Merge pull request #45 from jlingema/master

    • +
    +
  • +
  • 2016-10-17 Benedikt Hegner

    +
      +
    • add method to register collection

    • +
    • remove need for templating on registering for writing

    • +
    +
  • +
  • 2016-09-30 Frank Gaede

    +
      +
    • remove debug printout for found components

    • +
    • add example for using ASCIWriter - write_ascii

    • +
    • fixed const_relation getters w/ getSyntax

    • +
    • regenerated EDM, ostream operator<<, id() and o.->

    • +
    • add ASCIIWriter

    • +
    • improved creation of ostream operators etc.

    • +
    +
  • +
  • 2016-09-26 Joschka Lingemann

    +
      +
    • Add non-const accessors for non-const collections.

    • +
    +
  • +
  • 2016-08-23 hegner

    +
      +
    • Merge pull request #44 from jlingema/docs

    • +
    • Merge pull request #43 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-08-23 Joschka Lingemann

    +
      +
    • Change option to be the same across projects.

    • +
    +
  • +
  • 2016-08-16 Joschka Lingemann

    +
      +
    • Improve readability of code base name and version.

    • +
    • Allow to customize version for doxygen via cli.

    • +
    • Use readme as title page for doxygen.

    • +
    • Change version to tags currently used.

    • +
    +
  • +
  • 2016-08-15 Joschka Lingemann

    +
      +
    • Add unsigned long to the list of builtins for consistency.

    • +
    • add test that regenerates datamodel in dry-run mode.

    • +
    • Add dry-run option.

    • +
    +
  • +
  • 2016-08-09 Joschka Lingemann

    +
      +
    • Remove unnecessary dict.

    • +
    +
  • +
  • 2016-07-29 Joschka Lingemann

    +
      +
    • Add support for (unsigned) long long

    • +
    • Fix indentation

    • +
    +
  • +
  • 2016-07-28 hegner

    +
      +
    • Merge pull request #25 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-28 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add a paragraph on options in the datamodel description files.

    • +
    • Add checks for clashing getter and setter names.

    • +
    • Add doxygen comments.

    • +
    +
  • +
  • 2016-07-27 hegner

    +
      +
    • Merge pull request #42 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-27 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add tests for direct accessors and setters of POD members.

    • +
    • Merge with changes for doxygen comments and member exposure

    • +
    • Merge pull request #24 from jlingema/fix_cpy_relations

    • +
    • Add missing ; and switch to operator==

    • +
    • Code cleanup.

    • +
    +
  • +
  • 2016-07-26 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Removing print info generation, as that creates compilation issues.

    • +
    • Merge with recent changes from hegner/podio.

    • +
    • Remove print outs

    • +
    • Regenerated datamodel.

    • +
    • Extend tests to have empty references.

    • +
    • Initialize relations on copy only if they are set.

    • +
    +
  • +
  • 2016-07-25 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add test for deep copy.

    • +
    • Bug fix: Initialisation of OneToOneRelations when copying.

    • +
    +
  • +
  • 2016-07-22 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’

    • +
    • Add tests for direct getter and setter of POD members.

    • +
    • Bug fix: option value already parsed to bool.

    • +
    • Add getters for POD members in Const objects.

    • +
    • Regenerated datamodel.

    • +
    • Remove trailing ; to silence compiler warning.

    • +
    • Add options to yaml files and parser for get syntax and pod data exposure.

    • +
    • Expose POD member members in objects.

    • +
    • Adding comments that show up in doxygen.

    • +
    +
  • +
  • 2016-07-12 hegner

    +
      +
    • Merge pull request #40 from jlingema/master

    • +
    +
  • +
  • 2016-07-12 Joschka Lingemann

    +
      +
    • Revert to operator[], add function checking presence of a collection.

    • +
    • Adding way to only clear the chaches (needed for FCCSW).

    • +
    • Change way to access IDs and names to allow catching exceptions.

    • +
    +
  • +
  • 2016-06-30 Benedikt Hegner

    +
      +
    • update doc as preparation for milestone document

    • +
    +
  • +
  • 2016-06-17 Joschka Lingemann

    +
      +
    • Add test for OneToManyRelations in namespaces. Fix class-generator.

    • +
    +
  • +
  • 2016-06-16 hegner

    +
      +
    • Merge pull request #22 from Steinweg/eike_operators_new

    • +
    +
  • +
  • 2016-06-15 Eike Steinweg

    +
      +
    • implemented ostream operators - std::ostream operator<<() created for components, objects and collections - create PrintInfo classes for formatted (tabular) printout of collections

    • +
    +
  • +
  • 2016-06-14 Benedikt Hegner

    +
      +
    • add convenience methods to python interface

    • +
    +
  • +
  • 2016-06-13 Benedikt Hegner

    +
      +
    • fix problem of wrong references being stored

    • +
    +
  • +
  • 2016-06-13 hegner

    +
      +
    • Merge pull request #21 from gaede/reference_bug_test

    • +
    +
  • +
  • 2016-06-13 Frank Gaede

    +
      +
    • fixed error message for test case

    • +
    • add test case for bug with reading back references

    • +
    +
  • +
  • 2016-06-03 hegner

    +
      +
    • Merge pull request #19 from jlingema/pyinterface

    • +
    +
  • +
  • 2016-05-24 Joschka Lingemann

    +
      +
    • Fix close method.

    • +
    • Improving py interface.

    • +
    • Merge remote branch ‘hegner/master’

    • +
    +
  • +
  • 2016-05-19 hegner

    +
      +
    • Merge pull request #39 from jlingema/master

    • +
    +
  • +
  • 2016-05-19 Joschka Lingemann

    +
      +
    • Remove hard-coded build-type.

    • +
    +
  • +
  • 2016-05-18 hegner

    +
      +
    • Merge pull request #38 from jlingema/master

    • +
    +
  • +
  • 2016-05-18 Joschka Lingemann

    +
      +
    • Increase write-test event number to 2000.

    • +
    • Merge pull request #18 from jlingema/master

    • +
    • Fixing indentation errors.

    • +
    • Reverting to LCG_83 and afs.

    • +
    +
  • +
  • 2016-05-12 Benedikt Hegner

    +
      +
    • style changes

    • +
    +
  • +
  • 2016-04-26 hegner

    +
      +
    • Merge pull request #17 from gaede/improve_doc

    • +
    +
  • +
  • 2016-04-26 Frank Gaede

    +
      +
    • made the ink to doxygen explicit

    • +
    • add more doc links to README

    • +
    • dde some documenation links to Readme

    • +
    +
  • +
  • 2016-04-22 hegner

    +
      +
    • Merge pull request #16 from gaede/relation_bug

    • +
    +
  • +
  • 2016-04-22 Frank Gaede

    +
      +
    • added ExampleMC to show bug in storing relations

    • +
    • bug fix in {ref}_end() for empty relation

    • +
    +
  • +
  • 2016-04-21 Frank Gaede

    +
      +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    +
  • +
  • 2016-04-20 hegner

    +
      +
    • Merge pull request #15 from gaede/add_getters_setters

    • +
    +
  • +
  • 2016-04-20 Frank Gaede

    +
      +
    • add unittest “AssociativeContainer” set/map

    • +
    • remove incorrect access to reference vector method

    • +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    • Merge pull request #13 from gaede/fix_extracode

    • +
    • optional get/set syntax; operator<(); acces to reference vector

    • +
    +
  • +
  • 2016-04-20 Benedikt Hegner

    +
      +
    • clean up references at better place

    • +
    • Merge pull request #14 from jlingema/memleaks

    • +
    +
  • +
  • 2016-04-20 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’ into memleaks

    • +
    • Fixing memory leak.

    • +
    +
  • +
  • 2016-04-19 Frank Gaede

    +
      +
    • fixed extra code generation for ConstObject

    • +
    +
  • +
  • 2016-04-19 hegner

    +
      +
    • Merge pull request #12 from gaede/extracode_in_components

    • +
    • add unit test for extracode in component

    • +
    +
  • +
  • 2016-04-19 Benedikt Hegner

    +
      +
    • add link to bug tracker

    • +
    • clear references properly

    • +
    • test for adding extra code to components

    • +
    • fix for handling components w/o extra code

    • +
    • allow for extra code declarations in components

    • +
    • fix object ownership and leak at deletion of collection

    • +
    +
  • +
  • 2016-04-18 Benedikt Hegner

    +
      +
    • add support for strings as members

    • +
    • removing wrong file

    • +
    • adding more docs

    • +
    • extend datamodel validation

    • +
    • add gitignore file

    • +
    +
  • +
  • 2016-04-17 Benedikt Hegner

    +
      +
    • move examples into tests to make space for real end-user examples

    • +
    • Merge branch ‘master’ of github.com:hegner/podio into catch

    • +
    • migrate from gtest to catch

    • +
    • move component cross-checking into validator

    • +
    • add hook for datamodel validator

    • +
    • fix PODIO-6

    • +
    • add support for user specified code snippets

    • +
    • add pointerless read interface

    • +
    • fix case when multiple many-relations are defined; fix writing example

    • +
    +
  • +
  • 2016-04-13 hegner

    +
      +
    • Merge pull request #11 from gaede/master

    • +
    +
  • +
  • 2016-04-13 Frank Gaede

    +
      +
    • added clusters in clusters as test for infinite recursion

    • +
    • Merge branch ‘master’ of https://github.com/gaede/podio

    • +
    • Merge branch ‘master’ of https://github.com/hegner/podio

    • +
    +
  • +
  • 2016-04-13 Benedikt Hegner

    +
      +
    • move to using LCG releases from CVMFS

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • Merge branch ‘master’ of github.com:hegner/podio

    • +
    • remove unneeded parameter from processEvent

    • +
    • Merge pull request #10 from gaede/master

    • +
    • starting to add more documentation

    • +
    +
  • +
  • 2016-04-12 Frank Gaede

    +
      +
    • big fix: clear vector of internal references in Collcection::clear()

    • +
    • set podio_LIBRARIES in podioConfig.cmake

    • +
    +
  • +
  • 2016-04-11 Frank Gaede

    +
      +
    • creare source directories for class generator if needed

    • +
    +
  • +
  • 2016-04-07 clementhelsens

    +
      +
    • Merge pull request #37 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 hegner

    +
      +
    • Merge pull request #9 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 Joschka Lingemann

    +
      +
    • Using TFile::Open allows to also read eos files.

    • +
    +
  • +
  • 2016-03-14 hegner

    +
      +
    • Merge pull request #8 from jlingema/master

    • +
    +
  • +
  • 2016-03-14 Joschka Lingemann

    +
      +
    • Add templates file.

    • +
    • Fixing whitespace in templates according to FCC style.

    • +
    • First round of code clean-up. Moving code templates out of the generator. Move re-used functionality in functions.

    • +
    +
  • +
  • 2016-03-10 Joschka Lingemann

    +
      +
    • Moving member parsing in separate function.

    • +
    +
  • +
  • 2016-03-09 Joschka Lingemann

    +
      +
    • Add missing class from example datamodel.

    • +
    +
  • +
  • 2016-03-03 hegner

    +
      +
    • Merge pull request #34 from cbernet/tutorial_2

    • +
    +
  • +
  • 2016-03-03 Joschka Lingemann

    +
      +
    • Merge pull request #36 from hegner/master

    • +
    +
  • +
  • 2016-03-01 Benedikt Hegner

    +
      +
    • help cmake finding the proper gtest

    • +
    • use LCG 83 view

    • +
    +
  • +
  • 2016-03-01 Colin

    +
      +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-22 Colin

    +
      +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Joschka Lingemann

    +
      +
    • Adding dependencies for tests of examples.

    • +
    +
  • +
  • 2016-02-19 Colin

    +
      +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    +
  • +
  • 2016-02-18 Joschka Lingemann

    +
      +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    +
  • +
  • 2016-02-11 Colin

    +
      +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    +
  • +
  • 2016-02-10 Colin

    +
      +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-03-01 Colin Bernet

    +
      +
    • Merge pull request #35 from cbernet/master

    • +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-23 Colin

    +
      +
    • updated README

    • +
    • updated README

    • +
    • updated README

    • +
    • improved README

    • +
    • added python read example

    • +
    +
  • +
  • 2016-02-23 Colin Bernet

    +
      +
    • Merge pull request #33 from cbernet/master

    • +
    • Merge remote-tracking branch ‘official/master’

    • +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Colin Bernet

    +
      +
    • Merge pull request #32 from jlingema/master

    • +
    • Adding dependencies for tests of examples.

    • +
    • Merge pull request #31 from cbernet/master

    • +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    • Merge pull request #30 from jlingema/fix_include

    • +
    • Merge pull request #28 from cbernet/master

    • +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    • Merge pull request #29 from hegner/master

    • +
    +
  • +
  • 2016-02-18 Benedikt Hegner

    +
      +
    • add missing ID setting when free-floating collections are added to the store

    • +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-02-09 hegner

    +
      +
    • Merge pull request #7 from HEP-FCC/master

    • +
    +
  • +
  • 2016-02-09 Joschka Lingemann

    +
      +
    • Merge pull request #26 from cbernet/unified_env

    • +
    • Merge pull request #27 from hegner/master

    • +
    • Merge pull request #5 from zaborowska/fileZombie

    • +
    • Merge pull request #6 from zaborowska/rename

    • +
    +
  • +
  • 2016-02-09 Benedikt Hegner

    +
      +
    • beautify generated doxygen

    • +
    +
  • +
  • 2016-02-09 Colin

    +
      +
    • improving readme

    • +
    +
  • +
  • 2016-01-08 Colin

    +
      +
    • pick up soft on afs only at cern

    • +
    +
  • +
  • 2016-01-07 Colin

    +
      +
    • unified environment initialization

    • +
    +
  • +
  • 2016-02-08 zaborowska

    +
      +
    • Renaming Albers to PODIO

    • +
    +
  • +
  • 2016-02-08 Anna

    +
      +
    • Checking if file opened correctly

    • +
    +
  • +
  • 2016-02-05 Benedikt Hegner

    +
      +
    • remove deprecated files after merge

    • +
    • Merge branch ‘hegner-master’

    • +
    • resolve conflicts

    • +
    +
  • +
  • 2016-02-05 hegner

    +
      +
    • Merge pull request #3 from jlingema/master

    • +
    +
  • +
  • 2016-02-04 Joschka Lingemann

    +
      +
    • Adding install target for templates.

    • +
    • Merge with remote.

    • +
    • Change to new options. Add how to list all options.

    • +
    • Adding options for doxygen and gtest.

    • +
    +
  • +
  • 2016-02-01 Joschka Lingemann

    +
      +
    • Merge with remote master.

    • +
    • Adding examples to library paths.

    • +
    • Changing install destination for pcm / rootmap.

    • +
    • Updating instructions to new test folder structure

    • +
    +
  • +
  • 2016-01-29 Joschka Lingemann

    +
      +
    • Small cosmetic fixes to read-me.

    • +
    +
  • +
  • 2016-01-28 Joschka Lingemann

    +
      +
    • Adding how to run tests.

    • +
    • Changing testing structure to make unit-tests optional.

    • +
    • Adapting to Apple specifics.

    • +
    • Re-adding Find-ROOT macro.

    • +
    +
  • +
  • 2016-01-26 Joschka Lingemann

    +
      +
    • Fixing namespaces of members of objects.

    • +
    • Fixing namespacing of members for components.

    • +
    • Fix: Namespaced component in another component.

    • +
    +
  • +
  • 2016-01-18 Joschka Lingemann

    +
      +
    • Fixing path for python environment

    • +
    +
  • +
  • 2016-01-15 Joschka Lingemann

    +
      +
    • Adding python environment and pytools for PyYAML.

    • +
    • Splitting implementation and header files.

    • +
    • Newly generated datamodel.

    • +
    • Adding tests for namespaced data.

    • +
    • Fix relations for namespaced datamembers.

    • +
    • Removing trailing ; to silence warning.

    • +
    • First iteration of namespace support.

    • +
    • Adding handling of non-builtin members and fixing compile warnings

    • +
    +
  • +
  • 2016-01-13 Joschka Lingemann

    +
      +
    • Updating externals according to current FCCSW.

    • +
    +
  • +
  • 2015-11-18 Benedikt Hegner

    +
      +
    • make vector member code compile

    • +
    • add more forward declarations handling class A->B->A reference cases

    • +
    • move setter/getter implementation into CC file’

    • +
    +
  • +
  • 2015-10-22 Benedikt Hegner

    +
      +
    • install dictionaries explicitly

    • +
    +
  • +
  • 2015-10-21 Benedikt Hegner

    +
      +
    • fix bug for storing unitialized references

    • +
    • add new unit test covering non-filled relations

    • +
    +
  • +
  • 2015-10-19 Benedikt Hegner

    +
      +
    • add more single-ref unit tests; fix infinite loop

    • +
    +
  • +
  • 2015-10-16 Benedikt Hegner

    +
      +
    • allow chaining of components

    • +
    +
  • +
  • 2015-10-16 hegner

    +
      +
    • Merge pull request #1 from zaborowska/master

    • +
    +
  • +
  • 2015-10-16 Anna

    +
      +
    • Merge branch ‘master’ into test

    • +
    • Rename of examples->tests in init and README

    • +
    • Missing include of gtest added

    • +
    • added ‘setter’ for components

    • +
    +
  • +
  • 2015-10-15 Benedikt Hegner

    +
      +
    • add tests for components

    • +
    • move data definition syntax into separate markdown file

    • +
    +
  • +
  • 2015-10-14 Benedikt Hegner

    +
      +
    • new iteration of data model w/ new reference accessors

    • +
    • add tests for python interface

    • +
    • enable tests for python interface

    • +
    • remove accidentally added file

    • +
    • install python files

    • +
    • move PythonEventStore into podio namespace

    • +
    • add at() to methods of the collection

    • +
    • renaming package creation script

    • +
    +
  • +
  • 2015-10-13 Benedikt Hegner

    +
      +
    • update to new datamodel; fix mem leak

    • +
    • major refurbishment of podio; new interfaces in doc/doc.md

    • +
    +
  • +
  • 2015-05-12 Benedikt Hegner

    +
      +
    • adjust scripts to new naming convention

    • +
    +
  • +
  • 2015-05-11 Benedikt Hegner

    +
      +
    • rename albers into podio

    • +
    +
  • +
  • 2015-04-24 Benedikt Hegner

    +
      +
    • add CollectionBase to dictionaries

    • +
    +
  • +
  • 2015-04-22 Benedikt Hegner

    +
      +
    • add new tests; feature complete for lcio

    • +
    • next step towards lcio modelling

    • +
    • prepare for future vector member feature

    • +
    • removing deprecated method for supporting XYZHandle convention

    • +
    • upgrading the lcio layout

    • +
    • add more buildin types

    • +
    • removed code duplication in code generation

    • +
    • complete testing of single references

    • +
    • remove debug printout for the garbage collection

    • +
    +
  • +
  • 2015-04-21 Benedikt Hegner

    +
      +
    • adding std::array support

    • +
    • update code templates for new refs

    • +
    +
  • +
  • 2015-04-20 Benedikt Hegner

    +
      +
    • streamline definition syntax

    • +
    • Merge branch ‘master’ of github.com:hegner/albers

    • +
    • remove wrongly committed files

    • +
    +
  • +
  • 2015-04-20 Pere Mato

    +
      +
    • Minor changes in CMakeLists.txt to cope with XCode generation

    • +
    • don’t use the factory of the collection to create hits and refs

    • +
    • clarify namespace

    • +
    • update examples w/ new code generation

    • +
    • properly set relation vectors in push_back

    • +
    • create constructor with full signature

    • +
    +
  • +
  • 2015-04-19 Benedikt Hegner

    +
      +
    • vector member code #1

    • +
    • whitespace fix

    • +
    • first step towards lcio yaml file

    • +
    +
  • +
  • 2015-04-17 Benedikt Hegner

    +
      +
    • trivial python wrapper for event store

    • +
    • add simple non-existence check

    • +
    • add some doc strings

    • +
    • start using IReader

    • +
    • use method names acquire/release in ObjBase

    • +
    • add more docs

    • +
    • unify ref-counting behaviour

    • +
    • let XXXObj create relation collections themselves

    • +
    • add cloning and better initialization; aligning method implementation order with declaration order

    • +
    +
  • +
  • 2015-04-16 Benedikt Hegner

    +
      +
    • add proper destructor for XXXObj

    • +
    • add header needed for gcc

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • introducing ObjBase

    • +
    +
  • +
  • 2015-04-16 Pere Mato

    +
      +
    • test target is reserved from CMake > 3.0

    • +
    • Simplify CMakeLists files making use of ROOTConfig.cmake (ROOT build with CMake)

    • +
    • move delete command for Obj into the ref counting method

    • +
    • inline trivial setters and getters

    • +
    +
  • +
  • 2015-04-15 Benedikt Hegner

    +
      +
    • improve documentation

    • +
    • add doxygen target

    • +
    • whitespace

    • +
    • remove unneeded headers

    • +
    • fix gcc warnings

    • +
    • move to ROOT 6 on linux

    • +
    +
  • +
  • 2015-04-14 Benedikt Hegner

    +
      +
    • allow cyclic dependencies between collections and objects

    • +
    • setting collection ID on read

    • +
    • deprecate registry

    • +
    • first step towards deprecation of Registry

    • +
    • rename FooEntry classes to FooObj

    • +
    • fix cmake

    • +
    • next simplification of class generator; move more code into templates

    • +
    • first step towards simplified class generator

    • +
    • break circular header dependency in case types have references to the same type

    • +
    +
  • +
  • 2015-04-13 Benedikt Hegner

    +
      +
    • add handling of improper refs on writing

    • +
    • move implementations into cc file

    • +
    • add documentation draft; whitespace cleanup

    • +
    • add some comments

    • +
    • add some comments

    • +
    • rename event store methods

    • +
    • remove deprecated methods from Registry

    • +
    • fixing wrong whitespace

    • +
    • upgrade to new API supporting free-floating objects

    • +
    +
  • +
  • 2015-04-01 Benedikt Hegner

    +
      +
    • add newline at the end of the file

    • +
    +
  • +
  • 2014-12-11 Colin Bernet

    +
      +
    • Merge pull request #24 from cbernet/clone

    • +
    +
  • +
  • 2014-12-11 Colin

    +
      +
    • can clone an existing handle into a new collection.

    • +
    +
  • +
  • 2014-12-04 Colin Bernet

    +
      +
    • Merge pull request #23 from cbernet/edm_1

    • +
    +
  • +
  • 2014-12-03 Colin

    +
      +
    • removed getters and accessors from Handle

    • +
    • edm v1 compiles and runs.

    • +
    • class generation: can now have components inside components

    • +
    • uniform syntax for members

    • +
    +
  • +
  • 2014-12-02 Colin

    +
      +
    • edm_1 done, but need to review naming scheme and simplify a bit

    • +
    • started to work on first detailed edm prototype.

    • +
    +
  • +
  • 2014-12-02 Benedikt Hegner

    +
      +
    • remove incomplete relation code; was accidental commit

    • +
    +
  • +
  • 2014-11-26 Benedikt Hegner

    +
      +
    • adjusted to new structure of headers

    • +
    +
  • +
  • 2014-10-26 Benedikt Hegner

    +
      +
    • make friend declaration confirm standard; needed by genreflex

    • +
    +
  • +
  • 2014-10-24 hegner

    +
      +
    • Merge pull request #22 from hegner/master

    • +
    +
  • +
  • 2014-10-24 Benedikt Hegner

    +
      +
    • fix warnings

    • +
    • Merge pull request #21 from hegner/master

    • +
    • fix merge problems at runtime

    • +
    • revert to original data model setup

    • +
    • merge HEAD

    • +
    • towards n-to-n relation improvements; make class generator create other directory structure

    • +
    +
  • +
  • 2014-10-10 Colin

    +
      +
    • fixes for python import

    • +
    +
  • +
  • 2014-10-10 Colin Bernet

    +
      +
    • Merge pull request #20 from cbernet/python

    • +
    • added python specific stuff to install scripts

    • +
    • Merge pull request #19 from cbernet/python

    • +
    +
  • +
  • 2014-10-09 Colin

    +
      +
    • reader can now navigate directly to a given event number

    • +
    +
  • +
  • 2014-10-07 Colin Bernet

    +
      +
    • Merge pull request #18 from cbernet/python

    • +
    +
  • +
  • 2014-10-07 Colin

    +
      +
    • python read example ready

    • +
    • Merge branch ‘python’ of github.com:cbernet/albers into python

    • +
    • code more pythonic; unittests

    • +
    • python event store working

    • +
    +
  • +
  • 2014-10-06 Colin Bernet

    +
      +
    • Merge pull request #17 from cbernet/python

    • +
    • Update README.md

    • +
    +
  • +
  • 2014-10-06 Colin

    +
      +
    • handles working in python

    • +
    • added python test file

    • +
    +
  • +
  • 2014-10-02 Colin Bernet

    +
      +
    • Merge pull request #16 from cbernet/leptons

    • +
    +
  • +
  • 2014-10-02 Colin

    +
      +
    • added a muon to the event, and computing its isolation.

    • +
    • added print operator for ParticleHandle in utilities

    • +
    • Merge pull request #15 from cbernet/more_utility

    • +
    • bug fix in Collections. particle overlap checking based on handles

    • +
    +
  • +
  • 2014-10-01 Colin

    +
      +
    • write and read on 100000 events. solved rare problems by setting an eta cut in the generator.

    • +
    +
  • +
  • 2014-10-01 Colin Bernet

    +
      +
    • Merge pull request #14 from cbernet/dummy_generator

    • +
    • Dummy generator generates two jets

    • +
    • on-demand reading tested in read example

    • +
    • now using only the jets and the particles from the DummyGenerator

    • +
    • Merge pull request #13 from cbernet/coll_in_registry

    • +
    • CollectionBase pointers now registered in Registry. Changed writer interface

    • +
    • added first version of a dummy multijet event generator

    • +
    +
  • +
  • 2014-09-30 Colin

    +
      +
    • new utility functions. < operator for handles.

    • +
    +
  • +
  • 2014-09-29 Colin

    +
      +
    • Jet and vector utility functions used in write and read

    • +
    • print functions for Collections, and first utility functions

    • +
    +
  • +
  • 2014-09-28 Benedikt Hegner

    +
      +
    • take last element and increment by one for end iterator

    • +
    • fix bug of invalid references in user land

    • +
    +
  • +
  • 2014-09-27 Benedikt Hegner

    +
      +
    • next step towards one-to-many-relations; collection has proper members now

    • +
    • update and clean templates

    • +
    • add first part of one-to-many capabilities to POD and Handle

    • +
    +
  • +
  • 2014-09-25 Colin

    +
      +
    • using the new datamodel in read and write. Reading problem at first event!

    • +
    • developed data model

    • +
    +
  • +
  • 2014-09-25 Colin Bernet

    +
      +
    • Merge pull request #12 from cbernet/few_easy_mods

    • +
    • macos X initialization script

    • +
    • Merge branch ‘master’ into merge_attempt

    • +
    +
  • +
  • 2014-09-24 Benedikt Hegner

    +
      +
    • change syntax for data generation; part 1

    • +
    +
  • +
  • 2014-09-24 Colin

    +
      +
    • a bit of clean up

    • +
    +
  • +
  • 2014-09-23 Benedikt Hegner

    +
      +
    • simplify the structure of the PODs; now really look like structs

    • +
    • add functionality of defining components; simplify datamodel example and writer code

    • +
    • fix pedantic compilation warning

    • +
    +
  • +
  • 2014-09-23 Colin Bernet

    +
      +
    • Merge pull request #11 from cbernet/event_loop

    • +
    +
  • +
  • 2014-09-23 Colin

    +
      +
    • event loop in reader working, but messy ! overall design to be clarified

    • +
    • bug fix: not writing to TFile anymore just after filling the tree

    • +
    • Merge pull request #10 from cbernet/event_loop

    • +
    • implemented event loop in writer. big performance issue

    • +
    • Merge pull request #9 from cbernet/simple_edm

    • +
    +
  • +
  • 2014-09-22 Colin

    +
      +
    • example mains adapted to new EDM

    • +
    • bug fix for multiple includes

    • +
    • realistic data model

    • +
    +
  • +
  • 2014-09-22 Colin Bernet

    +
      +
    • Merge pull request #8 from cbernet/auto_handle_ptr

    • +
    • buffer address in embedded handles set in prepareAfterRead automatically

    • +
    • initialed collectionID to 0, and improved const-correctness

    • +
    • collection id is now unsigned

    • +
    • Merge pull request #7 from cbernet/macos_build_merge

    • +
    • Merge branch ‘macos_build’ into macos_build_merge

    • +
    • Merge branch ‘master’ of github.com:HEP-FCC/albers

    • +
    • conditional for mac os x

    • +
    • able to build on macos, need to test lxplus6

    • +
    +
  • +
  • 2014-09-21 Colin Bernet

    +
      +
    • reformatted README properly

    • +
    +
  • +
  • 2014-09-21 Colin

    +
      +
    • commented the code: Reader, Handle

    • +
    +
  • +
  • 2014-09-19 Colin

    +
      +
    • Merge branch ‘documentation’ of github.com:cbernet/albers into documentation

    • +
    +
  • +
  • 2014-09-18 Colin

    +
      +
    • documentation and questions: EventStore, Collection, Registry, Writer

    • +
    • documentation and questions: EventStore, Collection, Registry

    • +
    • added an environment setup script

    • +
    +
  • +
  • 2014-09-17 Colin

    +
      +
    • more specific installation instructions

    • +
    • added a particle class, aiming for a Z boson example

    • +
    +
  • +
  • 2014-09-17 Benedikt Hegner

    +
      +
    • fix for the fact that yaml parsing doesn’t preserve ordering

    • +
    +
  • +
  • 2014-09-16 Benedikt Hegner

    +
      +
    • rearrange the example

    • +
    +
  • +
  • 2014-09-15 Benedikt Hegner

    +
      +
    • fix md

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • add initial descriptions

    • +
    • make it so

    • +
    +
  • +
  • 2014-09-15 hegner

    +
      +
    • Initial commit

    • +
    +
  • +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + +
+
Versions
+
docs-on-gh-pages
+
master
+
v00-00-00
+
v00-99
+
v99-99-99
+
+
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/_static/_sphinx_javascript_frameworks_compat.js b/docs-on-gh-pages/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/docs-on-gh-pages/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs-on-gh-pages/_static/basic.css b/docs-on-gh-pages/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/docs-on-gh-pages/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs-on-gh-pages/_static/check-solid.svg b/docs-on-gh-pages/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/docs-on-gh-pages/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs-on-gh-pages/_static/clipboard.min.js b/docs-on-gh-pages/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/docs-on-gh-pages/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/docs-on-gh-pages/_static/copybutton.css b/docs-on-gh-pages/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/docs-on-gh-pages/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/docs-on-gh-pages/_static/copybutton.js b/docs-on-gh-pages/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/docs-on-gh-pages/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/docs-on-gh-pages/_static/copybutton_funcs.js b/docs-on-gh-pages/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/docs-on-gh-pages/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/docs-on-gh-pages/_static/css/badge_only.css b/docs-on-gh-pages/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/docs-on-gh-pages/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Bold.woff b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Regular.woff b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.eot b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.svg b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.ttf b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.woff b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.woff2 b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-bold-italic.woff b/docs-on-gh-pages/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-bold-italic.woff2 b/docs-on-gh-pages/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-bold.woff b/docs-on-gh-pages/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-bold.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-bold.woff2 b/docs-on-gh-pages/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-normal-italic.woff b/docs-on-gh-pages/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-normal-italic.woff2 b/docs-on-gh-pages/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-normal.woff b/docs-on-gh-pages/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-normal.woff differ diff --git a/docs-on-gh-pages/_static/css/fonts/lato-normal.woff2 b/docs-on-gh-pages/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/docs-on-gh-pages/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs-on-gh-pages/_static/css/theme.css b/docs-on-gh-pages/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/docs-on-gh-pages/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs-on-gh-pages/_static/doctools.js b/docs-on-gh-pages/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/docs-on-gh-pages/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs-on-gh-pages/_static/documentation_options.js b/docs-on-gh-pages/_static/documentation_options.js new file mode 100644 index 000000000..1823c1bde --- /dev/null +++ b/docs-on-gh-pages/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: false, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs-on-gh-pages/_static/file.png b/docs-on-gh-pages/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/docs-on-gh-pages/_static/file.png differ diff --git a/docs-on-gh-pages/_static/jquery.js b/docs-on-gh-pages/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/docs-on-gh-pages/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs-on-gh-pages/_static/js/html5shiv.min.js b/docs-on-gh-pages/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/docs-on-gh-pages/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs-on-gh-pages/_static/js/theme.js b/docs-on-gh-pages/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/docs-on-gh-pages/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs-on-gh-pages/_static/minus.png b/docs-on-gh-pages/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/docs-on-gh-pages/_static/minus.png differ diff --git a/docs-on-gh-pages/_static/plus.png b/docs-on-gh-pages/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/docs-on-gh-pages/_static/plus.png differ diff --git a/docs-on-gh-pages/_static/pygments.css b/docs-on-gh-pages/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/docs-on-gh-pages/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs-on-gh-pages/_static/searchtools.js b/docs-on-gh-pages/_static/searchtools.js new file mode 100644 index 000000000..7918c3fab --- /dev/null +++ b/docs-on-gh-pages/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs-on-gh-pages/_static/sphinx_highlight.js b/docs-on-gh-pages/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/docs-on-gh-pages/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs-on-gh-pages/advanced_topics.html b/docs-on-gh-pages/advanced_topics.html new file mode 100644 index 000000000..c8334958d --- /dev/null +++ b/docs-on-gh-pages/advanced_topics.html @@ -0,0 +1,452 @@ + + + + + + + Advanced Topics — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Advanced Topics

+
+

Writing extra data outside the EDM

+

See here

+
+
+

Changing / creating new templates

+

See here

+
+
+

Persistency

+

The library is build such that it can support multiple storage backends. However, the tested storage system being used is ROOT. +The following explains the requirements for a user-provided storage back-end.

+
+

Writing Back-End

+

There is no interface a writing class has to fulfill. It only needs to take advantage of the interfaces provided in PODIO. To persistify a collection, three pieces of information have to be stored:

+
    +
  1. the ID of the collection,

  2. +
  3. the vector of PODs in the collection, and

  4. +
  5. the relation information in the collection

  6. +
+

Before writing out a collection, the data need to be put into the proper structure. For this, the method prepareForWrite needs to be invoked. In the case of trivial POD members this results in a no-op. In case, the collection contains references to other collections, the pointers are being translated into collID:objIndex pairs. A serialization solution would - in principle - then look like this:

+
     collection->prepareForWrite();
+     void* buffer = collection->getBufferAddress();
+     auto refCollections = collection->referenceCollections();
+     // ...
+     //   write buffer, collection ID, and refCollections
+     // ...
+
+
+
+
+

Reading Back-End

+

The main requirement for a reading backend is its capability of reading back all +the necessary data from which a collection can be constructed in the form of +podio::CollectionReadBuffers. From these buffers collections can then be +constructed. Each instance has to contain the (type erased) POD buffers (as a +std::vector), the (possibly empty) vectors of podio::ObjectIDs that contain +the relation information as well the (possibly empty) vectors for the vector +member buffers, which are currently stored as pairs of the type (as a +std::string) and (type erased) data buffers in the form of std::vectors.

+
+
+

Dumping JSON

+

It is possible to turn on an automatic conversion to JSON for podio generated datamodels using the nlohmann/json library. +To enable this feature the core datamodel library has to be compiled with the PODIO_JSON_OUTPUT and linked against the nlohmann/json library (needs at least version 3.10). +In cmake the necessary steps are (assuming that datamodel is the datamodel core library)

+
find_library(nlohmann_json 3.10 REQUIRED)
+target_link_library(datamodel PUBLIC nlohmann_json::nlohmann_json)
+target_compile_definitions(datamodel PUBLIC PODIO_JSON_OUTPUT)
+
+
+

With JSON support enabled it is possible to convert collections (or single objects) to JSON simply via

+
#include "nlohmann/json.hpp"
+
+auto collection = // get collection from somewhere
+
+nlohmann::json json{
+   {"collectionName", collection}
+};
+
+
+

Each element of the collection will be converted to a JSON object, where the keys are the same as in the datamodel definiton. +Components contained in the objects will similarly be similarly converted.

+

JSON is not foreseen as a mode for persistency, i.e. there is no plan to add the conversion from JSON to the in memory representation of the datamodel.

+
+
+
+

Thread-safety

+

PODIO was written with thread-safety in mind and avoids the usage of globals and statics. +However, a few assumptions about user code and use-patterns were made. +The following lists the caveats of the library when it comes to parallelization.

+
+

Changing user data

+

As explained in the section about mutability of data, thread-safety is only guaranteed if data are considered read-only after creation.

+
+
+

Serialization

+

During the calls of prepareForWriting and prepareAfterReading on collections other operations like object creation or addition will lead to an inconsistent state.

+
+
+

Not-thread-safe components

+

The Readers and Writers that ship with podio are assumed to run on a single +thread only (more precisely we assume that each Reader or Writer doesn’t have to +synchronize with any other for file operations).

+
+
+
+

Running pre-commit

+
    +
  • Install pre-commit

    +

    $ pip install pre-commit

    +
  • +
  • Run pre-commit manually

    +

    $ pre-commit run --all-files

    +
  • +
+
+
+

Retrieving the EDM definition from a data file

+

It is possible to get the EDM definition(s) that was used to generate the +datatypes that are stored in a data file. This makes it possible to re-generate +the necessary code and build all libraries again in case they are not easily +available otherwise. To see which EDM definitions are available in a data file +use the podio-dump utility

+
podio-dump <data-file>
+
+
+

which will give an (exemplary) output like this

+
input file: <data-file>
+
+EDM model definitions stored in this file: edm4hep
+
+[...]
+
+
+

To actually dump the model definition to stdout use the --dump-edm option +and the name of the datamodel you want to dump:

+
podio-dump --dump-edm edm4hep <data-file> > dumped_edm4hep.yaml
+
+
+

Here we directly redirected the output to a yaml file that can then again be +used by the podio_class_generator.py to generate the corresponding c++ code +(or be passed to the cmake macros).

+

Note that the dumped EDM definition is equivalent but not necessarily exactly +the same as the original EDM definition. E.g. all the datatypes will have all +their fields (Members, OneToOneRelations, OneToManyRelations, +VectorMembers) defined, and defaulted to empty lists in case they were not +present in the original EDM definition. The reason for this is that the embedded +EDM definition is the pre-processed and validated one as described +below

+
+

Accessing the EDM definition programmatically

+

The EDM definition can also be accessed programmatically via the +[ROOT|SIO]FrameReader::getEDMDefinition method. It takes an EDM name as its +single argument and returns the EDM definition as a JSON string. Most likely +this has to be decoded into an actual JSON structure in order to be usable (e.g. +via json.loads in python to get a dict).

+
+
+

Technical details on EDM definition embedding

+

The EDM definition is embedded into the core EDM library as a raw string literal +in JSON format. This string is generated into the DatamodelDefinition.h file as

+
namespace <package_name>::meta {
+static constexpr auto <package_name>__JSONDefinition = R"EDMDEFINITION(<json encoded definition>)EDMDEFINITION";
+}
+
+
+

where <package_name> is the name of the EDM as passed to the +podio_class_generator.py (or the cmake macro). The <json encoded definition> +is obtained from the pre-processed EDM definition that is read from the yaml +file. During this pre-processing the EDM definition is validated, and optional +fields are filled with empty defaults. Additionally, the includeSubfolder +option will be populated with the actual include subfolder, in case it has been +set to True in the yaml file. Since the json encoded definition is generated +right before the pre-processed model is passed to the class generator, this +definition is equivalent, but not necessarily equal to the original definition.

+
+

The DatamodelRegistry

+

To make access to information about currently loaded and available datamodels a +bit easier the DatamodelRegistry (singleton) keeps a map of all loaded +datamodels and provides access to this information possible. In this context we +refer to an EDM as the shared library (and the corresponding public headers) +that have been compiled from code that has been generated from a datamodel +definition in the original YAML file. In general whenever we refer to a +datamodel in this context we mean the enitity as a whole, i.e. its definition +in a YAML file, the concrete implementation as an EDM, as well as other related +information that is related to it.

+

Currently the DatamodelRegistry provides mainly access to the original +definition of available datamodels via two methods:

+
const std::string_view getDatamodelDefinition(const std::string& edmName) const;
+
+const std::string_view getDatamodelDefinition(size_t index) const;
+
+
+

where index can be obtained from each collection via +getDatamodelRegistryIndex. That in turn simply calls +<package_name>::meta::DatamodelRegistryIndex::value(), another singleton like object +that takes care of registering an EDM definition to the DatamodelRegistry +during its static initialization. It is also defined in the +DatamodelDefinition.h header.

+

Since the datamodel definition is embedded as a raw string literal into the core +EDM shared library, it is in principle also relatively straight forward to +retrieve it from this library by inspecting the binary, e.g. via

+
readelf -p .rodata libedm4hep.so | grep options
+
+
+

which will result in something like

+
  [   300]  {"options": {"getSyntax": true, "exposePODMembers": false, "includeSubfolder": "edm4hep/"}, "components": {<...>}, "datatypes": {<...>}}
+
+
+
+
+

I/O helpers for EDM definition storing

+

The podio/utilities/DatamodelRegistryIOHelpers.h header defines two utility +classes, that help with instrumenting readers and writers with functionality to +read and write all the necessary EDM definitions.

+
    +
  • The DatamodelDefinitionCollector is intended for usage in writers. It +essentially collects the datamodel definitions of all the collections it encounters. +The registerDatamodelDefinition method it provides should be called with every collection +that is written. The getDatamodelDefinitionsToWrite method returns a vector of all +datamodel names and their definition that were encountered during writing. It is +then the writers responsibility to actually store this information into the +file.

  • +
  • The DatamodelDefinitionHolder is intended to be used by readers. It +provides the getDatamodelDefinition and getAvailableDatamodels methods. +It is again the readers property to correctly populate it with the data it +has read from file. Currently the SIOFrameReader and the ROOTFrameReader +use it and also offer the same functionality as public methods with the help +of it.

  • +
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/contributing.html b/docs-on-gh-pages/contributing.html new file mode 100644 index 000000000..f22a6fbb3 --- /dev/null +++ b/docs-on-gh-pages/contributing.html @@ -0,0 +1,298 @@ + + + + + + + Contributing to PODIO — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Contributing to PODIO

+

Please read these guidelines if you want to contribute to the PODIO project.

+
+

Git workflow

+

For PODIO we would like to follow a so called “No Switch Yard” (NoSY) workflow.

+

In essence this means that you develop your (small) new feature in a dedicated +feature branch that is kept up to date with the master branch until you create +a PR, as we only allow rebase merges for PRs.

+
+

Example workflow

+
    +
  • checkout a copy of PODIO from the origin at AIDASoft:

    +

    git clone https://github.com/AIDASoft/podio.git +cd podio

    +
  • +
  • create a fork of the repository on the Github web page

    +
      +
    • if you have not yet done so earlier

    • +
    +
  • +
  • add your fork as remote downstream using your Github username

    +
    git remote add downstream  https://<yourUserName>@github.com/<yourUserName>/podio.git
    +
    +
    +
  • +
  • create a new feature branch; choose a meaningful name

    +
    git checkout -b <myNewBranch>
    +
    +
    +
  • +
  • make the changes to existing files (or add new ones) and frequently keep up to date with the master:

    +
    git fetch origin; git rebase origin/master
    +
    +
    +
  • +
  • after having committed everything to your new branch, push it to your fork of PODIO:

    +
    git push downstream <myNewBranch>
    +
    +
    +
  • +
  • reload your own github website (https://github.com//podio)

    +
      +
    • you should see your commit

    • +
    • now you can create a pull request on the web site

    • +
    +
  • +
+
+
+

Release Notes

+

Please make sure you fill in meaningful release notes in the comment field that is +provided at the Github web page when creating the PR, e.g.

+
BEGINRELEASENOTES
+- updated documentation
+    - add guidelines for contributing
+- reverted some name changes in tests/examples
+    - `read-one` now again called `read`
+
+ENDRELEASENOTES
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/datamodel_syntax.html b/docs-on-gh-pages/datamodel_syntax.html new file mode 100644 index 000000000..270db2b71 --- /dev/null +++ b/docs-on-gh-pages/datamodel_syntax.html @@ -0,0 +1,395 @@ + + + + + + + Data Models and Data Model Definitions — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Models and Data Model Definitions

+

To describe a data model PODIO provides a data model definition syntax. +This is to ease the creation of optimised data formats, which may take advantage of a so-called struct-of-array data layout. +From the user-provided data model description PODIO creates all the files necessary to use this data model.

+
+

Basic Concepts and Supported Features

+

PODIO encourages the usage of composition, rather than inheritance. +One of the reasons for doing so is the focus on efficiency friendly plain-old-data. +For this reason, PODIO does not support inheritance within the defined data model. +Instead, users can combine multiple components to build a to be used datatype.

+

To allow the datatypes to be real PODs, the data stored within the data model are constrained to be +POD-compatible data. Those are

+
    +
  1. basic types like int, double, etc as well as a limited set of fixed width +integers from <cstdint> (the _leastN or _fastN types as well as all +8 bit types are not allowed).

  2. +
  3. components built up from basic types or other components

  4. +
  5. Fixed sized arrays of those types

  6. +
+

In addition, PODIO supports the storage of one-to-one and one-to-many relations between objects. +In the following the syntax for defining a given data model is explained. +A later section contains more details about the code being created from this.

+
+
+

Definition of custom components

+

A component is just a flat struct containing data. it can be defined via:

+
    components:
+      # My example component
+      MyComponent:
+        Members:
+          - float x
+          - float y
+          - float z
+          - AnotherComponent a
+
+
+
+
+

Definition of custom data classes

+

Here an excerpt from “datamodel.yaml” for a simple class, just containing one member of the type int.

+
    datatypes :
+      EventInfo :
+        Description : "My first data type"
+        Author : "It's me"
+        Members :
+        - int Number // event number
+
+
+

Using this definition, three classes will be created: EventInfo, EventInfoData and EventInfoCollection. These have the following signature:

+
    class EventInfoData {
+      public:
+        int Number;
+    }
+
+    class EventInfo {
+      public:
+      ...
+        int Number() const;
+        void Number(int);
+      ...
+    }
+
+
+
+

Defining members

+

The definition of a member is done in the Members section in the form:

+
    Members:
+      <type> <name> // <comment>
+
+
+

where type can be any builtin-type or a component.

+

It is also possible to specify default values for members via

+
    Members:
+      <type> <name>{<default-value>} // <comment>
+
+
+

Note that in this case it is extremely expensive to check whether the provided default-value results in valid c++. +Hence, there is only a very basic syntax check, but no actual type check, and wrong default values will be caught only when trying to compile the datamodel.

+

For describing physics quantities it is important to know their units. Thus it is possible to add the units to the member definition:

+
    Members:
+      <type> <name>{<default-value>} [<unit>] // <comment>
+
+
+
+
+

Definition of references between objects:

+

There can be one-to-one-relations and one-to-many relations being stored in a particular class. This happens either in the OneToOneRelations or OneToManyRelations section of the data definition. The definition has again the form:

+
    OneToOneRelations:
+      <type> <name> // <comment>
+    OneToManyRelations:
+      <type> <name> // <comment>
+
+
+
+
+

Explicit definition of methods

+

In a few cases, it makes sense to add some more functionality to the created classes. Thus this library provides two ways of defining additional methods and code. Either by defining them inline or in external files. Extra code has to be provided separately for immutable and mutable additions. +Note that the immutable (ExtraCode) will also be placed into the mutable classes, so that there is no need for duplicating the code. +Only if some additions should only be available for the mutable classes it is necessary to fill the MutableExtraCode section. +The includes will be add to the header files of the generated classes.

+
    ExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+    MutableExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+
+
+

The code being provided has to use the macro {name} in place of the concrete name of the class.

+
+
+
+

Global options

+

Some customization of the generated code is possible through flags. These flags are listed in the section options:

+
    options:
+      getSyntax: False
+      exposePODMembers: True
+    components:
+      # My simple component
+      ExampleComponent:
+        Members:
+          - int x
+    datatypes:
+      ExampleType:
+        Description: "My datatype with a component member"
+        Author: "Mr me"
+        Members:
+         - ExampleComponent comp // component from above
+
+
+
    +
  • getSyntax: steers the naming of get and set methods. If set to true, methods are prefixed with get and set following the capitalized member name, otherwise the member name is used for both.

  • +
  • exposePODMembers: whether get and set methods are also generated for members of a member-component. In the example corresponding methods would be generated to directly set / get x through ExampleType.

  • +
+
+
+

Extending a datamodel / using types from an upstream datamodel

+

It is possible to extend another datamodel with your own types, resp. use some datatypes or components from an upstream datamodel in your own datamodel. +This can be useful for prototyping new datatypes or for accomodating special requirements without having to reimplement / copy a complete datamodel.

+

To pass an upstream datamodel to the class generator use the --upstream-edm option that takes the package name as well as the yaml definition file of the upstream datamodel separated by a colon (‘:’). +This will effectively make all components and datatypes of the upstream datamodel available to the current definition for validation and generation of the necessary includes. +Nevertheless, only the code for the datatypes and components defined in the current yaml file will be generated. +The podio PODIO_GENERATE_DATAMODEL cmake macro has gained an additional parameter UPSTREAM_EDM to pass the arguments to the generator via the cmake macros.

+
+

Potential pitfalls

+
    +
  • The cmake macros do not handle linking against an upstream datamodel automatically. It is the users responsibility to explicitly link against the upstream datamodel.

  • +
  • When generating two datamodels side-by-side and into the same output directory and using the ROOT backend, the generated selection.xml file might be overwritten if both datamodels are generated into the same output directory.

  • +
+

Limiting this functionality to one upstream datamodel is a conscious choice to limit the potential for abuse of this feature.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/design.html b/docs-on-gh-pages/design.html new file mode 100644 index 000000000..298a8dba6 --- /dev/null +++ b/docs-on-gh-pages/design.html @@ -0,0 +1,298 @@ + + + + + + + Design and Implementation Details — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Design and Implementation Details

+

The driving considerations for the PODIO design are:

+
    +
  1. the concrete data are contained within plain-old-data structures (PODs)

  2. +
  3. user-exposed data types are concrete and do not use inheritance

  4. +
  5. The C++ and Python interface should look as close as possible

  6. +
  7. The user does not do any explicit memory management

  8. +
  9. Classes are generated using a higher-level abstraction and code generators

  10. +
+

The following sections give some more technical details and explanations for the design choices. +More concrete implementation details can be found in the doxygen documentation.

+
+

Layout of Objects

+

The data model is based on four different kind of objects and layers, namely

+
    +
  1. user visible (physics) classes (e.g. Hit). These act as transparent references to the underlying data,

  2. +
  3. a transient object knowing about all data for a certain physics object, including inter-object relations (e.g. HitObject),

  4. +
  5. a plain-old-data (POD) type holding the persistent object information (e.g. HitData), and

  6. +
  7. a user-visible collection containing the physics objects (e.g. HitCollection).

  8. +
+

These layers are described in the following.

+
+

The User Layer

+

The user visible objects (e.g. Hit) act as light-weight references to the underlying data, and provide the necessary user interface. They come in two flavors, mutable and immutable, where the mutable classes are easily recognizable by their name (e.g. MutableHit). +Mutable classes are implicitly converted to immutable ones if necessary, so that interfaces that require only reading access to the data should always use the immutable classes. Only in cases where explicit mutability of the objects is required should mutable classes appear in interface definitions.

+

For each of the data-members and OneToOneRelations declared in the data model definition, corresponding getters (and setters for the mutable classes) are generated. +For each of the OneToManyRelations and VectorMembers a vector-like interface is provided.

+

With the chosen interface, the code written in C++ and Python looks almost identical, if taking proper advantage of the auto keyword.

+
+
+

The Internal Data Layer

+

The internal objects give access to the object data, i.e. the POD, and the references to other objects. +These objects inherit from podio::ObjBase, which takes care of object identification (podio::ObjectID), and object-ownership. The ObjectID consists of the index of the object and an ID of the collection it belongs to. If the object does not belong to a collection yet, the data object owns the POD containing the real data, otherwise the POD is owned by the respective collection. For details about the inter-object references and their handling within the data objects please see below.

+
+
+

The POD Layer

+

The plain-old-data (POD) contain just the data declared in the Members section of the datamodel definition as well as some bookkeeping data for data types with OneToManyRelations or VectorMembers. Ownership and lifetime of the PODs is managed by the other parts of the infrastructure, namely the data objects and the data collections.

+
+
+

The Collections

+

The collections created serve three purposes:

+
    +
  1. giving access to or creating the data items

  2. +
  3. preparing objects for writing into PODs or preparing them after reading

  4. +
  5. support for the so-called notebook pattern

  6. +
+

When used via the so called factory pattern (i.e. using the create function to create new objects) a collection will return mutable objects. +It is important to note that objects that are “owned” by a collection (i.e. they are either created via create or they are added to the collection via push_back) become invalid and can no longer be used once a collection is cleared.

+
+
+

Vectorization support / notebook pattern

+

As an end-user oriented library, PODIO provides only a limited support for struct-of-arrays (SoA) memory layouts. In the vision, that the data used for heavy calculations is best copied locally, the library provides convenience methods for extracting the necessary information from the collections. More details can be found in the examples section of this document.

+
+
+
+

Handling mutability

+

Depending on the policy of the client of PODIO, data collections may be read-only after creation, or may be altered still. +While the base assumption of PODIO is that once-created collections are immutable once leaving the scope of its creator, +it still allows for explicit unfreezing collections afterwards. +This feature has to handled with care, as it heavily impacts thread-safety.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/doc.html b/docs-on-gh-pages/doc.html new file mode 100644 index 000000000..96c4e86ab --- /dev/null +++ b/docs-on-gh-pages/doc.html @@ -0,0 +1,247 @@ + + + + + + + Introduction — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Introduction

+

PODIO, or plain-old-data I/O, is a C++ library to support the creation and handling of data models in particle physics. It is based on the idea of employing plain-old-data (POD) data structures wherever possible, while avoiding deep-object hierarchies and virtual inheritance. This is to both improve runtime performance and simplify the implementation of persistency services.

+

At the same time it provides the necessary high-level functionality to the physicist, such as support for inter-object relations, and automatic memory-management. In addition, it provides a (ROOT assisted) Python interface. To simplify the creation of efficient data models, PODIO employs code generation from a simple yaml-based markup syntax.

+

To support the usage of modern software technologies, PODIO was written with concurrency in mind and gives basic support for vectorization technologies.

+

This document describes first how to define and create a specific data model, then how to use the created data. Afterwards it will explain the overall design and a few of the technical details of the implementation.

+

Many of the design choices are inspired by previous experience of the LCIO package used for the studies of the international linear collider, and the Gaudi Object Description applied in the LHCb collaboration at the LHC.

+
+
+

Quick-start

+

An up-to-date installation and quick start guide for the impatient user can be found on the PODIO github page.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/doc_title.html b/docs-on-gh-pages/doc_title.html new file mode 100644 index 000000000..2ab85f7e4 --- /dev/null +++ b/docs-on-gh-pages/doc_title.html @@ -0,0 +1,247 @@ + + + + + + + <no title> — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

\begin{titlepage} +\begin{center}

+

\vspace*{2.5cm}

+

\huge +PODIO - the POD I/O Library\ +Design Document v1.0

+

\vspace{0.5cm}

+

\normalsize +30.6.2016

+

\vspace{1cm}

+

Benedikt Hegner (CERN)\ +Frank Gaede (DESY)

+

\end{center} +\end{titlepage}

+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/examples.html b/docs-on-gh-pages/examples.html new file mode 100644 index 000000000..c28453515 --- /dev/null +++ b/docs-on-gh-pages/examples.html @@ -0,0 +1,370 @@ + + + + + + + Examples for Supported Interface — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Examples for Supported Interface

+

The following snippets show the support of PODIO for the different use cases as +well as some potential pitfalls. These examples are mainly concerned with how +collections of objects and the objects themselve interact. As such they are +framework agnostic.

+
+

Object Ownership

+

Every data created is either explicitly owned by collections or automatically garbage-collected. There is no need for any new or delete call on user side. +As a general rule: If an object has been added to a collection, the collection +assumes ownership and if the collection goes out of scope all handles that point +to objects in this collection are invalidated as well.

+
+
+

Object Creation and Storage

+

Objects and collections can be created via factories, which ensure proper object ownership:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create(1.4,2.4,3.7,4.2);  // init with values
+    auto hit2 = hits.create(); // default-construct object
+    hit2.energy(42.23);
+
+
+

In addition, individual objects can be created in the free. If they aren’t attached to a collection, they are automatically garbage-collected:

+
    auto hit1 = Hit();
+    auto hit2 = Hit();
+    ...
+    hits.push_back(hit1);
+    ...
+    <automatic deletion of hit2>
+
+
+

In this respect all objects behave like objects in Python.

+
+
+

Object References

+

The library supports the creation of one-to-many relations:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create();
+    auto hit2 = hits.create();
+    auto clusters = ClusterCollection{};
+    auto cluster = clusters.create();
+    cluster.addHit(hit1);
+    cluster.addHit(hit2);
+
+
+

The references can be accessed via iterators on the referencing objects

+
    for (auto i = cluster.Hits_begin(), \
+         end = cluster.Hits_end(); i!=end; ++i){
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

or via direct accessors

+
    auto size = cluster.Hits_size();
+    auto hit  = cluster.Hits(<aNumber>);
+
+
+

If asking for an entry outside bounds, a std::out_of_range exception is thrown.

+
+
+

Looping through Collections

+

Looping through collections is supported in two ways. Via iterators:

+
    for(auto i = hits.begin(), end = hits.end(); i != end; ++i) {
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

and via direct object access:

+
    for(int i = 0, end = hits.size(), i != end, ++i){
+      std::cout << hit[i].energy() << std::endl;
+    }
+
+
+
+
+

Support for Notebook-Pattern

+

The notebook pattern uses the assumption that it is better to create a small +copy of only the data that are needed for a particular calculation. This +pattern is supported by providing access like

+
    auto x_array = hits.x();   // returning all values
+    auto y_array = hits.y(10); // or only the first 10 elements
+
+
+

The resulting std::vector can then be used in (auto-)vectorizable code. +Passing in a size argument is optional; If no argument is passed all elements will be returned, +if an argument is passed only as many elements as requested will be returned. +If the collection holds less elements than are requested, only as elements as are available will be returned.

+
+
+

podio::Frame container

+

The podio::Frame is the main container for containing and grouping collections +together. It has two main methods:

+
    /// Store a collection
+    template<typename T>
+    const T& put(T&& coll, const std::string& name);
+
+    /// access a collection
+    template<typename T>
+    const& T get(const std::string& name);
+
+
+

Note that for putting collections into the Frame an explicit std::move is +necessary to highlight the change of ownership that happens in this case.

+
+
+

Object Retrieval

+

Collections can be retrieved explicitly:

+
    auto& hits = frame.get<HitCollection>("hits");
+    if (hits.isValid()) { ... }
+
+
+

Or implicitly when following an object reference. In both cases the access to data that has been retrieved is const.

+
+
+

User defined Meta Data

+

Sometimes it is necessary or useful to store additional data that is not directly foreseen in the EDM. +This could be configuration parameters of simulation jobs, or parameter descriptions like cell-ID encoding etc. PODIO currently allows to store such meta data in terms of a GenericParameters class that +holds an arbitrary number of named parameters of type int, float, string or vectors if these. +Meta data can be stored and retrieved from the Frame via the templated putParameter and getParameter methods.

+
+

Python Interface

+

The Reader and Writer classes in the root_io and sio_io submodules +provide all the necessary functionality to read and write event files. An +example of reading files looks like this:

+
    from podio.root_io import Reader
+    reader = Reader("one or many input files")
+    for event in reader.get("events"):
+      hits = store.get("hits")
+      for hit in hits:
+        # ...
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/frame.html b/docs-on-gh-pages/frame.html new file mode 100644 index 000000000..588c04211 --- /dev/null +++ b/docs-on-gh-pages/frame.html @@ -0,0 +1,402 @@ + + + + + + + The Frame concept — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

The Frame concept

+

The podio::Frame is a general data container for collection data of podio generated EDMs. +Additionally, it offers the functionality to store some (limited) data outside of an EDM. +The basic idea of the Frame is to give users of podio the possibility to organize EDM data into logical units and to potentially build a hierarchy of different Frames. +Common examples would be the organisation of data into Events and Runs. +However, it is important to note that podio does really not impose any meaning on any Frame and each Frame is essentially defined by its contents.

+
+

Basic functionality of a Frame

+

The main functionality of a Frame is to store and aggregate EDM collection data and it also offers the possibility to store some generic data alongside. +To ensure thread safety and const-correctness a Frame takes ownership of any data that is put into it and only gives read access to immutable data. +This is mandated by the interface for collection data (simplified here for better readability):

+
struct Frame {
+template<typename CollT>
+const CollT& put(CollT&& coll, const std::string& name);
+
+void put(std::unique_ptr<podio::CollectionBase> coll, const std::string& name);
+
+template<typename CollT>
+const CollT& get(const std::string& name) const;
+
+template<typename T>
+void putParameter(const std::string& name, T value);
+
+template<typename T>
+const T& getParameter(const std::string);
+};
+
+
+

In this case there are two ways to get collection data into the Frame

+
    +
  1. By passing a concrete collection (of type CollT) into the Frame as an rvalue. There are two ways to achieve this, either by passing the return value of a function directly into Frame::put or by explicitly moving it in the call via std::move if you are using a named variable.

  2. +
  3. By passing a std::unique_ptr to a collection. Similar to the first case, this can either be the return value of a function call, or has to be done via std::move (as mandated by the std::unique_ptr interface).

  4. +
+

In both cases, if you passed in a named variable, the user is left with a moved-from object, which has to be in a valid but indefinite state, and cannot be used afterwards. +Some compilers and static code analysis tools are able to detect the accidental usage of moved-from objects.

+

For putting in parameters the basic principle is very similar, with the major difference being, that for trivial types getParameter will actually return by value.

+

For all use cases there is some enable_if machinery in place to ensure that only valid collections and valid parameter types can actually be used. +These checks also make sure that it is impossible to put in collections without handing over ownership to the Frame.

+
+

Usage examples for collection data

+

These are a few very basic usage examples that highlight the main functionality (and potential pitfalls).

+
+

Putting collection data into the Frame

+

In all of the following examples, the following basic setup is assumed:

+
#include "podio/Frame.h"
+
+#include "edm4hep/MCParticleCollection.h" // just to have a concrete example
+
+// create an empty Frame
+auto frame = podio::Frame();
+
+
+

Assuming there is a function that creates an MCParticleCollection putting the return value into the Frame is very simple

+
edm4hep::MCParticleCollection createMCParticles(); // implemented somewhere else
+
+// put the return value of a function into the Frame
+frame.put(createMCParticles(), "particles");
+
+// put the return value into the Frame but keep the const reference
+auto& particles = frame.put(createMCParticles(), "moreParticles");
+
+
+

If working with named variables it is necessary to use std::move to put collections into the Frame. +The Frame will refuse to compile in case a named variable is not moved. +Assuming the same createMCParticles function as above, this looks like the following

+
auto coll = createMCParticles();
+// potentially still modify the collection
+
+// Need to use std::move now that the collection has a name
+frame.put(std::move(coll), "particles");
+
+// Keeping a const reference is also possible
+// NOTE: We are explicitly using a new variable name here
+auto coll2 = createMCParticles();
+auto& particles = frame.put(std::move(coll2), "MCParticles");
+
+
+

At this point only particles is in a valid and defined state.

+
+
+

Getting collection (references) from the Frame

+

Obtaining immutable (const) references to collections stored in the Frame is trivial. +Here we are assuming that the collections are actually present in the Frame.

+
auto& particles = frame.get<edm4hep::MCParticleCollection>("particles");
+
+
+
+
+
+

Usage for Parameters

+

Parameters are using the podio::GenericParameters class behind the scene. +Hence, the types that can be used are int, float, and std::string as well as as std::vectors of those. +For better usability, some overloads for putParameter exist to allow for an in-place construction, like, e.g.

+
// Passing in a const char* for a std::string
+frame.putParameter("aString", "a string value");
+
+// Creating a vector of ints on the fly
+frame.putParameter("ints", {1, 2, 3, 4});
+
+
+
+
+
+

I/O basics and philosophy

+

podio offers all the necessary functionality to read and write Frames. +However, it is not in the scope of podio to organize them into a hierarchy, nor +to maintain such a hierarchy. When writing data to file Frames are written to +the file in the order they are passed to the writer. For reading them back podio +offers random access to stored Frames, which should make it possible to +restore any hierarchy again. The Writers and Readers of podio are supposed to be +run on and accessed by only one single thread.

+
+

Writing a Frame

+

For writing a Frame the writers can ask each Frame for CollectionWriteBuffers for each collection that should be written. +In these buffers the underlying data is still owned by the collection, and by extension the Frame. +This makes it possible to write the same collection with several different writers. +Writers can access a Frame from several different threads, even though each writer is assumed to be on only one thread. +For writing the GenericParameters that are stored in the Frame and for other necessary data, similar access functionality is offered by the Frame.

+
+
+

Reading a Frame

+

When reading a Frame readers do not have to return a complete Frame. +Instead they return a more or less arbitrary type of FrameData that simply has to provide the following public interface.

+
struct FrameData {
+  /// Get a (copy) of the internal collection id table
+  podio::CollectionIDTable getIDTable() const;
+
+  /// Get the buffers to construct the collection with the given name
+  std::optional<podio::CollectionReadBuffers> getCollectionBuffers(const std::string& name);
+
+  /// Get the still available, i.e. yet unpacked, collections from the raw data
+  std::vector<std::string> getAvailableCollections() const;
+
+  /// Get the parameters that are stored in the raw data
+  std::unique_ptr<podio::GenericParameters> getParameters();
+};
+
+
+

A Frame is constructed with a (unique_ptr of such) FrameData and handles everything from there. +Note that the FrameData type of any I/O backend is a free type without inheritance as the Frame constructor is templated on this. +This splitting of reading data from file and constructing a Frame from it later has some advantages:

+
    +
  • Since podio assumes that reading is done single threaded the amount of time that is actually spent in a reader is minimized, as only the file operations need to be done on a single thread. All further processing (potential decompression, unpacking, etc.) can be done on a different thread where the Frame is actually constructed.

  • +
  • It gives different backends the necessary freedom to exploit different optimization strategies and does not force them to conform to an implementation that is potentially detrimental to performance.

  • +
  • It also makes it possible to pass around data from which a Frame can be constructed without having to actually construct one.

  • +
  • Readers do not have to know how to construct collections from the buffers, as they are only required to provide the buffers themselves.

  • +
+
+
+

Schema evolution

+

Schema evolution happens on the CollectionReadBuffers when they are requested from the FrameData inside the Frame. +It is possible for the I/O backend to handle schema evolution before the Frame sees the buffers for the first time. +In that case podio schema evolution becomes a simple check.

+
+
+
+
+

Frame implementation and design

+

One of the main concerns of the Frame is to offer one common, non-templated, interface while still supporting different I/O backends and potentially different policies. +The “classic” approach would be to have an abstract IFrame interface with several implementations that offer the desired functionality (and their small differences). +One problem with that approach is that a purely abstract interface cannot have templated member functions. Hence, the desired type-safe behavior of get and put would be very hard to implement. +Additionally, policies ideally affect orthogonal aspects of the Frame behavior. +Implementing all possible combinations of behaviors through implementations of an abstract interface would lead to quite a bit of code duplication and cannot take advantage of the factorization of the problem. +To solve these problems, we chose to implement the Frame via Type Erasure. +This also has the advantage that the Frame also has value semantics in line with the design of podio.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/genindex.html b/docs-on-gh-pages/genindex.html new file mode 100644 index 000000000..81dd48a77 --- /dev/null +++ b/docs-on-gh-pages/genindex.html @@ -0,0 +1,238 @@ + + + + + + Index — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/index.html b/docs-on-gh-pages/index.html new file mode 100644 index 000000000..c930ec669 --- /dev/null +++ b/docs-on-gh-pages/index.html @@ -0,0 +1,294 @@ + + + + + + + Welcome to PODIO’s documentation! — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/objects.inv b/docs-on-gh-pages/objects.inv new file mode 100644 index 000000000..35f908624 Binary files /dev/null and b/docs-on-gh-pages/objects.inv differ diff --git a/docs-on-gh-pages/search.html b/docs-on-gh-pages/search.html new file mode 100644 index 000000000..c7e05dcc7 --- /dev/null +++ b/docs-on-gh-pages/search.html @@ -0,0 +1,253 @@ + + + + + + Search — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/docs-on-gh-pages/searchindex.js b/docs-on-gh-pages/searchindex.js new file mode 100644 index 000000000..ac2a8470f --- /dev/null +++ b/docs-on-gh-pages/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["ReleaseNotes", "advanced_topics", "contributing", "datamodel_syntax", "design", "doc", "doc_title", "examples", "frame", "index", "templates", "userdata"], "filenames": ["ReleaseNotes.md", "advanced_topics.md", "contributing.md", "datamodel_syntax.md", "design.md", "doc.md", "doc_title.md", "examples.md", "frame.md", "index.rst", "templates.md", "userdata.md"], "titles": ["v00-17-04", "Advanced Topics", "Contributing to PODIO", "Data Models and Data Model Definitions", "Design and Implementation Details", "Introduction", "<no title>", "Examples for Supported Interface", "The Frame concept", "Welcome to PODIO\u2019s documentation!", "Changing / creating new templates", "Writing extra data outside an EDM"], "terms": {"2023": 0, "tmadlen": 0, "pr": [0, 2], "527": 0, "split": [0, 8, 10], "classgener": 0, "base": [0, 4, 5, 11], "class": [0, 1, 4, 7, 8, 9, 10, 11], "mixin": 0, "two": [0, 1, 3, 4, 7, 8, 10], "specif": [0, 5, 10], "c": [0, 1, 3, 4, 5, 10], "julia": 0, "code": [0, 1, 3, 4, 5, 7, 8], "gener": [0, 1, 3, 4, 5, 7, 8, 11], "onli": [0, 1, 2, 3, 4, 7, 8, 10], "deal": 0, "languag": [0, 10], "need": [0, 1, 3, 7, 8, 10], "instanti": [0, 10], "configur": [0, 7, 10], "correct": [0, 8, 10], "reader": [0, 1, 7, 8], "podio_class_gener": [0, 1, 10], "py": [0, 1, 10], "main": [0, 1, 7, 8, 10], "script": 0, "depend": [0, 4, 10], "desir": [0, 8], "slightli": [0, 10], "cleanup": 0, "membervari": 0, "declutt": 0, "its": [0, 1, 4, 8], "__init__": 0, "method": [0, 1, 4, 7, 10, 11], "bit": [0, 1, 3, 8], "530": 0, "remov": 0, "read": [0, 2, 4, 7, 10], "deprec": 0, "old": [0, 3, 4, 5], "style": 0, "format": [0, 1, 3, 10], "compon": [0, 9], "definit": [0, 4, 9, 10], "yaml": [0, 1, 3, 5, 9], "file": [0, 2, 3, 7, 8, 9], "485": 0, "eventstor": 0, "function": [0, 1, 3, 4, 5, 7, 9, 10, 11], "announc": 0, "429": 0, "529": 0, "switch": [0, 2], "relat": [0, 1, 3, 4, 5, 7, 10], "rang": [0, 11], "test": [0, 1, 2], "us": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11], "frame": [0, 9, 11], "i": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "o": [0, 5, 6, 9], "06": 0, "526": 0, "edm4hep": [0, 1, 8], "workflow": 0, "an": [0, 1, 4, 5, 7, 8, 9, 10], "lcg": 0, "stack": 0, "recent": 0, "enough": [0, 10, 11], "version": [0, 1, 10, 11], "cmake": [0, 1, 3, 10], "necessari": [0, 1, 3, 4, 5, 7, 8, 10, 11], "after": [0, 1, 2, 4, 10], "key4hep": 0, "235": 0, "jmcarcel": 0, "523": 0, "comment": [0, 2, 3], "name": [0, 1, 2, 3, 4, 7, 8, 10], "line": [0, 8], "number": [0, 3, 7, 11], "It": [0, 1, 3, 4, 5, 7, 8, 10, 11], "": [0, 1, 3, 8, 10], "veri": [0, 3, 8], "unlik": 0, "remain": 0, "up": [0, 2, 3, 5, 10], "date": [0, 2, 5], "when": [0, 1, 2, 3, 4, 7, 8, 10], "either": [0, 3, 4, 7, 8, 10], "content": [0, 8, 10], "chang": [0, 2, 7, 9], "521": 0, "do": [0, 3, 4, 8], "import": [0, 3, 4, 7, 8, 10], "root": [0, 1, 3, 5, 10], "podio": [0, 1, 3, 4, 5, 6, 8, 10, 11], "dump": 0, "help": [0, 1], "otherwis": [0, 1, 3, 4], "can": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "take": [0, 1, 3, 4, 8, 10], "while": [0, 4, 5, 8], "system": [0, 1], "print": 0, "514": 0, "introduc": 0, "maybesharedptr": 0, "manag": [0, 4, 5, 10], "obj": [0, 10], "user": [0, 3, 5, 8, 9, 10, 11], "face": [0, 10], "handl": [0, 3, 5, 7, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "control": [0, 10], "block": [0, 10], "object": [0, 1, 5, 8, 9, 10, 11], "distinct": 0, "entiti": 0, "potenti": [0, 7, 8, 10], "differ": [0, 4, 7, 8, 10, 11], "lifetim": [0, 4], "which": [0, 1, 3, 4, 7, 8, 10, 11], "allow": [0, 2, 3, 4, 7, 8, 10], "fix": [0, 3, 11], "174": 0, "492": 0, "increas": 0, "size": [0, 3, 7, 10, 11], "factor": [0, 8], "sinc": [0, 1, 8, 11], "thei": [0, 1, 4, 7, 8, 10], "ar": [0, 1, 3, 4, 5, 7, 8, 10, 11], "now": [0, 2, 8, 10], "effect": [0, 3], "pointer": [0, 1], "instead": [0, 3, 8, 10], "one": [0, 1, 2, 3, 7, 8, 10], "even": [0, 8], "initi": [0, 1, 10], "case": [0, 1, 3, 4, 7, 8, 11], "obtain": [0, 1, 8], "from": [0, 2, 4, 5, 7, 9, 10], "collect": [0, 1, 9, 10], "objbas": [0, 4], "make": [0, 1, 2, 3, 8, 10, 11], "objectid": [0, 1, 4], "member": [0, 1, 4, 8, 10], "constructor": [0, 8, 10], "privat": 0, "have": [0, 1, 2, 3, 8, 10, 11], "access": [0, 4, 7, 8, 10, 11], "raw": [0, 1, 8], "ani": [0, 1, 3, 4, 7, 8, 11], "static": [0, 1, 8], "makeempti": 0, "order": [0, 1, 8], "creat": [0, 2, 3, 4, 5, 7, 8, 9, 11], "empti": [0, 1, 8, 10], "also": [0, 1, 3, 8, 10, 11], "intern": [0, 5, 8], "unpersist": 0, "enabl": [0, 1], "more": [0, 1, 3, 4, 8], "exist": [0, 2, 8, 9], "sanit": 0, "ha": [0, 1, 3, 4, 7, 8], "becom": [0, 4, 8, 10], "possibl": [0, 1, 3, 4, 5, 8, 10, 11], "so": [0, 1, 2, 3, 4, 10], "ananya": 0, "gupta": 0, "473": 0, "ad": [0, 4, 7, 9, 11], "support": [0, 1, 5, 8, 9, 10], "python": [0, 1, 4, 5, 10], "interfac": [0, 1, 4, 5, 8, 9, 10, 11], "implement": [0, 1, 3, 5, 9, 10], "new": [0, 2, 3, 4, 7, 8, 9], "design": [0, 5, 6, 9, 10], "structur": [0, 1, 4, 5], "default": [0, 1, 3, 7, 10], "paramet": [0, 3, 7], "abstract": [0, 4, 8], "type": [0, 1, 4, 7, 8, 9, 10], "builtin": [0, 3, 10], "_sort_components_and_datatyp": 0, "perform": [0, 5, 8], "topolog": 0, "sort": 0, "datatyp": [0, 1, 3], "_has_static_arrays_import": 0, "check": [0, 3, 8], "arrai": [0, 3, 4, 10], "lang": 0, "l": 0, "program": 0, "argument": [0, 1, 3, 7, 10], "specifi": [0, 3], "current": [0, 1, 3, 7, 10, 11], "choic": [0, 3, 4, 5], "cpp": [0, 10], "upstream": [0, 9], "edm": [0, 3, 7, 8, 9, 10], "unit": [0, 3, 8], "suit": 0, "cover": 0, "exampl": [0, 3, 4, 9], "data": [0, 5, 9, 10], "model": [0, 1, 4, 5, 9, 10], "document": [0, 2, 4, 5, 6, 10], "enable_julia": 0, "toggl": 0, "option": [0, 1, 7, 8, 9, 10], "By": [0, 8, 10], "off": 0, "520": 0, "add": [0, 1, 2, 3, 10, 11], "error": [0, 11], "messag": 0, "std": [0, 1, 7, 8, 10, 11], "bad_function_cal": 0, "show": [0, 7], "stacktrac": 0, "quit": [0, 8], "uninform": 0, "519": 0, "getter": [0, 4, 10], "return": [0, 1, 4, 7, 8, 10], "valu": [0, 1, 3, 7, 8, 10, 11], "keep": [0, 1, 2, 8, 11], "const": [0, 1, 3, 7, 8, 11], "refer": [0, 1, 4, 9, 10, 11], "all": [0, 1, 3, 4, 7, 8, 10], "other": [0, 1, 3, 4, 8, 10], "518": 0, "488": 0, "bind": 0, "rntupl": 0, "writer": [0, 1, 7, 8], "understand": 0, "miss": 0, "storag": [0, 1, 3, 9, 10], "datamodel": [0, 1, 4, 9, 10], "513": 0, "rootframewrit": 0, "writefram": 0, "rootntuplewrit": 0, "ensur": [0, 7, 8], "consist": [0, 4], "given": [0, 3, 8], "categori": 0, "If": [0, 3, 4, 7, 8, 10], "inconsist": [0, 1], "found": [0, 4, 5], "except": [0, 7], "thrown": [0, 7], "befor": [0, 1, 8, 10], "might": [0, 3, 11], "lead": [0, 1, 8, 11], "crash": 0, "unread": 0, "382": 0, "refactor": 0, "map": [0, 1, 10], "track": 0, "set": [0, 1, 3, 11], "kept": [0, 2, 11], "511": 0, "decoupl": 0, "tool": [0, 8], "rest": 0, "folder": 0, "call": [0, 1, 2, 3, 4, 7, 8, 10], "podio_gen": [0, 10], "transpar": [0, 4], "time": [0, 5, 8], "neglig": 0, "again": [0, 1, 2, 3, 8], "becaus": 0, "we": [0, 1, 2, 8, 10, 11], "don": [0, 10], "t": [0, 1, 7, 8, 10], "load": [0, 1, 10], "librari": [0, 1, 3, 4, 5, 6, 7], "unnecessarili": 0, "longer": [0, 4], "simplifi": [0, 5, 8], "test_util": 0, "move": [0, 7, 8, 11], "write": [0, 4, 7, 9, 10], "where": [0, 1, 3, 4, 8, 10, 11], "belong": [0, 4], "sio": [0, 1, 10], "510": 0, "legaci": 0, "extra": [0, 3, 9, 10], "wa": [0, 1, 5], "being": [0, 1, 3, 8, 10], "pass": [0, 1, 3, 7, 8, 10], "example_fram": 0, "almost": [0, 4, 11], "alwai": [0, 4, 10], "anoth": [0, 1, 3], "hard": [0, 8], "notic": 0, "509": 0, "clang": [0, 10], "significantli": 0, "slower": 0, "run": [0, 8, 9, 10], "508": 0, "externaldata": 0, "modul": [0, 10], "let": 0, "care": [0, 1, 4, 10], "download": 0, "hash": 0, "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "addit": [0, 1, 3, 5, 7, 10, 11], "local": [0, 4], "store": [0, 3, 7, 8, 10, 11], "dexternaldata_object_stor": 0, "path": 0, "them": [0, 3, 4, 8, 10], "build": [0, 1, 3, 8], "scratch": 0, "won": 0, "507": 0, "copi": [0, 2, 3, 4, 7, 8], "dumpmodel": 0, "directori": [0, 3, 10], "some": [0, 2, 3, 4, 7, 8, 9, 10], "subdirectori": [0, 10], "try": [0, 3, 11], "find": 0, "look": [0, 1, 4, 7, 8, 10], "abov": [0, 3, 8, 10, 11], "doesn": [0, 1], "fail": 0, "505": 0, "bump": 0, "pylint": 0, "ci": 0, "2": [0, 6, 7, 8], "7": [0, 7], "502": 0, "deletebuff": 0, "popul": [0, 1], "collectionreadbuff": [0, 1, 8], "dispos": 0, "unconsum": 0, "buffer": [0, 1, 8], "leak": 0, "describ": [0, 1, 3, 4, 5], "500": 0, "rootframedata": 0, "clean": 0, "desctruct": 0, "sure": [0, 2, 8, 10], "delet": [0, 7], "collectiondata": [0, 10], "wouter": 0, "deconinck": 0, "503": 0, "instal": [0, 1, 5], "vi": 0, "497": 0, "podio_python_dir": 0, "top": [0, 10], "level": [0, 4, 5, 10], "cmakelist": 0, "build_test": 0, "496": 0, "oper": [0, 1, 8], "neg": 0, "comparison": 0, "http": [0, 2], "github": [0, 2, 5], "com": [0, 2], "aidasoft": [0, 2], "pull": [0, 2], "493": 0, "id": [0, 1, 4, 7, 8], "podioobjectid": 0, "29": 0, "mutabl": [0, 1, 3, 9, 10], "unsign": [0, 10, 11], "latter": 0, "useless": 0, "412": 0, "438": 0, "ostream": 0, "22": 0, "juraj": 0, "smiesko": 0, "491": 0, "warn": 0, "request": [0, 2, 7, 8], "entri": [0, 7, 10], "present": [0, 1, 8, 10, 11], "490": 0, "bug": 0, "built": [0, 3], "without": [0, 3, 8, 10], "489": 0, "486": 0, "untrack": 0, "properli": 0, "whether": [0, 3, 10], "been": [0, 1, 7], "collectionidt": [0, 8], "collectionid": 0, "signal": 0, "known": [0, 10], "tabl": [0, 8], "break": 0, "you": [0, 1, 2, 8, 11], "avoid": [0, 1, 5], "lookup": 0, "twice": 0, "subsequ": 0, "retriev": [0, 9], "overli": 0, "share": [0, 1], "rootntupleread": 0, "uncov": 0, "resolv": 0, "18": 0, "484": 0, "feel": 0, "benedikt": [0, 6], "hegner": [0, 6], "483": 0, "clarifi": 0, "schema": 0, "482": 0, "renam": 0, "macro": [0, 1, 3, 10], "createbuff": 0, "create_buff": 0, "481": 0, "execut": 0, "target": 0, "unittest": 0, "unittest_podio": 0, "collis": 0, "rel": [0, 1], "common": [0, 8, 10], "480": 0, "thoma": 0, "madlen": 0, "472": 0, "schemata": 0, "across": 0, "provid": [0, 1, 2, 3, 4, 5, 7, 8, 10], "syntax": [0, 3, 5], "intent": 0, "evolut": 0, "backend": [0, 1, 3, 8, 10], "includ": [0, 1, 3, 4, 8, 10, 11], "infrastructur": [0, 4], "futur": 0, "477": 0, "nlohmann": [0, 1], "json_fwd": 0, "hpp": [0, 1], "header": [0, 1, 3, 10], "reduc": 0, "unnecessari": 0, "templat": [0, 7, 8, 9], "475": 0, "478": 0, "collectionbas": [0, 8], "iter": [0, 7], "dmitri": 0, "kalinkin": 0, "465": 0, "typedef": 0, "referenc": [0, 7], "collection_typ": 0, "convers": [0, 1], "reachabl": 0, "objectcollect": 0, "value_typ": 0, "The": [0, 3, 7, 9, 10, 11], "reach": 0, "via": [0, 1, 3, 4, 7, 8, 11], "mutable_typ": 0, "30": [0, 6], "471": 0, "branch": [0, 2], "index": [0, 1, 4, 11], "e": [0, 1, 2, 4, 8, 10, 11], "behavior": [0, 8], "releas": 0, "seri": 0, "andr": 0, "sailer": 0, "469": 0, "updat": [0, 2], "requir": [0, 1, 3, 4, 8, 10], "catch2": 0, "3": [0, 1, 7, 8, 11], "4": [0, 7, 8], "20": 0, "clang16": 0, "el9": 0, "alma9": 0, "clang12": 0, "cs7": 0, "disabl": 0, "tabul": 0, "avail": [0, 1, 3, 7, 8, 9], "445": 0, "part": [0, 4, 10], "07": 0, "26": 0, "463": 0, "vector": [0, 1, 5, 7, 8, 10, 11], "vectormemb": [0, 1, 4, 10], "actual": [0, 1, 3, 8, 10], "subset": [0, 11], "work": [0, 8, 11], "462": 0, "reproduc": 0, "origin": [0, 1, 2], "issu": 0, "25": 0, "461": 0, "rootframeread": [0, 1], "master": [0, 2], "447": 0, "wrapper": 0, "around": [0, 8], "put": [0, 1, 7, 10, 11], "explicitli": [0, 3, 7, 8], "cppyi": 0, "gbl": 0, "432": 0, "457": 0, "setup": [0, 8], "explicit": [0, 4, 7], "enable_sio": 0, "rather": [0, 3, 10], "than": [0, 3, 7, 10], "presenc": [0, 10], "456": 0, "cach": 0, "455": 0, "cmake_binary_dir": 0, "project_binary_dir": 0, "439": 0, "framecategori": 0, "h": [0, 1, 8, 10, 11], "few": [0, 1, 3, 5, 8], "convent": 0, "hardcod": 0, "string": [0, 1, 3, 7, 8, 10], "variabl": [0, 8, 10], "454": 0, "cmake_": 0, "sourc": 0, "bin": 0, "_dir": 0, "project_": 0, "452": 0, "extend": [0, 9], "pre": [0, 9, 10], "processor": 0, "condit": 0, "to_json": 0, "visibl": [0, 4], "rootcl": 0, "interpret": 0, "435": 0, "450": 0, "descript": [0, 3, 5, 7, 10], "author": [0, 3], "field": [0, 1, 2, 10, 11], "449": 0, "commit": [0, 2, 9], "nightli": 0, "come": [0, 1, 4], "abl": [0, 8, 11], "395": 0, "minor": 0, "complaint": 0, "newer": 0, "tidi": 0, "anyth": 0, "essenti": [0, 1, 8, 10], "448": 0, "lcio": [0, 5], "datalayout": 0, "untouch": 0, "unbuilt": 0, "year": 0, "446": 0, "finish": 0, "sioframewrit": 0, "non": [0, 8], "mandatori": 0, "see": [0, 1, 2, 4, 8, 10], "442": 0, "437": 0, "modifi": [0, 8], "pars": [0, 10], "incorpor": 0, "436": 0, "27": 0, "413": 0, "schemaevolut": 0, "hold": [0, 4, 7], "offer": [0, 1, 8, 11], "evolvebuff": 0, "doe": [0, 3, 4, 8], "hook": 0, "framedata": [0, 8], "23": [0, 7], "434": 0, "433": 0, "rootlegacyread": 0, "428": 0, "sever": [0, 8], "less": [0, 7, 8], "topic": [0, 9], "sub": 0, "txt": 0, "commonli": 0, "podiotest": 0, "g": [0, 1, 2, 4, 8, 10, 11], "environ": 0, "config": 0, "427": 0, "delai": 0, "long": [0, 10, 11], "mainli": [0, 1, 7, 10], "quicker": 0, "respons": [0, 1, 3, 11], "flag": [0, 3, 10], "displai": 0, "alphabet": 0, "automat": [0, 1, 3, 5, 7], "adjust": 0, "column": 0, "width": [0, 3, 11], "fit": 0, "packag": [0, 3, 5, 10], "402": 0, "public": [0, 1, 3, 8], "constexpr": [0, 1], "char": [0, 8, 10], "getxxxnam": 0, "string_view": [0, 1], "reli": 0, "typenam": [0, 7, 8], "full": [0, 10], "gettypenam": 0, "valuetypenam": 0, "immut": [0, 3, 4, 8, 10], "getvaluetypenam": 0, "datatypenam": 0, "pod": [0, 1, 3, 5, 6, 10], "getdatatypenam": 0, "podio_sioblock_path": 0, "use_external_catch2": 0, "auto": [0, 1, 4, 7, 8, 11], "suitabl": 0, "fall": 0, "back": [0, 8], "fetch": [0, 2], "own": [0, 2, 3, 4, 7, 8], "426": 0, "ld_library_path": 0, "robust": 0, "incompat": 0, "425": 0, "skip_catch_discoveri": 0, "skip": 0, "discoveri": 0, "catch": 0, "unsuit": 0, "too": 0, "much": 0, "underli": [0, 4, 8, 11], "murmurhash": 0, "423": 0, "easier": [0, 1], "restructur": 0, "produc": [0, 10], "prior": 0, "421": 0, "appear": [0, 4], "insensit": 0, "written": [0, 1, 4, 5, 8, 11], "405": 0, "legibl": 0, "valid": [0, 1, 3, 8, 10], "improv": [0, 5], "interoper": 0, "rdatafram": 0, "169": 0, "follow": [0, 1, 2, 3, 4, 7, 8, 10, 11], "_": 0, "resp": [0, 3], "taken": 0, "singl": [0, 1, 8, 10], "_objidx": 0, "disambigu": 0, "normal": 0, "directli": [0, 1, 3, 7, 8, 10], "everyth": [0, 2, 8], "should": [0, 1, 2, 3, 4, 8, 10], "422": 0, "small": [0, 2, 7, 8], "could": [0, 7], "element": [0, 1, 7, 11], "420": 0, "insid": [0, 8], "rootread": 0, "segment": 0, "violat": 0, "417": 0, "multipl": [0, 1, 3], "411": 0, "api": 0, "open": 0, "418": 0, "bring": 0, "getmap": 0, "genericparamet": [0, 7, 8], "alreadi": [0, 10], "dd4hep": 0, "1112": 0, "mark": 0, "getxyzmap": 0, "brief": 0, "transit": 0, "period": 0, "These": [0, 3, 4, 7, 8, 10], "415": 0, "19": 0, "416": 0, "select": [0, 3, 10], "rule": [0, 7], "anymor": 0, "setter": [0, 4, 10], "410": 0, "squar": 0, "414": 0, "userdatacollect": [0, 11], "caus": 0, "first": [0, 3, 5, 7, 8], "394": 0, "collectionbufferfactori": 0, "factori": [0, 4, 7], "throughout": 0, "createschemaevolvablebuff": 0, "minimum": 0, "schema_vers": 0, "1": [0, 7, 8], "schemavers": 0, "datamodeldefinit": [0, 1], "package_nam": [0, 1, 10], "meta": [0, 1, 9], "propag": 0, "inform": [0, 1, 4, 9, 11], "place": [0, 3, 8, 10], "sioblock": [0, 10], "appropri": [0, 10], "christoph": 0, "dilk": 0, "408": 0, "between": 0, "accessor": [0, 7], "21": 0, "387": 0, "round": 0, "trip": 0, "extens": [0, 8], "400": 0, "sioframedata": 0, "getavailablecollect": [0, 8], "seg": 0, "fault": 0, "previous": 0, "399": 0, "podio_enable_sio": 0, "target_compile_definit": [0, 1], "podiosioio": 0, "get": [0, 1, 3, 7, 11], "well": [0, 1, 3, 4, 7, 8, 10], "featur": [0, 1, 2, 4, 9, 10], "scope": [0, 4, 7, 8], "target_link_librari": [0, 1], "paul": 0, "gessing": 0, "befurt": 0, "398": 0, "reject": 0, "397": 0, "properti": [0, 1], "396": 0, "341": 0, "metadata": 0, "w": 0, "simpl": [0, 3, 5, 8], "heurist": 0, "identifi": 0, "omiss": 0, "mistak": 0, "limit": [0, 3, 4, 8, 9], "backward": 0, "compat": [0, 3], "info": 0, "391": 0, "390": 0, "later": [0, 3, 8], "389": 0, "gitignor": 0, "358": 0, "emb": 0, "json": 0, "core": [0, 1], "contain": [0, 1, 3, 4, 8, 9, 10], "liter": [0, 1], "encod": [0, 1, 7], "regist": [0, 1], "newli": 0, "datamodelregistri": 0, "awar": [0, 10], "result": [0, 1, 3, 7], "done": [0, 2, 3, 8], "framewrit": 0, "give": [0, 1, 4, 5, 8, 10, 11], "roundtrip": 0, "compar": 0, "intend": [0, 1], "advanc": [0, 9], "detail": [0, 3, 5, 9, 10], "384": 0, "378": 0, "favor": 0, "372": 0, "doubl": [0, 3, 10, 11], "A": [0, 1, 3, 8, 10], "similar": [0, 8, 10, 11], "thing": 0, "ilcsoft": 0, "143": 0, "event": [0, 3, 7, 8, 11], "weight": [0, 4], "precis": [0, 1], "380": 0, "getparamet": [0, 7, 8], "getgenericparametersforwrit": 0, "exact": 0, "same": [0, 1, 3, 5, 8, 11], "easili": [0, 1, 4, 10], "offici": 0, "channel": 0, "replac": 0, "usag": [0, 1, 3, 5, 9], "getparameterkei": 0, "kei": [0, 1, 10], "377": 0, "visual": 0, "convert": [0, 1, 4], "graph": 0, "376": 0, "375": 0, "podio_vers": 0, "preprocessor": 0, "usabl": [0, 1, 8], "context": [0, 1], "374": 0, "constant": 0, "someth": [0, 1], "podio_build_vers": 0, "373": 0, "short": [0, 10], "output": [0, 1, 3, 10], "nathan": 0, "brei": 0, "369": 0, "putparamet": [0, 7, 8], "inlin": [0, 3], "linker": 0, "364": 0, "trigger": 0, "push": [0, 2], "368": 0, "podio_relax_pyv": 0, "relax": 0, "match": 0, "major": [0, 8, 10], "363": 0, "util": [0, 1], "defin": [0, 1, 5, 8, 9, 10], "cc": [0, 10], "sioutil": 0, "siowrit": 0, "343": 0, "defaultdict": 0, "hand": [0, 8], "roll": 0, "361": 0, "basic": [0, 5, 9, 10, 11], "319": 0, "355": 0, "365": 0, "2022": 0, "362": 0, "keyword": [0, 4], "onward": 0, "360": 0, "log": 0, "absolut": 0, "333": 0, "unique_ptr": [0, 8], "mutex": 0, "list": [0, 1, 3, 10, 11], "declar": [0, 3, 4, 10], "like": [0, 1, 2, 3, 4, 7, 8], "nvcc": 0, "mayb": 0, "yet": [0, 2, 4, 8, 11], "k4clue": 0, "34": 0, "dtag": 0, "podio_set_rpath": 0, "rpath": 0, "runpath": 0, "binari": [0, 1], "pin": 0, "ubuntu": 0, "runner": 0, "accident": [0, 8], "go": [0, 10], "out": [0, 1, 7], "sync": [0, 11], "359": 0, "356": 0, "readm": 0, "argpars": 0, "choos": [0, 2], "346": 0, "tp": 0, "apach": 0, "0": [0, 6, 7, 11], "licens": 0, "facilit": 0, "integr": 0, "experi": [0, 5], "357": 0, "prefix": [0, 3, 10], "onto": 0, "env": 0, "sh": 0, "354": 0, "posix": 0, "compliant": 0, "shell": 0, "bash": 0, "tab": 0, "space": 0, "mix": 0, "indent": 0, "root_include_path": 0, "351": 0, "were": [0, 1], "consid": [0, 1, 11], "implicit": 0, "boolean": 0, "caught": [0, 3], "against": [0, 1, 3], "nullptr": 0, "guard": 0, "correspond": [0, 1, 3, 4, 10], "344": 0, "339": 0, "intact": 0, "345": 0, "siolegacyread": 0, "287": 0, "349": 0, "nest": [0, 10], "348": 0, "adapt": 0, "went": 0, "unnot": 0, "previou": [0, 5], "root_io": [0, 7], "sio_io": [0, 7], "each": [0, 1, 4, 8, 10, 11], "somewher": [0, 1, 8], "untyp": 0, "framedatat": 0, "inspect": [0, 1], "reorgan": 0, "usual": [0, 11], "close": [0, 4], "addition": [0, 1, 8], "dictionari": [0, 10], "342": 0, "migrat": 0, "action": 0, "checkout": [0, 2], "v3": 0, "advis": 0, "clone": [0, 2], "bodi": 0, "327": 0, "typo": 0, "24": 0, "340": 0, "335": 0, "cvmf": 0, "view": 0, "latest": 0, "pick": [0, 10], "group": [0, 7], "lcg_102": 0, "337": 0, "notebook": [0, 9], "pattern": [0, 1, 9], "332": 0, "signatur": [0, 3, 10], "336": 0, "podioconfig": 0, "silenc": 0, "about": [0, 1, 3, 4], "polici": [0, 4, 8], "cmp00012": 0, "compil": [0, 1, 3, 8, 11], "step": [0, 1], "334": 0, "attempt": 0, "stream": [0, 10], "transient": [0, 4], "323": 0, "stdout": [0, 1], "overview": [0, 10], "over": [0, 8, 11], "d": 0, "To": [0, 1, 3, 5, 8, 11], "pythoneventstor": 0, "separ": [0, 3], "podiopythonstor": 0, "side": [0, 3, 7], "gotoev": 0, "iread": 0, "correctli": [0, 1], "sioread": 0, "thread": [0, 4, 8, 9], "safe": [0, 8], "final": 0, "plan": [0, 1], "stabl": 0, "still": [0, 4, 8, 10], "turn": [0, 1], "better": [0, 7, 8], "wai": [0, 3, 7, 8], "For": [0, 1, 2, 3, 4, 8, 11], "consider": [0, 4], "pleas": [0, 2, 4, 10], "consult": 0, "start": [0, 9], "unchang": 0, "distant": 0, "312": 0, "podio_json_output": [0, 1], "link": [0, 1, 3], "318": 0, "podio_add_root_io_dict": 0, "bugfix": 0, "output_fold": 0, "equal": [0, 1], "dir": 0, "selection_xml": 0, "317": 0, "unrel": 0, "prototyp": [0, 3, 10], "aim": 0, "eventu": 0, "redefin": 0, "memori": [0, 1, 4, 5], "316": 0, "maco": 0, "host": 0, "fuse": 0, "consequ": 0, "315": 0, "is_trivial_typ": [0, 10], "engin": [0, 10], "behav": [0, 7], "expect": 0, "exactli": [0, 1], "opposit": 0, "what": [0, 10, 11], "would": [0, 1, 2, 3, 8], "intuit": 0, "288": 0, "283": 0, "init": [0, 7], "apart": 0, "mean": [0, 1, 2, 8, 10, 11], "python2": 0, "276": 0, "seem": 0, "valentin": 0, "volkl": 0, "307": 0, "hotfix": 0, "290": 0, "revert": [0, 2], "unknown": 0, "symbol": 0, "podiodict": 0, "282": 0, "podio_use_clang_format": 0, "autodiscoveri": 0, "downstream": [0, 2], "discov": 0, "accordingli": 0, "ON": 0, "stage": 0, "305": 0, "upcom": 0, "294": 0, "siocollectionidtableblock": 0, "build_vers": 0, "sioversionblock": 0, "304": 0, "unreleas": 0, "303": 0, "soumil": 0, "296": 0, "instruct": 0, "how": [0, 5, 7, 8, 10], "295": 0, "prepareforwrit": [0, 1], "286": 0, "point": [0, 7, 8, 10], "reset": 0, "kalina": 0, "stoimenova": 0, "301": 0, "text": 0, "300": [0, 1], "python3": 0, "299": 0, "unset": 0, "detect": [0, 8], "293": 0, "obsolet": 0, "285": 0, "291": 0, "obj_needs_destructor": 0, "274": 0, "jinja2": [0, 10], "process": [0, 1, 8, 10], "262": 0, "untempl": 0, "ones": [0, 2, 4, 10], "supportedgenericdatatyp": 0, "tupl": 0, "those": [0, 3, 8], "typehelp": 0, "helper": 0, "277": 0, "remot": [0, 2], "input": [0, 1, 7], "everi": [0, 1, 7], "284": 0, "per": 0, "280": 0, "color": 0, "diff": 0, "diffutil": 0, "254": 0, "guidelin": [0, 2], "podio_generate_datamodel": [0, 3], "both": [0, 3, 5, 7, 8], "279": 0, "newest": 0, "clash": 0, "31": 0, "253": 0, "lint": 0, "end": [0, 4, 6, 7, 10], "trail": 0, "whitespac": 0, "flake8": 0, "ilcdirac": 0, "270": 0, "duplic": [0, 3, 8], "overload": [0, 8, 10], "269": 0, "broke": 0, "265": 0, "gcc11": 0, "dev": 0, "261": 0, "accept": 0, "integ": [0, 3, 11], "placido": 0, "fernandez": 0, "declara": 0, "259": 0, "filter": 0, "regex": 0, "complet": [0, 3, 8], "238": 0, "podiovers": 0, "three": [0, 1, 3, 4], "uint16_t": [0, 11], "patch": 0, "plu": 0, "expr": 0, "last": 0, "tag": 0, "64": [0, 11], "podio_": 0, "_version": 0, "extract": [0, 4], "reorder": 0, "section": [0, 1, 3, 4], "230": 0, "28": 0, "256": 0, "ignor": 0, "happen": [0, 3, 7, 8], "persist": [0, 4, 5, 9], "onc": [0, 4], "tri": 0, "isavail": 0, "observ": 0, "somewhat": 0, "setrefer": 0, "mistakenli": 0, "op": [0, 1], "mechan": 0, "restor": [0, 8], "obvious": 0, "252": 0, "wherev": [0, 5], "assign": 0, "thank": 0, "ownership": [0, 4, 8, 9], "ed": [0, 4], "251": 0, "had": 0, "onetoonerel": [0, 1, 3, 4, 10], "onetomanyrel": [0, 1, 3, 4, 10], "249": 0, "use_sanit": 0, "curent": 0, "address": 0, "withorigin": 0, "undefin": 0, "mutual": 0, "exlus": 0, "label": 0, "failur": 0, "force_run_all_test": 0, "overrid": 0, "develop": [0, 2], "209": 0, "mention": [0, 10, 11], "2021": 0, "245": 0, "render": 0, "241": 0, "prepar": [0, 4], "205": 0, "explictli": 0, "hit": [0, 4, 7, 11], "mutablehit": [0, 4], "discuss": 0, "204": 0, "reason": [0, 1, 3], "obviou": 0, "mutat": 0, "239": 0, "237": 0, "drop": 0, "colon": [0, 3], "236": 0, "problem": [0, 8], "spack": 0, "234": 0, "cstdint": [0, 3], "232": 0, "197": 0, "merg": [0, 2], "reconstruct": 0, "collectioninfotyp": 0, "simpli": [0, 1, 8], "assum": [0, 1, 7, 8], "proper": [0, 1, 4, 7], "didn": 0, "231": 0, "regress": 0, "223": 0, "213": 0, "224": 0, "219": 0, "214": 0, "frank": [0, 6], "gaed": [0, 6], "fundament": [0, 11], "basic_typ": 0, "bool": [0, 10], "usrint": 0, "uint64_t": [0, 11], "userint": 0, "usrdoubl": 0, "userdoubl": 0, "int": [0, 3, 7, 8, 10], "resiz": [0, 11], "myint": 0, "iu": 0, "nd": 0, "100": 0, "42": [0, 7], "114": 0, "effici": [0, 3, 5], "podio_generated_fil": 0, "glob": 0, "217": 0, "destructor": 0, "swap": 0, "idiom": 0, "namespac": [0, 1, 10], "216": 0, "211": 0, "parallel": [0, 1, 11], "ctest": 0, "jn": 0, "210": 0, "just": [0, 3, 4, 8, 10, 11], "earlier": [0, 2], "restrict": 0, "dict": [0, 1, 10], "exit": 0, "backtrac": 0, "collectionbuff": 0, "expos": [0, 4], "206": 0, "extern": [0, 3], "ship": [0, 1], "201": 0, "count": 0, "heap": 0, "free": [0, 7, 8], "200": 0, "195": 0, "circular": 0, "self": 0, "194": 0, "relationrang": 0, "akin": 0, "193": 0, "192": 0, "191": 0, "treat": 0, "186": 0, "int16_t": 0, "int32_t": 0, "int64_t": 0, "uint32_t": 0, "realli": [0, 8, 11], "189": 0, "read_and_writ": 0, "concurr": [0, 5], "spuriou": 0, "180": 0, "logic": [0, 8], "rootwrit": 0, "degrad": 0, "v6": 0, "our": 0, "affect": [0, 8], "badli": 0, "profit": 0, "182": 0, "statu": 0, "185": 0, "184": 0, "asciiwrit": 0, "183": 0, "export": 0, "marko": 0, "petric": 0, "181": 0, "scan": 0, "175": 0, "fulli": [0, 10], "qualifi": [0, 10], "168": 0, "issuecom": 0, "770751871": 0, "romanov": 0, "173": 0, "io": 0, "handler": 0, "171": 0, "153": 0, "170": 0, "enforc": 0, "werror": 0, "joseph": 0, "wang": 0, "156": 0, "noncopy": 0, "154": 0, "maintain": [0, 8], "111": 0, "172": 0, "brew": 0, "command": 0, "mac": 0, "2020": 0, "165": 0, "conveni": [0, 4], "emtpi": 0, "162": 0, "161": 0, "155": 0, "benchmark": 0, "timedread": 0, "timedwrit": 0, "decor": 0, "wrap": 0, "conform": [0, 8], "record": 0, "construct": [0, 1, 7, 8], "writeev": 0, "readcollect": 0, "benchmarkrecord": 0, "principl": [0, 1, 8, 10], "outsid": [0, 7, 8, 9], "search": 0, "152": 0, "copyabl": 0, "144": 0, "149": 0, "find_package_handle_standard_arg": 0, "147": 0, "130": 0, "second": 0, "altern": 0, "serial": 0, "runtim": [0, 5], "whole": [0, 1], "podio_add_datamodel_core_librari": 0, "condition": 0, "podio_add_sio_io_block": 0, "podio_io_handl": 0, "reflect": 0, "133": 0, "141": 0, "96": 0, "97": 0, "98": 0, "centos7": 0, "ubuntu1804": 0, "6": [0, 6], "least": [0, 1], "134": 0, "139": 0, "128": 0, "registerforwrit": 0, "site": [0, 2], "127": 0, "126": 0, "No": [0, 2], "125": 0, "recursive_mutex": 0, "made": [0, 1], "whatev": 0, "distanc": 0, "calcul": [0, 4, 7], "129": 0, "footprint": 0, "clear": [0, 4], "intermedi": 0, "124": 0, "sstream": 0, "123": 0, "122": 0, "121": 0, "pip": [0, 1], "120": 0, "cleanli": 0, "117": 0, "readabl": [0, 8], "focus": 0, "grasp": 0, "stricter": 0, "extracod": [0, 3, 10], "constextracod": 0, "accord": 0, "diverg": 0, "equival": [0, 1, 10, 11], "emit": 0, "charact": 0, "capabl": [0, 1, 11], "exhaust": 0, "serv": [0, 4], "purpos": [0, 4], "moment": [0, 10], "107": 0, "loop": [0, 9, 11], "106": 0, "infinit": 0, "cyclic": 0, "102": 0, "101": 0, "constobject": 0, "invalid": [0, 4, 7], "99": 0, "libpodiodict": 0, "libpodio": 0, "rootmap": 0, "92": 0, "float": [0, 3, 7, 8, 10, 11], "lcparamet": 0, "evtmd": 0, "geteventmetadata": 0, "setvalu": 0, "usereventweight": 0, "evtweight": 0, "getfloatv": 0, "49": 0, "91": 0, "podiorootio": 0, "90": 0, "89": 0, "88": 0, "addxxxx": 0, "addtoxxxx": 0, "87": 0, "8": [0, 3, 11], "jenkinsfil": 0, "cpack": 0, "enable_cpack": 0, "83": 0, "82": 0, "81": 0, "wl": 0, "dynamic_lookup": 0, "appleclang": 0, "linux": 0, "shlib": 0, "testdatamodel": 0, "80": 0, "75": 0, "74": 0, "q": 0, "quiet": 0, "printout": 0, "verbos": 0, "mode": [0, 1], "73": 0, "right": [0, 1], "podiomacro": 0, "72": 0, "travi": 0, "70": 0, "includesubfold": [0, 1, 10], "packagenam": 0, "etc": [0, 3, 7, 8], "true": [0, 1, 3], "uniqu": 0, "occur": 0, "occas": 0, "package_name_": 0, "69": 0, "68": 0, "podio_generate_dictionari": 0, "67": 0, "loader": 0, "preserv": 0, "65": 0, "2019": 0, "pere": 0, "mato": 0, "63": 0, "stl": [0, 10], "60": 0, "multi": 0, "word": 0, "examplehit": 0, "cellid": 0, "ben": 0, "morgan": 0, "59": 0, "58": 0, "57": 0, "56": 0, "55": 0, "fast": 0, "getfast": 0, "speed": 0, "xxcollect": 0, "54": 0, "cmakepackageconfighelp": 0, "associ": 0, "podiotarget": 0, "refind": 0, "standard": 0, "client": [0, 4], "find_packag": 0, "add_execut": 0, "foo": 0, "javier": 0, "cervant": 0, "villanueva": 0, "51": 0, "phase": 0, "report": 0, "mai": [0, 3, 4], "45": 0, "contribut": 0, "44": 0, "enambl": 0, "dryrun": 0, "43": 0, "suggest": 0, "graem": 0, "stewart": 0, "41": 0, "fcc": 0, "factoris": 0, "md": 0, "40": 0, "tchain": 0, "xrootd": 0, "eospubl": 0, "cern": [0, 6], "ch": 0, "eo": 0, "stick": 0, "hsf": 0, "2018": 0, "39": 0, "forward": [0, 1, 10], "treatment": 0, "statement": 0, "know": [0, 3, 4, 8], "concret": [0, 1, 3, 4, 8], "38": 0, "analog": 0, "larg": 0, "37": 0, "36": 0, "releaas": 0, "note": [0, 1, 3, 4, 7, 8, 10, 11], "releasenot": 0, "far": 0, "2017": 0, "32": [0, 11], "hep": 0, "colin": 0, "bernet": 0, "cbernet": 0, "nofile_fix": 0, "segv": 0, "interact": [0, 7], "pyeventstore_filenam": 0, "jlingema": 0, "clangf": 0, "joschka": 0, "lingemann": 0, "gen": 0, "53": 0, "fixwarn": 0, "regener": 0, "hint": 0, "highlight": [0, 7, 8], "doc": 0, "applic": 0, "struct": [0, 3, 4, 8, 10], "parser": 0, "temporarili": 0, "outputstream": 0, "add_ascii_io": 0, "zaborowska": 0, "52": 0, "50": 0, "findroot": 0, "lcg_88": 0, "unus": 0, "pyunittest": 0, "2016": [0, 6], "47": 0, "lcg_87": 0, "46": 0, "debug": 0, "asciwrit": 0, "write_ascii": 0, "const_rel": 0, "getsyntax": [0, 1, 3, 10], "creation": [0, 1, 3, 4, 5, 9], "fix_cpy_rel": 0, "project": [0, 2], "custom": [0, 9], "doxygen": [0, 4], "cli": 0, "titl": 0, "page": [0, 2, 5], "dry": 0, "paragraph": 0, "direct": [0, 7, 10], "exposur": 0, "deep": [0, 5], "initialis": 0, "chach": 0, "fccsw": 0, "mileston": 0, "steinweg": 0, "eike_operators_new": 0, "eik": 0, "printinfo": 0, "tabular": 0, "wrong": [0, 3], "reference_bug_test": 0, "pyinterfac": 0, "2000": 0, "lcg_83": 0, "af": 0, "improve_doc": 0, "ink": 0, "dde": 0, "documen": 0, "relation_bug": 0, "examplemc": 0, "ref": 0, "_end": 0, "add_getters_sett": 0, "associativecontain": 0, "incorrect": 0, "fix_extracod": 0, "acc": 0, "memleak": 0, "extracode_in_compon": 0, "tracker": 0, "real": [0, 3, 4], "gtest": 0, "cross": 0, "snippet": [0, 7, 10], "pointerless": 0, "mani": [0, 3, 5, 7, 10], "cluster": [0, 7], "recurs": 0, "build_typ": 0, "unneed": 0, "processev": 0, "big": 0, "collcect": 0, "podio_librari": 0, "crear": 0, "clementhelsen": 0, "fix_eo": 0, "9": 0, "tfile": 0, "re": [0, 1], "tutorial_2": 0, "chain": 0, "neater": 0, "fwd": 0, "fact": 0, "alber": 0, "tree": 0, "35": 0, "33": 0, "fix_includ": 0, "unified_env": 0, "5": 0, "filezombi": 0, "beautifi": 0, "soft": 0, "unifi": 0, "anna": 0, "conflict": 0, "destin": 0, "pcm": 0, "cosmet": 0, "me": [0, 3], "appl": 0, "pytool": 0, "pyyaml": 0, "datamemb": 0, "2015": 0, "b": [0, 2], "uniti": 0, "fill": [0, 1, 2, 3, 10, 11], "markdown": 0, "mem": 0, "refurbish": 0, "next": 0, "toward": 0, "xyzhandl": 0, "upgrad": 0, "layout": [0, 3, 9], "buildin": 0, "garbag": [0, 7], "streamlin": 0, "wrongli": 0, "cope": 0, "xcode": 0, "push_back": [0, 4, 7, 11], "trivial": [0, 1, 8, 10, 11], "acquir": 0, "behaviour": 0, "xxxobj": 0, "themselv": [0, 7, 8], "align": 0, "gcc": 0, "reserv": 0, "rootconfig": 0, "registri": 0, "fooentri": 0, "fooobj": 0, "simplif": 0, "improp": 0, "draft": 0, "newlin": [0, 3], "2014": 0, "edm_1": 0, "v1": [0, 6], "uniform": 0, "review": 0, "scheme": 0, "incomplet": 0, "friend": 0, "confirm": 0, "genreflex": 0, "head": 0, "n": [0, 11], "stuff": 0, "navig": 0, "readi": 0, "lepton": 0, "muon": 0, "comput": 0, "isol": 0, "particlehandl": 0, "more_util": 0, "particl": [0, 5, 8], "overlap": 0, "100000": 0, "solv": [0, 8], "rare": 0, "eta": 0, "cut": 0, "dummy_gener": 0, "dummi": 0, "jet": 0, "demand": 0, "dummygener": 0, "coll_in_registri": 0, "multijet": 0, "increment": 0, "land": 0, "few_easy_mod": 0, "x": [0, 3, 7], "merge_attempt": 0, "pedant": 0, "event_loop": 0, "messi": 0, "overal": [0, 5], "simple_edm": 0, "realist": 0, "auto_handle_ptr": 0, "embed": 0, "prepareafterread": [0, 1], "macos_build_merg": 0, "macos_build": 0, "lxplus6": 0, "reformat": 0, "question": 0, "z": [0, 3], "boson": 0, "rearrang": 0, "here": [1, 3, 8, 10, 11], "howev": [1, 8, 10, 11], "explain": [1, 3, 5], "There": [1, 3, 7, 8], "fulfil": 1, "advantag": [1, 3, 4, 8], "persistifi": 1, "piec": 1, "invok": 1, "translat": 1, "collid": [1, 5], "objindex": 1, "pair": 1, "solut": 1, "void": [1, 3, 8], "getbufferaddress": 1, "refcollect": 1, "referencecollect": 1, "form": [1, 3, 11], "instanc": 1, "eras": 1, "possibli": 1, "10": [1, 7, 11], "find_librari": 1, "nlohmann_json": 1, "With": [1, 4, 10], "collectionnam": 1, "definiton": 1, "similarli": 1, "foreseen": [1, 7], "represent": [1, 10], "mind": [1, 5], "global": [1, 9], "assumpt": [1, 4, 7], "caveat": 1, "As": [1, 4, 7, 11], "guarante": 1, "dure": 1, "state": [1, 8], "synchron": 1, "manual": [1, 11], "exemplari": 1, "want": [1, 2], "dumped_edm4hep": 1, "redirect": 1, "necessarili": 1, "below": [1, 4, 10], "frameread": 1, "getedmdefinit": 1, "most": [1, 10], "decod": 1, "__jsondefinit": 1, "r": 1, "edmdefinit": 1, "subfold": [1, 10], "singleton": 1, "whenev": 1, "enit": 1, "getdatamodeldefinit": 1, "edmnam": 1, "size_t": [1, 11], "getdatamodelregistryindex": 1, "That": 1, "datamodelregistryindex": 1, "straight": 1, "readelf": 1, "p": 1, "rodata": 1, "libedm4hep": 1, "grep": 1, "exposepodmemb": [1, 3], "fals": [1, 3], "datamodelregistryiohelp": 1, "instrument": 1, "datamodeldefinitioncollector": 1, "encount": 1, "registerdatamodeldefinit": 1, "getdatamodeldefinitionstowrit": 1, "datamodeldefinitionhold": 1, "getavailabledatamodel": 1, "sioframeread": 1, "yard": 2, "nosi": 2, "essenc": 2, "your": [2, 3], "dedic": 2, "until": 2, "rebas": 2, "cd": 2, "fork": 2, "repositori": 2, "web": 2, "usernam": 2, "yourusernam": 2, "meaning": 2, "mynewbranch": 2, "frequent": 2, "reload": 2, "websit": 2, "beginreleasenot": 2, "endreleasenot": 2, "eas": 3, "optimis": 3, "encourag": 3, "composit": 3, "inherit": [3, 4, 5, 8, 10], "One": [3, 8], "focu": 3, "friendli": 3, "plain": [3, 4, 5], "within": [3, 4, 10], "combin": [3, 8], "constrain": 3, "_leastn": 3, "_fastn": 3, "flat": 3, "my": 3, "mycompon": 3, "y": [3, 7], "anothercompon": 3, "excerpt": 3, "eventinfo": 3, "eventinfodata": 3, "eventinfocollect": 3, "extrem": 3, "expens": 3, "henc": [3, 8], "physic": [3, 4, 5], "quantiti": 3, "thu": 3, "particular": [3, 7], "sens": 3, "mutableextracod": 3, "declarationfil": 3, "implementationfil": 3, "through": [3, 8, 9, 10], "examplecompon": 3, "exampletyp": 3, "mr": 3, "comp": 3, "steer": 3, "capit": 3, "accomod": 3, "special": 3, "reimplement": 3, "nevertheless": 3, "gain": 3, "upstream_edm": 3, "xml": [3, 10], "overwritten": 3, "consciou": 3, "abus": 3, "drive": 4, "higher": 4, "technic": [4, 5], "explan": 4, "four": 4, "kind": 4, "act": 4, "certain": 4, "inter": [4, 5], "hitobject": 4, "hitdata": 4, "hitcollect": [4, 7, 11], "light": 4, "flavor": 4, "recogniz": 4, "implicitli": [4, 7], "chosen": 4, "ident": 4, "identif": 4, "respect": [4, 7], "bookkeep": 4, "item": 4, "orient": 4, "soa": 4, "vision": 4, "heavi": 4, "best": 4, "alter": 4, "leav": 4, "creator": 4, "unfreez": 4, "afterward": [4, 5, 8], "heavili": 4, "impact": 4, "safeti": [4, 8, 9], "idea": [5, 8], "emploi": 5, "hierarchi": [5, 8], "virtual": 5, "servic": 5, "At": [5, 8, 10], "high": 5, "physicist": 5, "assist": 5, "markup": 5, "modern": 5, "softwar": 5, "technologi": 5, "inspir": 5, "studi": 5, "linear": 5, "gaudi": 5, "appli": [5, 10], "lhcb": 5, "collabor": 5, "lhc": 5, "guid": 5, "impati": 5, "begin": [6, 7], "titlepag": 6, "center": 6, "vspace": 6, "5cm": 6, "huge": 6, "normals": 6, "1cm": 6, "desi": 6, "pitfal": [7, 8], "concern": [7, 8], "framework": 7, "agnost": 7, "goe": 7, "hit1": 7, "hit2": 7, "energi": 7, "individu": [7, 10], "aren": 7, "attach": 7, "clustercollect": 7, "addhit": 7, "hits_begin": 7, "hits_end": 7, "cout": 7, "endl": 7, "hits_siz": 7, "anumb": 7, "ask": [7, 8], "bound": 7, "out_of_rang": 7, "x_arrai": 7, "y_arrai": 7, "vectoriz": 7, "togeth": 7, "coll": [7, 8], "ting": 7, "isvalid": 7, "Or": 7, "sometim": 7, "simul": 7, "job": 7, "cell": 7, "term": 7, "arbitrari": [7, 8], "submodul": 7, "organ": 8, "organis": 8, "impos": 8, "aggreg": 8, "alongsid": [8, 11], "mandat": 8, "collt": 8, "rvalu": 8, "achiev": 8, "left": 8, "indefinit": 8, "cannot": 8, "analysi": 8, "enable_if": 8, "machineri": 8, "imposs": 8, "mcparticlecollect": 8, "createmcparticl": 8, "els": 8, "moreparticl": 8, "refus": 8, "coll2": 8, "mcparticl": 8, "behind": 8, "scene": 8, "astr": 8, "fly": 8, "nor": 8, "random": 8, "suppos": 8, "collectionwritebuff": 8, "though": 8, "getidt": 8, "getcollectionbuff": 8, "unpack": 8, "amount": 8, "spent": 8, "minim": 8, "further": [8, 10], "decompress": 8, "freedom": 8, "exploit": 8, "optim": 8, "strategi": 8, "forc": 8, "detriment": 8, "classic": 8, "approach": 8, "ifram": 8, "pure": 8, "ideal": 8, "orthogon": 8, "aspect": 8, "chose": 8, "erasur": 8, "semant": 8, "introduct": 9, "quick": 9, "concept": 9, "philosophi": 9, "preprocess": 9, "podio_config_read": 10, "generator_util": 10, "classgeneratorbasemixin": 10, "langaug": 10, "itself": 10, "digest": 10, "disk": 10, "consumpt": 10, "cppclassgener": 10, "juliaclassgener": 10, "broadli": 10, "along": 10, "live": 10, "layer": 10, "linv": 10, "resourc": 10, "src": 10, "mutablestruct": 10, "jl": 10, "parentmodul": 10, "jinja": 10, "immedi": 10, "activ": 10, "_get_filenames_templ": 10, "postfix": 10, "filenam": 10, "overridden": 10, "neccessari": 10, "_fill_templ": 10, "deleg": 10, "endfor": 10, "Be": 10, "mostli": 10, "use_get_syntax": 10, "incfold": 10, "includes_cc": 10, "implemen": 10, "includes_data": 10, "includes_obj": 10, "includes_cc_obj": 10, "includes_coll_cc": 10, "include_coll_data": 10, "forward_declar": 10, "leaf": 10, "forward_declarations_obj": 10, "is_pod": 10, "indic": 10, "ostream_collection_set": 10, "header_cont": 10, "bare_typ": 10, "full_typ": 10, "is_builtin": 10, "is_arrai": 10, "array_typ": 10, "array_s": 10, "getter_nam": 10, "setter_nam": 10, "jl_import": 10, "staticarrai": 10, "mvector": 10, "julia_typ": 10, "essenit": 10, "strip": 10, "down": 10, "experiment": 10, "int16": 10, "int32": 10, "uint32": 10, "float32": 10, "float64": 10, "int64": 10, "uint64": 10, "userfloat": 11, "userdata": 11, "14f": 11, "vec": 11, "deliber": 11, "biggest": 11, "hittag": 11, "intn_t": 11, "uintn_t": 11, "16": 11, "platform": 11, "static_assert": 11, "is_same_v": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"v00": 0, "17": 0, "04": 0, "03": 0, "02": 0, "01": 0, "16": 0, "05": 0, "15": 0, "14": 0, "00": 0, "13": 0, "12": 0, "11": 0, "10": 0, "09": 0, "08": 0, "advanc": 1, "topic": 1, "write": [1, 8, 11], "extra": [1, 11], "data": [1, 3, 4, 7, 8, 11], "outsid": [1, 11], "edm": [1, 11], "chang": [1, 10], "creat": [1, 10], "new": [1, 10], "templat": [1, 10], "persist": 1, "back": 1, "end": 1, "read": [1, 8], "dump": 1, "json": 1, "thread": 1, "safeti": 1, "user": [1, 4, 7], "serial": 1, "Not": 1, "safe": 1, "compon": [1, 3, 10], "run": 1, "pre": 1, "commit": 1, "retriev": [1, 7], "definit": [1, 3], "from": [1, 3, 8], "file": [1, 10], "access": 1, "programmat": 1, "technic": 1, "detail": [1, 4], "embed": 1, "The": [1, 4, 8], "datamodelregistri": 1, "i": [1, 8], "o": [1, 8], "helper": 1, "store": 1, "contribut": 2, "podio": [2, 7, 9], "git": 2, "workflow": 2, "exampl": [2, 7, 8, 11], "releas": 2, "note": 2, "model": 3, "basic": [3, 8], "concept": [3, 8], "support": [3, 4, 7, 11], "featur": 3, "custom": 3, "class": 3, "defin": [3, 7], "member": 3, "refer": [3, 7, 8], "between": 3, "object": [3, 4, 7], "explicit": 3, "method": 3, "global": 3, "option": 3, "extend": 3, "datamodel": 3, "us": 3, "type": [3, 11], "an": [3, 11], "upstream": 3, "potenti": 3, "pitfal": 3, "design": [4, 8], "implement": [4, 8], "layout": 4, "layer": 4, "intern": 4, "pod": 4, "collect": [4, 7, 8, 11], "vector": 4, "notebook": [4, 7], "pattern": [4, 7], "handl": 4, "mutabl": 4, "introduct": 5, "quick": 5, "start": 5, "interfac": 7, "ownership": 7, "creation": 7, "storag": 7, "loop": 7, "through": 7, "frame": [7, 8], "contain": 7, "meta": 7, "python": 7, "function": 8, "usag": [8, 11], "put": 8, "get": 8, "paramet": 8, "philosophi": 8, "schema": 8, "evolut": 8, "welcom": 9, "": 9, "document": 9, "preprocess": 10, "yaml": 10, "exist": 10, "ad": 10, "avail": 10, "inform": 10, "gener": 10, "datatyp": 10, "membervari": 10, "julia": 10, "code": 10, "some": 11, "limit": 11, "No": 11, "relat": 11, "other": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"v00-17-04": [[0, "v00-17-04"]], "v00-17-03": [[0, "v00-17-03"]], "v00-17-02": [[0, "v00-17-02"]], "v00-17-01": [[0, "v00-17-01"]], "v00-17": [[0, "v00-17"]], "v00-16-05": [[0, "v00-16-05"]], "v00-16-04": [[0, "v00-16-04"]], "v00-16-03": [[0, "v00-16-03"]], "v00-16-02": [[0, "v00-16-02"]], "v00-16-01": [[0, "v00-16-01"]], "v00-16": [[0, "v00-16"]], "v00-15": [[0, "v00-15"]], "v00-14-02": [[0, "v00-14-02"]], "v00-14-01": [[0, "v00-14-01"], [0, "id1"]], "v00-14": [[0, "v00-14"]], "v00-14-00": [[0, "v00-14-00"]], "v00-13-02": [[0, "v00-13-02"]], "v00-13-01": [[0, "v00-13-01"]], "v00-13": [[0, "v00-13"]], "v00-12": [[0, "v00-12"]], "v00-11": [[0, "v00-11"]], "v00-10": [[0, "v00-10"]], "v00-09-02": [[0, "v00-09-02"]], "v00-09": [[0, "v00-09"]], "v00-08": [[0, "v00-08"]], "Advanced Topics": [[1, "advanced-topics"]], "Writing extra data outside the EDM": [[1, "writing-extra-data-outside-the-edm"]], "Changing / creating new templates": [[1, "changing-creating-new-templates"], [10, "changing-creating-new-templates"]], "Persistency": [[1, "persistency"]], "Writing Back-End": [[1, "writing-back-end"]], "Reading Back-End": [[1, "reading-back-end"]], "Dumping JSON": [[1, "dumping-json"]], "Thread-safety": [[1, "thread-safety"]], "Changing user data": [[1, "changing-user-data"]], "Serialization": [[1, "serialization"]], "Not-thread-safe components": [[1, "not-thread-safe-components"]], "Running pre-commit": [[1, "running-pre-commit"]], "Retrieving the EDM definition from a data file": [[1, "retrieving-the-edm-definition-from-a-data-file"]], "Accessing the EDM definition programmatically": [[1, "accessing-the-edm-definition-programmatically"]], "Technical details on EDM definition embedding": [[1, "technical-details-on-edm-definition-embedding"]], "The DatamodelRegistry": [[1, "the-datamodelregistry"]], "I/O helpers for EDM definition storing": [[1, "i-o-helpers-for-edm-definition-storing"]], "Contributing to PODIO": [[2, "contributing-to-podio"]], "Git workflow": [[2, "git-workflow"]], "Example workflow": [[2, "example-workflow"]], "Release Notes": [[2, "release-notes"]], "Data Models and Data Model Definitions": [[3, "data-models-and-data-model-definitions"]], "Basic Concepts and Supported Features": [[3, "basic-concepts-and-supported-features"]], "Definition of custom components": [[3, "definition-of-custom-components"]], "Definition of custom data classes": [[3, "definition-of-custom-data-classes"]], "Defining members": [[3, "defining-members"]], "Definition of references between objects:": [[3, "definition-of-references-between-objects"]], "Explicit definition of methods": [[3, "explicit-definition-of-methods"]], "Global options": [[3, "global-options"]], "Extending a datamodel / using types from an upstream datamodel": [[3, "extending-a-datamodel-using-types-from-an-upstream-datamodel"]], "Potential pitfalls": [[3, "potential-pitfalls"]], "Design and Implementation Details": [[4, "design-and-implementation-details"]], "Layout of Objects": [[4, "layout-of-objects"]], "The User Layer": [[4, "the-user-layer"]], "The Internal Data Layer": [[4, "the-internal-data-layer"]], "The POD Layer": [[4, "the-pod-layer"]], "The Collections": [[4, "the-collections"]], "Vectorization support / notebook pattern": [[4, "vectorization-support-notebook-pattern"]], "Handling mutability": [[4, "handling-mutability"]], "Introduction": [[5, "introduction"]], "Quick-start": [[5, "quick-start"]], "Examples for Supported Interface": [[7, "examples-for-supported-interface"]], "Object Ownership": [[7, "object-ownership"]], "Object Creation and Storage": [[7, "object-creation-and-storage"]], "Object References": [[7, "object-references"]], "Looping through Collections": [[7, "looping-through-collections"]], "Support for Notebook-Pattern": [[7, "support-for-notebook-pattern"]], "podio::Frame container": [[7, "podio-frame-container"]], "Object Retrieval": [[7, "object-retrieval"]], "User defined Meta Data": [[7, "user-defined-meta-data"]], "Python Interface": [[7, "python-interface"]], "The Frame concept": [[8, "the-frame-concept"]], "Basic functionality of a Frame": [[8, "basic-functionality-of-a-frame"]], "Usage examples for collection data": [[8, "usage-examples-for-collection-data"]], "Putting collection data into the Frame": [[8, "putting-collection-data-into-the-frame"]], "Getting collection (references) from the Frame": [[8, "getting-collection-references-from-the-frame"]], "Usage for Parameters": [[8, "usage-for-parameters"]], "I/O basics and philosophy": [[8, "i-o-basics-and-philosophy"]], "Writing a Frame": [[8, "writing-a-frame"]], "Reading a Frame": [[8, "reading-a-frame"]], "Schema evolution": [[8, "schema-evolution"]], "Frame implementation and design": [[8, "frame-implementation-and-design"]], "Welcome to PODIO\u2019s documentation!": [[9, "welcome-to-podio-s-documentation"]], "Preprocessing of yaml file": [[10, "preprocessing-of-yaml-file"]], "Existing templates": [[10, "existing-templates"]], "Adding a new template": [[10, "adding-a-new-template"]], "Available information in the templates": [[10, "available-information-in-the-templates"]], "General information": [[10, "general-information"]], "Components": [[10, "components"]], "Datatypes": [[10, "datatypes"]], "MemberVariable": [[10, "membervariable"]], "DataType": [[10, "datatype"]], "Julia code generation": [[10, "julia-code-generation"]], "Writing extra data outside an EDM": [[11, "writing-extra-data-outside-an-edm"]], "Example usage": [[11, "example-usage"]], "Some limitations": [[11, "some-limitations"]], "No relations to other collections": [[11, "no-relations-to-other-collections"]], "Limited supported types": [[11, "limited-supported-types"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/docs-on-gh-pages/templates.html b/docs-on-gh-pages/templates.html new file mode 100644 index 000000000..869ce6eb2 --- /dev/null +++ b/docs-on-gh-pages/templates.html @@ -0,0 +1,584 @@ + + + + + + + Changing / creating new templates — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Changing / creating new templates

+

PODIO uses the Jinja2 template engine to generate the c++ code from the yaml description. +This document here gives an overview of how PODIO uses the Jinja2 engine and how the yaml file is processed before it is passed to it. +We don’t go into many details of Jinja2 templates here, please refer to the Template Designer Document of Jinja2. +PODIO only makes use of rather basic Jinja2 templates, so it should in principle be possible to pick up the basics just by looking at some existing templates.

+
+

Preprocessing of yaml file

+

The entry point for reading yaml files is the python/podio_gen/podio_config_reader.py. +When reading the yaml file a basic validation is run and the data members, relations and vector members of components and datatypes are parsed into MemberVariable objects (defined in python/podio_gen/generator_utils.py). +The main entry point to the code generation is the python/podio_class_generator.py which takes care of instantiating the language specific code generator (either C++ or a prototype version for Julia at this point). +The language specific generators inherit from the ClassGeneratorBaseMixin which takes care of some common initialization and provides some common functionality for code generation. +In the end each langauge specific generator will take care of (either by itself or through the common functionality in ClassGeneratorBaseMixin):

+
    +
  • Configuring the Jinja2 template engine. At the moment this is mainly making the templates known to the engine.

  • +
  • The necessary preprocessing of all the datatypes and components. This includes collecting necessary include directories and forward declaration, as well as digesting ExtraCode snippets.

  • +
  • Putting all the necessary information into a dict that can be easily used in the Jinja2 templates. See below for what is available in the templates

  • +
  • Calling the template engine to fill the necessary templates for each datatype or component and making sure to only write to disk if the filled template actually changed. Optionally run clang-format on them before writing.

  • +
  • Producing a list of generated c++ files for consumption by the cmake macros of PODIO.

  • +
+

Currently two language specific generators are available: CPPClassGenerator and JuliaClassGenerator. +Note that some of the information below will only apply to either of these generators as they provide the template engine with slightly different content.

+
+
+

Existing templates

+

Currently PODIO loads templates that are placed in <prefix>/python/templates. +They are broadly split along the classes that are generated for each datatype or component from the EDM definition:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

template file(s)

content

generated file(s)

Component.h.jinja2

Definition for each component

[<package>/]<component-name>.h

Data.h.jinja2

POD struct of each datatype (living in the POD layer)

[<package>/]<datatype-name>Data.h

Obj.{h,cc}.jinja2

Obj class for each datatype (linving in the object layer) and managing resources

[<package>/]<datatype-name>Obj.h, src/<datatype-name>Obj.cc

[Mutable]Object.{h,cc}.jinja2

The user facing interfaces for each datatype (living in the user layer)

[<package>/][Mutable]<datatype-name>.h, src/[Mutable]<datatype-name>.cc

Collection.{h,cc}.jinja2

The user facing collection interface (living in the user layer)

[<package>/]<datatype-name>Collection.h, src/<datatype-name>Collection.cc

CollectionData.{h,cc}.jinja2

The classes managing the collection storage (not user facing!)

[<package>/]<datatype-name>CollectionData.h, src/<datatype-name>CollectionData.cc

selection.xml.jinja2

The selection.xml file that is necessary for generating a root dictionary for the generated datamodel

src/selection.xml

SIOBlock.{h,cc}.jinja2

The SIO blocks that are necessary for the SIO backend

[<package>/]<datatype-name>SIOBlock.h, src/<datatype-name>SIOBlock.cc

MutableStruct.jl.jinja2

The mutable struct definitions of components and datatypes for julia

[<package>/]<datatype-name>Struct.jl, [<package>/]<component-name>Struct.jl

ParentModule.jl.jinja2

The constructor and collection definitions of components and datatypes in the data model are contained within a single module named after the package-name

[<package>/]<package-name>.jl

+

The presence of a [<package>] subdirectory for the header files is controlled by the includeSubfolder option in the yaml definition file.

+

Jinja allows the definition of additional macros and supports importing them similar to python modules. +These are stored in the macros subfolder and are imported directly by the main templates where necessary.

+
+
+

Adding a new template

+

All templates that are placed in the templates directory mentioned above become immediately available to the template engine if it ends on .jinja2 +However, it is still necessary to actively fill them from the class generator. +If the available information for the new templates is already enough and no further pre-processing is necessary, than they need to be added to _get_filenames_templates function in the ClassGeneratorBaseMixin. +The prefix and postfix dictionaries define how the template filename will be mapped to the generated files: <prefix><template-filename><postfix>. +By default a .h and a .cc file will be generated, but this can be overridden by adding the template to the endings dictionary. +With that in place it is now only neccessary to call _fill_templates with the appropriate template name and the pre processed data. +Note that for most templates this means that they have to be filled for each datatype or component individually.

+

If additional preprocessing is necessary, it will be necessary to also add that to the the language specific generators. +The main entry point to the generation is the process method which essentially just delegates to other methods.

+
+
+

Available information in the templates

+

The following gives an overview of the information that is available from the dictionary that is passed to the templates from the different +Each (top level) key in this dict is directly available as a variable in the Jinja2 templates, e.g.

+
component['includes'] = # list of includes
+
+
+

will become available as

+
{% for include in includes %}
+{{ include }}
+{% endfor %}
+
+
+

Be aware that some of the information is only available for the language +specific generators. The following information mostly applies to the c++ code +generation!

+
+

General information

+

The following keys / variables are always available

+ + + + + + + + + + + + + + + + + +

key / variable name

content

package_name

The package name of the datamodel (passed to the generator as argument)

use_get_syntax

The value of the getSyntax option from the yaml definition file

incfolder

The [<package>/] part of the generated header files (See above)

+
+
+

Components

+

The following keys are filled for each component

+ + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The class of the component as DataType (see below)

Members

The members of the component as MemberVariables

includes

All the necessary includes for this component

ExtraCode

Optionally present extra code

+
+
+

Datatypes

+

The following keys / variables are filled for each datatype

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The (immutable, user-facing) class as DataType (see below)

Members

The members of the datatype as a list of MemberVariables (see below)

OneToOneRelations

The one-to-one relation members of the datatype as a list of MemberVariables

OneToManyRelations

The one-to-many relation members of the datatype as a list of MemberVariables

VectorMembers

The vector members of the datatype as a list of MemberVariables

includes

The include directives for the the user facing classes header files

includes_cc

The include directives for the implemenations of the user facing classes

includes_data

The necessary include directives for the Data POD types

includes_obj

The include directives for the Obj classes headers.

includes_cc_obj

The include directives for the implementation files of the Obj classes.

includes_coll_cc

The include directives for the implementation of the Collection classes

include_coll_data

The include directives for the header CollectionData header file

forward_declarations

The forward declarations for the user facing classes header files. This is a nested dict, where the keys are namespaces and the leaf values are classes.

forward_declarations_obj

The forward declarations for the Obj classes header files.

is_pod

Flag value indicating whether the Data class of this datatype is a POD or if it contains an STL member

is_trivial_type

Flag that indicates that this is a trivial data type, i.e. one without relations or vector members.

ostream_collection_settings

A dict with a single header_contents key that is necessary for the output stream overload implementation of collections

+
+
+

MemberVariable

+

Defined in python/generator_utils.py. +The string representation gives the definition of the member, including a potentially present description string. +In principle all members are accessible in the templates, however, the most important ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

description

name

The name of the member

namespace

The (potentially empty) namespace of the member

bare_type

The type of the member without namespace

full_type

The full, namespace qualified, type of the member, essentially {{ namespace }}::{{ bare_type }}

description

The (optional) description string of the member

is_builtin

Flag for indicating that a member is a builtin type

is_array

Flag for indicating that a member is a std::array

array_type

The type of the array if the member is a std::array

array_size

The size of the array if the member is a std::array

getter_name

Method for generating the correct name for getter functions, depending on the getSyntax option in the yaml definition file.

setter_name

Method for generating the correct name for setter functions, depending on the getSyntax option in the yaml definition file and on whether the member is a relation or not

signature

The signature of a data member that can be used in function signatures, corresponds to {{ full_type }} {{ name }}

jl_imports

Import required for StaticArrays: MVector

julia_type

Equivalent julia type for the c++ type

+
+
+

DataType

+

Defined in python/generator_utils.py. +This is essenitally a stripped down version of the MemberVariable with the major difference being that the string representation returns the fully qualified type instead. +The available fields are

+ + + + + + + + + + + + + + + + + +

field

description

bare_type

The type without the namespace

namespace

The (potentially empty) namespace

full_type

The fully qualified type, corresponding to {{ namespace }}::{{ bare_type }}.

+
+
+

Julia code generation

+

It is an experimental feature. +Builtin types mapping in Julia

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cpp

julia

bool

Bool

char

Char

short

Int16

int

Int32

unsigned int

UInt32

float

Float32

double

Float64

long

Int64

unsigned long

UInt64

long long

Int64

unsigned long long

UInt64

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/docs-on-gh-pages/userdata.html b/docs-on-gh-pages/userdata.html new file mode 100644 index 000000000..4b8536214 --- /dev/null +++ b/docs-on-gh-pages/userdata.html @@ -0,0 +1,319 @@ + + + + + + + Writing extra data outside an EDM — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Writing extra data outside an EDM

+

In some cases it can be necessary to write some additional data that can not +(yet) be stored in the EDM. PODIO offers a possibility to store such extra user +data via the podio::UserDataCollection. It gives the user access to a +std::vector of a set of limited fundamental types, which is written alongside +the data stored in the EDM classes for each event.

+
+

Example usage

+

Creating or getting a UserDataCollection via the Frame works the same +as with any other collection of the EDM via the put or get functions:

+
#include "podio/UserDataCollection.h"
+
+// Create a collection and put it into a Frame
+userFloats = podio::UserDataCollection<float>();
+frame.put(std::move(userFloats), "userFloats");
+
+// get a collection
+const auto& userData = frame.get<podio::UserDataCollection<float>>("userFloats");
+
+
+

The interface of the UserDataCollection is similar to a basic version of the +std::vector, i.e. push_back, resize and the basic functions for accessing +elements are present:

+
userFloats.push_back(3.14f); // add elements
+userFloats.resize(10);       // make the collection have 10 elements
+auto value = userFloats[0];  // access elements by index
+
+for (auto&& value : userFloats) {
+    // necessary functionality for range-based for-loops
+}
+
+for (size_t i = 0; i < userFloats.size(); ++i) {i
+    // but also for index based loops
+}
+
+
+

For cases where this subset interface is not enough it is also possible to get a +reference to the underlying std::vector via the UserDataCollection::vec() +method.

+
+
+

Some limitations

+

Since adding additional fields to an EDM type is almost trivial for PODIO +generated EDMs the UserDataCollection capabilities are deliberately kept +limited. Here we list what we consider to be the biggest limitations:

+
+

No relations to other collections

+

Since a UserDataCollection is really just a list of numbers it is not possible +to form relations to other objects. This also means that users are responsible +for keeping a UserDataCollection in sync with an EDM collection if is used to +store additional information, e.g.

+
auto& hits = store.create<HitCollection>("hits");
+auto& hitTags = store.create<podio::UserDataCollection<uint16_t>>("hitTags");
+
+for (/* some loop */) {
+    auto hit = hits.create();
+    // To be able to loop over these in parallel, you have to fill the user data manually
+    uint16_t hitTag;
+    hitTags.push_back(hitTag);
+}
+
+
+
+
+

Limited supported types

+

As mentioned above the possible types that can be stored in a +UserDataCollection is currently (deliberately) limited to the following +fundamental types

+
    +
  • fixed width integers: intN_t and uintN_t, with N={8, 16, 32, 64}

  • +
  • float and double

  • +
+

Trying to store different types in a UserDataCollection will lead to a +compilation error. Note that the usual integer types might be the same as the +fixed width version on some platforms. However, the equivalences of different +types might be different on different platforms. E.g.

+
static_assert(std::is_same_v<unsigned long, uint64_t>);
+
+
+

might work on some platforms, but might not work on others.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: docs-on-gh-pages + + + +
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..4ecdc0450 --- /dev/null +++ b/index.html @@ -0,0 +1,9 @@ + + + + Redirecting to latest release + + + + + diff --git a/master/.buildinfo b/master/.buildinfo new file mode 100644 index 000000000..f192e66c0 --- /dev/null +++ b/master/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: b9e645f1f83c91db09f06d5032eb6615 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/master/.doctrees/ReleaseNotes.doctree b/master/.doctrees/ReleaseNotes.doctree new file mode 100644 index 000000000..682326d29 Binary files /dev/null and b/master/.doctrees/ReleaseNotes.doctree differ diff --git a/master/.doctrees/advanced_topics.doctree b/master/.doctrees/advanced_topics.doctree new file mode 100644 index 000000000..b03509afc Binary files /dev/null and b/master/.doctrees/advanced_topics.doctree differ diff --git a/master/.doctrees/contributing.doctree b/master/.doctrees/contributing.doctree new file mode 100644 index 000000000..736f4c13f Binary files /dev/null and b/master/.doctrees/contributing.doctree differ diff --git a/master/.doctrees/datamodel_syntax.doctree b/master/.doctrees/datamodel_syntax.doctree new file mode 100644 index 000000000..789c13ee4 Binary files /dev/null and b/master/.doctrees/datamodel_syntax.doctree differ diff --git a/master/.doctrees/design.doctree b/master/.doctrees/design.doctree new file mode 100644 index 000000000..799151602 Binary files /dev/null and b/master/.doctrees/design.doctree differ diff --git a/master/.doctrees/doc.doctree b/master/.doctrees/doc.doctree new file mode 100644 index 000000000..06b975b54 Binary files /dev/null and b/master/.doctrees/doc.doctree differ diff --git a/master/.doctrees/doc_title.doctree b/master/.doctrees/doc_title.doctree new file mode 100644 index 000000000..bce08b4f2 Binary files /dev/null and b/master/.doctrees/doc_title.doctree differ diff --git a/master/.doctrees/environment.pickle b/master/.doctrees/environment.pickle new file mode 100644 index 000000000..687029072 Binary files /dev/null and b/master/.doctrees/environment.pickle differ diff --git a/master/.doctrees/examples.doctree b/master/.doctrees/examples.doctree new file mode 100644 index 000000000..a7958dd66 Binary files /dev/null and b/master/.doctrees/examples.doctree differ diff --git a/master/.doctrees/frame.doctree b/master/.doctrees/frame.doctree new file mode 100644 index 000000000..82100b7bc Binary files /dev/null and b/master/.doctrees/frame.doctree differ diff --git a/master/.doctrees/index.doctree b/master/.doctrees/index.doctree new file mode 100644 index 000000000..645a805cf Binary files /dev/null and b/master/.doctrees/index.doctree differ diff --git a/master/.doctrees/templates.doctree b/master/.doctrees/templates.doctree new file mode 100644 index 000000000..4454b5de3 Binary files /dev/null and b/master/.doctrees/templates.doctree differ diff --git a/master/.doctrees/userdata.doctree b/master/.doctrees/userdata.doctree new file mode 100644 index 000000000..8442beb4b Binary files /dev/null and b/master/.doctrees/userdata.doctree differ diff --git a/master/ReleaseNotes.html b/master/ReleaseNotes.html new file mode 100644 index 000000000..dc2bbcc2f --- /dev/null +++ b/master/ReleaseNotes.html @@ -0,0 +1,3488 @@ + + + + + + + v00-17-04 — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

v00-17-04

+
    +
  • 2023-12-14 tmadlener (PR#527)

    +
      +
    • Split the ClassGenerator into a base class (mixin) and two specific c++ and julia code generators that only deal with their language specific needs.

      +
        +
      • Instantiate and configure the correct reader in the podio_class_generator.py main script depending on the desired language.

      • +
      +
    • +
    • Slightly cleanup the MemberVariable to declutter its __init__ method a bit.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#530)

    +
      +
    • Remove the reading of the deprecated old-style format of component definitions in the YAML files.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#485)

    +
      +
    • Remove the deprecated EventStore functionality as announced in #429

    • +
    +
  • +
  • 2023-12-12 tmadlener (PR#529)

    +
      +
    • Switch the relation range tests to use Frame based I/O.

    • +
    +
  • +
  • 2023-12-06 tmadlener (PR#526)

    +
      +
    • Switch the edm4hep workflows to an LCG stack with a recent enough version of CMake. Necessary after key4hep/EDM4hep#235

    • +
    +
  • +
  • 2023-12-05 jmcarcell (PR#523)

    +
      +
    • Remove comment with file name and line number. It’s very unlikely it remains up to date when either the name or the content of the files changes

    • +
    +
  • +
  • 2023-12-04 jmcarcell (PR#521)

    +
      +
    • Do not import ROOT when using podio-dump --help, otherwise it can take a while depending on the system only to print the help.

    • +
    +
  • +
  • 2023-12-04 tmadlener (PR#514)

    +
      +
    • Introduce the MaybeSharedPtr to manage the Obj* in the user facing handle classes.

      +
        +
      • This splits the control block and the managed object into two distinct entities with potentially different lifetimes, which allows to fix #174 and #492.

      • +
      • This increases the size of the user facing handle classes by a factor two, since they are now effectively two pointers instead of one, even if the control block will not be initialized in case a handle is obtained from a collection.

      • +
      +
    • +
    • Remove the ObjBase base class and make the ObjectID a member of the Obj classes.

    • +
    • Make the user facing handle class constructors from an Obj* private as users will not have access to raw Obj* in any case.

      +
        +
      • Introduce a static makeEmpty method for the generated classes in order to create an empty handle, which is also used internally to handle unpersisted relations.

      • +
      +
    • +
    • Enable more existing test cases in sanitizer workflows now that it has become possible to do so.

    • +
    +
  • +
  • 2023-12-04 Ananya Gupta (PR#473)

    +
      +
    • Added Julia code generation support in the existing Python interface.

    • +
    • Implemented a new design structure for generated Julia code.

    • +
    • Added default parameters in constructor definitions with support for Abstract types (for builtins).

    • +
    • Created _sort_components_and_datatypes function to perform topological sort on components and datatypes.

    • +
    • Created _has_static_arrays_import to check for the need of using Static Arrays in the generated julia code.

    • +
    • Added –lang (-l) programming language argument to specify the programming language for code generation, current choices: cpp and julia, default: cpp.

    • +
    • Added –upstream-edm code generation support for julia.

    • +
    • Added tests in the unit test suite, covering the Julia code generation of the example data models.

    • +
    • Added documentation for julia code generation.

    • +
    • Added ENABLE_JULIA toggle option. By default it is OFF.

    • +
    +
  • +
  • 2023-12-01 jmcarcell (PR#520)

    +
      +
    • Add an error message when there is an std::bad_function_call, which currently shows +a stacktrace and is quite uninformative.

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#519)

    +
      +
    • Make generated member getter functions return by value for builtin types. Keep return by const reference for all other types. Fixes #518

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#488)

    +
      +
    • Add python bindings for the RNTuple reader and writer

    • +
    • Make podio-dump understand RNTuple based files

    • +
    • Fix missing storage of datamodel definitions for RNTuple based files

    • +
    +
  • +
+
+
+

v00-17-03

+
    +
  • 2023-11-14 tmadlener (PR#513)

    +
      +
    • Introduce checks in ROOTFrameWriter::writeFrame and ROOTNTupleWriter::writeFrame that ensure consistent contents for all Frames of a given category. If inconsistent contents are found an exception is thrown. Before these changes this might lead to a crash or to unreadable files. Fixes #382

    • +
    • Refactor ROOTNTupleWriter internals to have only one map that keeps track of categories instead of two maps and a set that need to be kept consistent.

    • +
    +
  • +
+
+
+

v00-17-02

+
    +
  • 2023-11-08 jmcarcell (PR#511)

    +
      +
    • Decouple generation tools and files from the rest of the podio python files by creating a new folder called podio_gen. This is a transparent change for users that only use the generator script.

      +
        +
      • This makes the configuration / generation times negligible again, because we don’t load libraries unnecessarily any longer for the generation.

      • +
      +
    • +
    • Simplify the python bindings (podio) __init__.py and remove the test_utils from it.

    • +
    • Move the tests for writing frames in python to the tests folder, where they belong and also test the SIO python writer.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#510)

    +
      +
    • Fix legacy tests; an extra argument was being passed and default in the .cpp file example_frame.root was being used which (almost) always exists (because there is a another test creating it) so it was hard to notice.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#509)

    +
      +
    • Add an option for using clang format and set it to off by default. It is significantly slower to run cmake with this option on.

    • +
    +
  • +
  • 2023-11-02 jmcarcell (PR#508)

    +
      +
    • Use the cmake ExternalData module to manage test data. This lets cmake take care of downloading the tests by hash so they can be version controlled. In addition, it’s possible to set up a local store using -DExternalData_OBJECT_STORES=/path/to/store and it will download the test files there if they are not there but otherwise use them from there, so building from scratch won’t download the test files again.

    • +
    +
  • +
  • 2023-10-16 jmcarcell (PR#507)

    +
      +
    • Copy .clang-format to the dumpmodel test directory and fix some tests when the build directory is not a subdirectory of the main directory. In some tests clang-format will try to find a .clang-format looking in the directories above and if it doesn’t exist it will format files differently and some tests will fail.

    • +
    +
  • +
+
+
+

v00-17-01

+
    +
  • 2023-10-12 tmadlener (PR#505)

    +
      +
    • Bump the pylint version for CI to 2.17.7

    • +
    +
  • +
  • 2023-10-11 tmadlener (PR#502)

    +
      +
    • Add a deleteBuffers function that is populated at generation time to the CollectionReadBuffers to make it possible to dispose of unconsumed buffers. This fixes the main leaks described in #500

    • +
    • Make the ROOTFrameData clean up all unconsumed buffers at desctruction.

    • +
    • Make sure to delete buffers that are no longer necessary in the CollectionData constructor. This fixes some more leaks described in #500

    • +
    +
  • +
  • 2023-10-08 Wouter Deconinck (PR#503)

    +
      +
    • Install podio-vis

    • +
    +
  • +
  • 2023-10-04 jmcarcell (PR#497)

    +
      +
    • Move podio_PYTHON_DIR to the top level CMakeLists so that it is set even when BUILD_TESTING is off

    • +
    +
  • +
  • 2023-10-02 jmcarcell (PR#496)

    +
      +
    • Add an operator != to fix negative comparisons since after https://github.com/AIDASoft/podio/pull/493 now id() returns a podioObjectID

    • +
    +
  • +
  • 2023-09-29 tmadlener (PR#493)

    +
      +
    • Make [Mutable]Object::id() return a podio::ObjectID instead of unsigned, since the latter has become useless with #412. Fixes #438

    • +
    • Add an operator<<(std::ostream&) for podio::ObjectID

    • +
    +
  • +
+
+
+

v00-17

+
    +
  • 2023-09-22 Juraj Smiesko (PR#491)

    +
      +
    • podio-dump: print warning if requested entry not present in the file

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#490)

    +
      +
    • Fix bugs in python imports when podio is built without SIO support. Fixes #489

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#486)

    +
      +
    • Make sure to initialize ObjectIDs to untracked to properly track whether they have been added to a Frame or not

    • +
    • Change CollectionIDTable interfaces of name and collectionID to return optional to signal whether a collection (ID) is known to the table. This is a breaking change if you use the CollectionIDTable!

      +
        +
      • Avoids having to do the lookup twice to check existence and a subsequent retrieval

      • +
      +
    • +
    • Fix bug of overly shared CollectionIDTable in ROOTNTupleReader that was uncovered by the CollectionIDTable switch to optional returns.

    • +
    • Switch tests from EventStore to Frame based I/O.

    • +
    • Fix bug in Frame based I/O that lead to crashes when trying to resolve relations to unpersisted objects.

    • +
    +
  • +
  • 2023-09-18 tmadlener (PR#484)

    +
      +
    • Make the podio python bindings import structure “feel more pythonic”

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#483)

    +
      +
    • Clarify error message in case of not implemented schema changes

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#482)

    +
      +
    • rename CMake macro createBuffers into create_buffers

    • +
    +
  • +
  • 2023-09-13 jmcarcell (PR#481)

    +
      +
    • Rename the cmake executable or target unittest to unittest_podio, to avoid possible collisions since the unittest name is relatively common

    • +
    +
  • +
  • 2023-09-13 Benedikt Hegner (PR#480)

    +
      +
    • Move the code generation of buffers into the ‘create_buffers’ macro

    • +
    +
  • +
  • 2023-09-13 Thomas Madlener (PR#472)

    +
      +
    • Allow comparison of data schemata across versions

    • +
    • Provide syntax to clarify user intentions in schema evolution

    • +
    • Provide schema evolution implementation based on ROOT backend

    • +
    • Include infrastructure for future support for schema evolution in other backends

    • +
    • Documentation for schema evolution functionality

    • +
    +
  • +
  • 2023-09-11 tmadlener (PR#477)

    +
      +
    • Use nlohmann/json_fwd.hpp in headers to reduce unnecessary template instantiations. Fixes #475

    • +
    +
  • +
  • 2023-09-08 tmadlener (PR#478)

    +
      +
    • Add empty method to CollectionBase

    • +
    • Add operator== to the collection iterators

    • +
    +
  • +
  • 2023-09-08 Dmitry Kalinkin (PR#465)

    +
      +
    • Introduce member typedefs to the user facing classes.

      +
        +
      • Object’s collection type can now be referenced as Object::collection_type. Conversely, the object type is reachable as ObjectCollection::value_type. The mutable objects can be reached via Object::mutable_type.

      • +
      +
    • +
    +
  • +
  • 2023-08-30 tmadlener (PR#471)

    +
      +
    • Initialize the branch names to be index based for reading (i.e. legacy behavior) for all releases of the v00-16 series.

    • +
    +
  • +
  • 2023-08-22 Andre Sailer (PR#469)

    +
      +
    • Tests: update required catch2 version to 3.4 for builds with c++20

    • +
    • CI: use clang16 on el9 (alma9), instead of clang12 on cs7, using c++20

    • +
    • CI: disable key4hep-release-based tests (tabulate available)

    • +
    +
  • +
  • 2023-08-22 Benedikt Hegner (PR#445)

    +
      +
    • Allow to specify units as part of the datamodel definition

    • +
    +
  • +
  • 2023-07-26 tmadlener (PR#463)

    +
      +
    • Make sure to only access vector member buffers of collections of datatypes with VectorMembers if they actually exist. This is necessary to make subset collections of such datatypes work in I/O. Fixes #462

    • +
    • Add a test that reproduces the original issue and is fixed by this.

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#461)

    +
      +
    • Make sure the ROOTFrameReader on the master branch can read v00-16-06 files

    • +
    • Add v00-16-06 to the legacy versions that are tested

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#447)

    +
      +
    • Add a python wrapper around the different available Frame writers.

    • +
    • Add a put method to the Frame wrapper that allows to add collections to the Frame without having to explicitly use cppyy.gbl.std.move. Fixes #432

    • +
    • Add test cases that write via python bindings and read via c++.

    • +
    +
  • +
  • 2023-07-20 tmadlener (PR#457)

    +
      +
    • Simplify the test setup for SIO in CMake and make it explicit on the ENABLE_SIO option rather than on the presence of targets.

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#456)

    +
      +
    • Cache podio_PYTHON_DIR

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#455)

    +
      +
    • Rename CMAKE_BINARY_DIR to PROJECT_BINARY_DIR

    • +
    +
  • +
  • 2023-07-18 tmadlener (PR#439)

    +
      +
    • Introduce the FrameCategories.h header that puts a few of the conventions and otherwise hardcoded strings into variables / functions.

    • +
    +
  • +
  • 2023-07-14 jmcarcell (PR#454)

    +
      +
    • Rename CMAKE_{SOURCE,BIN}_DIR to PROJECT_{SOURCE,BIN}_DIR

    • +
    +
  • +
  • 2023-07-14 tmadlener (PR#452)

    +
      +
    • Extend the pre-processor condition for the to_json functionality to not be visible in rootcling or the root interpreter. Fixes #435

    • +
    +
  • +
  • 2023-07-13 Benedikt Hegner (PR#450)

    +
      +
    • Add optional description and author fields to component definition

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#449)

    +
      +
    • Fix the pre-commit workflow by making it run on top of the key4hep nightlies that come with a recent enough root version to be able to work with the RNTuple addition (#395)

    • +
    • Fix a few minor complaints from newer versions of clang-format, clang-tidy and pylint

    • +
    • Enable building the RNTuple backend for more workflows (anything that comes with a new enough ROOT essentially).

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#448)

    +
      +
    • Remove the lcio datalayout which has been untouched (and unbuilt) for quite a few years.

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#446)

    +
      +
    • Make calling finish for the SIOFrameWriter non-mandatory. See #442 for other related changes.

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#442)

    +
      +
    • Allow not calling finish() when using the writers

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#395)

    +
      +
    • Add support for the new RNTuple format by adding a writer, reader and tests.

    • +
    +
  • +
  • 2023-06-30 Ananya Gupta (PR#437)

    +
      +
    • Modified parse function definition to incorporate missing description in member definition error message. Fixes #436

    • +
    +
  • +
  • 2023-06-27 Thomas Madlener (PR#413)

    +
      +
    • Introduce podio::SchemaEvolution that can hold schema evolution functions and that offers an evolveBuffers method that does the schema evolution on these buffers before collections are created.

    • +
    • Add hooks in podio::Frame to call this when collections are read from the FrameData.

    • +
    +
  • +
  • 2023-06-23 tmadlener (PR#434)

    +
      +
    • Properly handle the slightly different branch contents before v00-16-04. Fixes #433

    • +
    • Add tests that use the ROOTLegacyReader to actually read the downloaded legacy files

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#428)

    +
      +
    • Split the tests directory into several (more or less) topical sub-directories to declutter the main test CMakeLists.txt a bit

    • +
    • Move commonly used functionality into cmake/podioTests.cmake (e.g. setting up a test environment)

    • +
    • Move python unittests config to the python directory

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#427)

    +
      +
    • Delay library loading as long as possible, mainly for quicker responses for --help

    • +
    • Add a --version flag for dumping the podio version

    • +
    • Display collections and parameters in alphabetical order and automatically adjust column widths to fit contents (using the tabulate package).

    • +
    +
  • +
  • 2023-06-09 Thomas Madlener (PR#402)

    +
      +
    • Add public static constexpr char* type names to the collections and make the getXXXName() methods return string_views to these strings. This is a breaking change to the interface of the collections if you explicitly rely on them being std::string

      +
        +
      • typeName: the full type name of the collection (returned also by getTypeName)

      • +
      • valueTypeName: the (immutable) type name of the objects of the collection (returned by getValueTypeName)

      • +
      • dataTypeName: the type name of the data PODs (returned by getDataTypeName)

      • +
      +
    • +
    • Make unittest environment properly use PODIO_SIOBLOCK_PATH

    • +
    • USE_EXTERNAL_CATCH2 now can also be set to AUTO to look for a suitable version of Catch2 before falling back and fetching and building it’s own version instead of a hard fail.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#426)

    +
      +
    • Check if PODIO_SIOBLOCK_PATH exists in the environment and use that to look for SIO Blocks libraries before falling back to LD_LIBRARY_PATH. This makes it possible to make slightly more robust environments if several (incompatible) podio installations are visible on LD_LIBRARY_PATH

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#425)

    +
      +
    • Add a SKIP_CATCH_DISCOVERY cmake option to skip the unittest discovery of Catch2 to avoid running the catch discovery in an unsuitable environment.

    • +
    • Make environment for unittests more specific to avoid catching too much of the underlying environment.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#412)

    +
      +
    • Using string hashes as CollectionID based on MurmurHash

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#423)

    +
      +
    • Add some more structure to make it easier to add more legacy tests.

      +
        +
      • Use this to download more legacy files automatically

      • +
      • Restructure CMake config to make this possible

      • +
      +
    • +
    • Add tests for Frame based root I/O reading files that have been produced with prior versions of podio

    • +
    • Add more tests for EventStore based root I/O reading files that have been produced with prior versions of podio

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#421)

    +
      +
    • Make the collections appear in alphabetical order in root files, using a case insensitive sorting of the collections that are written.

    • +
    +
  • +
  • 2023-06-05 Thomas Madlener (PR#405)

    +
      +
    • Make the branch names for relations and vector members more legible and valid c++ variable names to improve interoperability with RDataFrame. Fixes #169

      +
        +
      • The branch names will have the following structure: _<collection-name>_<relation-name>, resp. _<collection-name>_<vectormember-name>, where relation-name, resp.vectormember-name are taken from the YAML definitions.

      • +
      • Subset collections will have a single branch with <collection-name>_objIdx. This makes it easier to disambiguate them from normal collections.

      • +
      +
    • +
    • This is a breaking change if you use the root files directly! If you use the podio Readers/Writers everything should be transparent

    • +
    +
  • +
  • 2023-05-30 tmadlener (PR#422)

    +
      +
    • Fix small bug in Frame python bindings where set but empty parameters could crash podio-dump when trying to access a non-existent element

    • +
    +
  • +
+
+
+

v00-16-05

+
    +
  • 2023-05-23 tmadlener (PR#420)

    +
      +
    • Fix a version check inside the ROOTReader to avoid segmentation violations

    • +
    +
  • +
+
+
+

v00-16-04

+
    +
  • 2023-05-23 tmadlener (PR#417)

    +
      +
    • Fix an issue with reading multiple files via the ROOTFrameReader (#411)

      +
        +
      • Add documentation for API of opening file(s)

      • +
      • Add tests for reading multiple files

      • +
      +
    • +
    +
  • +
  • 2023-05-22 tmadlener (PR#418)

    +
      +
    • Bring back the public templated getMap functionality for podio::GenericParameters as they are already used in DD4hep (see AIDASoft/DD4hep#1112).

      +
        +
      • Mark the existing getXYZMap as deprecated but keep them for a brief transition period.

      • +
      • These have been removed in #415.

      • +
      +
    • +
    +
  • +
  • 2023-05-19 jmcarcell (PR#416)

    +
      +
    • Remove selection rules for classes that don’t exist anymore

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#415)

    +
      +
    • Remove the deprecated getters and setters from the generic parameters

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#410)

    +
      +
    • Remove the square that is run when cmake runs

    • +
    +
  • +
  • 2023-05-09 tmadlener (PR#414)

    +
      +
    • Fix off-by-one error in UserDataCollection::print that caused the first element to be printed twice.

    • +
    +
  • +
  • 2023-05-09 Thomas Madlener (PR#394)

    +
      +
    • Introduce a CollectionBufferFactory that can create the necessary buffers from a collection type, a schema version and a subset collection flag.

      +
        +
      • Use this factory throughout all existing Readers

      • +
      • Remove createBuffers and createSchemaEvolvableBuffers from podio::CollectionBase interface

      • +
      +
    • +
    • Make the minimum allowed schema_version 1 in the yaml definition files. Default to 1 if no schema_version is provided

    • +
    • Add a schemaVersion to the DatamodelDefinition.h header that is generated and that can be accessed via {{ package_name }}::meta::schemaVersion. Use this to propagate schema information to the necessary places.

    • +
    • Make SIOBlocks write the current schema version, such that on reading they can generate the appropriate buffers for the version on file.

    • +
    +
  • +
  • 2023-04-22 Christopher Dilks (PR#408)

    +
      +
    • fix type inconsistency between Collection::size() and index for const object accessors

    • +
    +
  • +
  • 2023-04-21 jmcarcell (PR#387)

    +
      +
    • Make sure that the dump model round trip tests work without ENABLE_SIO

    • +
    • Actually test the extension model dumping

    • +
    +
  • +
  • 2023-04-12 Thomas Madlener (PR#400)

    +
      +
    • Fix a bug in SIOFrameData::getAvailableCollections to also work with Frames where some of the collections have not been written and that could lead to a seg fault.

    • +
    • Add a test for this in c++ (previously only covered in python unittests of Frame).

    • +
    +
  • +
  • 2023-04-05 Thomas Madlener (PR#399)

    +
      +
    • Add PODIO_ENABLE_SIO=1 to the public target_compile_definitions for podioSioIO so that all dependent targets automatically get it as well. This should make it easier to use SIO dependent features in dependencies.

    • +
    • Consistently use a scope for target_link_libraries in tests.

    • +
    +
  • +
  • 2023-04-03 Paul Gessinger-Befurt (PR#398)

    +
      +
    • Do not reject building if ROOT was built with C++20 (instead of C++17).

    • +
    +
  • +
  • 2023-04-03 Thomas Madlener (PR#397)

    +
      +
    • Remove the GENERATED property from generated files in CMake to avoid inconsistent removal of headers and source files with the clean target. Fixes #396

    • +
    +
  • +
  • 2023-03-15 Benedikt Hegner (PR#341)

    +
      +
    • Adding infrastructure for schema evolution

    • +
    • Added explicit version tracking to the metadata

    • +
    • Data model comparison tool w/ simple heuristics to identify potential omissions / mistakes (e.g. checking for the limits of the ROOT backend)

    • +
    • Changed handling of backwards compatibility for the collection info metadata

    • +
    +
  • +
+
+
+

v00-16-03

+
    +
  • 2023-03-14 jmcarcell (PR#391)

    +
      +
    • Catch an exception when a clang-format flag is not found

    • +
    +
  • +
  • 2023-03-14 jmcarcell (PR#390)

    +
      +
    • Modify the initial clang-format check to try to run with all the arguments that will be used later

    • +
    +
  • +
  • 2023-03-13 jmcarcell (PR#389)

    +
      +
    • Add .cache to the gitignore

    • +
    +
  • +
  • 2023-03-07 Thomas Madlener (PR#358)

    +
      +
    • Embed the EDM definition in JSON format into the shared core datamodel libraries

      +
        +
      • Generate an additional DatamodelDefinition.h header file containing the string literal json encoded definition

      • +
      • Statically register this to the newly introduced DatamodelRegistry and make collections aware of which datamodel they belong to

      • +
      +
    • +
    • Collect all EDM definitions from all collections that are written with a writer and write all these definitions to the resulting file

      +
        +
      • Currently only done for the FrameWriters

      • +
      +
    • +
    • Give podio-dump the necessary functionality to retrieve the stored models and dump them in YAML format again

      +
        +
      • Add roundtrip tests that compare the generated code from the original model and the one that has been dumped from a data file to ensure that all components work as intended.

      • +
      +
    • +
    • See the advanced topics documentation for more details.

    • +
    +
  • +
  • 2023-03-06 Dmitry Kalinkin (PR#384)

    +
      +
    • Added an operator for conversion to std::string for podio::version::Version

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#378)

    +
      +
    • Introduce deprecation warnings for the EventStore based I/O model as it will be removed in favor of the Frame based one

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#372)

    +
      +
    • Make double a supported type of GenericParameters. A similar thing has been added to LCIO in iLCSoft/LCIO#143 to support storing event weights that need double precision.

    • +
    • Add more unittests to the GenericParameters covering also the available constructors.

    • +
    +
  • +
  • 2023-02-27 Thomas Madlener (PR#380)

    +
      +
    • Add getParameters method to the Frame and deprecate getGenericParametersForWrite which offered the exact same functionality.

      +
        +
      • Make it easily possible to get all parameters that are currently stored in a Frame via an “official” channel

      • +
      • Replace all internal usages.

      • +
      +
    • +
    • Add a getParameterKeys templated method to get the keys for different parameter types that are currently stored in the Frame.

    • +
    +
  • +
  • 2023-02-22 jmcarcell (PR#377)

    +
      +
    • Add a visualization tool that converts a YAML description to a graph

    • +
    +
  • +
  • 2023-02-21 jmcarcell (PR#376)

    +
      +
    • Fix tests without SIO

    • +
    +
  • +
  • 2023-02-14 Thomas Madlener (PR#375)

    +
      +
    • Fix the PODIO_VERSION preprocessor macro to be actually usable in a preprocessor context. Fixes #374

    • +
    • Make podio_VERSION preprocessor constant something that can be used in a preprocessor context (now the same as PODIO_BUILD_VERSION

    • +
    • Add test that ensures that the macro and the constant are actually used in a preprocessor context.

    • +
    +
  • +
  • 2023-02-13 Juraj Smiesko (PR#373)

    +
      +
    • Adding ID to the short podio-dump output

    • +
    +
  • +
  • 2023-02-06 Nathan Brei (PR#369)

    +
      +
    • Mark non-templated definitions of Frame::Frame, Frame::get, Frame::put and Frame::putParameters as inline to fix linker errors.

    • +
    +
  • +
  • 2023-02-02 jmcarcell (PR#364)

    +
      +
    • Make workflows not trigger twice on pushes to PRs

    • +
    +
  • +
  • 2023-01-26 jmcarcell (PR#368)

    +
      +
    • CMAKE: Add option PODIO_RELAX_PYVER to allow relaxing the required match of python version with the one that ROOT has been built with to only check major and minor versions

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#363)

    +
      +
    • Move sio utility functionality defined in SIOFrameWriter.cc to private sioUtils.h header and use it also in the legacy SIOWriter.

    • +
    • Fix cmake configure dependencies (missed in #343) for datamodel generation macro.

    • +
    • Use defaultdict instead of hand rolling one in class generator.

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#361)

    +
      +
    • Add basic I/O tests for datatypes defined in the extension datamodel. Fixes #319

    • +
    +
  • +
  • 2023-01-11 jmcarcell (PR#355)

    +
      +
    • Change the readers so that when the file is missing they won’t crash

    • +
    +
  • +
  • 2023-01-10 jmcarcell (PR#365)

    +
      +
    • Fix the pre-commit workflow

    • +
    +
  • +
  • 2022-12-23 jmcarcell (PR#362)

    +
      +
    • Rename the variable match to avoid collisions with a python keyword from Python 3.10 onwards

    • +
    +
  • +
+
+
+

v00-16-02

+
    +
  • 2022-12-19 Thomas Madlener (PR#360)

    +
      +
    • Make the log output of loading the SIOBlock libraries more informative by also providing the absolute paths to the loaded (and rejected) shared libraries.

    • +
    +
  • +
  • 2022-12-16 Thomas Madlener (PR#333)

    +
      +
    • Initialize the unique_ptr<mutex> in the constructor initializer list instead of in the member variable declaration. This is more likely a bug in nvcc (or maybe a c++17 feature not yet supported by nvcc). Fixes key4hep/k4Clue#34

    • +
    • Pass --disable-new-dtags to the linker when using PODIO_SET_RPATH, to set RPATH and not RUNPATH in the binaries.

    • +
    • Pin the ubuntu version for runners that build on ubuntu to not accidentally go out of sync with the underlying LCG releases.

    • +
    • Disable the podio tests in the edm4hep workflows (see #359).

    • +
    +
  • +
+
+
+

v00-16-01

+
    +
  • 2022-12-06 jmcarcell (PR#356)

    +
      +
    • Fix path in the README

    • +
    • Use the functionality in argparse to choose between options

    • +
    +
  • +
  • 2022-12-06 Benedikt Hegner (PR#346)

    +
      +
    • Switched tp Apache 2.0 license to facilitate integration in experiment stacks.

    • +
    +
  • +
  • 2022-12-05 Thomas Madlener (PR#357)

    +
      +
    • Put <prefix>/bin onto PATH in order to make podio-dump available from environments created with env.sh

    • +
    +
  • +
  • 2022-12-02 jmcarcell (PR#354)

    +
      +
    • Make env.sh setup script POSIX compliant to run in shells other than bash

      +
        +
      • Change == to =

      • +
      • Change tabs to spaces (two) to avoid mix of spaces and tabs for indenting

      • +
      • Add <prefix>/include to ROOT_INCLUDE_PATH (as it is required since #343)

      • +
      +
    • +
    +
  • +
  • 2022-11-16 Thomas Madlener (PR#351)

    +
      +
    • Fix bug in Frame python bindings where empty collections were considered as non-existing. Replacing the original check relying on some implicit boolean conversions (which also caught empty collections) to an explicit check against nullptr.

    • +
    • Make podio-dump more robust in installations without SIO support, by guarding the corresponding import.

    • +
    +
  • +
  • 2022-11-14 Thomas Madlener (PR#344)

    +
      +
    • Make podio-dump work with new Frame based I/O (fixes #339)

    • +
    • Keep existing functionality intact by using the legacy readers introduced in #345.

    • +
    +
  • +
  • 2022-11-11 Thomas Madlener (PR#345)

    +
      +
    • Add a ROOTLegacyReader and a SIOLegacyReader that read files that have been written prior to #287 into podio::Frames and offers the same interface as the frame readers

      +
        +
      • Also including python bindings for it

      • +
      +
    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#349)

    +
      +
    • Fix bug in setting relations in nested get calls in podio::Frame. Fixes #348

    • +
    • Adapt the read test to actually check this. Previously this went unnoticed, because the necessary relations were already set in a previous call.

    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#343)

    +
      +
    • Add python bindings for Frame based I/O

      +
        +
      • Available from podio.root_io and podio.sio_io, where a Reader and a Writer is implemented for each.

      • +
      • Wrapper around podio::Frame. Requires that the podio/Frame.h header is available somewhere on the ROOT_INCLUDE_PATH.

      • +
      +
    • +
    • Add necessary functionality for python bindings to C++ API

      +
        +
      • untyped Frame::get method for getting collections

      • +
      • New constructor from FrameDataT&&

      • +
      • functionality to inspect file and Frame contents more easily

      • +
      +
    • +
    • Reorganize python code into structure that follows the usual python packaging conventions a bit more closely

      +
        +
      • Introduce the podio module. Make CMake generate the __init__.py with the correct version

      • +
      • Move everything except the generator script into module. Additionally also keep an EventStore wrapper to not break existing code.

      • +
      +
    • +
    • Refactor the CMakeLists.txt that is responsible for building the core and all required I/O libraries

      +
        +
      • Build more dictionaries for more python bindings.

      • +
      +
    • +
    +
  • +
  • 2022-11-02 Thomas Madlener (PR#342)

    +
      +
    • Migrate to actions/checkout@v3 as advised by github

    • +
    • Use the checkout action to clone the dependencies in the edm4hep workflow instead of doing an explicit clone in the body of the action

    • +
    +
  • +
  • 2022-11-02 Dmitry Kalinkin (PR#327)

    +
      +
    • fix typo in documentation

    • +
    +
  • +
  • 2022-10-24 Juraj Smiesko (PR#340)

    +
      +
    • Adding reading of specific entry from frame

    • +
    +
  • +
  • 2022-10-21 Thomas Madlener (PR#335)

    +
      +
    • Update the github-action-cvmfs and run-lcg-view actions to their latest available version to pick up the latest improvements (caching of dependencies, log groups)

    • +
    • Introduce log groups in github actions for easier to interpret outputs

    • +
    • Switch to LCG_102 for lcg based build environments

    • +
    • Add a workflow that builds and tests EDM4hep after building podio

    • +
    +
  • +
+
+
+

v00-16

+
    +
  • 2022-10-04 Thomas Madlener (PR#337)

    +
      +
    • Make the notebook pattern functionality return std::vectors instead of std::array to avoid having to specify a static size. Fixes #332

    • +
    • Backwards incompatible change as the return type as well as the call signature for the notebook pattern change.

    • +
    +
  • +
  • 2022-09-27 Andre Sailer (PR#336)

    +
      +
    • podioConfig.cmake: silence warning about cmake policy CMP00012

    • +
    • CMake: explicitly look for catch2 version 3 and fail at cmake instead of compile step

    • +
    +
  • +
  • 2022-09-27 Thomas Madlener (PR#334)

    +
      +
    • Fix a warning/error message from ROOT from attempts to stream the std::mutex members of GenericParameters by marking them as transient for the dictionary generation.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#323)

    +
      +
    • Add a podio-dump python script (installed to <prefix>/bin that can be used to dump event contents to stdout. By default prints an overview over the collections and their types, but can also be used to dump full events, via the -d or --detailed flag. Use --help to get all available options and their descriptions.

    • +
    • To allow podio-dump to work with all available backends also add support for reading SIO via the PythonEventStore.

      +
        +
      • Split off the necessary c++ functionality into a separate podioPythonStore library (+ necessary ROOT dictionaries).

      • +
      +
    • +
    • Add a print function to the collections for easier dumping from the python side.

    • +
    • Add a print function to the GenericParameters

    • +
    • Make goToEvent is a part of the IReader interface and correctly implemented it for the SIOReader.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#287)

    +
      +
    • Introduce the podio::Frame as a generalized, thread-safe (event) data container.

      +
        +
      • This first version offers all necessary functionality and an almost finalized interface, i.e. we plan to keep this as stable as possible, but we might still change things if it turns out that there are better ways to do some things

      • +
      • For details about the basic interface and the underlying design considerations please consult the corresponding documentation

      • +
      +
    • +
    • This will be the only way to work with podio data starting from version 1.0

      +
        +
      • For now the current I/O implementations remain in place unchanged, but they will be deprecated (and removed) in the not too distant future

      • +
      +
    • +
    +
  • +
+
+
+

v00-15

+
    +
  • 2022-08-09 Thomas Madlener (PR#312)

    +
      +
    • Add support for converting objects and collections to JSON using nlohmann/json.

      +
        +
      • To enable JSON support it is necessary to build the datamodel with PODIO_JSON_OUTPUT and to link against the nlohmann/json library.

      • +
      +
    • +
    +
  • +
  • 2022-08-05 Wouter Deconinck (PR#318)

    +
      +
    • CMake: PODIO_ADD_ROOT_IO_DICT: Bugfix for data models in OUTPUT_FOLDER not equal to source dir in root dictionary generation cmake macro.

      +
        +
      • Now SELECTION_XML can be passed either as absolute path or relative to OUTPUT_FOLDER.

      • +
      +
    • +
    +
  • +
  • 2022-08-03 Thomas Madlener (PR#317)

    +
      +
    • Make it possible to pass an upstream datamodel to the class generator such that datatypes and components defined there can be used in an unrelated datamodel. This makes it possible to extend datamodels and to prototype new datatypes with the aim of upstreaming them eventually without having to redefine all the necessary components.

    • +
    • Refactor the internals of the config reader / class generator slightly to make it possible to hold multiple datamodels in memory

    • +
    +
  • +
  • 2022-08-02 Thomas Madlener (PR#316)

    +
      +
    • Remove macOS CI workflows because github hosted runners will deprecate macOS 10.15 (announcement) and later versions of macOS no longer support fuse and as a consequence CVMFS.

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#315)

    +
      +
    • Make the is_trivial_type flag available in the template engine behave as expected (it behaved exactly oppositely to what was documented and what one would intuitively expect). The flag was originally introduced in #288

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#283)

    +
      +
    • Allow users to define default values for member variables, instead of default initializing all of them.

      +
        +
      • The syntax for specifying a default value is - <type> <name>{<init-value>} // <description>.

      • +
      • The passed value is not validated in any way. Apart from a very basic syntax check, there is no validation that the provided default initialization values are actually valid. This means that generated code might not compile.

      • +
      +
    • +
    • Remove some of the python2 compatibility and do some cleanup

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#276)

    +
      +
    • Remove support for having std::string members in datatypes and components, as they break PODness and it seems that this feature was not in use in any case.

    • +
    • Make ROOTReader slightly more robust against missing datatypes in dictionaries when reading files.

    • +
    +
  • +
  • 2022-06-22 Valentin Volkl (PR#307)

    +
      +
    • hotfix for https://github.com/AIDASoft/podio/issues/290: revert a clang-tidy change to make sure that there are no unknown symbols in podioDict

    • +
    +
  • +
  • 2022-06-21 Thomas Madlener (PR#282)

    +
      +
    • Add a PODIO_USE_CLANG_FORMAT option to the cmake configuration to toggle the autodiscovery of clang-format and a .clang-format configuration file. This option is also available for downstream packages that use podio to generate their EDM.

      +
        +
      • The default is AUTO, where we try to discover a suitable clang-format version as well as a .clang-format file and use it if we find it.

      • +
      • If set to OFF podio will not try to see whether clang-format and a .clang-format file are available and will also not try to format the code accordingly.

      • +
      • If set to ON podio will actually require a suitable clang-format version and the presence of a .clang-format file and will fail at the cmake stage if not present.

      • +
      +
    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#305)

    +
      +
    • Make sure generator warnings are printed

    • +
    • Add a deprecation warning for the upcoming removal of support of std::string in data types. (See also #276)

    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#294)

    +
      +
    • Remove the EventStore, CollectionIDTable and version::Version members from the SIOCollectionIDTableBlock to make it easier to use in the Frame context

    • +
    • Move the podio:version::build_version into its own SIOVersionBlock

    • +
    • This is a breaking change for the SIO backend and it will not be able to read files that have been written prior to this

    • +
    +
  • +
+
+
+

v00-14-02

+
    +
  • 2022-06-15 Thomas Madlener (PR#304)

    +
      +
    • Use the releases v3.0.1 version of Catch2 instead of an unreleased commit

    • +
    +
  • +
  • 2022-06-15 Thomas Madlener (PR#303)

    +
      +
    • Default initialize the array for the vectorized access.

    • +
    +
  • +
  • 2022-06-14 soumil (PR#296)

    +
      +
    • Add instructions on how to run pre-commit locally to the documentation

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#295)

    +
      +
    • Mark CollectionBase::prepareForWrite as const and make sure that the generated implementations are thread safe.

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#286)

    +
      +
    • Make sure that vector member buffers for writing point to the correct place even if a collection has been moved, by resetting them when the buffers are requested.

    • +
    • Add checks for this to the unittests, as this is sort of an interface for I/O backends.

    • +
    +
  • +
  • 2022-06-13 Kalina Stoimenova (PR#301)

    +
      +
    • Fixed the text in the cmake message for code generation to point to the correct readme file

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#300)

    +
      +
    • Newer versions of pylint have removed a few options and a few checks that aimed at python2-python3 compatibility.

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#299)

    +
      +
    • Explicitly add constructors to CollectionBase

    • +
    • Make sure to not use an unset LD_LIBRARY_PATH for detecting sio blocks shared libraries.

    • +
    +
  • +
  • 2022-06-02 soumil (PR#293)

    +
      +
    • Removing python2 compatibility imports

    • +
    • Removing ordered loading (obsolete) function

    • +
    +
  • +
  • 2022-06-01 Thomas Madlener (PR#285)

    +
      +
    • Fix potential bug in setting the collection ID for subset collections

    • +
    +
  • +
  • 2022-05-30 soumil (PR#291)

    +
      +
    • Replace the obj_needs_destructor flag in the generator code and templates with the is_trivial_type flag, since that is the more appropriate name. (Fixes #288)

    • +
    +
  • +
  • 2022-05-27 Thomas Madlener (PR#274)

    +
      +
    • Add documentation for the Jinja2 templates and the code generation process in general to make working with these parts of PODIO easier.

    • +
    +
  • +
  • 2022-05-23 Thomas Madlener (PR#262)

    +
      +
    • Make the getters and setters for the GenericParameters templated functions and add a deprecation warning for the untemplated ones.

    • +
    • Define a SupportedGenericDataTypes tuple defining the types (and vectors of those) that can be stored in GenericParameters

    • +
    • Add a podio/utilities/TypeHelpers.h header with some type handling helpers.

    • +
    +
  • +
  • 2022-05-20 Thomas Madlener (PR#277)

    +
      +
    • Avoid fetching the (remote) legacy input file for tests unnecessarily every time cmake is run.

    • +
    +
  • +
  • 2022-05-17 Thomas Madlener (PR#284)

    +
      +
    • Make sure the EventStore doesn’t try to read event meta data multiple times per event

    • +
    • Add a empty method to GenericParameters to check if any parameters are stored.

    • +
    +
  • +
  • 2022-04-04 Thomas Madlener (PR#280)

    +
      +
    • Only use --color option for diff in clang-format wrapper script if it is supported by the underlying diffutils.

    • +
    +
  • +
  • 2022-04-02 Thomas Madlener (PR#254)

    +
      +
    • Add a .clang-format and .clang-tidy config file for consistent formatting and following a few coding guidelines.

    • +
    • Add pre-commit hooks that run clang-tidy and clang-format

    • +
    • Make all currently present files follow the formatting and guidelines of the present configuration.

    • +
    • Make the PODIO_GENERATE_DATAMODEL macro look for a .clang-format file and the presence of clang-formatand automatically format all the generated files if both are there.

    • +
    +
  • +
  • 2022-04-01 Thomas Madlener (PR#279)

    +
      +
    • Fix test environment to work again in newest Key4hep release by unsetting ROOT_INCLUDE_PATH in the test environment to avoid potential clashes with existing other installations in the environment.

    • +
    • Add CI build against the Key4hep nightlies.

    • +
    • Switch to use the Catch2 installation from Key4hep for the workflows.

    • +
    +
  • +
  • 2022-03-31 Thomas Madlener (PR#253)

    +
      +
    • Add a basic setup for pre-commit and replace the python linting github workflow with one that is run via pre-commit.

      +
        +
      • Add additional checks for consistent line-endings and removal of trailing whitespaces.

      • +
      +
    • +
    • Update pylint and flake8 config to no longer check for python2/python3 compatibility but instead follow the same guidelines as e.g. in ILCDirac.

    • +
    • Fix all issues that were uncovered.

    • +
    +
  • +
  • 2022-03-23 Thomas Madlener (PR#270)

    +
      +
    • Remove duplicated printing of component members in the std::ostream& operator<< overloads of the datatypes. Fixes #269

    • +
    • Add an example datatype that broke compilation before these fixes.

    • +
    +
  • +
  • 2022-03-18 Andre Sailer (PR#265)

    +
      +
    • CI: use clang12 and gcc11 for tests based on dev stacks

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14

+
    +
  • 2021-10-13 Thomas Madlener (PR#234)

    +
      +
    • Make sure that #include <cstdint> is present when using fixed with integers in datatypes

    • +
    +
  • +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-14-00

+
    +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-13-02

+
    +
  • 2021-10-08 Thomas Madlener (PR#224)

    +
      +
    • Make the clone function always return a mutable object, also when called on an immutable object (Fixes #219)

    • +
    +
  • +
  • 2021-09-22 Thomas Madlener (PR#214)

    +
      +
    • Make the CMake datamodel generation macro use the python interpreter that is also found by CMake to avoid accidentally picking up an unsuitable system provided version that might be on PATH.

    • +
    +
  • +
  • 2021-09-21 Frank Gaede (PR#213)

    +
      +
    • add possibility to store additional user data as collections of fundamental types in PODIO files

      +
        +
      • uses std::vector<basic_type>

      • +
      • stored in simple branch in root (and simple block in SIO)

      • +
      • all fundamental types supported in PODIO (except bool) can be written

      • +
      +
    • +
    • example code:

    • +
    +
      auto& usrInts = store.create<podio::UserDataCollection<uint64_t> >("userInts");
    +  auto& usrDoubles = store.create<podio::UserDataCollection<double> >("userDoubles");
    +  // ...
    +
    +  // add some unsigned ints
    +  usrInts.resize( i + 1 ) ;
    +  int myInt = 0 ;
    +  for( auto& iu : usrInts ){
    +    iu = myInt++  ;
    +  }
    +  // and some user double values
    +  unsigned nd = 100 ;
    +  usrDoubles.resize( nd ) ;
    +  for(unsigned id=0 ; id<nd ; ++id){
    +    usrDoubles[id] = 42. ;
    +  }
    +
    +
    +
      +
    • should replace https://github.com/key4hep/EDM4hep/pull/114 in a more efficient way

    • +
    +
  • +
  • 2021-09-21 tmadlener (PR#143)

    +
      +
    • Generate an additional podio_generated_files.cmake file containing all generated source files as a header and sources list and make the code generation macro include this file to get the headers and source files.

      +
        +
      • Now only the files generated for the current settings are picked up by cmake

      • +
      • Makes it possible to have additional files in the folders where the generated files are placed, since these are no longer globbed over.

      • +
      +
    • +
    +
  • +
  • 2021-09-10 Thomas Madlener (PR#217)

    +
      +
    • Make the Obj destructors = default where possible, i.e. if a datatype has no relations to handle

    • +
    • Make the assignment operators of the user facing classes use the “copy-and-swap” idiom

    • +
    • Fix the problem where OneToOneRelations needed to be from the same namespace as the datatype they are used in (#216)

    • +
    +
  • +
  • 2021-09-06 Thomas Madlener (PR#211)

    +
      +
    • Fix test dependencies to allow running tests in parallel via ctest -jN

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#210)

    +
      +
    • Fix a few small issues in the datamodel yaml file validation. These do not change the behavior of code generation, they just try to catch problems earlier

      +
        +
      • Make sure that OneToManyRelations and OneToOneRelations have the same restrictions

      • +
      • Only allow components, builtins and arrays of those as Members

      • +
      +
    • +
    • Make the API of validate slightly more generic by taking a dict instead of multiple arguments.

    • +
    • Make the generator exit with an easier to read error message in case of a validation problem instead of printing a full backtrace.

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#197)

    +
      +
    • Introduce a podio::CollectionBuffers class that contains everything that is necessary for I/O of a given collection. This is a breaking change in the collection interface

    • +
    • Introduce and generate a CollectionData class for each datatype that only manages the storage of a given collection.

      +
        +
      • Exposes only the Obj entries of each collection as well as the necessary functionality to add a new object (and its relations) to the collection.

      • +
      +
    • +
    • Implement “subset” collections that behave exactly the same as normal collections apart from an additional function call when creating them.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#206)

    +
      +
    • Switch to Catch2 v3 test library and by default assume that it is available. Use the ‘USE_EXTERNAL_CATCH2` cmake option to control whether podio should use an external installation or if it should fetch and build it internally instead.

    • +
    • Remove catch.hpp header that was previously shipped, since it is no longer needed.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#201)

    +
      +
    • Make assignment operator increase the reference count to avoid possible heap-after-free usage. (Fixes #200)

    • +
    +
  • +
+
+
+

v00-13-01

+
    +
  • 2021-06-03 Thomas Madlener (PR#195)

    +
      +
    • Fix possible circular and self-includes in generated header files.

    • +
    +
  • +
  • 2021-06-03 Thomas Madlener (PR#194)

    +
      +
    • Make it possible to do indexed access on a RelationRange, making the interface more akin to a const std::vector

    • +
    +
  • +
  • 2021-05-31 tmadlener (PR#193)

    +
      +
    • Make collection element access const correct.

    • +
    +
  • +
  • 2021-05-31 Thomas Madlener (PR#192)

    +
      +
    • Fix const-correctness problems of meta data access via EventStore.

    • +
    +
  • +
  • 2021-05-28 Benedikt Hegner (PR#191)

    +
      +
    • Fix bug in validity check so that transient and persistent collections are treated the same

    • +
    +
  • +
  • 2021-05-28 Thomas Madlener (PR#186)

    +
      +
    • Add support for fixed width integer type members in components and datatypes.

      +
        +
      • Now possible to use int16_t, int32_t, int64_t, uint16_t, uint32_t and uint64_t as members. Other fixed width integer types that are potentially defined in <cstdint> are not considered valid as the intended use case is really only fixed width integers for now. These are rejected at the datamodel validation step.

      • +
      • Fixed width integers are considered to be “builtin” types for podio.

      • +
      +
    • +
    +
  • +
  • 2021-05-04 Valentin Volkl (PR#189)

    +
      +
    • [cmake] fix test dependencies: read_and_write.cpp reads the file example.root that is created by the write test. If the dependency is not declared, running the tests concurrently can lead to spurious test failures.

    • +
    +
  • +
  • 2021-04-28 tmadlener (PR#180)

    +
      +
    • Improve the branch look-up logic in ROOTReader and ROOTWriter. Triggered by a performance degradation in v6.22/06, where this logic was changed inside ROOT and our use case was affected badly. All ROOT versions profit from these changes as it is in general more efficient than the previous implementation.

    • +
    +
  • +
  • 2021-03-30 tmadlener (PR#182)

    +
      +
    • Use run-lcg-view github action and switch to more recent LCG releases to run CI.

    • +
    • Update README to include status of CI

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#185)

    +
      +
    • extended .gitignore

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#184)

    +
      +
    • Clean up AsciiWriter comments

    • +
    +
  • +
  • 2021-03-23 tmadlener (PR#183)

    +
      +
    • Use SIO targets in cmake, which are exported starting with v00-01 (iLCSoft/SIO#15)

    • +
    +
  • +
  • 2021-02-23 Marko Petric (PR#181)

    +
      +
    • Add coverity nightly scan based on run-lcg-view action

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#175)

    +
      +
    • Fully qualify return types for OneToOneRelation getters in generated .cc file for objects and Const objects. This fixes a bug described in https://github.com/AIDASoft/podio/issues/168#issuecomment-770751871 and now allows to mix different namespaces in the generated code. This allows to more easily extend already existing datamodels by compiling and linking against them.

    • +
    +
  • +
  • 2021-02-23 Dmitry Romanov (PR#173)

    +
      +
    • Added IO Handler argument to schema generation example in README

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#171)

    +
      +
    • Fix compiler warnings, that were uncovered by #153 and described in #170. Fix them in the core classes and also in the generated ones.

    • +
    • Enforce no new warnings with Werror in the CI builds.

    • +
    +
  • +
  • 2021-02-15 Joseph C Wang (PR#156)

    +
      +
    • Readers/writers are now noncopyable

    • +
    +
  • +
  • 2021-02-02 Joseph C Wang (PR#154)

    +
      +
    • Disable operator = for collections so that it maintains one copy of collections, fixes #111

    • +
    +
  • +
  • 2021-01-26 tmadlener (PR#172)

    +
      +
    • Fix deprecated brew install commands in mac workflow

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#165)

    +
      +
    • Add a convenience RelationRange::emtpy function for easily checking whether a range is empty.

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#162)

    +
      +
    • Fix cmake problem #161 on Ubuntu

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#155)

    +
      +
    • Add some benchmarking tools, including TimedReader and TimedWriter decorators that allow to wrap (interface conforming) readers and writers and record the times different operations take. The times are recorded on two levels: setup times, like constructing a reader or “one-time” calls and per event times, for things that happen each event (e.g. writeEvent or readCollection). Additionally the BenchmarkRecorder in principle also allows to track additional things outside of these decorators.

    • +
    +
  • +
+
+
+

v00-13

+
    +
  • 2020-12-03 Marko Petric (PR#153)

    +
      +
    • Set rpath for macOS and externalize compiler and linker flags

    • +
    • Search for the same version of python as was used for building ROOT

    • +
    +
  • +
  • 2020-12-03 Joseph C Wang (PR#152)

    +
      +
    • Make EventStore non-copyable

    • +
    +
  • +
  • 2020-12-03 tmadlener (PR#144)

    +
      +
    • Decouple the writers and the EventStore to allow to write collections that have previously been read from a file.

    • +
    +
  • +
  • 2020-11-24 Valentin Volkl (PR#149)

    +
      +
    • [cmake] add find_package_handle_standard_args() to podio config

    • +
    +
  • +
  • 2020-11-18 Frank Gaede (PR#147)

    +
      +
    • fix for MacOs when using SIO I/O with podio +- need to link edm-core library to edm-sioBlocks library

    • +
    +
  • +
  • 2020-11-10 Thomas Madlener (PR#130)

    +
      +
    • Add SIO as a second I/O backend (as alternative to ROOT) that can be enabled with ENABLE_SIO. If enabled, a separate podioSioIO library is built that allows reading and writing sio files. For serializing the different datatypes, additional code is generated to build an SioBlocks library that is loaded at runtime (if found somewhere on LD_LIBRARY_PATH). To facilitate the whole process at the cmake level, new cmake functions are provided to generate the core datamodel library PODIO_ADD_DATAMODEL_CORE_LIBRARY, to (conditionally) define the ROOT dictionary target PODIO_ADD_ROOT_IO_DICT and to (conditionally) define the Sio Blocks library target PODIO_ADD_SIO_IO_BLOCKS. The I/O backends that are supported by podio are exported via the PODIO_IO_HANDLERS list variable.

    • +
    • podio_generate_datamodel.py now additionally takes the I/O handlers that should be generated as arguments. This is also reflected in an additional argument to PODIO_GENERATE_DATAMODEL. To have backwards compatibility, this additional argument defaults to ROOT in both cases and downstream packages should work as usual without changes.

    • +
    +
  • +
  • 2020-10-06 tmadlener (PR#133)

    +
      +
    • Make ROOTReader handle file switches properly for meta data reading.

    • +
    +
  • +
  • 2020-09-29 tmadlener (PR#141)

    +
      +
    • Update CI actions to use LCG 96, 97, 98 for mac, centos7 and ubuntu1804

    • +
    • Make python bindings work with root 6.22 (and onwards)

    • +
    • Make sure that root has been built with c++17 at the cmake stage

    • +
    • Require at least CMake 3.12

    • +
    +
  • +
  • 2020-09-18 tmadlener (PR#134)

    +
      +
    • Make the EventStore actually take ownership of the metadata passed to it by the readers. (see #139)

    • +
    • Make the collections properly clean up data of VectorMembers (see #139)

    • +
    • Fix small memory leak in the EventStore for the CollectionIDTable.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#128)

    +
      +
    • Fix a possible nullptr access in the Writers and make registerForWrite return a boolean to make it easier to check from the calling site.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#127)

    +
      +
    • cleanup of GenericParameters for meta data +- remove mutable from internal maps

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#126)

    +
      +
    • No longer install python unittest files

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#125)

    +
      +
    • improve CollectionIDTable +- previously used a std::recursive_mutex which is unnecessary in this case +- made whatever can be made const const and now use std::distance to calculate the index.

    • +
    +
  • +
  • 2020-08-28 tmadlener (PR#129)

    +
      +
    • Reduce memory footprint by clearing intermediately used I/O buffers.

    • +
    +
  • +
+
+
+

v00-12

+
    +
  • 2020-08-11 Frank Gaede (PR#124)

    +
      +
    • minor bug fix for macos: +- add <sstream> to write.cpp +- fixes #123

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#122)

    +
      +
    • Update README to reflect the new requirements (i.e. jinja2)

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#121)

    +
      +
    • Update Ubuntu CI script to install the python requirements via pip.

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#120)

    +
      +
    • Use jinja2 template engine to generate c++ code. This makes it possible to more cleanly separate the generation of the c++ code and all the necessary pre-processing. Now only the pre-processing is done in python, while the complete generation is done using jinja2. This should make it much easier to make changes to the generated c++ code.

    • +
    +
  • +
  • 2020-08-05 tmadlener (PR#117)

    +
      +
    • Refactoring of the podio class generator to improve its readability. This refactoring is mainly focusing on reducing the size of some methods to make them easier to grasp as well as trying to more cleanly separate the validation of the inputs and the c++ code generation. The validation is stricter than the current version and will potentially break things. Specifically, the handling of ExtraCode and ConstExtraCode is now implemented according to the documentation. In the previous version this has somewhat diverged from there. The yaml declaration of components has been made equivalent to the ones of the datatypes but “old-style” definitions are still handled properly. In the latter case a deprecation warning is emitted. The generated c++ code is functionally equivalent, but not equal character by character. The differences are mainly whitespace, but at some places also some of the generated code has been updated to more recent c++ capabilities. Additionally, some tests for the validation are added. They are not really exhaustive and should be considered to serve mainly documenting purposes for the moment.

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#107)

    +
      +
    • Introduce range wrapper for OneToManyRelations and VectorMembers to allow range-based for loops

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#106)

    +
      +
    • Fix the possibility of running into infinite loops in the ostream operator with cyclical references

    • +
    +
  • +
  • 2020-08-03 Frank Gaede (PR#102)

    +
      +
    • add test example read_and_write.cpp

      +
        +
      • simple use case for reading in an event an writing (parts of it) to another file

      • +
      • currently fails with segmentation fault (to be fixed)

      • +
      +
    • +
    +
  • +
  • 2020-08-03 Valentin Volkl (PR#98)

    +
      +
    • add ubuntu ci build

    • +
    +
  • +
+
+
+

v00-11

+
    +
  • 2020-07-21 tmadlener (PR#101)

    +
      +
    • Fix bug where ConstObject with empty OneToManyRelations give an invalid iterator range, #100

    • +
    +
  • +
  • 2020-06-23 Andre Sailer (PR#99)

    +
      +
    • Point to libpodioDict.so instead of libpodio.so in rootmap file

    • +
    +
  • +
  • 2020-06-03 Frank Gaede (PR#92)

    +
      +
    • implement reading/writing of meta data for runs, events and collections

      +
        +
      • based on GenericParameters that hold named parameters of type int, float, string or vectors if these (copied from lcio::LCParameters)

      • +
      • meta data for the three types is always written

      • +
      • it is read only on request

      • +
      +
    • +
    • example for writing:

    • +
    +
       auto& evtMD = store.getEventMetaData() ;
    +    evtMD.setValue( "UserEventWeight" , (float) 100.*i ) ;
    +
    +
    +
      +
    • example for reading:

    • +
    +
      auto& evtMD = store.getEventMetaData() ;
    +  float evtWeight = evtMD.getFloatVal( "UserEventWeight" ) ;
    +
    +
    +
      +
    • addresses #49

    • +
    +
  • +
  • 2020-05-26 Andre Sailer (PR#91)

    +
      +
    • Ensure podioRootIO is linked against podioDict even when linker uses as-needed by default, fixes #90

    • +
    +
  • +
  • 2020-05-26 Thomas Madlener (PR#89)

    +
      +
    • Updated README and env.sh to reflect changes in install process

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#88)

    +
      +
    • change add relation naming addXxxx -> addToXxxxs

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#87)

    +
      +
    • update minimum required CMake version to 3.8

    • +
    • remove obsolete Jenkinsfile

    • +
    • make CPack config optional: cmake variable ENABLE_CPACK defaults to OFF

    • +
    • update Readme with Spack instructions

    • +
    +
  • +
  • 2020-04-14 Frank Gaede (PR#83)

    +
      +
    • allow automatic change of version in CMakeLists.txt

      +
        +
      • fixes #82

      • +
      +
    • +
    +
  • +
+
+
+

v00-10

+
    +
  • 2020-04-03 Frank Gaede (PR#81)

    +
      +
    • make compatible with macos and clang

      +
        +
      • use -Wl,-undefined,dynamic_lookup w/ AppleClang

        +
          +
        • make the same, default behavior on linux explicit w/ -Wl,--allow-shlib-undefined

        • +
        +
      • +
      • add ROOT::Core to TestDataModel library

      • +
      +
    • +
    +
  • +
  • 2020-04-03 Marko Petric (PR#80)

    +
      +
    • add a macOS test to GitHub actions

    • +
    +
  • +
  • 2020-04-03 Valentin Volkl (PR#75)

    +
      +
    • Fixes in python code for 2-3 compatibility

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#74)

    +
      +
    • Fix exception when podio_class_generator is called with -q/–quiet

    • +
    • Printout about includes only in verbose mode

    • +
    • Do not print warnings in quiet mode

    • +
    • Print each warning only once

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#73)

    +
      +
    • Added PODIO_GENERATE_DATAMODEL Cmake macro to call the class generator at the right time. see podioMacros for the signature

    • +
    +
  • +
  • 2020-03-11 Marko Petric (PR#72)

    +
      +
    • Update CI to use GitHub actions

    • +
    • Add test against a Python 3 LCG view

    • +
    • Remove travis

    • +
    • Add tests for Python 3 compatibility and flake8

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#70)

    +
      +
    • ClassGenerator: add option “includeSubfolder”, to always use `#include “<packagename>/<object>.h” etc. if set to “True”

    • +
    • Added sorting and “uniquing” of include lists. Some duplicates still occur because two different lists are used on occasion

    • +
    • Added $PACKAGE_NAME_ to include guards

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#69)

    +
      +
    • Move all Root dependencies (RootReader, RootWriter) of the podio Library into podioRootIO, rename podioDict to podioDict

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#68)

    +
      +
    • Add podioMacros.cmake to contain PODIO_GENERATE_DICTIONARY

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#67)

    +
      +
    • Change Yaml loader to preserve order of members as given in the yaml

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#65)

    +
      +
    • podio_class_generator: only write files if their content changed

    • +
    +
  • +
  • 2019-10-15 Valentin Volkl (PR#64)

    +
      +
    • Add BUILD_TESTS CMake option for building tests

    • +
    +
  • +
  • 2019-10-15 Pere Mato (PR#63)

    +
      +
    • Fix to avoid deprecated STL classes in C++17

    • +
    +
  • +
+
+
+

v00-09-02

+
    +
  • 2019-09-27 Frank Gaede (PR#60)

    +
      +
    • fixed the code generation for members with multi word types (long long, unsigned long,…) +- add example to ExampleHit: +- unsigned long long cellID // cellID

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59)

    +
      +
    • move templates inside the python directory when installing +- fixes: #58

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59) +/

  • +
  • 2019-09-27 Frank Gaede (PR#57)

    +
      +
    • allow for numbers in namespace and class names +- generate type name string for CollectionBase::getValueTypeName()
      +- fixes #56

    • +
    +
  • +
  • 2019-09-26 Frank Gaede (PR#55)

    +
      +
    • cache collection pointers for fast access in EventStore::get()

      +
        +
      • added EventStore::getFast(int id)

      • +
      • considerably speeds up XXCollection::setReferences() +when reading back collections

      • +
      +
    • +
    +
  • +
  • 2019-09-26 Ben Morgan (PR#54)

    +
      +
    • improve the CMake

      +
        +
      1. Consistent use of CMake usage requirements to propagate include and link dependencies

      2. +
      3. Full use of the CMakePackageConfigHelpers module to generate the podioConfig.cmake file and associated podioTargets.cmake

      4. +
      5. Automatically refind the ROOT dependency

      6. +
      7. Standardize install paths for CMake and template files +A podio client can, in CMake, do

      8. +
      +
    • +
    +
    find_package(podio REQUIRED)
    +add_executable(foo foo.cc)
    +target_link_libraries(foo podio::podio)
    +
    +
    +

    and all include/link paths will be set correctly.

    +
  • +
  • 2019-08-21 Javier Cervantes Villanueva (PR#51) +Do not install tests

    +
      +
    • Allow tests to run after the build phase

    • +
    • Paths have been modified to point to binary or source directories

    • +
    • Before, tests had to be run only after running make install

    • +
    • Test are not installed anymore

    • +
    • Fail tests if any error is reported (ROOT Interpreter error may not be considered by CMake)

    • +
    +
  • +
  • 2019-05-10 Frank Gaede (PR#45)

    +
      +
    • updated documentation

      +
        +
      • add guidelines for contributing

      • +
      +
    • +
    • reverted some name changes in tests/examples (fixes #44)

      +
        +
      • read-one now again called read

      • +
      +
    • +
    • enamble dryrun again for generate-edm test

    • +
    +
  • +
  • 2019-04-09 Marko Petric (PR#43)

    +
      +
    • Implementation of CI based on LCG views, as suggested in #42

    • +
    +
  • +
  • 2019-04-09 Graeme A Stewart (PR#41)

    +
      +
    • Improve convenience setup scripts and build instructions +- remove FCC specific code from init.sh +- factorise environment setup to env.sh +- updated README.md

    • +
    +
  • +
  • 2019-03-24 Javier Cervantes (PR#40)

    +
      +
    • ROOTReader now supports multiple inputs thanks to new implementation based on TChain

    • +
    • ROOTReader now supports opening files via xrootd (root:///eospublic.cern.ch//eos... for example)

    • +
    • Improved CMake and CPack configuration, sticking more closely to HSF template

    • +
    +
  • +
+
+
+

v00-09

+
    +
  • 2018-12-20 Frank Gaede (PR#39)

    +
      +
    • add some fixes and improvements

      +
        +
      • fix forward declarations in Object template when using a namespace for the EDM

      • +
      • fix array getter names when using the get/set syntax

      • +
      • add missing treatment for include statements in component’s header files

      • +
      • handle array members in ostream operators

      • +
      +
    • +
    • add CollectionBase::size() member function

      +
        +
      • allows to access collection size w/o knowing the concrete type

      • +
      • method is already generated in implementation classes

      • +
      +
    • +
    +
  • +
  • 2018-12-06 Frank Gaede (PR#38)

    +
      +
    • add code generation for I/O of vector members +- vector members are treated analogous to the reference vectors,i.e. +streamed as one large vector per collection

    • +
    • updated tests/datamodel accordingly (using clang-format)

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#37)

    +
      +
    • handle references and vector members in collection’s ostream operators

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#36)

    +
      +
    • add github templates for releaase notes, issues and contribution guidelines

    • +
    • add ReleaseNotes.md +- contains all commit logs so far (v00-08)

    • +
    +
  • +
+
+
+

v00-08

+
    +
  • 2017-11-02 hegner

    +
      +
    • Merge pull request #32 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-09-13 Colin Bernet

    +
      +
    • Merge pull request #60 from cbernet/nofile_fix

    • +
    +
  • +
  • 2017-09-12 Colin

    +
      +
    • fixed segv when opening a non accessible input file

    • +
    • fix test in interactive mode. write program had been moved

    • +
    +
  • +
  • 2017-06-21 Colin Bernet

    +
      +
    • Merge pull request #59 from cbernet/pyeventstore_filename

    • +
    +
  • +
  • 2017-06-20 Colin

    +
      +
    • can now get the name of the current file (useful when reporting exceptions)

    • +
    +
  • +
  • 2017-05-29 hegner

    +
      +
    • Merge pull request #58 from jlingema/clangf

    • +
    +
  • +
  • 2017-05-29 Joschka Lingemann

    +
      +
    • Fix bug introduced with clang format class gen would crash if clang-format was not used

    • +
    +
  • +
  • 2017-05-23 hegner

    +
      +
    • Merge pull request #53 from jlingema/array

    • +
    • Merge pull request #55 from jlingema/clangf

    • +
    • Merge pull request #57 from jlingema/fixWarnings

    • +
    +
  • +
  • 2017-05-22 Joschka Lingemann

    +
      +
    • Regenerate test datamodel

    • +
    • Add override statements

    • +
    +
  • +
  • 2017-04-20 Joschka Lingemann

    +
      +
    • Only call clang-format if it is in PATH

    • +
    +
  • +
  • 2017-04-11 Joschka Lingemann

    +
      +
    • Add language hints for syntax highlighting in docs

    • +
    • Add options of class generator to README

    • +
    • Add test for clang format

    • +
    • Add clang to path in init

    • +
    • Add clang-format application as option, closes #54

    • +
    +
  • +
  • 2017-04-07 Joschka Lingemann

    +
      +
    • Regenerated datamodel

    • +
    • Fix test in read and write for array of struct

    • +
    • Fixes in parser for arrays of struct

    • +
    • Add test for array of struct

    • +
    • Add includes for arrays of PODs

    • +
    +
  • +
  • 2017-04-04 Benedikt Hegner

    +
      +
    • temporarily disable outputstream for arrays

    • +
    +
  • +
  • 2017-04-04 hegner

    +
      +
    • Merge pull request #26 from gaede/add_ascii_io

    • +
    • Merge branch ‘master’ into add_ascii_io

    • +
    +
  • +
  • 2017-03-24 zaborowska

    +
      +
    • Merge pull request #52 from jlingema/array

    • +
    +
  • +
  • 2017-03-24 Joschka Lingemann

    +
      +
    • Add ROOT version requirement

    • +
    +
  • +
  • 2017-03-21 hegner

    +
      +
    • Merge pull request #30 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-03-20 hegner

    +
      +
    • Merge pull request #50 from jlingema/array

    • +
    +
  • +
  • 2017-03-13 Joschka Lingemann

    +
      +
    • Increase version requirement in README

    • +
    • Removing FindROOT macro, using standard use-file

    • +
    • Migrate to LCG_88

    • +
    • silence warning of unsigned -> int

    • +
    • Merge remote branch ‘origin/master’ into array

    • +
    +
  • +
  • 2017-03-02 Joschka Lingemann

    +
      +
    • Add implementation for array members

    • +
    +
  • +
  • 2017-02-15 Joschka Lingemann

    +
      +
    • Add test for datatype with array-member.

    • +
    +
  • +
  • 2017-02-21 zaborowska

    +
      +
    • Merge pull request #49 from jlingema/cvmfs

    • +
    +
  • +
  • 2017-02-21 Joschka Lingemann

    +
      +
    • Remove unused variable, add check if PODIO is set.

    • +
    • Move to cvmfs

    • +
    • Set ROOT_INCLUDE_PATH of pyunittest to avoid failure if FCC env is set.

    • +
    +
  • +
  • 2016-12-12 zaborowska

    +
      +
    • Merge pull request #47 from jlingema/master

    • +
    +
  • +
  • 2016-12-09 Joschka Lingemann

    +
      +
    • Regenerated datamodel with check against invalid collections.

    • +
    • Add check against OneToManyRelations to invalid collections

    • +
    • Move to LCG_87

    • +
    +
  • +
  • 2016-12-09 hegner

    +
      +
    • Merge pull request #46 from jlingema/master

    • +
    +
  • +
  • 2016-12-06 Joschka Lingemann

    +
      +
    • Require C++14.

    • +
    +
  • +
  • 2016-11-07 hegner

    +
      +
    • Merge pull request #45 from jlingema/master

    • +
    +
  • +
  • 2016-10-17 Benedikt Hegner

    +
      +
    • add method to register collection

    • +
    • remove need for templating on registering for writing

    • +
    +
  • +
  • 2016-09-30 Frank Gaede

    +
      +
    • remove debug printout for found components

    • +
    • add example for using ASCIWriter - write_ascii

    • +
    • fixed const_relation getters w/ getSyntax

    • +
    • regenerated EDM, ostream operator<<, id() and o.->

    • +
    • add ASCIIWriter

    • +
    • improved creation of ostream operators etc.

    • +
    +
  • +
  • 2016-09-26 Joschka Lingemann

    +
      +
    • Add non-const accessors for non-const collections.

    • +
    +
  • +
  • 2016-08-23 hegner

    +
      +
    • Merge pull request #44 from jlingema/docs

    • +
    • Merge pull request #43 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-08-23 Joschka Lingemann

    +
      +
    • Change option to be the same across projects.

    • +
    +
  • +
  • 2016-08-16 Joschka Lingemann

    +
      +
    • Improve readability of code base name and version.

    • +
    • Allow to customize version for doxygen via cli.

    • +
    • Use readme as title page for doxygen.

    • +
    • Change version to tags currently used.

    • +
    +
  • +
  • 2016-08-15 Joschka Lingemann

    +
      +
    • Add unsigned long to the list of builtins for consistency.

    • +
    • add test that regenerates datamodel in dry-run mode.

    • +
    • Add dry-run option.

    • +
    +
  • +
  • 2016-08-09 Joschka Lingemann

    +
      +
    • Remove unnecessary dict.

    • +
    +
  • +
  • 2016-07-29 Joschka Lingemann

    +
      +
    • Add support for (unsigned) long long

    • +
    • Fix indentation

    • +
    +
  • +
  • 2016-07-28 hegner

    +
      +
    • Merge pull request #25 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-28 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add a paragraph on options in the datamodel description files.

    • +
    • Add checks for clashing getter and setter names.

    • +
    • Add doxygen comments.

    • +
    +
  • +
  • 2016-07-27 hegner

    +
      +
    • Merge pull request #42 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-27 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add tests for direct accessors and setters of POD members.

    • +
    • Merge with changes for doxygen comments and member exposure

    • +
    • Merge pull request #24 from jlingema/fix_cpy_relations

    • +
    • Add missing ; and switch to operator==

    • +
    • Code cleanup.

    • +
    +
  • +
  • 2016-07-26 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Removing print info generation, as that creates compilation issues.

    • +
    • Merge with recent changes from hegner/podio.

    • +
    • Remove print outs

    • +
    • Regenerated datamodel.

    • +
    • Extend tests to have empty references.

    • +
    • Initialize relations on copy only if they are set.

    • +
    +
  • +
  • 2016-07-25 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add test for deep copy.

    • +
    • Bug fix: Initialisation of OneToOneRelations when copying.

    • +
    +
  • +
  • 2016-07-22 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’

    • +
    • Add tests for direct getter and setter of POD members.

    • +
    • Bug fix: option value already parsed to bool.

    • +
    • Add getters for POD members in Const objects.

    • +
    • Regenerated datamodel.

    • +
    • Remove trailing ; to silence compiler warning.

    • +
    • Add options to yaml files and parser for get syntax and pod data exposure.

    • +
    • Expose POD member members in objects.

    • +
    • Adding comments that show up in doxygen.

    • +
    +
  • +
  • 2016-07-12 hegner

    +
      +
    • Merge pull request #40 from jlingema/master

    • +
    +
  • +
  • 2016-07-12 Joschka Lingemann

    +
      +
    • Revert to operator[], add function checking presence of a collection.

    • +
    • Adding way to only clear the chaches (needed for FCCSW).

    • +
    • Change way to access IDs and names to allow catching exceptions.

    • +
    +
  • +
  • 2016-06-30 Benedikt Hegner

    +
      +
    • update doc as preparation for milestone document

    • +
    +
  • +
  • 2016-06-17 Joschka Lingemann

    +
      +
    • Add test for OneToManyRelations in namespaces. Fix class-generator.

    • +
    +
  • +
  • 2016-06-16 hegner

    +
      +
    • Merge pull request #22 from Steinweg/eike_operators_new

    • +
    +
  • +
  • 2016-06-15 Eike Steinweg

    +
      +
    • implemented ostream operators - std::ostream operator<<() created for components, objects and collections - create PrintInfo classes for formatted (tabular) printout of collections

    • +
    +
  • +
  • 2016-06-14 Benedikt Hegner

    +
      +
    • add convenience methods to python interface

    • +
    +
  • +
  • 2016-06-13 Benedikt Hegner

    +
      +
    • fix problem of wrong references being stored

    • +
    +
  • +
  • 2016-06-13 hegner

    +
      +
    • Merge pull request #21 from gaede/reference_bug_test

    • +
    +
  • +
  • 2016-06-13 Frank Gaede

    +
      +
    • fixed error message for test case

    • +
    • add test case for bug with reading back references

    • +
    +
  • +
  • 2016-06-03 hegner

    +
      +
    • Merge pull request #19 from jlingema/pyinterface

    • +
    +
  • +
  • 2016-05-24 Joschka Lingemann

    +
      +
    • Fix close method.

    • +
    • Improving py interface.

    • +
    • Merge remote branch ‘hegner/master’

    • +
    +
  • +
  • 2016-05-19 hegner

    +
      +
    • Merge pull request #39 from jlingema/master

    • +
    +
  • +
  • 2016-05-19 Joschka Lingemann

    +
      +
    • Remove hard-coded build-type.

    • +
    +
  • +
  • 2016-05-18 hegner

    +
      +
    • Merge pull request #38 from jlingema/master

    • +
    +
  • +
  • 2016-05-18 Joschka Lingemann

    +
      +
    • Increase write-test event number to 2000.

    • +
    • Merge pull request #18 from jlingema/master

    • +
    • Fixing indentation errors.

    • +
    • Reverting to LCG_83 and afs.

    • +
    +
  • +
  • 2016-05-12 Benedikt Hegner

    +
      +
    • style changes

    • +
    +
  • +
  • 2016-04-26 hegner

    +
      +
    • Merge pull request #17 from gaede/improve_doc

    • +
    +
  • +
  • 2016-04-26 Frank Gaede

    +
      +
    • made the ink to doxygen explicit

    • +
    • add more doc links to README

    • +
    • dde some documenation links to Readme

    • +
    +
  • +
  • 2016-04-22 hegner

    +
      +
    • Merge pull request #16 from gaede/relation_bug

    • +
    +
  • +
  • 2016-04-22 Frank Gaede

    +
      +
    • added ExampleMC to show bug in storing relations

    • +
    • bug fix in {ref}_end() for empty relation

    • +
    +
  • +
  • 2016-04-21 Frank Gaede

    +
      +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    +
  • +
  • 2016-04-20 hegner

    +
      +
    • Merge pull request #15 from gaede/add_getters_setters

    • +
    +
  • +
  • 2016-04-20 Frank Gaede

    +
      +
    • add unittest “AssociativeContainer” set/map

    • +
    • remove incorrect access to reference vector method

    • +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    • Merge pull request #13 from gaede/fix_extracode

    • +
    • optional get/set syntax; operator<(); acces to reference vector

    • +
    +
  • +
  • 2016-04-20 Benedikt Hegner

    +
      +
    • clean up references at better place

    • +
    • Merge pull request #14 from jlingema/memleaks

    • +
    +
  • +
  • 2016-04-20 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’ into memleaks

    • +
    • Fixing memory leak.

    • +
    +
  • +
  • 2016-04-19 Frank Gaede

    +
      +
    • fixed extra code generation for ConstObject

    • +
    +
  • +
  • 2016-04-19 hegner

    +
      +
    • Merge pull request #12 from gaede/extracode_in_components

    • +
    • add unit test for extracode in component

    • +
    +
  • +
  • 2016-04-19 Benedikt Hegner

    +
      +
    • add link to bug tracker

    • +
    • clear references properly

    • +
    • test for adding extra code to components

    • +
    • fix for handling components w/o extra code

    • +
    • allow for extra code declarations in components

    • +
    • fix object ownership and leak at deletion of collection

    • +
    +
  • +
  • 2016-04-18 Benedikt Hegner

    +
      +
    • add support for strings as members

    • +
    • removing wrong file

    • +
    • adding more docs

    • +
    • extend datamodel validation

    • +
    • add gitignore file

    • +
    +
  • +
  • 2016-04-17 Benedikt Hegner

    +
      +
    • move examples into tests to make space for real end-user examples

    • +
    • Merge branch ‘master’ of github.com:hegner/podio into catch

    • +
    • migrate from gtest to catch

    • +
    • move component cross-checking into validator

    • +
    • add hook for datamodel validator

    • +
    • fix PODIO-6

    • +
    • add support for user specified code snippets

    • +
    • add pointerless read interface

    • +
    • fix case when multiple many-relations are defined; fix writing example

    • +
    +
  • +
  • 2016-04-13 hegner

    +
      +
    • Merge pull request #11 from gaede/master

    • +
    +
  • +
  • 2016-04-13 Frank Gaede

    +
      +
    • added clusters in clusters as test for infinite recursion

    • +
    • Merge branch ‘master’ of https://github.com/gaede/podio

    • +
    • Merge branch ‘master’ of https://github.com/hegner/podio

    • +
    +
  • +
  • 2016-04-13 Benedikt Hegner

    +
      +
    • move to using LCG releases from CVMFS

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • Merge branch ‘master’ of github.com:hegner/podio

    • +
    • remove unneeded parameter from processEvent

    • +
    • Merge pull request #10 from gaede/master

    • +
    • starting to add more documentation

    • +
    +
  • +
  • 2016-04-12 Frank Gaede

    +
      +
    • big fix: clear vector of internal references in Collcection::clear()

    • +
    • set podio_LIBRARIES in podioConfig.cmake

    • +
    +
  • +
  • 2016-04-11 Frank Gaede

    +
      +
    • creare source directories for class generator if needed

    • +
    +
  • +
  • 2016-04-07 clementhelsens

    +
      +
    • Merge pull request #37 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 hegner

    +
      +
    • Merge pull request #9 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 Joschka Lingemann

    +
      +
    • Using TFile::Open allows to also read eos files.

    • +
    +
  • +
  • 2016-03-14 hegner

    +
      +
    • Merge pull request #8 from jlingema/master

    • +
    +
  • +
  • 2016-03-14 Joschka Lingemann

    +
      +
    • Add templates file.

    • +
    • Fixing whitespace in templates according to FCC style.

    • +
    • First round of code clean-up. Moving code templates out of the generator. Move re-used functionality in functions.

    • +
    +
  • +
  • 2016-03-10 Joschka Lingemann

    +
      +
    • Moving member parsing in separate function.

    • +
    +
  • +
  • 2016-03-09 Joschka Lingemann

    +
      +
    • Add missing class from example datamodel.

    • +
    +
  • +
  • 2016-03-03 hegner

    +
      +
    • Merge pull request #34 from cbernet/tutorial_2

    • +
    +
  • +
  • 2016-03-03 Joschka Lingemann

    +
      +
    • Merge pull request #36 from hegner/master

    • +
    +
  • +
  • 2016-03-01 Benedikt Hegner

    +
      +
    • help cmake finding the proper gtest

    • +
    • use LCG 83 view

    • +
    +
  • +
  • 2016-03-01 Colin

    +
      +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-22 Colin

    +
      +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Joschka Lingemann

    +
      +
    • Adding dependencies for tests of examples.

    • +
    +
  • +
  • 2016-02-19 Colin

    +
      +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    +
  • +
  • 2016-02-18 Joschka Lingemann

    +
      +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    +
  • +
  • 2016-02-11 Colin

    +
      +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    +
  • +
  • 2016-02-10 Colin

    +
      +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-03-01 Colin Bernet

    +
      +
    • Merge pull request #35 from cbernet/master

    • +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-23 Colin

    +
      +
    • updated README

    • +
    • updated README

    • +
    • updated README

    • +
    • improved README

    • +
    • added python read example

    • +
    +
  • +
  • 2016-02-23 Colin Bernet

    +
      +
    • Merge pull request #33 from cbernet/master

    • +
    • Merge remote-tracking branch ‘official/master’

    • +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Colin Bernet

    +
      +
    • Merge pull request #32 from jlingema/master

    • +
    • Adding dependencies for tests of examples.

    • +
    • Merge pull request #31 from cbernet/master

    • +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    • Merge pull request #30 from jlingema/fix_include

    • +
    • Merge pull request #28 from cbernet/master

    • +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    • Merge pull request #29 from hegner/master

    • +
    +
  • +
  • 2016-02-18 Benedikt Hegner

    +
      +
    • add missing ID setting when free-floating collections are added to the store

    • +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-02-09 hegner

    +
      +
    • Merge pull request #7 from HEP-FCC/master

    • +
    +
  • +
  • 2016-02-09 Joschka Lingemann

    +
      +
    • Merge pull request #26 from cbernet/unified_env

    • +
    • Merge pull request #27 from hegner/master

    • +
    • Merge pull request #5 from zaborowska/fileZombie

    • +
    • Merge pull request #6 from zaborowska/rename

    • +
    +
  • +
  • 2016-02-09 Benedikt Hegner

    +
      +
    • beautify generated doxygen

    • +
    +
  • +
  • 2016-02-09 Colin

    +
      +
    • improving readme

    • +
    +
  • +
  • 2016-01-08 Colin

    +
      +
    • pick up soft on afs only at cern

    • +
    +
  • +
  • 2016-01-07 Colin

    +
      +
    • unified environment initialization

    • +
    +
  • +
  • 2016-02-08 zaborowska

    +
      +
    • Renaming Albers to PODIO

    • +
    +
  • +
  • 2016-02-08 Anna

    +
      +
    • Checking if file opened correctly

    • +
    +
  • +
  • 2016-02-05 Benedikt Hegner

    +
      +
    • remove deprecated files after merge

    • +
    • Merge branch ‘hegner-master’

    • +
    • resolve conflicts

    • +
    +
  • +
  • 2016-02-05 hegner

    +
      +
    • Merge pull request #3 from jlingema/master

    • +
    +
  • +
  • 2016-02-04 Joschka Lingemann

    +
      +
    • Adding install target for templates.

    • +
    • Merge with remote.

    • +
    • Change to new options. Add how to list all options.

    • +
    • Adding options for doxygen and gtest.

    • +
    +
  • +
  • 2016-02-01 Joschka Lingemann

    +
      +
    • Merge with remote master.

    • +
    • Adding examples to library paths.

    • +
    • Changing install destination for pcm / rootmap.

    • +
    • Updating instructions to new test folder structure

    • +
    +
  • +
  • 2016-01-29 Joschka Lingemann

    +
      +
    • Small cosmetic fixes to read-me.

    • +
    +
  • +
  • 2016-01-28 Joschka Lingemann

    +
      +
    • Adding how to run tests.

    • +
    • Changing testing structure to make unit-tests optional.

    • +
    • Adapting to Apple specifics.

    • +
    • Re-adding Find-ROOT macro.

    • +
    +
  • +
  • 2016-01-26 Joschka Lingemann

    +
      +
    • Fixing namespaces of members of objects.

    • +
    • Fixing namespacing of members for components.

    • +
    • Fix: Namespaced component in another component.

    • +
    +
  • +
  • 2016-01-18 Joschka Lingemann

    +
      +
    • Fixing path for python environment

    • +
    +
  • +
  • 2016-01-15 Joschka Lingemann

    +
      +
    • Adding python environment and pytools for PyYAML.

    • +
    • Splitting implementation and header files.

    • +
    • Newly generated datamodel.

    • +
    • Adding tests for namespaced data.

    • +
    • Fix relations for namespaced datamembers.

    • +
    • Removing trailing ; to silence warning.

    • +
    • First iteration of namespace support.

    • +
    • Adding handling of non-builtin members and fixing compile warnings

    • +
    +
  • +
  • 2016-01-13 Joschka Lingemann

    +
      +
    • Updating externals according to current FCCSW.

    • +
    +
  • +
  • 2015-11-18 Benedikt Hegner

    +
      +
    • make vector member code compile

    • +
    • add more forward declarations handling class A->B->A reference cases

    • +
    • move setter/getter implementation into CC file’

    • +
    +
  • +
  • 2015-10-22 Benedikt Hegner

    +
      +
    • install dictionaries explicitly

    • +
    +
  • +
  • 2015-10-21 Benedikt Hegner

    +
      +
    • fix bug for storing unitialized references

    • +
    • add new unit test covering non-filled relations

    • +
    +
  • +
  • 2015-10-19 Benedikt Hegner

    +
      +
    • add more single-ref unit tests; fix infinite loop

    • +
    +
  • +
  • 2015-10-16 Benedikt Hegner

    +
      +
    • allow chaining of components

    • +
    +
  • +
  • 2015-10-16 hegner

    +
      +
    • Merge pull request #1 from zaborowska/master

    • +
    +
  • +
  • 2015-10-16 Anna

    +
      +
    • Merge branch ‘master’ into test

    • +
    • Rename of examples->tests in init and README

    • +
    • Missing include of gtest added

    • +
    • added ‘setter’ for components

    • +
    +
  • +
  • 2015-10-15 Benedikt Hegner

    +
      +
    • add tests for components

    • +
    • move data definition syntax into separate markdown file

    • +
    +
  • +
  • 2015-10-14 Benedikt Hegner

    +
      +
    • new iteration of data model w/ new reference accessors

    • +
    • add tests for python interface

    • +
    • enable tests for python interface

    • +
    • remove accidentally added file

    • +
    • install python files

    • +
    • move PythonEventStore into podio namespace

    • +
    • add at() to methods of the collection

    • +
    • renaming package creation script

    • +
    +
  • +
  • 2015-10-13 Benedikt Hegner

    +
      +
    • update to new datamodel; fix mem leak

    • +
    • major refurbishment of podio; new interfaces in doc/doc.md

    • +
    +
  • +
  • 2015-05-12 Benedikt Hegner

    +
      +
    • adjust scripts to new naming convention

    • +
    +
  • +
  • 2015-05-11 Benedikt Hegner

    +
      +
    • rename albers into podio

    • +
    +
  • +
  • 2015-04-24 Benedikt Hegner

    +
      +
    • add CollectionBase to dictionaries

    • +
    +
  • +
  • 2015-04-22 Benedikt Hegner

    +
      +
    • add new tests; feature complete for lcio

    • +
    • next step towards lcio modelling

    • +
    • prepare for future vector member feature

    • +
    • removing deprecated method for supporting XYZHandle convention

    • +
    • upgrading the lcio layout

    • +
    • add more buildin types

    • +
    • removed code duplication in code generation

    • +
    • complete testing of single references

    • +
    • remove debug printout for the garbage collection

    • +
    +
  • +
  • 2015-04-21 Benedikt Hegner

    +
      +
    • adding std::array support

    • +
    • update code templates for new refs

    • +
    +
  • +
  • 2015-04-20 Benedikt Hegner

    +
      +
    • streamline definition syntax

    • +
    • Merge branch ‘master’ of github.com:hegner/albers

    • +
    • remove wrongly committed files

    • +
    +
  • +
  • 2015-04-20 Pere Mato

    +
      +
    • Minor changes in CMakeLists.txt to cope with XCode generation

    • +
    • don’t use the factory of the collection to create hits and refs

    • +
    • clarify namespace

    • +
    • update examples w/ new code generation

    • +
    • properly set relation vectors in push_back

    • +
    • create constructor with full signature

    • +
    +
  • +
  • 2015-04-19 Benedikt Hegner

    +
      +
    • vector member code #1

    • +
    • whitespace fix

    • +
    • first step towards lcio yaml file

    • +
    +
  • +
  • 2015-04-17 Benedikt Hegner

    +
      +
    • trivial python wrapper for event store

    • +
    • add simple non-existence check

    • +
    • add some doc strings

    • +
    • start using IReader

    • +
    • use method names acquire/release in ObjBase

    • +
    • add more docs

    • +
    • unify ref-counting behaviour

    • +
    • let XXXObj create relation collections themselves

    • +
    • add cloning and better initialization; aligning method implementation order with declaration order

    • +
    +
  • +
  • 2015-04-16 Benedikt Hegner

    +
      +
    • add proper destructor for XXXObj

    • +
    • add header needed for gcc

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • introducing ObjBase

    • +
    +
  • +
  • 2015-04-16 Pere Mato

    +
      +
    • test target is reserved from CMake > 3.0

    • +
    • Simplify CMakeLists files making use of ROOTConfig.cmake (ROOT build with CMake)

    • +
    • move delete command for Obj into the ref counting method

    • +
    • inline trivial setters and getters

    • +
    +
  • +
  • 2015-04-15 Benedikt Hegner

    +
      +
    • improve documentation

    • +
    • add doxygen target

    • +
    • whitespace

    • +
    • remove unneeded headers

    • +
    • fix gcc warnings

    • +
    • move to ROOT 6 on linux

    • +
    +
  • +
  • 2015-04-14 Benedikt Hegner

    +
      +
    • allow cyclic dependencies between collections and objects

    • +
    • setting collection ID on read

    • +
    • deprecate registry

    • +
    • first step towards deprecation of Registry

    • +
    • rename FooEntry classes to FooObj

    • +
    • fix cmake

    • +
    • next simplification of class generator; move more code into templates

    • +
    • first step towards simplified class generator

    • +
    • break circular header dependency in case types have references to the same type

    • +
    +
  • +
  • 2015-04-13 Benedikt Hegner

    +
      +
    • add handling of improper refs on writing

    • +
    • move implementations into cc file

    • +
    • add documentation draft; whitespace cleanup

    • +
    • add some comments

    • +
    • add some comments

    • +
    • rename event store methods

    • +
    • remove deprecated methods from Registry

    • +
    • fixing wrong whitespace

    • +
    • upgrade to new API supporting free-floating objects

    • +
    +
  • +
  • 2015-04-01 Benedikt Hegner

    +
      +
    • add newline at the end of the file

    • +
    +
  • +
  • 2014-12-11 Colin Bernet

    +
      +
    • Merge pull request #24 from cbernet/clone

    • +
    +
  • +
  • 2014-12-11 Colin

    +
      +
    • can clone an existing handle into a new collection.

    • +
    +
  • +
  • 2014-12-04 Colin Bernet

    +
      +
    • Merge pull request #23 from cbernet/edm_1

    • +
    +
  • +
  • 2014-12-03 Colin

    +
      +
    • removed getters and accessors from Handle

    • +
    • edm v1 compiles and runs.

    • +
    • class generation: can now have components inside components

    • +
    • uniform syntax for members

    • +
    +
  • +
  • 2014-12-02 Colin

    +
      +
    • edm_1 done, but need to review naming scheme and simplify a bit

    • +
    • started to work on first detailed edm prototype.

    • +
    +
  • +
  • 2014-12-02 Benedikt Hegner

    +
      +
    • remove incomplete relation code; was accidental commit

    • +
    +
  • +
  • 2014-11-26 Benedikt Hegner

    +
      +
    • adjusted to new structure of headers

    • +
    +
  • +
  • 2014-10-26 Benedikt Hegner

    +
      +
    • make friend declaration confirm standard; needed by genreflex

    • +
    +
  • +
  • 2014-10-24 hegner

    +
      +
    • Merge pull request #22 from hegner/master

    • +
    +
  • +
  • 2014-10-24 Benedikt Hegner

    +
      +
    • fix warnings

    • +
    • Merge pull request #21 from hegner/master

    • +
    • fix merge problems at runtime

    • +
    • revert to original data model setup

    • +
    • merge HEAD

    • +
    • towards n-to-n relation improvements; make class generator create other directory structure

    • +
    +
  • +
  • 2014-10-10 Colin

    +
      +
    • fixes for python import

    • +
    +
  • +
  • 2014-10-10 Colin Bernet

    +
      +
    • Merge pull request #20 from cbernet/python

    • +
    • added python specific stuff to install scripts

    • +
    • Merge pull request #19 from cbernet/python

    • +
    +
  • +
  • 2014-10-09 Colin

    +
      +
    • reader can now navigate directly to a given event number

    • +
    +
  • +
  • 2014-10-07 Colin Bernet

    +
      +
    • Merge pull request #18 from cbernet/python

    • +
    +
  • +
  • 2014-10-07 Colin

    +
      +
    • python read example ready

    • +
    • Merge branch ‘python’ of github.com:cbernet/albers into python

    • +
    • code more pythonic; unittests

    • +
    • python event store working

    • +
    +
  • +
  • 2014-10-06 Colin Bernet

    +
      +
    • Merge pull request #17 from cbernet/python

    • +
    • Update README.md

    • +
    +
  • +
  • 2014-10-06 Colin

    +
      +
    • handles working in python

    • +
    • added python test file

    • +
    +
  • +
  • 2014-10-02 Colin Bernet

    +
      +
    • Merge pull request #16 from cbernet/leptons

    • +
    +
  • +
  • 2014-10-02 Colin

    +
      +
    • added a muon to the event, and computing its isolation.

    • +
    • added print operator for ParticleHandle in utilities

    • +
    • Merge pull request #15 from cbernet/more_utility

    • +
    • bug fix in Collections. particle overlap checking based on handles

    • +
    +
  • +
  • 2014-10-01 Colin

    +
      +
    • write and read on 100000 events. solved rare problems by setting an eta cut in the generator.

    • +
    +
  • +
  • 2014-10-01 Colin Bernet

    +
      +
    • Merge pull request #14 from cbernet/dummy_generator

    • +
    • Dummy generator generates two jets

    • +
    • on-demand reading tested in read example

    • +
    • now using only the jets and the particles from the DummyGenerator

    • +
    • Merge pull request #13 from cbernet/coll_in_registry

    • +
    • CollectionBase pointers now registered in Registry. Changed writer interface

    • +
    • added first version of a dummy multijet event generator

    • +
    +
  • +
  • 2014-09-30 Colin

    +
      +
    • new utility functions. < operator for handles.

    • +
    +
  • +
  • 2014-09-29 Colin

    +
      +
    • Jet and vector utility functions used in write and read

    • +
    • print functions for Collections, and first utility functions

    • +
    +
  • +
  • 2014-09-28 Benedikt Hegner

    +
      +
    • take last element and increment by one for end iterator

    • +
    • fix bug of invalid references in user land

    • +
    +
  • +
  • 2014-09-27 Benedikt Hegner

    +
      +
    • next step towards one-to-many-relations; collection has proper members now

    • +
    • update and clean templates

    • +
    • add first part of one-to-many capabilities to POD and Handle

    • +
    +
  • +
  • 2014-09-25 Colin

    +
      +
    • using the new datamodel in read and write. Reading problem at first event!

    • +
    • developed data model

    • +
    +
  • +
  • 2014-09-25 Colin Bernet

    +
      +
    • Merge pull request #12 from cbernet/few_easy_mods

    • +
    • macos X initialization script

    • +
    • Merge branch ‘master’ into merge_attempt

    • +
    +
  • +
  • 2014-09-24 Benedikt Hegner

    +
      +
    • change syntax for data generation; part 1

    • +
    +
  • +
  • 2014-09-24 Colin

    +
      +
    • a bit of clean up

    • +
    +
  • +
  • 2014-09-23 Benedikt Hegner

    +
      +
    • simplify the structure of the PODs; now really look like structs

    • +
    • add functionality of defining components; simplify datamodel example and writer code

    • +
    • fix pedantic compilation warning

    • +
    +
  • +
  • 2014-09-23 Colin Bernet

    +
      +
    • Merge pull request #11 from cbernet/event_loop

    • +
    +
  • +
  • 2014-09-23 Colin

    +
      +
    • event loop in reader working, but messy ! overall design to be clarified

    • +
    • bug fix: not writing to TFile anymore just after filling the tree

    • +
    • Merge pull request #10 from cbernet/event_loop

    • +
    • implemented event loop in writer. big performance issue

    • +
    • Merge pull request #9 from cbernet/simple_edm

    • +
    +
  • +
  • 2014-09-22 Colin

    +
      +
    • example mains adapted to new EDM

    • +
    • bug fix for multiple includes

    • +
    • realistic data model

    • +
    +
  • +
  • 2014-09-22 Colin Bernet

    +
      +
    • Merge pull request #8 from cbernet/auto_handle_ptr

    • +
    • buffer address in embedded handles set in prepareAfterRead automatically

    • +
    • initialed collectionID to 0, and improved const-correctness

    • +
    • collection id is now unsigned

    • +
    • Merge pull request #7 from cbernet/macos_build_merge

    • +
    • Merge branch ‘macos_build’ into macos_build_merge

    • +
    • Merge branch ‘master’ of github.com:HEP-FCC/albers

    • +
    • conditional for mac os x

    • +
    • able to build on macos, need to test lxplus6

    • +
    +
  • +
  • 2014-09-21 Colin Bernet

    +
      +
    • reformatted README properly

    • +
    +
  • +
  • 2014-09-21 Colin

    +
      +
    • commented the code: Reader, Handle

    • +
    +
  • +
  • 2014-09-19 Colin

    +
      +
    • Merge branch ‘documentation’ of github.com:cbernet/albers into documentation

    • +
    +
  • +
  • 2014-09-18 Colin

    +
      +
    • documentation and questions: EventStore, Collection, Registry, Writer

    • +
    • documentation and questions: EventStore, Collection, Registry

    • +
    • added an environment setup script

    • +
    +
  • +
  • 2014-09-17 Colin

    +
      +
    • more specific installation instructions

    • +
    • added a particle class, aiming for a Z boson example

    • +
    +
  • +
  • 2014-09-17 Benedikt Hegner

    +
      +
    • fix for the fact that yaml parsing doesn’t preserve ordering

    • +
    +
  • +
  • 2014-09-16 Benedikt Hegner

    +
      +
    • rearrange the example

    • +
    +
  • +
  • 2014-09-15 Benedikt Hegner

    +
      +
    • fix md

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • add initial descriptions

    • +
    • make it so

    • +
    +
  • +
  • 2014-09-15 hegner

    +
      +
    • Initial commit

    • +
    +
  • +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/_static/_sphinx_javascript_frameworks_compat.js b/master/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/master/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/master/_static/basic.css b/master/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/master/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/master/_static/check-solid.svg b/master/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/master/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/clipboard.min.js b/master/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/master/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/master/_static/copybutton.css b/master/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/master/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/master/_static/copybutton.js b/master/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/master/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/master/_static/copybutton_funcs.js b/master/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/master/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/master/_static/css/badge_only.css b/master/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/master/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/master/_static/css/fonts/Roboto-Slab-Bold.woff b/master/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/master/_static/css/fonts/Roboto-Slab-Bold.woff2 b/master/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/master/_static/css/fonts/Roboto-Slab-Regular.woff b/master/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/master/_static/css/fonts/Roboto-Slab-Regular.woff2 b/master/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/master/_static/css/fonts/fontawesome-webfont.eot b/master/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/master/_static/css/fonts/fontawesome-webfont.svg b/master/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/master/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/css/fonts/fontawesome-webfont.ttf b/master/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/master/_static/css/fonts/fontawesome-webfont.woff b/master/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/master/_static/css/fonts/fontawesome-webfont.woff2 b/master/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/master/_static/css/fonts/lato-bold-italic.woff b/master/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/master/_static/css/fonts/lato-bold-italic.woff differ diff --git a/master/_static/css/fonts/lato-bold-italic.woff2 b/master/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/master/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/master/_static/css/fonts/lato-bold.woff b/master/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/master/_static/css/fonts/lato-bold.woff differ diff --git a/master/_static/css/fonts/lato-bold.woff2 b/master/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/master/_static/css/fonts/lato-bold.woff2 differ diff --git a/master/_static/css/fonts/lato-normal-italic.woff b/master/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/master/_static/css/fonts/lato-normal-italic.woff differ diff --git a/master/_static/css/fonts/lato-normal-italic.woff2 b/master/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/master/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/master/_static/css/fonts/lato-normal.woff b/master/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/master/_static/css/fonts/lato-normal.woff differ diff --git a/master/_static/css/fonts/lato-normal.woff2 b/master/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/master/_static/css/fonts/lato-normal.woff2 differ diff --git a/master/_static/css/theme.css b/master/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/master/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/master/_static/doctools.js b/master/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/master/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/master/_static/documentation_options.js b/master/_static/documentation_options.js new file mode 100644 index 000000000..1823c1bde --- /dev/null +++ b/master/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: false, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/master/_static/file.png b/master/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/master/_static/file.png differ diff --git a/master/_static/jquery.js b/master/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/master/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/master/_static/js/html5shiv.min.js b/master/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/master/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/master/_static/js/theme.js b/master/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/master/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/master/_static/minus.png b/master/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/master/_static/minus.png differ diff --git a/master/_static/plus.png b/master/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/master/_static/plus.png differ diff --git a/master/_static/pygments.css b/master/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/master/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/master/_static/searchtools.js b/master/_static/searchtools.js new file mode 100644 index 000000000..7918c3fab --- /dev/null +++ b/master/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/master/_static/sphinx_highlight.js b/master/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/master/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/master/advanced_topics.html b/master/advanced_topics.html new file mode 100644 index 000000000..08eb3ece2 --- /dev/null +++ b/master/advanced_topics.html @@ -0,0 +1,452 @@ + + + + + + + Advanced Topics — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Advanced Topics

+
+

Writing extra data outside the EDM

+

See here

+
+
+

Changing / creating new templates

+

See here

+
+
+

Persistency

+

The library is build such that it can support multiple storage backends. However, the tested storage system being used is ROOT. +The following explains the requirements for a user-provided storage back-end.

+
+

Writing Back-End

+

There is no interface a writing class has to fulfill. It only needs to take advantage of the interfaces provided in PODIO. To persistify a collection, three pieces of information have to be stored:

+
    +
  1. the ID of the collection,

  2. +
  3. the vector of PODs in the collection, and

  4. +
  5. the relation information in the collection

  6. +
+

Before writing out a collection, the data need to be put into the proper structure. For this, the method prepareForWrite needs to be invoked. In the case of trivial POD members this results in a no-op. In case, the collection contains references to other collections, the pointers are being translated into collID:objIndex pairs. A serialization solution would - in principle - then look like this:

+
     collection->prepareForWrite();
+     void* buffer = collection->getBufferAddress();
+     auto refCollections = collection->referenceCollections();
+     // ...
+     //   write buffer, collection ID, and refCollections
+     // ...
+
+
+
+
+

Reading Back-End

+

The main requirement for a reading backend is its capability of reading back all +the necessary data from which a collection can be constructed in the form of +podio::CollectionReadBuffers. From these buffers collections can then be +constructed. Each instance has to contain the (type erased) POD buffers (as a +std::vector), the (possibly empty) vectors of podio::ObjectIDs that contain +the relation information as well the (possibly empty) vectors for the vector +member buffers, which are currently stored as pairs of the type (as a +std::string) and (type erased) data buffers in the form of std::vectors.

+
+
+

Dumping JSON

+

It is possible to turn on an automatic conversion to JSON for podio generated datamodels using the nlohmann/json library. +To enable this feature the core datamodel library has to be compiled with the PODIO_JSON_OUTPUT and linked against the nlohmann/json library (needs at least version 3.10). +In cmake the necessary steps are (assuming that datamodel is the datamodel core library)

+
find_library(nlohmann_json 3.10 REQUIRED)
+target_link_library(datamodel PUBLIC nlohmann_json::nlohmann_json)
+target_compile_definitions(datamodel PUBLIC PODIO_JSON_OUTPUT)
+
+
+

With JSON support enabled it is possible to convert collections (or single objects) to JSON simply via

+
#include "nlohmann/json.hpp"
+
+auto collection = // get collection from somewhere
+
+nlohmann::json json{
+   {"collectionName", collection}
+};
+
+
+

Each element of the collection will be converted to a JSON object, where the keys are the same as in the datamodel definiton. +Components contained in the objects will similarly be similarly converted.

+

JSON is not foreseen as a mode for persistency, i.e. there is no plan to add the conversion from JSON to the in memory representation of the datamodel.

+
+
+
+

Thread-safety

+

PODIO was written with thread-safety in mind and avoids the usage of globals and statics. +However, a few assumptions about user code and use-patterns were made. +The following lists the caveats of the library when it comes to parallelization.

+
+

Changing user data

+

As explained in the section about mutability of data, thread-safety is only guaranteed if data are considered read-only after creation.

+
+
+

Serialization

+

During the calls of prepareForWriting and prepareAfterReading on collections other operations like object creation or addition will lead to an inconsistent state.

+
+
+

Not-thread-safe components

+

The Readers and Writers that ship with podio are assumed to run on a single +thread only (more precisely we assume that each Reader or Writer doesn’t have to +synchronize with any other for file operations).

+
+
+
+

Running pre-commit

+
    +
  • Install pre-commit

    +

    $ pip install pre-commit

    +
  • +
  • Run pre-commit manually

    +

    $ pre-commit run --all-files

    +
  • +
+
+
+

Retrieving the EDM definition from a data file

+

It is possible to get the EDM definition(s) that was used to generate the +datatypes that are stored in a data file. This makes it possible to re-generate +the necessary code and build all libraries again in case they are not easily +available otherwise. To see which EDM definitions are available in a data file +use the podio-dump utility

+
podio-dump <data-file>
+
+
+

which will give an (exemplary) output like this

+
input file: <data-file>
+
+EDM model definitions stored in this file: edm4hep
+
+[...]
+
+
+

To actually dump the model definition to stdout use the --dump-edm option +and the name of the datamodel you want to dump:

+
podio-dump --dump-edm edm4hep <data-file> > dumped_edm4hep.yaml
+
+
+

Here we directly redirected the output to a yaml file that can then again be +used by the podio_class_generator.py to generate the corresponding c++ code +(or be passed to the cmake macros).

+

Note that the dumped EDM definition is equivalent but not necessarily exactly +the same as the original EDM definition. E.g. all the datatypes will have all +their fields (Members, OneToOneRelations, OneToManyRelations, +VectorMembers) defined, and defaulted to empty lists in case they were not +present in the original EDM definition. The reason for this is that the embedded +EDM definition is the pre-processed and validated one as described +below

+
+

Accessing the EDM definition programmatically

+

The EDM definition can also be accessed programmatically via the +[ROOT|SIO]FrameReader::getEDMDefinition method. It takes an EDM name as its +single argument and returns the EDM definition as a JSON string. Most likely +this has to be decoded into an actual JSON structure in order to be usable (e.g. +via json.loads in python to get a dict).

+
+
+

Technical details on EDM definition embedding

+

The EDM definition is embedded into the core EDM library as a raw string literal +in JSON format. This string is generated into the DatamodelDefinition.h file as

+
namespace <package_name>::meta {
+static constexpr auto <package_name>__JSONDefinition = R"EDMDEFINITION(<json encoded definition>)EDMDEFINITION";
+}
+
+
+

where <package_name> is the name of the EDM as passed to the +podio_class_generator.py (or the cmake macro). The <json encoded definition> +is obtained from the pre-processed EDM definition that is read from the yaml +file. During this pre-processing the EDM definition is validated, and optional +fields are filled with empty defaults. Additionally, the includeSubfolder +option will be populated with the actual include subfolder, in case it has been +set to True in the yaml file. Since the json encoded definition is generated +right before the pre-processed model is passed to the class generator, this +definition is equivalent, but not necessarily equal to the original definition.

+
+

The DatamodelRegistry

+

To make access to information about currently loaded and available datamodels a +bit easier the DatamodelRegistry (singleton) keeps a map of all loaded +datamodels and provides access to this information possible. In this context we +refer to an EDM as the shared library (and the corresponding public headers) +that have been compiled from code that has been generated from a datamodel +definition in the original YAML file. In general whenever we refer to a +datamodel in this context we mean the enitity as a whole, i.e. its definition +in a YAML file, the concrete implementation as an EDM, as well as other related +information that is related to it.

+

Currently the DatamodelRegistry provides mainly access to the original +definition of available datamodels via two methods:

+
const std::string_view getDatamodelDefinition(const std::string& edmName) const;
+
+const std::string_view getDatamodelDefinition(size_t index) const;
+
+
+

where index can be obtained from each collection via +getDatamodelRegistryIndex. That in turn simply calls +<package_name>::meta::DatamodelRegistryIndex::value(), another singleton like object +that takes care of registering an EDM definition to the DatamodelRegistry +during its static initialization. It is also defined in the +DatamodelDefinition.h header.

+

Since the datamodel definition is embedded as a raw string literal into the core +EDM shared library, it is in principle also relatively straight forward to +retrieve it from this library by inspecting the binary, e.g. via

+
readelf -p .rodata libedm4hep.so | grep options
+
+
+

which will result in something like

+
  [   300]  {"options": {"getSyntax": true, "exposePODMembers": false, "includeSubfolder": "edm4hep/"}, "components": {<...>}, "datatypes": {<...>}}
+
+
+
+
+

I/O helpers for EDM definition storing

+

The podio/utilities/DatamodelRegistryIOHelpers.h header defines two utility +classes, that help with instrumenting readers and writers with functionality to +read and write all the necessary EDM definitions.

+
    +
  • The DatamodelDefinitionCollector is intended for usage in writers. It +essentially collects the datamodel definitions of all the collections it encounters. +The registerDatamodelDefinition method it provides should be called with every collection +that is written. The getDatamodelDefinitionsToWrite method returns a vector of all +datamodel names and their definition that were encountered during writing. It is +then the writers responsibility to actually store this information into the +file.

  • +
  • The DatamodelDefinitionHolder is intended to be used by readers. It +provides the getDatamodelDefinition and getAvailableDatamodels methods. +It is again the readers property to correctly populate it with the data it +has read from file. Currently the SIOFrameReader and the ROOTFrameReader +use it and also offer the same functionality as public methods with the help +of it.

  • +
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/contributing.html b/master/contributing.html new file mode 100644 index 000000000..53a96595d --- /dev/null +++ b/master/contributing.html @@ -0,0 +1,298 @@ + + + + + + + Contributing to PODIO — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Contributing to PODIO

+

Please read these guidelines if you want to contribute to the PODIO project.

+
+

Git workflow

+

For PODIO we would like to follow a so called “No Switch Yard” (NoSY) workflow.

+

In essence this means that you develop your (small) new feature in a dedicated +feature branch that is kept up to date with the master branch until you create +a PR, as we only allow rebase merges for PRs.

+
+

Example workflow

+
    +
  • checkout a copy of PODIO from the origin at AIDASoft:

    +

    git clone https://github.com/AIDASoft/podio.git +cd podio

    +
  • +
  • create a fork of the repository on the Github web page

    +
      +
    • if you have not yet done so earlier

    • +
    +
  • +
  • add your fork as remote downstream using your Github username

    +
    git remote add downstream  https://<yourUserName>@github.com/<yourUserName>/podio.git
    +
    +
    +
  • +
  • create a new feature branch; choose a meaningful name

    +
    git checkout -b <myNewBranch>
    +
    +
    +
  • +
  • make the changes to existing files (or add new ones) and frequently keep up to date with the master:

    +
    git fetch origin; git rebase origin/master
    +
    +
    +
  • +
  • after having committed everything to your new branch, push it to your fork of PODIO:

    +
    git push downstream <myNewBranch>
    +
    +
    +
  • +
  • reload your own github website (https://github.com//podio)

    +
      +
    • you should see your commit

    • +
    • now you can create a pull request on the web site

    • +
    +
  • +
+
+
+

Release Notes

+

Please make sure you fill in meaningful release notes in the comment field that is +provided at the Github web page when creating the PR, e.g.

+
BEGINRELEASENOTES
+- updated documentation
+    - add guidelines for contributing
+- reverted some name changes in tests/examples
+    - `read-one` now again called `read`
+
+ENDRELEASENOTES
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/datamodel_syntax.html b/master/datamodel_syntax.html new file mode 100644 index 000000000..2cb96bf71 --- /dev/null +++ b/master/datamodel_syntax.html @@ -0,0 +1,395 @@ + + + + + + + Data Models and Data Model Definitions — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Models and Data Model Definitions

+

To describe a data model PODIO provides a data model definition syntax. +This is to ease the creation of optimised data formats, which may take advantage of a so-called struct-of-array data layout. +From the user-provided data model description PODIO creates all the files necessary to use this data model.

+
+

Basic Concepts and Supported Features

+

PODIO encourages the usage of composition, rather than inheritance. +One of the reasons for doing so is the focus on efficiency friendly plain-old-data. +For this reason, PODIO does not support inheritance within the defined data model. +Instead, users can combine multiple components to build a to be used datatype.

+

To allow the datatypes to be real PODs, the data stored within the data model are constrained to be +POD-compatible data. Those are

+
    +
  1. basic types like int, double, etc as well as a limited set of fixed width +integers from <cstdint> (the _leastN or _fastN types as well as all +8 bit types are not allowed).

  2. +
  3. components built up from basic types or other components

  4. +
  5. Fixed sized arrays of those types

  6. +
+

In addition, PODIO supports the storage of one-to-one and one-to-many relations between objects. +In the following the syntax for defining a given data model is explained. +A later section contains more details about the code being created from this.

+
+
+

Definition of custom components

+

A component is just a flat struct containing data. it can be defined via:

+
    components:
+      # My example component
+      MyComponent:
+        Members:
+          - float x
+          - float y
+          - float z
+          - AnotherComponent a
+
+
+
+
+

Definition of custom data classes

+

Here an excerpt from “datamodel.yaml” for a simple class, just containing one member of the type int.

+
    datatypes :
+      EventInfo :
+        Description : "My first data type"
+        Author : "It's me"
+        Members :
+        - int Number // event number
+
+
+

Using this definition, three classes will be created: EventInfo, EventInfoData and EventInfoCollection. These have the following signature:

+
    class EventInfoData {
+      public:
+        int Number;
+    }
+
+    class EventInfo {
+      public:
+      ...
+        int Number() const;
+        void Number(int);
+      ...
+    }
+
+
+
+

Defining members

+

The definition of a member is done in the Members section in the form:

+
    Members:
+      <type> <name> // <comment>
+
+
+

where type can be any builtin-type or a component.

+

It is also possible to specify default values for members via

+
    Members:
+      <type> <name>{<default-value>} // <comment>
+
+
+

Note that in this case it is extremely expensive to check whether the provided default-value results in valid c++. +Hence, there is only a very basic syntax check, but no actual type check, and wrong default values will be caught only when trying to compile the datamodel.

+

For describing physics quantities it is important to know their units. Thus it is possible to add the units to the member definition:

+
    Members:
+      <type> <name>{<default-value>} [<unit>] // <comment>
+
+
+
+
+

Definition of references between objects:

+

There can be one-to-one-relations and one-to-many relations being stored in a particular class. This happens either in the OneToOneRelations or OneToManyRelations section of the data definition. The definition has again the form:

+
    OneToOneRelations:
+      <type> <name> // <comment>
+    OneToManyRelations:
+      <type> <name> // <comment>
+
+
+
+
+

Explicit definition of methods

+

In a few cases, it makes sense to add some more functionality to the created classes. Thus this library provides two ways of defining additional methods and code. Either by defining them inline or in external files. Extra code has to be provided separately for immutable and mutable additions. +Note that the immutable (ExtraCode) will also be placed into the mutable classes, so that there is no need for duplicating the code. +Only if some additions should only be available for the mutable classes it is necessary to fill the MutableExtraCode section. +The includes will be add to the header files of the generated classes.

+
    ExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+    MutableExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+
+
+

The code being provided has to use the macro {name} in place of the concrete name of the class.

+
+
+
+

Global options

+

Some customization of the generated code is possible through flags. These flags are listed in the section options:

+
    options:
+      getSyntax: False
+      exposePODMembers: True
+    components:
+      # My simple component
+      ExampleComponent:
+        Members:
+          - int x
+    datatypes:
+      ExampleType:
+        Description: "My datatype with a component member"
+        Author: "Mr me"
+        Members:
+         - ExampleComponent comp // component from above
+
+
+
    +
  • getSyntax: steers the naming of get and set methods. If set to true, methods are prefixed with get and set following the capitalized member name, otherwise the member name is used for both.

  • +
  • exposePODMembers: whether get and set methods are also generated for members of a member-component. In the example corresponding methods would be generated to directly set / get x through ExampleType.

  • +
+
+
+

Extending a datamodel / using types from an upstream datamodel

+

It is possible to extend another datamodel with your own types, resp. use some datatypes or components from an upstream datamodel in your own datamodel. +This can be useful for prototyping new datatypes or for accomodating special requirements without having to reimplement / copy a complete datamodel.

+

To pass an upstream datamodel to the class generator use the --upstream-edm option that takes the package name as well as the yaml definition file of the upstream datamodel separated by a colon (‘:’). +This will effectively make all components and datatypes of the upstream datamodel available to the current definition for validation and generation of the necessary includes. +Nevertheless, only the code for the datatypes and components defined in the current yaml file will be generated. +The podio PODIO_GENERATE_DATAMODEL cmake macro has gained an additional parameter UPSTREAM_EDM to pass the arguments to the generator via the cmake macros.

+
+

Potential pitfalls

+
    +
  • The cmake macros do not handle linking against an upstream datamodel automatically. It is the users responsibility to explicitly link against the upstream datamodel.

  • +
  • When generating two datamodels side-by-side and into the same output directory and using the ROOT backend, the generated selection.xml file might be overwritten if both datamodels are generated into the same output directory.

  • +
+

Limiting this functionality to one upstream datamodel is a conscious choice to limit the potential for abuse of this feature.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/design.html b/master/design.html new file mode 100644 index 000000000..add7fe2bd --- /dev/null +++ b/master/design.html @@ -0,0 +1,298 @@ + + + + + + + Design and Implementation Details — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Design and Implementation Details

+

The driving considerations for the PODIO design are:

+
    +
  1. the concrete data are contained within plain-old-data structures (PODs)

  2. +
  3. user-exposed data types are concrete and do not use inheritance

  4. +
  5. The C++ and Python interface should look as close as possible

  6. +
  7. The user does not do any explicit memory management

  8. +
  9. Classes are generated using a higher-level abstraction and code generators

  10. +
+

The following sections give some more technical details and explanations for the design choices. +More concrete implementation details can be found in the doxygen documentation.

+
+

Layout of Objects

+

The data model is based on four different kind of objects and layers, namely

+
    +
  1. user visible (physics) classes (e.g. Hit). These act as transparent references to the underlying data,

  2. +
  3. a transient object knowing about all data for a certain physics object, including inter-object relations (e.g. HitObject),

  4. +
  5. a plain-old-data (POD) type holding the persistent object information (e.g. HitData), and

  6. +
  7. a user-visible collection containing the physics objects (e.g. HitCollection).

  8. +
+

These layers are described in the following.

+
+

The User Layer

+

The user visible objects (e.g. Hit) act as light-weight references to the underlying data, and provide the necessary user interface. They come in two flavors, mutable and immutable, where the mutable classes are easily recognizable by their name (e.g. MutableHit). +Mutable classes are implicitly converted to immutable ones if necessary, so that interfaces that require only reading access to the data should always use the immutable classes. Only in cases where explicit mutability of the objects is required should mutable classes appear in interface definitions.

+

For each of the data-members and OneToOneRelations declared in the data model definition, corresponding getters (and setters for the mutable classes) are generated. +For each of the OneToManyRelations and VectorMembers a vector-like interface is provided.

+

With the chosen interface, the code written in C++ and Python looks almost identical, if taking proper advantage of the auto keyword.

+
+
+

The Internal Data Layer

+

The internal objects give access to the object data, i.e. the POD, and the references to other objects. +These objects inherit from podio::ObjBase, which takes care of object identification (podio::ObjectID), and object-ownership. The ObjectID consists of the index of the object and an ID of the collection it belongs to. If the object does not belong to a collection yet, the data object owns the POD containing the real data, otherwise the POD is owned by the respective collection. For details about the inter-object references and their handling within the data objects please see below.

+
+
+

The POD Layer

+

The plain-old-data (POD) contain just the data declared in the Members section of the datamodel definition as well as some bookkeeping data for data types with OneToManyRelations or VectorMembers. Ownership and lifetime of the PODs is managed by the other parts of the infrastructure, namely the data objects and the data collections.

+
+
+

The Collections

+

The collections created serve three purposes:

+
    +
  1. giving access to or creating the data items

  2. +
  3. preparing objects for writing into PODs or preparing them after reading

  4. +
  5. support for the so-called notebook pattern

  6. +
+

When used via the so called factory pattern (i.e. using the create function to create new objects) a collection will return mutable objects. +It is important to note that objects that are “owned” by a collection (i.e. they are either created via create or they are added to the collection via push_back) become invalid and can no longer be used once a collection is cleared.

+
+
+

Vectorization support / notebook pattern

+

As an end-user oriented library, PODIO provides only a limited support for struct-of-arrays (SoA) memory layouts. In the vision, that the data used for heavy calculations is best copied locally, the library provides convenience methods for extracting the necessary information from the collections. More details can be found in the examples section of this document.

+
+
+
+

Handling mutability

+

Depending on the policy of the client of PODIO, data collections may be read-only after creation, or may be altered still. +While the base assumption of PODIO is that once-created collections are immutable once leaving the scope of its creator, +it still allows for explicit unfreezing collections afterwards. +This feature has to handled with care, as it heavily impacts thread-safety.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/doc.html b/master/doc.html new file mode 100644 index 000000000..97f4be774 --- /dev/null +++ b/master/doc.html @@ -0,0 +1,247 @@ + + + + + + + Introduction — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Introduction

+

PODIO, or plain-old-data I/O, is a C++ library to support the creation and handling of data models in particle physics. It is based on the idea of employing plain-old-data (POD) data structures wherever possible, while avoiding deep-object hierarchies and virtual inheritance. This is to both improve runtime performance and simplify the implementation of persistency services.

+

At the same time it provides the necessary high-level functionality to the physicist, such as support for inter-object relations, and automatic memory-management. In addition, it provides a (ROOT assisted) Python interface. To simplify the creation of efficient data models, PODIO employs code generation from a simple yaml-based markup syntax.

+

To support the usage of modern software technologies, PODIO was written with concurrency in mind and gives basic support for vectorization technologies.

+

This document describes first how to define and create a specific data model, then how to use the created data. Afterwards it will explain the overall design and a few of the technical details of the implementation.

+

Many of the design choices are inspired by previous experience of the LCIO package used for the studies of the international linear collider, and the Gaudi Object Description applied in the LHCb collaboration at the LHC.

+
+
+

Quick-start

+

An up-to-date installation and quick start guide for the impatient user can be found on the PODIO github page.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/doc_title.html b/master/doc_title.html new file mode 100644 index 000000000..98903d8ea --- /dev/null +++ b/master/doc_title.html @@ -0,0 +1,247 @@ + + + + + + + <no title> — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

\begin{titlepage} +\begin{center}

+

\vspace*{2.5cm}

+

\huge +PODIO - the POD I/O Library\ +Design Document v1.0

+

\vspace{0.5cm}

+

\normalsize +30.6.2016

+

\vspace{1cm}

+

Benedikt Hegner (CERN)\ +Frank Gaede (DESY)

+

\end{center} +\end{titlepage}

+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/examples.html b/master/examples.html new file mode 100644 index 000000000..0a58e1aec --- /dev/null +++ b/master/examples.html @@ -0,0 +1,370 @@ + + + + + + + Examples for Supported Interface — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Examples for Supported Interface

+

The following snippets show the support of PODIO for the different use cases as +well as some potential pitfalls. These examples are mainly concerned with how +collections of objects and the objects themselve interact. As such they are +framework agnostic.

+
+

Object Ownership

+

Every data created is either explicitly owned by collections or automatically garbage-collected. There is no need for any new or delete call on user side. +As a general rule: If an object has been added to a collection, the collection +assumes ownership and if the collection goes out of scope all handles that point +to objects in this collection are invalidated as well.

+
+
+

Object Creation and Storage

+

Objects and collections can be created via factories, which ensure proper object ownership:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create(1.4,2.4,3.7,4.2);  // init with values
+    auto hit2 = hits.create(); // default-construct object
+    hit2.energy(42.23);
+
+
+

In addition, individual objects can be created in the free. If they aren’t attached to a collection, they are automatically garbage-collected:

+
    auto hit1 = Hit();
+    auto hit2 = Hit();
+    ...
+    hits.push_back(hit1);
+    ...
+    <automatic deletion of hit2>
+
+
+

In this respect all objects behave like objects in Python.

+
+
+

Object References

+

The library supports the creation of one-to-many relations:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create();
+    auto hit2 = hits.create();
+    auto clusters = ClusterCollection{};
+    auto cluster = clusters.create();
+    cluster.addHit(hit1);
+    cluster.addHit(hit2);
+
+
+

The references can be accessed via iterators on the referencing objects

+
    for (auto i = cluster.Hits_begin(), \
+         end = cluster.Hits_end(); i!=end; ++i){
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

or via direct accessors

+
    auto size = cluster.Hits_size();
+    auto hit  = cluster.Hits(<aNumber>);
+
+
+

If asking for an entry outside bounds, a std::out_of_range exception is thrown.

+
+
+

Looping through Collections

+

Looping through collections is supported in two ways. Via iterators:

+
    for(auto i = hits.begin(), end = hits.end(); i != end; ++i) {
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

and via direct object access:

+
    for(int i = 0, end = hits.size(), i != end, ++i){
+      std::cout << hit[i].energy() << std::endl;
+    }
+
+
+
+
+

Support for Notebook-Pattern

+

The notebook pattern uses the assumption that it is better to create a small +copy of only the data that are needed for a particular calculation. This +pattern is supported by providing access like

+
    auto x_array = hits.x();   // returning all values
+    auto y_array = hits.y(10); // or only the first 10 elements
+
+
+

The resulting std::vector can then be used in (auto-)vectorizable code. +Passing in a size argument is optional; If no argument is passed all elements will be returned, +if an argument is passed only as many elements as requested will be returned. +If the collection holds less elements than are requested, only as elements as are available will be returned.

+
+
+

podio::Frame container

+

The podio::Frame is the main container for containing and grouping collections +together. It has two main methods:

+
    /// Store a collection
+    template<typename T>
+    const T& put(T&& coll, const std::string& name);
+
+    /// access a collection
+    template<typename T>
+    const& T get(const std::string& name);
+
+
+

Note that for putting collections into the Frame an explicit std::move is +necessary to highlight the change of ownership that happens in this case.

+
+
+

Object Retrieval

+

Collections can be retrieved explicitly:

+
    auto& hits = frame.get<HitCollection>("hits");
+    if (hits.isValid()) { ... }
+
+
+

Or implicitly when following an object reference. In both cases the access to data that has been retrieved is const.

+
+
+

User defined Meta Data

+

Sometimes it is necessary or useful to store additional data that is not directly foreseen in the EDM. +This could be configuration parameters of simulation jobs, or parameter descriptions like cell-ID encoding etc. PODIO currently allows to store such meta data in terms of a GenericParameters class that +holds an arbitrary number of named parameters of type int, float, string or vectors if these. +Meta data can be stored and retrieved from the Frame via the templated putParameter and getParameter methods.

+
+

Python Interface

+

The Reader and Writer classes in the root_io and sio_io submodules +provide all the necessary functionality to read and write event files. An +example of reading files looks like this:

+
    from podio.root_io import Reader
+    reader = Reader("one or many input files")
+    for event in reader.get("events"):
+      hits = store.get("hits")
+      for hit in hits:
+        # ...
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/frame.html b/master/frame.html new file mode 100644 index 000000000..69e7071f1 --- /dev/null +++ b/master/frame.html @@ -0,0 +1,402 @@ + + + + + + + The Frame concept — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

The Frame concept

+

The podio::Frame is a general data container for collection data of podio generated EDMs. +Additionally, it offers the functionality to store some (limited) data outside of an EDM. +The basic idea of the Frame is to give users of podio the possibility to organize EDM data into logical units and to potentially build a hierarchy of different Frames. +Common examples would be the organisation of data into Events and Runs. +However, it is important to note that podio does really not impose any meaning on any Frame and each Frame is essentially defined by its contents.

+
+

Basic functionality of a Frame

+

The main functionality of a Frame is to store and aggregate EDM collection data and it also offers the possibility to store some generic data alongside. +To ensure thread safety and const-correctness a Frame takes ownership of any data that is put into it and only gives read access to immutable data. +This is mandated by the interface for collection data (simplified here for better readability):

+
struct Frame {
+template<typename CollT>
+const CollT& put(CollT&& coll, const std::string& name);
+
+void put(std::unique_ptr<podio::CollectionBase> coll, const std::string& name);
+
+template<typename CollT>
+const CollT& get(const std::string& name) const;
+
+template<typename T>
+void putParameter(const std::string& name, T value);
+
+template<typename T>
+const T& getParameter(const std::string);
+};
+
+
+

In this case there are two ways to get collection data into the Frame

+
    +
  1. By passing a concrete collection (of type CollT) into the Frame as an rvalue. There are two ways to achieve this, either by passing the return value of a function directly into Frame::put or by explicitly moving it in the call via std::move if you are using a named variable.

  2. +
  3. By passing a std::unique_ptr to a collection. Similar to the first case, this can either be the return value of a function call, or has to be done via std::move (as mandated by the std::unique_ptr interface).

  4. +
+

In both cases, if you passed in a named variable, the user is left with a moved-from object, which has to be in a valid but indefinite state, and cannot be used afterwards. +Some compilers and static code analysis tools are able to detect the accidental usage of moved-from objects.

+

For putting in parameters the basic principle is very similar, with the major difference being, that for trivial types getParameter will actually return by value.

+

For all use cases there is some enable_if machinery in place to ensure that only valid collections and valid parameter types can actually be used. +These checks also make sure that it is impossible to put in collections without handing over ownership to the Frame.

+
+

Usage examples for collection data

+

These are a few very basic usage examples that highlight the main functionality (and potential pitfalls).

+
+

Putting collection data into the Frame

+

In all of the following examples, the following basic setup is assumed:

+
#include "podio/Frame.h"
+
+#include "edm4hep/MCParticleCollection.h" // just to have a concrete example
+
+// create an empty Frame
+auto frame = podio::Frame();
+
+
+

Assuming there is a function that creates an MCParticleCollection putting the return value into the Frame is very simple

+
edm4hep::MCParticleCollection createMCParticles(); // implemented somewhere else
+
+// put the return value of a function into the Frame
+frame.put(createMCParticles(), "particles");
+
+// put the return value into the Frame but keep the const reference
+auto& particles = frame.put(createMCParticles(), "moreParticles");
+
+
+

If working with named variables it is necessary to use std::move to put collections into the Frame. +The Frame will refuse to compile in case a named variable is not moved. +Assuming the same createMCParticles function as above, this looks like the following

+
auto coll = createMCParticles();
+// potentially still modify the collection
+
+// Need to use std::move now that the collection has a name
+frame.put(std::move(coll), "particles");
+
+// Keeping a const reference is also possible
+// NOTE: We are explicitly using a new variable name here
+auto coll2 = createMCParticles();
+auto& particles = frame.put(std::move(coll2), "MCParticles");
+
+
+

At this point only particles is in a valid and defined state.

+
+
+

Getting collection (references) from the Frame

+

Obtaining immutable (const) references to collections stored in the Frame is trivial. +Here we are assuming that the collections are actually present in the Frame.

+
auto& particles = frame.get<edm4hep::MCParticleCollection>("particles");
+
+
+
+
+
+

Usage for Parameters

+

Parameters are using the podio::GenericParameters class behind the scene. +Hence, the types that can be used are int, float, and std::string as well as as std::vectors of those. +For better usability, some overloads for putParameter exist to allow for an in-place construction, like, e.g.

+
// Passing in a const char* for a std::string
+frame.putParameter("aString", "a string value");
+
+// Creating a vector of ints on the fly
+frame.putParameter("ints", {1, 2, 3, 4});
+
+
+
+
+
+

I/O basics and philosophy

+

podio offers all the necessary functionality to read and write Frames. +However, it is not in the scope of podio to organize them into a hierarchy, nor +to maintain such a hierarchy. When writing data to file Frames are written to +the file in the order they are passed to the writer. For reading them back podio +offers random access to stored Frames, which should make it possible to +restore any hierarchy again. The Writers and Readers of podio are supposed to be +run on and accessed by only one single thread.

+
+

Writing a Frame

+

For writing a Frame the writers can ask each Frame for CollectionWriteBuffers for each collection that should be written. +In these buffers the underlying data is still owned by the collection, and by extension the Frame. +This makes it possible to write the same collection with several different writers. +Writers can access a Frame from several different threads, even though each writer is assumed to be on only one thread. +For writing the GenericParameters that are stored in the Frame and for other necessary data, similar access functionality is offered by the Frame.

+
+
+

Reading a Frame

+

When reading a Frame readers do not have to return a complete Frame. +Instead they return a more or less arbitrary type of FrameData that simply has to provide the following public interface.

+
struct FrameData {
+  /// Get a (copy) of the internal collection id table
+  podio::CollectionIDTable getIDTable() const;
+
+  /// Get the buffers to construct the collection with the given name
+  std::optional<podio::CollectionReadBuffers> getCollectionBuffers(const std::string& name);
+
+  /// Get the still available, i.e. yet unpacked, collections from the raw data
+  std::vector<std::string> getAvailableCollections() const;
+
+  /// Get the parameters that are stored in the raw data
+  std::unique_ptr<podio::GenericParameters> getParameters();
+};
+
+
+

A Frame is constructed with a (unique_ptr of such) FrameData and handles everything from there. +Note that the FrameData type of any I/O backend is a free type without inheritance as the Frame constructor is templated on this. +This splitting of reading data from file and constructing a Frame from it later has some advantages:

+
    +
  • Since podio assumes that reading is done single threaded the amount of time that is actually spent in a reader is minimized, as only the file operations need to be done on a single thread. All further processing (potential decompression, unpacking, etc.) can be done on a different thread where the Frame is actually constructed.

  • +
  • It gives different backends the necessary freedom to exploit different optimization strategies and does not force them to conform to an implementation that is potentially detrimental to performance.

  • +
  • It also makes it possible to pass around data from which a Frame can be constructed without having to actually construct one.

  • +
  • Readers do not have to know how to construct collections from the buffers, as they are only required to provide the buffers themselves.

  • +
+
+
+

Schema evolution

+

Schema evolution happens on the CollectionReadBuffers when they are requested from the FrameData inside the Frame. +It is possible for the I/O backend to handle schema evolution before the Frame sees the buffers for the first time. +In that case podio schema evolution becomes a simple check.

+
+
+
+
+

Frame implementation and design

+

One of the main concerns of the Frame is to offer one common, non-templated, interface while still supporting different I/O backends and potentially different policies. +The “classic” approach would be to have an abstract IFrame interface with several implementations that offer the desired functionality (and their small differences). +One problem with that approach is that a purely abstract interface cannot have templated member functions. Hence, the desired type-safe behavior of get and put would be very hard to implement. +Additionally, policies ideally affect orthogonal aspects of the Frame behavior. +Implementing all possible combinations of behaviors through implementations of an abstract interface would lead to quite a bit of code duplication and cannot take advantage of the factorization of the problem. +To solve these problems, we chose to implement the Frame via Type Erasure. +This also has the advantage that the Frame also has value semantics in line with the design of podio.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/genindex.html b/master/genindex.html new file mode 100644 index 000000000..60e926cd2 --- /dev/null +++ b/master/genindex.html @@ -0,0 +1,238 @@ + + + + + + Index — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/index.html b/master/index.html new file mode 100644 index 000000000..65cbbc8bb --- /dev/null +++ b/master/index.html @@ -0,0 +1,294 @@ + + + + + + + Welcome to PODIO’s documentation! — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/objects.inv b/master/objects.inv new file mode 100644 index 000000000..35f908624 Binary files /dev/null and b/master/objects.inv differ diff --git a/master/search.html b/master/search.html new file mode 100644 index 000000000..3f536911a --- /dev/null +++ b/master/search.html @@ -0,0 +1,253 @@ + + + + + + Search — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/master/searchindex.js b/master/searchindex.js new file mode 100644 index 000000000..ac2a8470f --- /dev/null +++ b/master/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["ReleaseNotes", "advanced_topics", "contributing", "datamodel_syntax", "design", "doc", "doc_title", "examples", "frame", "index", "templates", "userdata"], "filenames": ["ReleaseNotes.md", "advanced_topics.md", "contributing.md", "datamodel_syntax.md", "design.md", "doc.md", "doc_title.md", "examples.md", "frame.md", "index.rst", "templates.md", "userdata.md"], "titles": ["v00-17-04", "Advanced Topics", "Contributing to PODIO", "Data Models and Data Model Definitions", "Design and Implementation Details", "Introduction", "<no title>", "Examples for Supported Interface", "The Frame concept", "Welcome to PODIO\u2019s documentation!", "Changing / creating new templates", "Writing extra data outside an EDM"], "terms": {"2023": 0, "tmadlen": 0, "pr": [0, 2], "527": 0, "split": [0, 8, 10], "classgener": 0, "base": [0, 4, 5, 11], "class": [0, 1, 4, 7, 8, 9, 10, 11], "mixin": 0, "two": [0, 1, 3, 4, 7, 8, 10], "specif": [0, 5, 10], "c": [0, 1, 3, 4, 5, 10], "julia": 0, "code": [0, 1, 3, 4, 5, 7, 8], "gener": [0, 1, 3, 4, 5, 7, 8, 11], "onli": [0, 1, 2, 3, 4, 7, 8, 10], "deal": 0, "languag": [0, 10], "need": [0, 1, 3, 7, 8, 10], "instanti": [0, 10], "configur": [0, 7, 10], "correct": [0, 8, 10], "reader": [0, 1, 7, 8], "podio_class_gener": [0, 1, 10], "py": [0, 1, 10], "main": [0, 1, 7, 8, 10], "script": 0, "depend": [0, 4, 10], "desir": [0, 8], "slightli": [0, 10], "cleanup": 0, "membervari": 0, "declutt": 0, "its": [0, 1, 4, 8], "__init__": 0, "method": [0, 1, 4, 7, 10, 11], "bit": [0, 1, 3, 8], "530": 0, "remov": 0, "read": [0, 2, 4, 7, 10], "deprec": 0, "old": [0, 3, 4, 5], "style": 0, "format": [0, 1, 3, 10], "compon": [0, 9], "definit": [0, 4, 9, 10], "yaml": [0, 1, 3, 5, 9], "file": [0, 2, 3, 7, 8, 9], "485": 0, "eventstor": 0, "function": [0, 1, 3, 4, 5, 7, 9, 10, 11], "announc": 0, "429": 0, "529": 0, "switch": [0, 2], "relat": [0, 1, 3, 4, 5, 7, 10], "rang": [0, 11], "test": [0, 1, 2], "us": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11], "frame": [0, 9, 11], "i": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "o": [0, 5, 6, 9], "06": 0, "526": 0, "edm4hep": [0, 1, 8], "workflow": 0, "an": [0, 1, 4, 5, 7, 8, 9, 10], "lcg": 0, "stack": 0, "recent": 0, "enough": [0, 10, 11], "version": [0, 1, 10, 11], "cmake": [0, 1, 3, 10], "necessari": [0, 1, 3, 4, 5, 7, 8, 10, 11], "after": [0, 1, 2, 4, 10], "key4hep": 0, "235": 0, "jmcarcel": 0, "523": 0, "comment": [0, 2, 3], "name": [0, 1, 2, 3, 4, 7, 8, 10], "line": [0, 8], "number": [0, 3, 7, 11], "It": [0, 1, 3, 4, 5, 7, 8, 10, 11], "": [0, 1, 3, 8, 10], "veri": [0, 3, 8], "unlik": 0, "remain": 0, "up": [0, 2, 3, 5, 10], "date": [0, 2, 5], "when": [0, 1, 2, 3, 4, 7, 8, 10], "either": [0, 3, 4, 7, 8, 10], "content": [0, 8, 10], "chang": [0, 2, 7, 9], "521": 0, "do": [0, 3, 4, 8], "import": [0, 3, 4, 7, 8, 10], "root": [0, 1, 3, 5, 10], "podio": [0, 1, 3, 4, 5, 6, 8, 10, 11], "dump": 0, "help": [0, 1], "otherwis": [0, 1, 3, 4], "can": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "take": [0, 1, 3, 4, 8, 10], "while": [0, 4, 5, 8], "system": [0, 1], "print": 0, "514": 0, "introduc": 0, "maybesharedptr": 0, "manag": [0, 4, 5, 10], "obj": [0, 10], "user": [0, 3, 5, 8, 9, 10, 11], "face": [0, 10], "handl": [0, 3, 5, 7, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "control": [0, 10], "block": [0, 10], "object": [0, 1, 5, 8, 9, 10, 11], "distinct": 0, "entiti": 0, "potenti": [0, 7, 8, 10], "differ": [0, 4, 7, 8, 10, 11], "lifetim": [0, 4], "which": [0, 1, 3, 4, 7, 8, 10, 11], "allow": [0, 2, 3, 4, 7, 8, 10], "fix": [0, 3, 11], "174": 0, "492": 0, "increas": 0, "size": [0, 3, 7, 10, 11], "factor": [0, 8], "sinc": [0, 1, 8, 11], "thei": [0, 1, 4, 7, 8, 10], "ar": [0, 1, 3, 4, 5, 7, 8, 10, 11], "now": [0, 2, 8, 10], "effect": [0, 3], "pointer": [0, 1], "instead": [0, 3, 8, 10], "one": [0, 1, 2, 3, 7, 8, 10], "even": [0, 8], "initi": [0, 1, 10], "case": [0, 1, 3, 4, 7, 8, 11], "obtain": [0, 1, 8], "from": [0, 2, 4, 5, 7, 9, 10], "collect": [0, 1, 9, 10], "objbas": [0, 4], "make": [0, 1, 2, 3, 8, 10, 11], "objectid": [0, 1, 4], "member": [0, 1, 4, 8, 10], "constructor": [0, 8, 10], "privat": 0, "have": [0, 1, 2, 3, 8, 10, 11], "access": [0, 4, 7, 8, 10, 11], "raw": [0, 1, 8], "ani": [0, 1, 3, 4, 7, 8, 11], "static": [0, 1, 8], "makeempti": 0, "order": [0, 1, 8], "creat": [0, 2, 3, 4, 5, 7, 8, 9, 11], "empti": [0, 1, 8, 10], "also": [0, 1, 3, 8, 10, 11], "intern": [0, 5, 8], "unpersist": 0, "enabl": [0, 1], "more": [0, 1, 3, 4, 8], "exist": [0, 2, 8, 9], "sanit": 0, "ha": [0, 1, 3, 4, 7, 8], "becom": [0, 4, 8, 10], "possibl": [0, 1, 3, 4, 5, 8, 10, 11], "so": [0, 1, 2, 3, 4, 10], "ananya": 0, "gupta": 0, "473": 0, "ad": [0, 4, 7, 9, 11], "support": [0, 1, 5, 8, 9, 10], "python": [0, 1, 4, 5, 10], "interfac": [0, 1, 4, 5, 8, 9, 10, 11], "implement": [0, 1, 3, 5, 9, 10], "new": [0, 2, 3, 4, 7, 8, 9], "design": [0, 5, 6, 9, 10], "structur": [0, 1, 4, 5], "default": [0, 1, 3, 7, 10], "paramet": [0, 3, 7], "abstract": [0, 4, 8], "type": [0, 1, 4, 7, 8, 9, 10], "builtin": [0, 3, 10], "_sort_components_and_datatyp": 0, "perform": [0, 5, 8], "topolog": 0, "sort": 0, "datatyp": [0, 1, 3], "_has_static_arrays_import": 0, "check": [0, 3, 8], "arrai": [0, 3, 4, 10], "lang": 0, "l": 0, "program": 0, "argument": [0, 1, 3, 7, 10], "specifi": [0, 3], "current": [0, 1, 3, 7, 10, 11], "choic": [0, 3, 4, 5], "cpp": [0, 10], "upstream": [0, 9], "edm": [0, 3, 7, 8, 9, 10], "unit": [0, 3, 8], "suit": 0, "cover": 0, "exampl": [0, 3, 4, 9], "data": [0, 5, 9, 10], "model": [0, 1, 4, 5, 9, 10], "document": [0, 2, 4, 5, 6, 10], "enable_julia": 0, "toggl": 0, "option": [0, 1, 7, 8, 9, 10], "By": [0, 8, 10], "off": 0, "520": 0, "add": [0, 1, 2, 3, 10, 11], "error": [0, 11], "messag": 0, "std": [0, 1, 7, 8, 10, 11], "bad_function_cal": 0, "show": [0, 7], "stacktrac": 0, "quit": [0, 8], "uninform": 0, "519": 0, "getter": [0, 4, 10], "return": [0, 1, 4, 7, 8, 10], "valu": [0, 1, 3, 7, 8, 10, 11], "keep": [0, 1, 2, 8, 11], "const": [0, 1, 3, 7, 8, 11], "refer": [0, 1, 4, 9, 10, 11], "all": [0, 1, 3, 4, 7, 8, 10], "other": [0, 1, 3, 4, 8, 10], "518": 0, "488": 0, "bind": 0, "rntupl": 0, "writer": [0, 1, 7, 8], "understand": 0, "miss": 0, "storag": [0, 1, 3, 9, 10], "datamodel": [0, 1, 4, 9, 10], "513": 0, "rootframewrit": 0, "writefram": 0, "rootntuplewrit": 0, "ensur": [0, 7, 8], "consist": [0, 4], "given": [0, 3, 8], "categori": 0, "If": [0, 3, 4, 7, 8, 10], "inconsist": [0, 1], "found": [0, 4, 5], "except": [0, 7], "thrown": [0, 7], "befor": [0, 1, 8, 10], "might": [0, 3, 11], "lead": [0, 1, 8, 11], "crash": 0, "unread": 0, "382": 0, "refactor": 0, "map": [0, 1, 10], "track": 0, "set": [0, 1, 3, 11], "kept": [0, 2, 11], "511": 0, "decoupl": 0, "tool": [0, 8], "rest": 0, "folder": 0, "call": [0, 1, 2, 3, 4, 7, 8, 10], "podio_gen": [0, 10], "transpar": [0, 4], "time": [0, 5, 8], "neglig": 0, "again": [0, 1, 2, 3, 8], "becaus": 0, "we": [0, 1, 2, 8, 10, 11], "don": [0, 10], "t": [0, 1, 7, 8, 10], "load": [0, 1, 10], "librari": [0, 1, 3, 4, 5, 6, 7], "unnecessarili": 0, "longer": [0, 4], "simplifi": [0, 5, 8], "test_util": 0, "move": [0, 7, 8, 11], "write": [0, 4, 7, 9, 10], "where": [0, 1, 3, 4, 8, 10, 11], "belong": [0, 4], "sio": [0, 1, 10], "510": 0, "legaci": 0, "extra": [0, 3, 9, 10], "wa": [0, 1, 5], "being": [0, 1, 3, 8, 10], "pass": [0, 1, 3, 7, 8, 10], "example_fram": 0, "almost": [0, 4, 11], "alwai": [0, 4, 10], "anoth": [0, 1, 3], "hard": [0, 8], "notic": 0, "509": 0, "clang": [0, 10], "significantli": 0, "slower": 0, "run": [0, 8, 9, 10], "508": 0, "externaldata": 0, "modul": [0, 10], "let": 0, "care": [0, 1, 4, 10], "download": 0, "hash": 0, "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "addit": [0, 1, 3, 5, 7, 10, 11], "local": [0, 4], "store": [0, 3, 7, 8, 10, 11], "dexternaldata_object_stor": 0, "path": 0, "them": [0, 3, 4, 8, 10], "build": [0, 1, 3, 8], "scratch": 0, "won": 0, "507": 0, "copi": [0, 2, 3, 4, 7, 8], "dumpmodel": 0, "directori": [0, 3, 10], "some": [0, 2, 3, 4, 7, 8, 9, 10], "subdirectori": [0, 10], "try": [0, 3, 11], "find": 0, "look": [0, 1, 4, 7, 8, 10], "abov": [0, 3, 8, 10, 11], "doesn": [0, 1], "fail": 0, "505": 0, "bump": 0, "pylint": 0, "ci": 0, "2": [0, 6, 7, 8], "7": [0, 7], "502": 0, "deletebuff": 0, "popul": [0, 1], "collectionreadbuff": [0, 1, 8], "dispos": 0, "unconsum": 0, "buffer": [0, 1, 8], "leak": 0, "describ": [0, 1, 3, 4, 5], "500": 0, "rootframedata": 0, "clean": 0, "desctruct": 0, "sure": [0, 2, 8, 10], "delet": [0, 7], "collectiondata": [0, 10], "wouter": 0, "deconinck": 0, "503": 0, "instal": [0, 1, 5], "vi": 0, "497": 0, "podio_python_dir": 0, "top": [0, 10], "level": [0, 4, 5, 10], "cmakelist": 0, "build_test": 0, "496": 0, "oper": [0, 1, 8], "neg": 0, "comparison": 0, "http": [0, 2], "github": [0, 2, 5], "com": [0, 2], "aidasoft": [0, 2], "pull": [0, 2], "493": 0, "id": [0, 1, 4, 7, 8], "podioobjectid": 0, "29": 0, "mutabl": [0, 1, 3, 9, 10], "unsign": [0, 10, 11], "latter": 0, "useless": 0, "412": 0, "438": 0, "ostream": 0, "22": 0, "juraj": 0, "smiesko": 0, "491": 0, "warn": 0, "request": [0, 2, 7, 8], "entri": [0, 7, 10], "present": [0, 1, 8, 10, 11], "490": 0, "bug": 0, "built": [0, 3], "without": [0, 3, 8, 10], "489": 0, "486": 0, "untrack": 0, "properli": 0, "whether": [0, 3, 10], "been": [0, 1, 7], "collectionidt": [0, 8], "collectionid": 0, "signal": 0, "known": [0, 10], "tabl": [0, 8], "break": 0, "you": [0, 1, 2, 8, 11], "avoid": [0, 1, 5], "lookup": 0, "twice": 0, "subsequ": 0, "retriev": [0, 9], "overli": 0, "share": [0, 1], "rootntupleread": 0, "uncov": 0, "resolv": 0, "18": 0, "484": 0, "feel": 0, "benedikt": [0, 6], "hegner": [0, 6], "483": 0, "clarifi": 0, "schema": 0, "482": 0, "renam": 0, "macro": [0, 1, 3, 10], "createbuff": 0, "create_buff": 0, "481": 0, "execut": 0, "target": 0, "unittest": 0, "unittest_podio": 0, "collis": 0, "rel": [0, 1], "common": [0, 8, 10], "480": 0, "thoma": 0, "madlen": 0, "472": 0, "schemata": 0, "across": 0, "provid": [0, 1, 2, 3, 4, 5, 7, 8, 10], "syntax": [0, 3, 5], "intent": 0, "evolut": 0, "backend": [0, 1, 3, 8, 10], "includ": [0, 1, 3, 4, 8, 10, 11], "infrastructur": [0, 4], "futur": 0, "477": 0, "nlohmann": [0, 1], "json_fwd": 0, "hpp": [0, 1], "header": [0, 1, 3, 10], "reduc": 0, "unnecessari": 0, "templat": [0, 7, 8, 9], "475": 0, "478": 0, "collectionbas": [0, 8], "iter": [0, 7], "dmitri": 0, "kalinkin": 0, "465": 0, "typedef": 0, "referenc": [0, 7], "collection_typ": 0, "convers": [0, 1], "reachabl": 0, "objectcollect": 0, "value_typ": 0, "The": [0, 3, 7, 9, 10, 11], "reach": 0, "via": [0, 1, 3, 4, 7, 8, 11], "mutable_typ": 0, "30": [0, 6], "471": 0, "branch": [0, 2], "index": [0, 1, 4, 11], "e": [0, 1, 2, 4, 8, 10, 11], "behavior": [0, 8], "releas": 0, "seri": 0, "andr": 0, "sailer": 0, "469": 0, "updat": [0, 2], "requir": [0, 1, 3, 4, 8, 10], "catch2": 0, "3": [0, 1, 7, 8, 11], "4": [0, 7, 8], "20": 0, "clang16": 0, "el9": 0, "alma9": 0, "clang12": 0, "cs7": 0, "disabl": 0, "tabul": 0, "avail": [0, 1, 3, 7, 8, 9], "445": 0, "part": [0, 4, 10], "07": 0, "26": 0, "463": 0, "vector": [0, 1, 5, 7, 8, 10, 11], "vectormemb": [0, 1, 4, 10], "actual": [0, 1, 3, 8, 10], "subset": [0, 11], "work": [0, 8, 11], "462": 0, "reproduc": 0, "origin": [0, 1, 2], "issu": 0, "25": 0, "461": 0, "rootframeread": [0, 1], "master": [0, 2], "447": 0, "wrapper": 0, "around": [0, 8], "put": [0, 1, 7, 10, 11], "explicitli": [0, 3, 7, 8], "cppyi": 0, "gbl": 0, "432": 0, "457": 0, "setup": [0, 8], "explicit": [0, 4, 7], "enable_sio": 0, "rather": [0, 3, 10], "than": [0, 3, 7, 10], "presenc": [0, 10], "456": 0, "cach": 0, "455": 0, "cmake_binary_dir": 0, "project_binary_dir": 0, "439": 0, "framecategori": 0, "h": [0, 1, 8, 10, 11], "few": [0, 1, 3, 5, 8], "convent": 0, "hardcod": 0, "string": [0, 1, 3, 7, 8, 10], "variabl": [0, 8, 10], "454": 0, "cmake_": 0, "sourc": 0, "bin": 0, "_dir": 0, "project_": 0, "452": 0, "extend": [0, 9], "pre": [0, 9, 10], "processor": 0, "condit": 0, "to_json": 0, "visibl": [0, 4], "rootcl": 0, "interpret": 0, "435": 0, "450": 0, "descript": [0, 3, 5, 7, 10], "author": [0, 3], "field": [0, 1, 2, 10, 11], "449": 0, "commit": [0, 2, 9], "nightli": 0, "come": [0, 1, 4], "abl": [0, 8, 11], "395": 0, "minor": 0, "complaint": 0, "newer": 0, "tidi": 0, "anyth": 0, "essenti": [0, 1, 8, 10], "448": 0, "lcio": [0, 5], "datalayout": 0, "untouch": 0, "unbuilt": 0, "year": 0, "446": 0, "finish": 0, "sioframewrit": 0, "non": [0, 8], "mandatori": 0, "see": [0, 1, 2, 4, 8, 10], "442": 0, "437": 0, "modifi": [0, 8], "pars": [0, 10], "incorpor": 0, "436": 0, "27": 0, "413": 0, "schemaevolut": 0, "hold": [0, 4, 7], "offer": [0, 1, 8, 11], "evolvebuff": 0, "doe": [0, 3, 4, 8], "hook": 0, "framedata": [0, 8], "23": [0, 7], "434": 0, "433": 0, "rootlegacyread": 0, "428": 0, "sever": [0, 8], "less": [0, 7, 8], "topic": [0, 9], "sub": 0, "txt": 0, "commonli": 0, "podiotest": 0, "g": [0, 1, 2, 4, 8, 10, 11], "environ": 0, "config": 0, "427": 0, "delai": 0, "long": [0, 10, 11], "mainli": [0, 1, 7, 10], "quicker": 0, "respons": [0, 1, 3, 11], "flag": [0, 3, 10], "displai": 0, "alphabet": 0, "automat": [0, 1, 3, 5, 7], "adjust": 0, "column": 0, "width": [0, 3, 11], "fit": 0, "packag": [0, 3, 5, 10], "402": 0, "public": [0, 1, 3, 8], "constexpr": [0, 1], "char": [0, 8, 10], "getxxxnam": 0, "string_view": [0, 1], "reli": 0, "typenam": [0, 7, 8], "full": [0, 10], "gettypenam": 0, "valuetypenam": 0, "immut": [0, 3, 4, 8, 10], "getvaluetypenam": 0, "datatypenam": 0, "pod": [0, 1, 3, 5, 6, 10], "getdatatypenam": 0, "podio_sioblock_path": 0, "use_external_catch2": 0, "auto": [0, 1, 4, 7, 8, 11], "suitabl": 0, "fall": 0, "back": [0, 8], "fetch": [0, 2], "own": [0, 2, 3, 4, 7, 8], "426": 0, "ld_library_path": 0, "robust": 0, "incompat": 0, "425": 0, "skip_catch_discoveri": 0, "skip": 0, "discoveri": 0, "catch": 0, "unsuit": 0, "too": 0, "much": 0, "underli": [0, 4, 8, 11], "murmurhash": 0, "423": 0, "easier": [0, 1], "restructur": 0, "produc": [0, 10], "prior": 0, "421": 0, "appear": [0, 4], "insensit": 0, "written": [0, 1, 4, 5, 8, 11], "405": 0, "legibl": 0, "valid": [0, 1, 3, 8, 10], "improv": [0, 5], "interoper": 0, "rdatafram": 0, "169": 0, "follow": [0, 1, 2, 3, 4, 7, 8, 10, 11], "_": 0, "resp": [0, 3], "taken": 0, "singl": [0, 1, 8, 10], "_objidx": 0, "disambigu": 0, "normal": 0, "directli": [0, 1, 3, 7, 8, 10], "everyth": [0, 2, 8], "should": [0, 1, 2, 3, 4, 8, 10], "422": 0, "small": [0, 2, 7, 8], "could": [0, 7], "element": [0, 1, 7, 11], "420": 0, "insid": [0, 8], "rootread": 0, "segment": 0, "violat": 0, "417": 0, "multipl": [0, 1, 3], "411": 0, "api": 0, "open": 0, "418": 0, "bring": 0, "getmap": 0, "genericparamet": [0, 7, 8], "alreadi": [0, 10], "dd4hep": 0, "1112": 0, "mark": 0, "getxyzmap": 0, "brief": 0, "transit": 0, "period": 0, "These": [0, 3, 4, 7, 8, 10], "415": 0, "19": 0, "416": 0, "select": [0, 3, 10], "rule": [0, 7], "anymor": 0, "setter": [0, 4, 10], "410": 0, "squar": 0, "414": 0, "userdatacollect": [0, 11], "caus": 0, "first": [0, 3, 5, 7, 8], "394": 0, "collectionbufferfactori": 0, "factori": [0, 4, 7], "throughout": 0, "createschemaevolvablebuff": 0, "minimum": 0, "schema_vers": 0, "1": [0, 7, 8], "schemavers": 0, "datamodeldefinit": [0, 1], "package_nam": [0, 1, 10], "meta": [0, 1, 9], "propag": 0, "inform": [0, 1, 4, 9, 11], "place": [0, 3, 8, 10], "sioblock": [0, 10], "appropri": [0, 10], "christoph": 0, "dilk": 0, "408": 0, "between": 0, "accessor": [0, 7], "21": 0, "387": 0, "round": 0, "trip": 0, "extens": [0, 8], "400": 0, "sioframedata": 0, "getavailablecollect": [0, 8], "seg": 0, "fault": 0, "previous": 0, "399": 0, "podio_enable_sio": 0, "target_compile_definit": [0, 1], "podiosioio": 0, "get": [0, 1, 3, 7, 11], "well": [0, 1, 3, 4, 7, 8, 10], "featur": [0, 1, 2, 4, 9, 10], "scope": [0, 4, 7, 8], "target_link_librari": [0, 1], "paul": 0, "gessing": 0, "befurt": 0, "398": 0, "reject": 0, "397": 0, "properti": [0, 1], "396": 0, "341": 0, "metadata": 0, "w": 0, "simpl": [0, 3, 5, 8], "heurist": 0, "identifi": 0, "omiss": 0, "mistak": 0, "limit": [0, 3, 4, 8, 9], "backward": 0, "compat": [0, 3], "info": 0, "391": 0, "390": 0, "later": [0, 3, 8], "389": 0, "gitignor": 0, "358": 0, "emb": 0, "json": 0, "core": [0, 1], "contain": [0, 1, 3, 4, 8, 9, 10], "liter": [0, 1], "encod": [0, 1, 7], "regist": [0, 1], "newli": 0, "datamodelregistri": 0, "awar": [0, 10], "result": [0, 1, 3, 7], "done": [0, 2, 3, 8], "framewrit": 0, "give": [0, 1, 4, 5, 8, 10, 11], "roundtrip": 0, "compar": 0, "intend": [0, 1], "advanc": [0, 9], "detail": [0, 3, 5, 9, 10], "384": 0, "378": 0, "favor": 0, "372": 0, "doubl": [0, 3, 10, 11], "A": [0, 1, 3, 8, 10], "similar": [0, 8, 10, 11], "thing": 0, "ilcsoft": 0, "143": 0, "event": [0, 3, 7, 8, 11], "weight": [0, 4], "precis": [0, 1], "380": 0, "getparamet": [0, 7, 8], "getgenericparametersforwrit": 0, "exact": 0, "same": [0, 1, 3, 5, 8, 11], "easili": [0, 1, 4, 10], "offici": 0, "channel": 0, "replac": 0, "usag": [0, 1, 3, 5, 9], "getparameterkei": 0, "kei": [0, 1, 10], "377": 0, "visual": 0, "convert": [0, 1, 4], "graph": 0, "376": 0, "375": 0, "podio_vers": 0, "preprocessor": 0, "usabl": [0, 1, 8], "context": [0, 1], "374": 0, "constant": 0, "someth": [0, 1], "podio_build_vers": 0, "373": 0, "short": [0, 10], "output": [0, 1, 3, 10], "nathan": 0, "brei": 0, "369": 0, "putparamet": [0, 7, 8], "inlin": [0, 3], "linker": 0, "364": 0, "trigger": 0, "push": [0, 2], "368": 0, "podio_relax_pyv": 0, "relax": 0, "match": 0, "major": [0, 8, 10], "363": 0, "util": [0, 1], "defin": [0, 1, 5, 8, 9, 10], "cc": [0, 10], "sioutil": 0, "siowrit": 0, "343": 0, "defaultdict": 0, "hand": [0, 8], "roll": 0, "361": 0, "basic": [0, 5, 9, 10, 11], "319": 0, "355": 0, "365": 0, "2022": 0, "362": 0, "keyword": [0, 4], "onward": 0, "360": 0, "log": 0, "absolut": 0, "333": 0, "unique_ptr": [0, 8], "mutex": 0, "list": [0, 1, 3, 10, 11], "declar": [0, 3, 4, 10], "like": [0, 1, 2, 3, 4, 7, 8], "nvcc": 0, "mayb": 0, "yet": [0, 2, 4, 8, 11], "k4clue": 0, "34": 0, "dtag": 0, "podio_set_rpath": 0, "rpath": 0, "runpath": 0, "binari": [0, 1], "pin": 0, "ubuntu": 0, "runner": 0, "accident": [0, 8], "go": [0, 10], "out": [0, 1, 7], "sync": [0, 11], "359": 0, "356": 0, "readm": 0, "argpars": 0, "choos": [0, 2], "346": 0, "tp": 0, "apach": 0, "0": [0, 6, 7, 11], "licens": 0, "facilit": 0, "integr": 0, "experi": [0, 5], "357": 0, "prefix": [0, 3, 10], "onto": 0, "env": 0, "sh": 0, "354": 0, "posix": 0, "compliant": 0, "shell": 0, "bash": 0, "tab": 0, "space": 0, "mix": 0, "indent": 0, "root_include_path": 0, "351": 0, "were": [0, 1], "consid": [0, 1, 11], "implicit": 0, "boolean": 0, "caught": [0, 3], "against": [0, 1, 3], "nullptr": 0, "guard": 0, "correspond": [0, 1, 3, 4, 10], "344": 0, "339": 0, "intact": 0, "345": 0, "siolegacyread": 0, "287": 0, "349": 0, "nest": [0, 10], "348": 0, "adapt": 0, "went": 0, "unnot": 0, "previou": [0, 5], "root_io": [0, 7], "sio_io": [0, 7], "each": [0, 1, 4, 8, 10, 11], "somewher": [0, 1, 8], "untyp": 0, "framedatat": 0, "inspect": [0, 1], "reorgan": 0, "usual": [0, 11], "close": [0, 4], "addition": [0, 1, 8], "dictionari": [0, 10], "342": 0, "migrat": 0, "action": 0, "checkout": [0, 2], "v3": 0, "advis": 0, "clone": [0, 2], "bodi": 0, "327": 0, "typo": 0, "24": 0, "340": 0, "335": 0, "cvmf": 0, "view": 0, "latest": 0, "pick": [0, 10], "group": [0, 7], "lcg_102": 0, "337": 0, "notebook": [0, 9], "pattern": [0, 1, 9], "332": 0, "signatur": [0, 3, 10], "336": 0, "podioconfig": 0, "silenc": 0, "about": [0, 1, 3, 4], "polici": [0, 4, 8], "cmp00012": 0, "compil": [0, 1, 3, 8, 11], "step": [0, 1], "334": 0, "attempt": 0, "stream": [0, 10], "transient": [0, 4], "323": 0, "stdout": [0, 1], "overview": [0, 10], "over": [0, 8, 11], "d": 0, "To": [0, 1, 3, 5, 8, 11], "pythoneventstor": 0, "separ": [0, 3], "podiopythonstor": 0, "side": [0, 3, 7], "gotoev": 0, "iread": 0, "correctli": [0, 1], "sioread": 0, "thread": [0, 4, 8, 9], "safe": [0, 8], "final": 0, "plan": [0, 1], "stabl": 0, "still": [0, 4, 8, 10], "turn": [0, 1], "better": [0, 7, 8], "wai": [0, 3, 7, 8], "For": [0, 1, 2, 3, 4, 8, 11], "consider": [0, 4], "pleas": [0, 2, 4, 10], "consult": 0, "start": [0, 9], "unchang": 0, "distant": 0, "312": 0, "podio_json_output": [0, 1], "link": [0, 1, 3], "318": 0, "podio_add_root_io_dict": 0, "bugfix": 0, "output_fold": 0, "equal": [0, 1], "dir": 0, "selection_xml": 0, "317": 0, "unrel": 0, "prototyp": [0, 3, 10], "aim": 0, "eventu": 0, "redefin": 0, "memori": [0, 1, 4, 5], "316": 0, "maco": 0, "host": 0, "fuse": 0, "consequ": 0, "315": 0, "is_trivial_typ": [0, 10], "engin": [0, 10], "behav": [0, 7], "expect": 0, "exactli": [0, 1], "opposit": 0, "what": [0, 10, 11], "would": [0, 1, 2, 3, 8], "intuit": 0, "288": 0, "283": 0, "init": [0, 7], "apart": 0, "mean": [0, 1, 2, 8, 10, 11], "python2": 0, "276": 0, "seem": 0, "valentin": 0, "volkl": 0, "307": 0, "hotfix": 0, "290": 0, "revert": [0, 2], "unknown": 0, "symbol": 0, "podiodict": 0, "282": 0, "podio_use_clang_format": 0, "autodiscoveri": 0, "downstream": [0, 2], "discov": 0, "accordingli": 0, "ON": 0, "stage": 0, "305": 0, "upcom": 0, "294": 0, "siocollectionidtableblock": 0, "build_vers": 0, "sioversionblock": 0, "304": 0, "unreleas": 0, "303": 0, "soumil": 0, "296": 0, "instruct": 0, "how": [0, 5, 7, 8, 10], "295": 0, "prepareforwrit": [0, 1], "286": 0, "point": [0, 7, 8, 10], "reset": 0, "kalina": 0, "stoimenova": 0, "301": 0, "text": 0, "300": [0, 1], "python3": 0, "299": 0, "unset": 0, "detect": [0, 8], "293": 0, "obsolet": 0, "285": 0, "291": 0, "obj_needs_destructor": 0, "274": 0, "jinja2": [0, 10], "process": [0, 1, 8, 10], "262": 0, "untempl": 0, "ones": [0, 2, 4, 10], "supportedgenericdatatyp": 0, "tupl": 0, "those": [0, 3, 8], "typehelp": 0, "helper": 0, "277": 0, "remot": [0, 2], "input": [0, 1, 7], "everi": [0, 1, 7], "284": 0, "per": 0, "280": 0, "color": 0, "diff": 0, "diffutil": 0, "254": 0, "guidelin": [0, 2], "podio_generate_datamodel": [0, 3], "both": [0, 3, 5, 7, 8], "279": 0, "newest": 0, "clash": 0, "31": 0, "253": 0, "lint": 0, "end": [0, 4, 6, 7, 10], "trail": 0, "whitespac": 0, "flake8": 0, "ilcdirac": 0, "270": 0, "duplic": [0, 3, 8], "overload": [0, 8, 10], "269": 0, "broke": 0, "265": 0, "gcc11": 0, "dev": 0, "261": 0, "accept": 0, "integ": [0, 3, 11], "placido": 0, "fernandez": 0, "declara": 0, "259": 0, "filter": 0, "regex": 0, "complet": [0, 3, 8], "238": 0, "podiovers": 0, "three": [0, 1, 3, 4], "uint16_t": [0, 11], "patch": 0, "plu": 0, "expr": 0, "last": 0, "tag": 0, "64": [0, 11], "podio_": 0, "_version": 0, "extract": [0, 4], "reorder": 0, "section": [0, 1, 3, 4], "230": 0, "28": 0, "256": 0, "ignor": 0, "happen": [0, 3, 7, 8], "persist": [0, 4, 5, 9], "onc": [0, 4], "tri": 0, "isavail": 0, "observ": 0, "somewhat": 0, "setrefer": 0, "mistakenli": 0, "op": [0, 1], "mechan": 0, "restor": [0, 8], "obvious": 0, "252": 0, "wherev": [0, 5], "assign": 0, "thank": 0, "ownership": [0, 4, 8, 9], "ed": [0, 4], "251": 0, "had": 0, "onetoonerel": [0, 1, 3, 4, 10], "onetomanyrel": [0, 1, 3, 4, 10], "249": 0, "use_sanit": 0, "curent": 0, "address": 0, "withorigin": 0, "undefin": 0, "mutual": 0, "exlus": 0, "label": 0, "failur": 0, "force_run_all_test": 0, "overrid": 0, "develop": [0, 2], "209": 0, "mention": [0, 10, 11], "2021": 0, "245": 0, "render": 0, "241": 0, "prepar": [0, 4], "205": 0, "explictli": 0, "hit": [0, 4, 7, 11], "mutablehit": [0, 4], "discuss": 0, "204": 0, "reason": [0, 1, 3], "obviou": 0, "mutat": 0, "239": 0, "237": 0, "drop": 0, "colon": [0, 3], "236": 0, "problem": [0, 8], "spack": 0, "234": 0, "cstdint": [0, 3], "232": 0, "197": 0, "merg": [0, 2], "reconstruct": 0, "collectioninfotyp": 0, "simpli": [0, 1, 8], "assum": [0, 1, 7, 8], "proper": [0, 1, 4, 7], "didn": 0, "231": 0, "regress": 0, "223": 0, "213": 0, "224": 0, "219": 0, "214": 0, "frank": [0, 6], "gaed": [0, 6], "fundament": [0, 11], "basic_typ": 0, "bool": [0, 10], "usrint": 0, "uint64_t": [0, 11], "userint": 0, "usrdoubl": 0, "userdoubl": 0, "int": [0, 3, 7, 8, 10], "resiz": [0, 11], "myint": 0, "iu": 0, "nd": 0, "100": 0, "42": [0, 7], "114": 0, "effici": [0, 3, 5], "podio_generated_fil": 0, "glob": 0, "217": 0, "destructor": 0, "swap": 0, "idiom": 0, "namespac": [0, 1, 10], "216": 0, "211": 0, "parallel": [0, 1, 11], "ctest": 0, "jn": 0, "210": 0, "just": [0, 3, 4, 8, 10, 11], "earlier": [0, 2], "restrict": 0, "dict": [0, 1, 10], "exit": 0, "backtrac": 0, "collectionbuff": 0, "expos": [0, 4], "206": 0, "extern": [0, 3], "ship": [0, 1], "201": 0, "count": 0, "heap": 0, "free": [0, 7, 8], "200": 0, "195": 0, "circular": 0, "self": 0, "194": 0, "relationrang": 0, "akin": 0, "193": 0, "192": 0, "191": 0, "treat": 0, "186": 0, "int16_t": 0, "int32_t": 0, "int64_t": 0, "uint32_t": 0, "realli": [0, 8, 11], "189": 0, "read_and_writ": 0, "concurr": [0, 5], "spuriou": 0, "180": 0, "logic": [0, 8], "rootwrit": 0, "degrad": 0, "v6": 0, "our": 0, "affect": [0, 8], "badli": 0, "profit": 0, "182": 0, "statu": 0, "185": 0, "184": 0, "asciiwrit": 0, "183": 0, "export": 0, "marko": 0, "petric": 0, "181": 0, "scan": 0, "175": 0, "fulli": [0, 10], "qualifi": [0, 10], "168": 0, "issuecom": 0, "770751871": 0, "romanov": 0, "173": 0, "io": 0, "handler": 0, "171": 0, "153": 0, "170": 0, "enforc": 0, "werror": 0, "joseph": 0, "wang": 0, "156": 0, "noncopy": 0, "154": 0, "maintain": [0, 8], "111": 0, "172": 0, "brew": 0, "command": 0, "mac": 0, "2020": 0, "165": 0, "conveni": [0, 4], "emtpi": 0, "162": 0, "161": 0, "155": 0, "benchmark": 0, "timedread": 0, "timedwrit": 0, "decor": 0, "wrap": 0, "conform": [0, 8], "record": 0, "construct": [0, 1, 7, 8], "writeev": 0, "readcollect": 0, "benchmarkrecord": 0, "principl": [0, 1, 8, 10], "outsid": [0, 7, 8, 9], "search": 0, "152": 0, "copyabl": 0, "144": 0, "149": 0, "find_package_handle_standard_arg": 0, "147": 0, "130": 0, "second": 0, "altern": 0, "serial": 0, "runtim": [0, 5], "whole": [0, 1], "podio_add_datamodel_core_librari": 0, "condition": 0, "podio_add_sio_io_block": 0, "podio_io_handl": 0, "reflect": 0, "133": 0, "141": 0, "96": 0, "97": 0, "98": 0, "centos7": 0, "ubuntu1804": 0, "6": [0, 6], "least": [0, 1], "134": 0, "139": 0, "128": 0, "registerforwrit": 0, "site": [0, 2], "127": 0, "126": 0, "No": [0, 2], "125": 0, "recursive_mutex": 0, "made": [0, 1], "whatev": 0, "distanc": 0, "calcul": [0, 4, 7], "129": 0, "footprint": 0, "clear": [0, 4], "intermedi": 0, "124": 0, "sstream": 0, "123": 0, "122": 0, "121": 0, "pip": [0, 1], "120": 0, "cleanli": 0, "117": 0, "readabl": [0, 8], "focus": 0, "grasp": 0, "stricter": 0, "extracod": [0, 3, 10], "constextracod": 0, "accord": 0, "diverg": 0, "equival": [0, 1, 10, 11], "emit": 0, "charact": 0, "capabl": [0, 1, 11], "exhaust": 0, "serv": [0, 4], "purpos": [0, 4], "moment": [0, 10], "107": 0, "loop": [0, 9, 11], "106": 0, "infinit": 0, "cyclic": 0, "102": 0, "101": 0, "constobject": 0, "invalid": [0, 4, 7], "99": 0, "libpodiodict": 0, "libpodio": 0, "rootmap": 0, "92": 0, "float": [0, 3, 7, 8, 10, 11], "lcparamet": 0, "evtmd": 0, "geteventmetadata": 0, "setvalu": 0, "usereventweight": 0, "evtweight": 0, "getfloatv": 0, "49": 0, "91": 0, "podiorootio": 0, "90": 0, "89": 0, "88": 0, "addxxxx": 0, "addtoxxxx": 0, "87": 0, "8": [0, 3, 11], "jenkinsfil": 0, "cpack": 0, "enable_cpack": 0, "83": 0, "82": 0, "81": 0, "wl": 0, "dynamic_lookup": 0, "appleclang": 0, "linux": 0, "shlib": 0, "testdatamodel": 0, "80": 0, "75": 0, "74": 0, "q": 0, "quiet": 0, "printout": 0, "verbos": 0, "mode": [0, 1], "73": 0, "right": [0, 1], "podiomacro": 0, "72": 0, "travi": 0, "70": 0, "includesubfold": [0, 1, 10], "packagenam": 0, "etc": [0, 3, 7, 8], "true": [0, 1, 3], "uniqu": 0, "occur": 0, "occas": 0, "package_name_": 0, "69": 0, "68": 0, "podio_generate_dictionari": 0, "67": 0, "loader": 0, "preserv": 0, "65": 0, "2019": 0, "pere": 0, "mato": 0, "63": 0, "stl": [0, 10], "60": 0, "multi": 0, "word": 0, "examplehit": 0, "cellid": 0, "ben": 0, "morgan": 0, "59": 0, "58": 0, "57": 0, "56": 0, "55": 0, "fast": 0, "getfast": 0, "speed": 0, "xxcollect": 0, "54": 0, "cmakepackageconfighelp": 0, "associ": 0, "podiotarget": 0, "refind": 0, "standard": 0, "client": [0, 4], "find_packag": 0, "add_execut": 0, "foo": 0, "javier": 0, "cervant": 0, "villanueva": 0, "51": 0, "phase": 0, "report": 0, "mai": [0, 3, 4], "45": 0, "contribut": 0, "44": 0, "enambl": 0, "dryrun": 0, "43": 0, "suggest": 0, "graem": 0, "stewart": 0, "41": 0, "fcc": 0, "factoris": 0, "md": 0, "40": 0, "tchain": 0, "xrootd": 0, "eospubl": 0, "cern": [0, 6], "ch": 0, "eo": 0, "stick": 0, "hsf": 0, "2018": 0, "39": 0, "forward": [0, 1, 10], "treatment": 0, "statement": 0, "know": [0, 3, 4, 8], "concret": [0, 1, 3, 4, 8], "38": 0, "analog": 0, "larg": 0, "37": 0, "36": 0, "releaas": 0, "note": [0, 1, 3, 4, 7, 8, 10, 11], "releasenot": 0, "far": 0, "2017": 0, "32": [0, 11], "hep": 0, "colin": 0, "bernet": 0, "cbernet": 0, "nofile_fix": 0, "segv": 0, "interact": [0, 7], "pyeventstore_filenam": 0, "jlingema": 0, "clangf": 0, "joschka": 0, "lingemann": 0, "gen": 0, "53": 0, "fixwarn": 0, "regener": 0, "hint": 0, "highlight": [0, 7, 8], "doc": 0, "applic": 0, "struct": [0, 3, 4, 8, 10], "parser": 0, "temporarili": 0, "outputstream": 0, "add_ascii_io": 0, "zaborowska": 0, "52": 0, "50": 0, "findroot": 0, "lcg_88": 0, "unus": 0, "pyunittest": 0, "2016": [0, 6], "47": 0, "lcg_87": 0, "46": 0, "debug": 0, "asciwrit": 0, "write_ascii": 0, "const_rel": 0, "getsyntax": [0, 1, 3, 10], "creation": [0, 1, 3, 4, 5, 9], "fix_cpy_rel": 0, "project": [0, 2], "custom": [0, 9], "doxygen": [0, 4], "cli": 0, "titl": 0, "page": [0, 2, 5], "dry": 0, "paragraph": 0, "direct": [0, 7, 10], "exposur": 0, "deep": [0, 5], "initialis": 0, "chach": 0, "fccsw": 0, "mileston": 0, "steinweg": 0, "eike_operators_new": 0, "eik": 0, "printinfo": 0, "tabular": 0, "wrong": [0, 3], "reference_bug_test": 0, "pyinterfac": 0, "2000": 0, "lcg_83": 0, "af": 0, "improve_doc": 0, "ink": 0, "dde": 0, "documen": 0, "relation_bug": 0, "examplemc": 0, "ref": 0, "_end": 0, "add_getters_sett": 0, "associativecontain": 0, "incorrect": 0, "fix_extracod": 0, "acc": 0, "memleak": 0, "extracode_in_compon": 0, "tracker": 0, "real": [0, 3, 4], "gtest": 0, "cross": 0, "snippet": [0, 7, 10], "pointerless": 0, "mani": [0, 3, 5, 7, 10], "cluster": [0, 7], "recurs": 0, "build_typ": 0, "unneed": 0, "processev": 0, "big": 0, "collcect": 0, "podio_librari": 0, "crear": 0, "clementhelsen": 0, "fix_eo": 0, "9": 0, "tfile": 0, "re": [0, 1], "tutorial_2": 0, "chain": 0, "neater": 0, "fwd": 0, "fact": 0, "alber": 0, "tree": 0, "35": 0, "33": 0, "fix_includ": 0, "unified_env": 0, "5": 0, "filezombi": 0, "beautifi": 0, "soft": 0, "unifi": 0, "anna": 0, "conflict": 0, "destin": 0, "pcm": 0, "cosmet": 0, "me": [0, 3], "appl": 0, "pytool": 0, "pyyaml": 0, "datamemb": 0, "2015": 0, "b": [0, 2], "uniti": 0, "fill": [0, 1, 2, 3, 10, 11], "markdown": 0, "mem": 0, "refurbish": 0, "next": 0, "toward": 0, "xyzhandl": 0, "upgrad": 0, "layout": [0, 3, 9], "buildin": 0, "garbag": [0, 7], "streamlin": 0, "wrongli": 0, "cope": 0, "xcode": 0, "push_back": [0, 4, 7, 11], "trivial": [0, 1, 8, 10, 11], "acquir": 0, "behaviour": 0, "xxxobj": 0, "themselv": [0, 7, 8], "align": 0, "gcc": 0, "reserv": 0, "rootconfig": 0, "registri": 0, "fooentri": 0, "fooobj": 0, "simplif": 0, "improp": 0, "draft": 0, "newlin": [0, 3], "2014": 0, "edm_1": 0, "v1": [0, 6], "uniform": 0, "review": 0, "scheme": 0, "incomplet": 0, "friend": 0, "confirm": 0, "genreflex": 0, "head": 0, "n": [0, 11], "stuff": 0, "navig": 0, "readi": 0, "lepton": 0, "muon": 0, "comput": 0, "isol": 0, "particlehandl": 0, "more_util": 0, "particl": [0, 5, 8], "overlap": 0, "100000": 0, "solv": [0, 8], "rare": 0, "eta": 0, "cut": 0, "dummy_gener": 0, "dummi": 0, "jet": 0, "demand": 0, "dummygener": 0, "coll_in_registri": 0, "multijet": 0, "increment": 0, "land": 0, "few_easy_mod": 0, "x": [0, 3, 7], "merge_attempt": 0, "pedant": 0, "event_loop": 0, "messi": 0, "overal": [0, 5], "simple_edm": 0, "realist": 0, "auto_handle_ptr": 0, "embed": 0, "prepareafterread": [0, 1], "macos_build_merg": 0, "macos_build": 0, "lxplus6": 0, "reformat": 0, "question": 0, "z": [0, 3], "boson": 0, "rearrang": 0, "here": [1, 3, 8, 10, 11], "howev": [1, 8, 10, 11], "explain": [1, 3, 5], "There": [1, 3, 7, 8], "fulfil": 1, "advantag": [1, 3, 4, 8], "persistifi": 1, "piec": 1, "invok": 1, "translat": 1, "collid": [1, 5], "objindex": 1, "pair": 1, "solut": 1, "void": [1, 3, 8], "getbufferaddress": 1, "refcollect": 1, "referencecollect": 1, "form": [1, 3, 11], "instanc": 1, "eras": 1, "possibli": 1, "10": [1, 7, 11], "find_librari": 1, "nlohmann_json": 1, "With": [1, 4, 10], "collectionnam": 1, "definiton": 1, "similarli": 1, "foreseen": [1, 7], "represent": [1, 10], "mind": [1, 5], "global": [1, 9], "assumpt": [1, 4, 7], "caveat": 1, "As": [1, 4, 7, 11], "guarante": 1, "dure": 1, "state": [1, 8], "synchron": 1, "manual": [1, 11], "exemplari": 1, "want": [1, 2], "dumped_edm4hep": 1, "redirect": 1, "necessarili": 1, "below": [1, 4, 10], "frameread": 1, "getedmdefinit": 1, "most": [1, 10], "decod": 1, "__jsondefinit": 1, "r": 1, "edmdefinit": 1, "subfold": [1, 10], "singleton": 1, "whenev": 1, "enit": 1, "getdatamodeldefinit": 1, "edmnam": 1, "size_t": [1, 11], "getdatamodelregistryindex": 1, "That": 1, "datamodelregistryindex": 1, "straight": 1, "readelf": 1, "p": 1, "rodata": 1, "libedm4hep": 1, "grep": 1, "exposepodmemb": [1, 3], "fals": [1, 3], "datamodelregistryiohelp": 1, "instrument": 1, "datamodeldefinitioncollector": 1, "encount": 1, "registerdatamodeldefinit": 1, "getdatamodeldefinitionstowrit": 1, "datamodeldefinitionhold": 1, "getavailabledatamodel": 1, "sioframeread": 1, "yard": 2, "nosi": 2, "essenc": 2, "your": [2, 3], "dedic": 2, "until": 2, "rebas": 2, "cd": 2, "fork": 2, "repositori": 2, "web": 2, "usernam": 2, "yourusernam": 2, "meaning": 2, "mynewbranch": 2, "frequent": 2, "reload": 2, "websit": 2, "beginreleasenot": 2, "endreleasenot": 2, "eas": 3, "optimis": 3, "encourag": 3, "composit": 3, "inherit": [3, 4, 5, 8, 10], "One": [3, 8], "focu": 3, "friendli": 3, "plain": [3, 4, 5], "within": [3, 4, 10], "combin": [3, 8], "constrain": 3, "_leastn": 3, "_fastn": 3, "flat": 3, "my": 3, "mycompon": 3, "y": [3, 7], "anothercompon": 3, "excerpt": 3, "eventinfo": 3, "eventinfodata": 3, "eventinfocollect": 3, "extrem": 3, "expens": 3, "henc": [3, 8], "physic": [3, 4, 5], "quantiti": 3, "thu": 3, "particular": [3, 7], "sens": 3, "mutableextracod": 3, "declarationfil": 3, "implementationfil": 3, "through": [3, 8, 9, 10], "examplecompon": 3, "exampletyp": 3, "mr": 3, "comp": 3, "steer": 3, "capit": 3, "accomod": 3, "special": 3, "reimplement": 3, "nevertheless": 3, "gain": 3, "upstream_edm": 3, "xml": [3, 10], "overwritten": 3, "consciou": 3, "abus": 3, "drive": 4, "higher": 4, "technic": [4, 5], "explan": 4, "four": 4, "kind": 4, "act": 4, "certain": 4, "inter": [4, 5], "hitobject": 4, "hitdata": 4, "hitcollect": [4, 7, 11], "light": 4, "flavor": 4, "recogniz": 4, "implicitli": [4, 7], "chosen": 4, "ident": 4, "identif": 4, "respect": [4, 7], "bookkeep": 4, "item": 4, "orient": 4, "soa": 4, "vision": 4, "heavi": 4, "best": 4, "alter": 4, "leav": 4, "creator": 4, "unfreez": 4, "afterward": [4, 5, 8], "heavili": 4, "impact": 4, "safeti": [4, 8, 9], "idea": [5, 8], "emploi": 5, "hierarchi": [5, 8], "virtual": 5, "servic": 5, "At": [5, 8, 10], "high": 5, "physicist": 5, "assist": 5, "markup": 5, "modern": 5, "softwar": 5, "technologi": 5, "inspir": 5, "studi": 5, "linear": 5, "gaudi": 5, "appli": [5, 10], "lhcb": 5, "collabor": 5, "lhc": 5, "guid": 5, "impati": 5, "begin": [6, 7], "titlepag": 6, "center": 6, "vspace": 6, "5cm": 6, "huge": 6, "normals": 6, "1cm": 6, "desi": 6, "pitfal": [7, 8], "concern": [7, 8], "framework": 7, "agnost": 7, "goe": 7, "hit1": 7, "hit2": 7, "energi": 7, "individu": [7, 10], "aren": 7, "attach": 7, "clustercollect": 7, "addhit": 7, "hits_begin": 7, "hits_end": 7, "cout": 7, "endl": 7, "hits_siz": 7, "anumb": 7, "ask": [7, 8], "bound": 7, "out_of_rang": 7, "x_arrai": 7, "y_arrai": 7, "vectoriz": 7, "togeth": 7, "coll": [7, 8], "ting": 7, "isvalid": 7, "Or": 7, "sometim": 7, "simul": 7, "job": 7, "cell": 7, "term": 7, "arbitrari": [7, 8], "submodul": 7, "organ": 8, "organis": 8, "impos": 8, "aggreg": 8, "alongsid": [8, 11], "mandat": 8, "collt": 8, "rvalu": 8, "achiev": 8, "left": 8, "indefinit": 8, "cannot": 8, "analysi": 8, "enable_if": 8, "machineri": 8, "imposs": 8, "mcparticlecollect": 8, "createmcparticl": 8, "els": 8, "moreparticl": 8, "refus": 8, "coll2": 8, "mcparticl": 8, "behind": 8, "scene": 8, "astr": 8, "fly": 8, "nor": 8, "random": 8, "suppos": 8, "collectionwritebuff": 8, "though": 8, "getidt": 8, "getcollectionbuff": 8, "unpack": 8, "amount": 8, "spent": 8, "minim": 8, "further": [8, 10], "decompress": 8, "freedom": 8, "exploit": 8, "optim": 8, "strategi": 8, "forc": 8, "detriment": 8, "classic": 8, "approach": 8, "ifram": 8, "pure": 8, "ideal": 8, "orthogon": 8, "aspect": 8, "chose": 8, "erasur": 8, "semant": 8, "introduct": 9, "quick": 9, "concept": 9, "philosophi": 9, "preprocess": 9, "podio_config_read": 10, "generator_util": 10, "classgeneratorbasemixin": 10, "langaug": 10, "itself": 10, "digest": 10, "disk": 10, "consumpt": 10, "cppclassgener": 10, "juliaclassgener": 10, "broadli": 10, "along": 10, "live": 10, "layer": 10, "linv": 10, "resourc": 10, "src": 10, "mutablestruct": 10, "jl": 10, "parentmodul": 10, "jinja": 10, "immedi": 10, "activ": 10, "_get_filenames_templ": 10, "postfix": 10, "filenam": 10, "overridden": 10, "neccessari": 10, "_fill_templ": 10, "deleg": 10, "endfor": 10, "Be": 10, "mostli": 10, "use_get_syntax": 10, "incfold": 10, "includes_cc": 10, "implemen": 10, "includes_data": 10, "includes_obj": 10, "includes_cc_obj": 10, "includes_coll_cc": 10, "include_coll_data": 10, "forward_declar": 10, "leaf": 10, "forward_declarations_obj": 10, "is_pod": 10, "indic": 10, "ostream_collection_set": 10, "header_cont": 10, "bare_typ": 10, "full_typ": 10, "is_builtin": 10, "is_arrai": 10, "array_typ": 10, "array_s": 10, "getter_nam": 10, "setter_nam": 10, "jl_import": 10, "staticarrai": 10, "mvector": 10, "julia_typ": 10, "essenit": 10, "strip": 10, "down": 10, "experiment": 10, "int16": 10, "int32": 10, "uint32": 10, "float32": 10, "float64": 10, "int64": 10, "uint64": 10, "userfloat": 11, "userdata": 11, "14f": 11, "vec": 11, "deliber": 11, "biggest": 11, "hittag": 11, "intn_t": 11, "uintn_t": 11, "16": 11, "platform": 11, "static_assert": 11, "is_same_v": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"v00": 0, "17": 0, "04": 0, "03": 0, "02": 0, "01": 0, "16": 0, "05": 0, "15": 0, "14": 0, "00": 0, "13": 0, "12": 0, "11": 0, "10": 0, "09": 0, "08": 0, "advanc": 1, "topic": 1, "write": [1, 8, 11], "extra": [1, 11], "data": [1, 3, 4, 7, 8, 11], "outsid": [1, 11], "edm": [1, 11], "chang": [1, 10], "creat": [1, 10], "new": [1, 10], "templat": [1, 10], "persist": 1, "back": 1, "end": 1, "read": [1, 8], "dump": 1, "json": 1, "thread": 1, "safeti": 1, "user": [1, 4, 7], "serial": 1, "Not": 1, "safe": 1, "compon": [1, 3, 10], "run": 1, "pre": 1, "commit": 1, "retriev": [1, 7], "definit": [1, 3], "from": [1, 3, 8], "file": [1, 10], "access": 1, "programmat": 1, "technic": 1, "detail": [1, 4], "embed": 1, "The": [1, 4, 8], "datamodelregistri": 1, "i": [1, 8], "o": [1, 8], "helper": 1, "store": 1, "contribut": 2, "podio": [2, 7, 9], "git": 2, "workflow": 2, "exampl": [2, 7, 8, 11], "releas": 2, "note": 2, "model": 3, "basic": [3, 8], "concept": [3, 8], "support": [3, 4, 7, 11], "featur": 3, "custom": 3, "class": 3, "defin": [3, 7], "member": 3, "refer": [3, 7, 8], "between": 3, "object": [3, 4, 7], "explicit": 3, "method": 3, "global": 3, "option": 3, "extend": 3, "datamodel": 3, "us": 3, "type": [3, 11], "an": [3, 11], "upstream": 3, "potenti": 3, "pitfal": 3, "design": [4, 8], "implement": [4, 8], "layout": 4, "layer": 4, "intern": 4, "pod": 4, "collect": [4, 7, 8, 11], "vector": 4, "notebook": [4, 7], "pattern": [4, 7], "handl": 4, "mutabl": 4, "introduct": 5, "quick": 5, "start": 5, "interfac": 7, "ownership": 7, "creation": 7, "storag": 7, "loop": 7, "through": 7, "frame": [7, 8], "contain": 7, "meta": 7, "python": 7, "function": 8, "usag": [8, 11], "put": 8, "get": 8, "paramet": 8, "philosophi": 8, "schema": 8, "evolut": 8, "welcom": 9, "": 9, "document": 9, "preprocess": 10, "yaml": 10, "exist": 10, "ad": 10, "avail": 10, "inform": 10, "gener": 10, "datatyp": 10, "membervari": 10, "julia": 10, "code": 10, "some": 11, "limit": 11, "No": 11, "relat": 11, "other": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"v00-17-04": [[0, "v00-17-04"]], "v00-17-03": [[0, "v00-17-03"]], "v00-17-02": [[0, "v00-17-02"]], "v00-17-01": [[0, "v00-17-01"]], "v00-17": [[0, "v00-17"]], "v00-16-05": [[0, "v00-16-05"]], "v00-16-04": [[0, "v00-16-04"]], "v00-16-03": [[0, "v00-16-03"]], "v00-16-02": [[0, "v00-16-02"]], "v00-16-01": [[0, "v00-16-01"]], "v00-16": [[0, "v00-16"]], "v00-15": [[0, "v00-15"]], "v00-14-02": [[0, "v00-14-02"]], "v00-14-01": [[0, "v00-14-01"], [0, "id1"]], "v00-14": [[0, "v00-14"]], "v00-14-00": [[0, "v00-14-00"]], "v00-13-02": [[0, "v00-13-02"]], "v00-13-01": [[0, "v00-13-01"]], "v00-13": [[0, "v00-13"]], "v00-12": [[0, "v00-12"]], "v00-11": [[0, "v00-11"]], "v00-10": [[0, "v00-10"]], "v00-09-02": [[0, "v00-09-02"]], "v00-09": [[0, "v00-09"]], "v00-08": [[0, "v00-08"]], "Advanced Topics": [[1, "advanced-topics"]], "Writing extra data outside the EDM": [[1, "writing-extra-data-outside-the-edm"]], "Changing / creating new templates": [[1, "changing-creating-new-templates"], [10, "changing-creating-new-templates"]], "Persistency": [[1, "persistency"]], "Writing Back-End": [[1, "writing-back-end"]], "Reading Back-End": [[1, "reading-back-end"]], "Dumping JSON": [[1, "dumping-json"]], "Thread-safety": [[1, "thread-safety"]], "Changing user data": [[1, "changing-user-data"]], "Serialization": [[1, "serialization"]], "Not-thread-safe components": [[1, "not-thread-safe-components"]], "Running pre-commit": [[1, "running-pre-commit"]], "Retrieving the EDM definition from a data file": [[1, "retrieving-the-edm-definition-from-a-data-file"]], "Accessing the EDM definition programmatically": [[1, "accessing-the-edm-definition-programmatically"]], "Technical details on EDM definition embedding": [[1, "technical-details-on-edm-definition-embedding"]], "The DatamodelRegistry": [[1, "the-datamodelregistry"]], "I/O helpers for EDM definition storing": [[1, "i-o-helpers-for-edm-definition-storing"]], "Contributing to PODIO": [[2, "contributing-to-podio"]], "Git workflow": [[2, "git-workflow"]], "Example workflow": [[2, "example-workflow"]], "Release Notes": [[2, "release-notes"]], "Data Models and Data Model Definitions": [[3, "data-models-and-data-model-definitions"]], "Basic Concepts and Supported Features": [[3, "basic-concepts-and-supported-features"]], "Definition of custom components": [[3, "definition-of-custom-components"]], "Definition of custom data classes": [[3, "definition-of-custom-data-classes"]], "Defining members": [[3, "defining-members"]], "Definition of references between objects:": [[3, "definition-of-references-between-objects"]], "Explicit definition of methods": [[3, "explicit-definition-of-methods"]], "Global options": [[3, "global-options"]], "Extending a datamodel / using types from an upstream datamodel": [[3, "extending-a-datamodel-using-types-from-an-upstream-datamodel"]], "Potential pitfalls": [[3, "potential-pitfalls"]], "Design and Implementation Details": [[4, "design-and-implementation-details"]], "Layout of Objects": [[4, "layout-of-objects"]], "The User Layer": [[4, "the-user-layer"]], "The Internal Data Layer": [[4, "the-internal-data-layer"]], "The POD Layer": [[4, "the-pod-layer"]], "The Collections": [[4, "the-collections"]], "Vectorization support / notebook pattern": [[4, "vectorization-support-notebook-pattern"]], "Handling mutability": [[4, "handling-mutability"]], "Introduction": [[5, "introduction"]], "Quick-start": [[5, "quick-start"]], "Examples for Supported Interface": [[7, "examples-for-supported-interface"]], "Object Ownership": [[7, "object-ownership"]], "Object Creation and Storage": [[7, "object-creation-and-storage"]], "Object References": [[7, "object-references"]], "Looping through Collections": [[7, "looping-through-collections"]], "Support for Notebook-Pattern": [[7, "support-for-notebook-pattern"]], "podio::Frame container": [[7, "podio-frame-container"]], "Object Retrieval": [[7, "object-retrieval"]], "User defined Meta Data": [[7, "user-defined-meta-data"]], "Python Interface": [[7, "python-interface"]], "The Frame concept": [[8, "the-frame-concept"]], "Basic functionality of a Frame": [[8, "basic-functionality-of-a-frame"]], "Usage examples for collection data": [[8, "usage-examples-for-collection-data"]], "Putting collection data into the Frame": [[8, "putting-collection-data-into-the-frame"]], "Getting collection (references) from the Frame": [[8, "getting-collection-references-from-the-frame"]], "Usage for Parameters": [[8, "usage-for-parameters"]], "I/O basics and philosophy": [[8, "i-o-basics-and-philosophy"]], "Writing a Frame": [[8, "writing-a-frame"]], "Reading a Frame": [[8, "reading-a-frame"]], "Schema evolution": [[8, "schema-evolution"]], "Frame implementation and design": [[8, "frame-implementation-and-design"]], "Welcome to PODIO\u2019s documentation!": [[9, "welcome-to-podio-s-documentation"]], "Preprocessing of yaml file": [[10, "preprocessing-of-yaml-file"]], "Existing templates": [[10, "existing-templates"]], "Adding a new template": [[10, "adding-a-new-template"]], "Available information in the templates": [[10, "available-information-in-the-templates"]], "General information": [[10, "general-information"]], "Components": [[10, "components"]], "Datatypes": [[10, "datatypes"]], "MemberVariable": [[10, "membervariable"]], "DataType": [[10, "datatype"]], "Julia code generation": [[10, "julia-code-generation"]], "Writing extra data outside an EDM": [[11, "writing-extra-data-outside-an-edm"]], "Example usage": [[11, "example-usage"]], "Some limitations": [[11, "some-limitations"]], "No relations to other collections": [[11, "no-relations-to-other-collections"]], "Limited supported types": [[11, "limited-supported-types"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/master/templates.html b/master/templates.html new file mode 100644 index 000000000..b0affd658 --- /dev/null +++ b/master/templates.html @@ -0,0 +1,584 @@ + + + + + + + Changing / creating new templates — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Changing / creating new templates

+

PODIO uses the Jinja2 template engine to generate the c++ code from the yaml description. +This document here gives an overview of how PODIO uses the Jinja2 engine and how the yaml file is processed before it is passed to it. +We don’t go into many details of Jinja2 templates here, please refer to the Template Designer Document of Jinja2. +PODIO only makes use of rather basic Jinja2 templates, so it should in principle be possible to pick up the basics just by looking at some existing templates.

+
+

Preprocessing of yaml file

+

The entry point for reading yaml files is the python/podio_gen/podio_config_reader.py. +When reading the yaml file a basic validation is run and the data members, relations and vector members of components and datatypes are parsed into MemberVariable objects (defined in python/podio_gen/generator_utils.py). +The main entry point to the code generation is the python/podio_class_generator.py which takes care of instantiating the language specific code generator (either C++ or a prototype version for Julia at this point). +The language specific generators inherit from the ClassGeneratorBaseMixin which takes care of some common initialization and provides some common functionality for code generation. +In the end each langauge specific generator will take care of (either by itself or through the common functionality in ClassGeneratorBaseMixin):

+
    +
  • Configuring the Jinja2 template engine. At the moment this is mainly making the templates known to the engine.

  • +
  • The necessary preprocessing of all the datatypes and components. This includes collecting necessary include directories and forward declaration, as well as digesting ExtraCode snippets.

  • +
  • Putting all the necessary information into a dict that can be easily used in the Jinja2 templates. See below for what is available in the templates

  • +
  • Calling the template engine to fill the necessary templates for each datatype or component and making sure to only write to disk if the filled template actually changed. Optionally run clang-format on them before writing.

  • +
  • Producing a list of generated c++ files for consumption by the cmake macros of PODIO.

  • +
+

Currently two language specific generators are available: CPPClassGenerator and JuliaClassGenerator. +Note that some of the information below will only apply to either of these generators as they provide the template engine with slightly different content.

+
+
+

Existing templates

+

Currently PODIO loads templates that are placed in <prefix>/python/templates. +They are broadly split along the classes that are generated for each datatype or component from the EDM definition:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

template file(s)

content

generated file(s)

Component.h.jinja2

Definition for each component

[<package>/]<component-name>.h

Data.h.jinja2

POD struct of each datatype (living in the POD layer)

[<package>/]<datatype-name>Data.h

Obj.{h,cc}.jinja2

Obj class for each datatype (linving in the object layer) and managing resources

[<package>/]<datatype-name>Obj.h, src/<datatype-name>Obj.cc

[Mutable]Object.{h,cc}.jinja2

The user facing interfaces for each datatype (living in the user layer)

[<package>/][Mutable]<datatype-name>.h, src/[Mutable]<datatype-name>.cc

Collection.{h,cc}.jinja2

The user facing collection interface (living in the user layer)

[<package>/]<datatype-name>Collection.h, src/<datatype-name>Collection.cc

CollectionData.{h,cc}.jinja2

The classes managing the collection storage (not user facing!)

[<package>/]<datatype-name>CollectionData.h, src/<datatype-name>CollectionData.cc

selection.xml.jinja2

The selection.xml file that is necessary for generating a root dictionary for the generated datamodel

src/selection.xml

SIOBlock.{h,cc}.jinja2

The SIO blocks that are necessary for the SIO backend

[<package>/]<datatype-name>SIOBlock.h, src/<datatype-name>SIOBlock.cc

MutableStruct.jl.jinja2

The mutable struct definitions of components and datatypes for julia

[<package>/]<datatype-name>Struct.jl, [<package>/]<component-name>Struct.jl

ParentModule.jl.jinja2

The constructor and collection definitions of components and datatypes in the data model are contained within a single module named after the package-name

[<package>/]<package-name>.jl

+

The presence of a [<package>] subdirectory for the header files is controlled by the includeSubfolder option in the yaml definition file.

+

Jinja allows the definition of additional macros and supports importing them similar to python modules. +These are stored in the macros subfolder and are imported directly by the main templates where necessary.

+
+
+

Adding a new template

+

All templates that are placed in the templates directory mentioned above become immediately available to the template engine if it ends on .jinja2 +However, it is still necessary to actively fill them from the class generator. +If the available information for the new templates is already enough and no further pre-processing is necessary, than they need to be added to _get_filenames_templates function in the ClassGeneratorBaseMixin. +The prefix and postfix dictionaries define how the template filename will be mapped to the generated files: <prefix><template-filename><postfix>. +By default a .h and a .cc file will be generated, but this can be overridden by adding the template to the endings dictionary. +With that in place it is now only neccessary to call _fill_templates with the appropriate template name and the pre processed data. +Note that for most templates this means that they have to be filled for each datatype or component individually.

+

If additional preprocessing is necessary, it will be necessary to also add that to the the language specific generators. +The main entry point to the generation is the process method which essentially just delegates to other methods.

+
+
+

Available information in the templates

+

The following gives an overview of the information that is available from the dictionary that is passed to the templates from the different +Each (top level) key in this dict is directly available as a variable in the Jinja2 templates, e.g.

+
component['includes'] = # list of includes
+
+
+

will become available as

+
{% for include in includes %}
+{{ include }}
+{% endfor %}
+
+
+

Be aware that some of the information is only available for the language +specific generators. The following information mostly applies to the c++ code +generation!

+
+

General information

+

The following keys / variables are always available

+ + + + + + + + + + + + + + + + + +

key / variable name

content

package_name

The package name of the datamodel (passed to the generator as argument)

use_get_syntax

The value of the getSyntax option from the yaml definition file

incfolder

The [<package>/] part of the generated header files (See above)

+
+
+

Components

+

The following keys are filled for each component

+ + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The class of the component as DataType (see below)

Members

The members of the component as MemberVariables

includes

All the necessary includes for this component

ExtraCode

Optionally present extra code

+
+
+

Datatypes

+

The following keys / variables are filled for each datatype

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The (immutable, user-facing) class as DataType (see below)

Members

The members of the datatype as a list of MemberVariables (see below)

OneToOneRelations

The one-to-one relation members of the datatype as a list of MemberVariables

OneToManyRelations

The one-to-many relation members of the datatype as a list of MemberVariables

VectorMembers

The vector members of the datatype as a list of MemberVariables

includes

The include directives for the the user facing classes header files

includes_cc

The include directives for the implemenations of the user facing classes

includes_data

The necessary include directives for the Data POD types

includes_obj

The include directives for the Obj classes headers.

includes_cc_obj

The include directives for the implementation files of the Obj classes.

includes_coll_cc

The include directives for the implementation of the Collection classes

include_coll_data

The include directives for the header CollectionData header file

forward_declarations

The forward declarations for the user facing classes header files. This is a nested dict, where the keys are namespaces and the leaf values are classes.

forward_declarations_obj

The forward declarations for the Obj classes header files.

is_pod

Flag value indicating whether the Data class of this datatype is a POD or if it contains an STL member

is_trivial_type

Flag that indicates that this is a trivial data type, i.e. one without relations or vector members.

ostream_collection_settings

A dict with a single header_contents key that is necessary for the output stream overload implementation of collections

+
+
+

MemberVariable

+

Defined in python/generator_utils.py. +The string representation gives the definition of the member, including a potentially present description string. +In principle all members are accessible in the templates, however, the most important ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

description

name

The name of the member

namespace

The (potentially empty) namespace of the member

bare_type

The type of the member without namespace

full_type

The full, namespace qualified, type of the member, essentially {{ namespace }}::{{ bare_type }}

description

The (optional) description string of the member

is_builtin

Flag for indicating that a member is a builtin type

is_array

Flag for indicating that a member is a std::array

array_type

The type of the array if the member is a std::array

array_size

The size of the array if the member is a std::array

getter_name

Method for generating the correct name for getter functions, depending on the getSyntax option in the yaml definition file.

setter_name

Method for generating the correct name for setter functions, depending on the getSyntax option in the yaml definition file and on whether the member is a relation or not

signature

The signature of a data member that can be used in function signatures, corresponds to {{ full_type }} {{ name }}

jl_imports

Import required for StaticArrays: MVector

julia_type

Equivalent julia type for the c++ type

+
+
+

DataType

+

Defined in python/generator_utils.py. +This is essenitally a stripped down version of the MemberVariable with the major difference being that the string representation returns the fully qualified type instead. +The available fields are

+ + + + + + + + + + + + + + + + + +

field

description

bare_type

The type without the namespace

namespace

The (potentially empty) namespace

full_type

The fully qualified type, corresponding to {{ namespace }}::{{ bare_type }}.

+
+
+

Julia code generation

+

It is an experimental feature. +Builtin types mapping in Julia

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cpp

julia

bool

Bool

char

Char

short

Int16

int

Int32

unsigned int

UInt32

float

Float32

double

Float64

long

Int64

unsigned long

UInt64

long long

Int64

unsigned long long

UInt64

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/master/userdata.html b/master/userdata.html new file mode 100644 index 000000000..ab11afe1e --- /dev/null +++ b/master/userdata.html @@ -0,0 +1,319 @@ + + + + + + + Writing extra data outside an EDM — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Writing extra data outside an EDM

+

In some cases it can be necessary to write some additional data that can not +(yet) be stored in the EDM. PODIO offers a possibility to store such extra user +data via the podio::UserDataCollection. It gives the user access to a +std::vector of a set of limited fundamental types, which is written alongside +the data stored in the EDM classes for each event.

+
+

Example usage

+

Creating or getting a UserDataCollection via the Frame works the same +as with any other collection of the EDM via the put or get functions:

+
#include "podio/UserDataCollection.h"
+
+// Create a collection and put it into a Frame
+userFloats = podio::UserDataCollection<float>();
+frame.put(std::move(userFloats), "userFloats");
+
+// get a collection
+const auto& userData = frame.get<podio::UserDataCollection<float>>("userFloats");
+
+
+

The interface of the UserDataCollection is similar to a basic version of the +std::vector, i.e. push_back, resize and the basic functions for accessing +elements are present:

+
userFloats.push_back(3.14f); // add elements
+userFloats.resize(10);       // make the collection have 10 elements
+auto value = userFloats[0];  // access elements by index
+
+for (auto&& value : userFloats) {
+    // necessary functionality for range-based for-loops
+}
+
+for (size_t i = 0; i < userFloats.size(); ++i) {i
+    // but also for index based loops
+}
+
+
+

For cases where this subset interface is not enough it is also possible to get a +reference to the underlying std::vector via the UserDataCollection::vec() +method.

+
+
+

Some limitations

+

Since adding additional fields to an EDM type is almost trivial for PODIO +generated EDMs the UserDataCollection capabilities are deliberately kept +limited. Here we list what we consider to be the biggest limitations:

+
+

No relations to other collections

+

Since a UserDataCollection is really just a list of numbers it is not possible +to form relations to other objects. This also means that users are responsible +for keeping a UserDataCollection in sync with an EDM collection if is used to +store additional information, e.g.

+
auto& hits = store.create<HitCollection>("hits");
+auto& hitTags = store.create<podio::UserDataCollection<uint16_t>>("hitTags");
+
+for (/* some loop */) {
+    auto hit = hits.create();
+    // To be able to loop over these in parallel, you have to fill the user data manually
+    uint16_t hitTag;
+    hitTags.push_back(hitTag);
+}
+
+
+
+
+

Limited supported types

+

As mentioned above the possible types that can be stored in a +UserDataCollection is currently (deliberately) limited to the following +fundamental types

+
    +
  • fixed width integers: intN_t and uintN_t, with N={8, 16, 32, 64}

  • +
  • float and double

  • +
+

Trying to store different types in a UserDataCollection will lead to a +compilation error. Note that the usual integer types might be the same as the +fixed width version on some platforms. However, the equivalences of different +types might be different on different platforms. E.g.

+
static_assert(std::is_same_v<unsigned long, uint64_t>);
+
+
+

might work on some platforms, but might not work on others.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: master + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/.buildinfo b/v00-00-00/.buildinfo new file mode 100644 index 000000000..9fb2c1893 --- /dev/null +++ b/v00-00-00/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1169a8f072c8d2a9be4ec125660c8139 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v00-00-00/.doctrees/ReleaseNotes.doctree b/v00-00-00/.doctrees/ReleaseNotes.doctree new file mode 100644 index 000000000..f6722057e Binary files /dev/null and b/v00-00-00/.doctrees/ReleaseNotes.doctree differ diff --git a/v00-00-00/.doctrees/advanced_topics.doctree b/v00-00-00/.doctrees/advanced_topics.doctree new file mode 100644 index 000000000..8be5ca22e Binary files /dev/null and b/v00-00-00/.doctrees/advanced_topics.doctree differ diff --git a/v00-00-00/.doctrees/contributing.doctree b/v00-00-00/.doctrees/contributing.doctree new file mode 100644 index 000000000..9cfdfe69a Binary files /dev/null and b/v00-00-00/.doctrees/contributing.doctree differ diff --git a/v00-00-00/.doctrees/datamodel_syntax.doctree b/v00-00-00/.doctrees/datamodel_syntax.doctree new file mode 100644 index 000000000..ddcc551eb Binary files /dev/null and b/v00-00-00/.doctrees/datamodel_syntax.doctree differ diff --git a/v00-00-00/.doctrees/design.doctree b/v00-00-00/.doctrees/design.doctree new file mode 100644 index 000000000..bfb5a552e Binary files /dev/null and b/v00-00-00/.doctrees/design.doctree differ diff --git a/v00-00-00/.doctrees/doc.doctree b/v00-00-00/.doctrees/doc.doctree new file mode 100644 index 000000000..22e523cf4 Binary files /dev/null and b/v00-00-00/.doctrees/doc.doctree differ diff --git a/v00-00-00/.doctrees/doc_title.doctree b/v00-00-00/.doctrees/doc_title.doctree new file mode 100644 index 000000000..aace5fdf2 Binary files /dev/null and b/v00-00-00/.doctrees/doc_title.doctree differ diff --git a/v00-00-00/.doctrees/environment.pickle b/v00-00-00/.doctrees/environment.pickle new file mode 100644 index 000000000..1c18def11 Binary files /dev/null and b/v00-00-00/.doctrees/environment.pickle differ diff --git a/v00-00-00/.doctrees/examples.doctree b/v00-00-00/.doctrees/examples.doctree new file mode 100644 index 000000000..aa9a2b98c Binary files /dev/null and b/v00-00-00/.doctrees/examples.doctree differ diff --git a/v00-00-00/.doctrees/frame.doctree b/v00-00-00/.doctrees/frame.doctree new file mode 100644 index 000000000..9426ba055 Binary files /dev/null and b/v00-00-00/.doctrees/frame.doctree differ diff --git a/v00-00-00/.doctrees/index.doctree b/v00-00-00/.doctrees/index.doctree new file mode 100644 index 000000000..dc8b1ad60 Binary files /dev/null and b/v00-00-00/.doctrees/index.doctree differ diff --git a/v00-00-00/.doctrees/templates.doctree b/v00-00-00/.doctrees/templates.doctree new file mode 100644 index 000000000..59d070c58 Binary files /dev/null and b/v00-00-00/.doctrees/templates.doctree differ diff --git a/v00-00-00/.doctrees/userdata.doctree b/v00-00-00/.doctrees/userdata.doctree new file mode 100644 index 000000000..1b712edb8 Binary files /dev/null and b/v00-00-00/.doctrees/userdata.doctree differ diff --git a/v00-00-00/ReleaseNotes.html b/v00-00-00/ReleaseNotes.html new file mode 100644 index 000000000..a9c3e4824 --- /dev/null +++ b/v00-00-00/ReleaseNotes.html @@ -0,0 +1,3488 @@ + + + + + + + v00-17-04 — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

v00-17-04

+
    +
  • 2023-12-14 tmadlener (PR#527)

    +
      +
    • Split the ClassGenerator into a base class (mixin) and two specific c++ and julia code generators that only deal with their language specific needs.

      +
        +
      • Instantiate and configure the correct reader in the podio_class_generator.py main script depending on the desired language.

      • +
      +
    • +
    • Slightly cleanup the MemberVariable to declutter its __init__ method a bit.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#530)

    +
      +
    • Remove the reading of the deprecated old-style format of component definitions in the YAML files.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#485)

    +
      +
    • Remove the deprecated EventStore functionality as announced in #429

    • +
    +
  • +
  • 2023-12-12 tmadlener (PR#529)

    +
      +
    • Switch the relation range tests to use Frame based I/O.

    • +
    +
  • +
  • 2023-12-06 tmadlener (PR#526)

    +
      +
    • Switch the edm4hep workflows to an LCG stack with a recent enough version of CMake. Necessary after key4hep/EDM4hep#235

    • +
    +
  • +
  • 2023-12-05 jmcarcell (PR#523)

    +
      +
    • Remove comment with file name and line number. It’s very unlikely it remains up to date when either the name or the content of the files changes

    • +
    +
  • +
  • 2023-12-04 jmcarcell (PR#521)

    +
      +
    • Do not import ROOT when using podio-dump --help, otherwise it can take a while depending on the system only to print the help.

    • +
    +
  • +
  • 2023-12-04 tmadlener (PR#514)

    +
      +
    • Introduce the MaybeSharedPtr to manage the Obj* in the user facing handle classes.

      +
        +
      • This splits the control block and the managed object into two distinct entities with potentially different lifetimes, which allows to fix #174 and #492.

      • +
      • This increases the size of the user facing handle classes by a factor two, since they are now effectively two pointers instead of one, even if the control block will not be initialized in case a handle is obtained from a collection.

      • +
      +
    • +
    • Remove the ObjBase base class and make the ObjectID a member of the Obj classes.

    • +
    • Make the user facing handle class constructors from an Obj* private as users will not have access to raw Obj* in any case.

      +
        +
      • Introduce a static makeEmpty method for the generated classes in order to create an empty handle, which is also used internally to handle unpersisted relations.

      • +
      +
    • +
    • Enable more existing test cases in sanitizer workflows now that it has become possible to do so.

    • +
    +
  • +
  • 2023-12-04 Ananya Gupta (PR#473)

    +
      +
    • Added Julia code generation support in the existing Python interface.

    • +
    • Implemented a new design structure for generated Julia code.

    • +
    • Added default parameters in constructor definitions with support for Abstract types (for builtins).

    • +
    • Created _sort_components_and_datatypes function to perform topological sort on components and datatypes.

    • +
    • Created _has_static_arrays_import to check for the need of using Static Arrays in the generated julia code.

    • +
    • Added –lang (-l) programming language argument to specify the programming language for code generation, current choices: cpp and julia, default: cpp.

    • +
    • Added –upstream-edm code generation support for julia.

    • +
    • Added tests in the unit test suite, covering the Julia code generation of the example data models.

    • +
    • Added documentation for julia code generation.

    • +
    • Added ENABLE_JULIA toggle option. By default it is OFF.

    • +
    +
  • +
  • 2023-12-01 jmcarcell (PR#520)

    +
      +
    • Add an error message when there is an std::bad_function_call, which currently shows +a stacktrace and is quite uninformative.

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#519)

    +
      +
    • Make generated member getter functions return by value for builtin types. Keep return by const reference for all other types. Fixes #518

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#488)

    +
      +
    • Add python bindings for the RNTuple reader and writer

    • +
    • Make podio-dump understand RNTuple based files

    • +
    • Fix missing storage of datamodel definitions for RNTuple based files

    • +
    +
  • +
+
+
+

v00-17-03

+
    +
  • 2023-11-14 tmadlener (PR#513)

    +
      +
    • Introduce checks in ROOTFrameWriter::writeFrame and ROOTNTupleWriter::writeFrame that ensure consistent contents for all Frames of a given category. If inconsistent contents are found an exception is thrown. Before these changes this might lead to a crash or to unreadable files. Fixes #382

    • +
    • Refactor ROOTNTupleWriter internals to have only one map that keeps track of categories instead of two maps and a set that need to be kept consistent.

    • +
    +
  • +
+
+
+

v00-17-02

+
    +
  • 2023-11-08 jmcarcell (PR#511)

    +
      +
    • Decouple generation tools and files from the rest of the podio python files by creating a new folder called podio_gen. This is a transparent change for users that only use the generator script.

      +
        +
      • This makes the configuration / generation times negligible again, because we don’t load libraries unnecessarily any longer for the generation.

      • +
      +
    • +
    • Simplify the python bindings (podio) __init__.py and remove the test_utils from it.

    • +
    • Move the tests for writing frames in python to the tests folder, where they belong and also test the SIO python writer.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#510)

    +
      +
    • Fix legacy tests; an extra argument was being passed and default in the .cpp file example_frame.root was being used which (almost) always exists (because there is a another test creating it) so it was hard to notice.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#509)

    +
      +
    • Add an option for using clang format and set it to off by default. It is significantly slower to run cmake with this option on.

    • +
    +
  • +
  • 2023-11-02 jmcarcell (PR#508)

    +
      +
    • Use the cmake ExternalData module to manage test data. This lets cmake take care of downloading the tests by hash so they can be version controlled. In addition, it’s possible to set up a local store using -DExternalData_OBJECT_STORES=/path/to/store and it will download the test files there if they are not there but otherwise use them from there, so building from scratch won’t download the test files again.

    • +
    +
  • +
  • 2023-10-16 jmcarcell (PR#507)

    +
      +
    • Copy .clang-format to the dumpmodel test directory and fix some tests when the build directory is not a subdirectory of the main directory. In some tests clang-format will try to find a .clang-format looking in the directories above and if it doesn’t exist it will format files differently and some tests will fail.

    • +
    +
  • +
+
+
+

v00-17-01

+
    +
  • 2023-10-12 tmadlener (PR#505)

    +
      +
    • Bump the pylint version for CI to 2.17.7

    • +
    +
  • +
  • 2023-10-11 tmadlener (PR#502)

    +
      +
    • Add a deleteBuffers function that is populated at generation time to the CollectionReadBuffers to make it possible to dispose of unconsumed buffers. This fixes the main leaks described in #500

    • +
    • Make the ROOTFrameData clean up all unconsumed buffers at desctruction.

    • +
    • Make sure to delete buffers that are no longer necessary in the CollectionData constructor. This fixes some more leaks described in #500

    • +
    +
  • +
  • 2023-10-08 Wouter Deconinck (PR#503)

    +
      +
    • Install podio-vis

    • +
    +
  • +
  • 2023-10-04 jmcarcell (PR#497)

    +
      +
    • Move podio_PYTHON_DIR to the top level CMakeLists so that it is set even when BUILD_TESTING is off

    • +
    +
  • +
  • 2023-10-02 jmcarcell (PR#496)

    +
      +
    • Add an operator != to fix negative comparisons since after https://github.com/AIDASoft/podio/pull/493 now id() returns a podioObjectID

    • +
    +
  • +
  • 2023-09-29 tmadlener (PR#493)

    +
      +
    • Make [Mutable]Object::id() return a podio::ObjectID instead of unsigned, since the latter has become useless with #412. Fixes #438

    • +
    • Add an operator<<(std::ostream&) for podio::ObjectID

    • +
    +
  • +
+
+
+

v00-17

+
    +
  • 2023-09-22 Juraj Smiesko (PR#491)

    +
      +
    • podio-dump: print warning if requested entry not present in the file

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#490)

    +
      +
    • Fix bugs in python imports when podio is built without SIO support. Fixes #489

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#486)

    +
      +
    • Make sure to initialize ObjectIDs to untracked to properly track whether they have been added to a Frame or not

    • +
    • Change CollectionIDTable interfaces of name and collectionID to return optional to signal whether a collection (ID) is known to the table. This is a breaking change if you use the CollectionIDTable!

      +
        +
      • Avoids having to do the lookup twice to check existence and a subsequent retrieval

      • +
      +
    • +
    • Fix bug of overly shared CollectionIDTable in ROOTNTupleReader that was uncovered by the CollectionIDTable switch to optional returns.

    • +
    • Switch tests from EventStore to Frame based I/O.

    • +
    • Fix bug in Frame based I/O that lead to crashes when trying to resolve relations to unpersisted objects.

    • +
    +
  • +
  • 2023-09-18 tmadlener (PR#484)

    +
      +
    • Make the podio python bindings import structure “feel more pythonic”

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#483)

    +
      +
    • Clarify error message in case of not implemented schema changes

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#482)

    +
      +
    • rename CMake macro createBuffers into create_buffers

    • +
    +
  • +
  • 2023-09-13 jmcarcell (PR#481)

    +
      +
    • Rename the cmake executable or target unittest to unittest_podio, to avoid possible collisions since the unittest name is relatively common

    • +
    +
  • +
  • 2023-09-13 Benedikt Hegner (PR#480)

    +
      +
    • Move the code generation of buffers into the ‘create_buffers’ macro

    • +
    +
  • +
  • 2023-09-13 Thomas Madlener (PR#472)

    +
      +
    • Allow comparison of data schemata across versions

    • +
    • Provide syntax to clarify user intentions in schema evolution

    • +
    • Provide schema evolution implementation based on ROOT backend

    • +
    • Include infrastructure for future support for schema evolution in other backends

    • +
    • Documentation for schema evolution functionality

    • +
    +
  • +
  • 2023-09-11 tmadlener (PR#477)

    +
      +
    • Use nlohmann/json_fwd.hpp in headers to reduce unnecessary template instantiations. Fixes #475

    • +
    +
  • +
  • 2023-09-08 tmadlener (PR#478)

    +
      +
    • Add empty method to CollectionBase

    • +
    • Add operator== to the collection iterators

    • +
    +
  • +
  • 2023-09-08 Dmitry Kalinkin (PR#465)

    +
      +
    • Introduce member typedefs to the user facing classes.

      +
        +
      • Object’s collection type can now be referenced as Object::collection_type. Conversely, the object type is reachable as ObjectCollection::value_type. The mutable objects can be reached via Object::mutable_type.

      • +
      +
    • +
    +
  • +
  • 2023-08-30 tmadlener (PR#471)

    +
      +
    • Initialize the branch names to be index based for reading (i.e. legacy behavior) for all releases of the v00-16 series.

    • +
    +
  • +
  • 2023-08-22 Andre Sailer (PR#469)

    +
      +
    • Tests: update required catch2 version to 3.4 for builds with c++20

    • +
    • CI: use clang16 on el9 (alma9), instead of clang12 on cs7, using c++20

    • +
    • CI: disable key4hep-release-based tests (tabulate available)

    • +
    +
  • +
  • 2023-08-22 Benedikt Hegner (PR#445)

    +
      +
    • Allow to specify units as part of the datamodel definition

    • +
    +
  • +
  • 2023-07-26 tmadlener (PR#463)

    +
      +
    • Make sure to only access vector member buffers of collections of datatypes with VectorMembers if they actually exist. This is necessary to make subset collections of such datatypes work in I/O. Fixes #462

    • +
    • Add a test that reproduces the original issue and is fixed by this.

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#461)

    +
      +
    • Make sure the ROOTFrameReader on the master branch can read v00-16-06 files

    • +
    • Add v00-16-06 to the legacy versions that are tested

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#447)

    +
      +
    • Add a python wrapper around the different available Frame writers.

    • +
    • Add a put method to the Frame wrapper that allows to add collections to the Frame without having to explicitly use cppyy.gbl.std.move. Fixes #432

    • +
    • Add test cases that write via python bindings and read via c++.

    • +
    +
  • +
  • 2023-07-20 tmadlener (PR#457)

    +
      +
    • Simplify the test setup for SIO in CMake and make it explicit on the ENABLE_SIO option rather than on the presence of targets.

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#456)

    +
      +
    • Cache podio_PYTHON_DIR

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#455)

    +
      +
    • Rename CMAKE_BINARY_DIR to PROJECT_BINARY_DIR

    • +
    +
  • +
  • 2023-07-18 tmadlener (PR#439)

    +
      +
    • Introduce the FrameCategories.h header that puts a few of the conventions and otherwise hardcoded strings into variables / functions.

    • +
    +
  • +
  • 2023-07-14 jmcarcell (PR#454)

    +
      +
    • Rename CMAKE_{SOURCE,BIN}_DIR to PROJECT_{SOURCE,BIN}_DIR

    • +
    +
  • +
  • 2023-07-14 tmadlener (PR#452)

    +
      +
    • Extend the pre-processor condition for the to_json functionality to not be visible in rootcling or the root interpreter. Fixes #435

    • +
    +
  • +
  • 2023-07-13 Benedikt Hegner (PR#450)

    +
      +
    • Add optional description and author fields to component definition

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#449)

    +
      +
    • Fix the pre-commit workflow by making it run on top of the key4hep nightlies that come with a recent enough root version to be able to work with the RNTuple addition (#395)

    • +
    • Fix a few minor complaints from newer versions of clang-format, clang-tidy and pylint

    • +
    • Enable building the RNTuple backend for more workflows (anything that comes with a new enough ROOT essentially).

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#448)

    +
      +
    • Remove the lcio datalayout which has been untouched (and unbuilt) for quite a few years.

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#446)

    +
      +
    • Make calling finish for the SIOFrameWriter non-mandatory. See #442 for other related changes.

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#442)

    +
      +
    • Allow not calling finish() when using the writers

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#395)

    +
      +
    • Add support for the new RNTuple format by adding a writer, reader and tests.

    • +
    +
  • +
  • 2023-06-30 Ananya Gupta (PR#437)

    +
      +
    • Modified parse function definition to incorporate missing description in member definition error message. Fixes #436

    • +
    +
  • +
  • 2023-06-27 Thomas Madlener (PR#413)

    +
      +
    • Introduce podio::SchemaEvolution that can hold schema evolution functions and that offers an evolveBuffers method that does the schema evolution on these buffers before collections are created.

    • +
    • Add hooks in podio::Frame to call this when collections are read from the FrameData.

    • +
    +
  • +
  • 2023-06-23 tmadlener (PR#434)

    +
      +
    • Properly handle the slightly different branch contents before v00-16-04. Fixes #433

    • +
    • Add tests that use the ROOTLegacyReader to actually read the downloaded legacy files

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#428)

    +
      +
    • Split the tests directory into several (more or less) topical sub-directories to declutter the main test CMakeLists.txt a bit

    • +
    • Move commonly used functionality into cmake/podioTests.cmake (e.g. setting up a test environment)

    • +
    • Move python unittests config to the python directory

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#427)

    +
      +
    • Delay library loading as long as possible, mainly for quicker responses for --help

    • +
    • Add a --version flag for dumping the podio version

    • +
    • Display collections and parameters in alphabetical order and automatically adjust column widths to fit contents (using the tabulate package).

    • +
    +
  • +
  • 2023-06-09 Thomas Madlener (PR#402)

    +
      +
    • Add public static constexpr char* type names to the collections and make the getXXXName() methods return string_views to these strings. This is a breaking change to the interface of the collections if you explicitly rely on them being std::string

      +
        +
      • typeName: the full type name of the collection (returned also by getTypeName)

      • +
      • valueTypeName: the (immutable) type name of the objects of the collection (returned by getValueTypeName)

      • +
      • dataTypeName: the type name of the data PODs (returned by getDataTypeName)

      • +
      +
    • +
    • Make unittest environment properly use PODIO_SIOBLOCK_PATH

    • +
    • USE_EXTERNAL_CATCH2 now can also be set to AUTO to look for a suitable version of Catch2 before falling back and fetching and building it’s own version instead of a hard fail.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#426)

    +
      +
    • Check if PODIO_SIOBLOCK_PATH exists in the environment and use that to look for SIO Blocks libraries before falling back to LD_LIBRARY_PATH. This makes it possible to make slightly more robust environments if several (incompatible) podio installations are visible on LD_LIBRARY_PATH

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#425)

    +
      +
    • Add a SKIP_CATCH_DISCOVERY cmake option to skip the unittest discovery of Catch2 to avoid running the catch discovery in an unsuitable environment.

    • +
    • Make environment for unittests more specific to avoid catching too much of the underlying environment.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#412)

    +
      +
    • Using string hashes as CollectionID based on MurmurHash

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#423)

    +
      +
    • Add some more structure to make it easier to add more legacy tests.

      +
        +
      • Use this to download more legacy files automatically

      • +
      • Restructure CMake config to make this possible

      • +
      +
    • +
    • Add tests for Frame based root I/O reading files that have been produced with prior versions of podio

    • +
    • Add more tests for EventStore based root I/O reading files that have been produced with prior versions of podio

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#421)

    +
      +
    • Make the collections appear in alphabetical order in root files, using a case insensitive sorting of the collections that are written.

    • +
    +
  • +
  • 2023-06-05 Thomas Madlener (PR#405)

    +
      +
    • Make the branch names for relations and vector members more legible and valid c++ variable names to improve interoperability with RDataFrame. Fixes #169

      +
        +
      • The branch names will have the following structure: _<collection-name>_<relation-name>, resp. _<collection-name>_<vectormember-name>, where relation-name, resp.vectormember-name are taken from the YAML definitions.

      • +
      • Subset collections will have a single branch with <collection-name>_objIdx. This makes it easier to disambiguate them from normal collections.

      • +
      +
    • +
    • This is a breaking change if you use the root files directly! If you use the podio Readers/Writers everything should be transparent

    • +
    +
  • +
  • 2023-05-30 tmadlener (PR#422)

    +
      +
    • Fix small bug in Frame python bindings where set but empty parameters could crash podio-dump when trying to access a non-existent element

    • +
    +
  • +
+
+
+

v00-16-05

+
    +
  • 2023-05-23 tmadlener (PR#420)

    +
      +
    • Fix a version check inside the ROOTReader to avoid segmentation violations

    • +
    +
  • +
+
+
+

v00-16-04

+
    +
  • 2023-05-23 tmadlener (PR#417)

    +
      +
    • Fix an issue with reading multiple files via the ROOTFrameReader (#411)

      +
        +
      • Add documentation for API of opening file(s)

      • +
      • Add tests for reading multiple files

      • +
      +
    • +
    +
  • +
  • 2023-05-22 tmadlener (PR#418)

    +
      +
    • Bring back the public templated getMap functionality for podio::GenericParameters as they are already used in DD4hep (see AIDASoft/DD4hep#1112).

      +
        +
      • Mark the existing getXYZMap as deprecated but keep them for a brief transition period.

      • +
      • These have been removed in #415.

      • +
      +
    • +
    +
  • +
  • 2023-05-19 jmcarcell (PR#416)

    +
      +
    • Remove selection rules for classes that don’t exist anymore

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#415)

    +
      +
    • Remove the deprecated getters and setters from the generic parameters

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#410)

    +
      +
    • Remove the square that is run when cmake runs

    • +
    +
  • +
  • 2023-05-09 tmadlener (PR#414)

    +
      +
    • Fix off-by-one error in UserDataCollection::print that caused the first element to be printed twice.

    • +
    +
  • +
  • 2023-05-09 Thomas Madlener (PR#394)

    +
      +
    • Introduce a CollectionBufferFactory that can create the necessary buffers from a collection type, a schema version and a subset collection flag.

      +
        +
      • Use this factory throughout all existing Readers

      • +
      • Remove createBuffers and createSchemaEvolvableBuffers from podio::CollectionBase interface

      • +
      +
    • +
    • Make the minimum allowed schema_version 1 in the yaml definition files. Default to 1 if no schema_version is provided

    • +
    • Add a schemaVersion to the DatamodelDefinition.h header that is generated and that can be accessed via {{ package_name }}::meta::schemaVersion. Use this to propagate schema information to the necessary places.

    • +
    • Make SIOBlocks write the current schema version, such that on reading they can generate the appropriate buffers for the version on file.

    • +
    +
  • +
  • 2023-04-22 Christopher Dilks (PR#408)

    +
      +
    • fix type inconsistency between Collection::size() and index for const object accessors

    • +
    +
  • +
  • 2023-04-21 jmcarcell (PR#387)

    +
      +
    • Make sure that the dump model round trip tests work without ENABLE_SIO

    • +
    • Actually test the extension model dumping

    • +
    +
  • +
  • 2023-04-12 Thomas Madlener (PR#400)

    +
      +
    • Fix a bug in SIOFrameData::getAvailableCollections to also work with Frames where some of the collections have not been written and that could lead to a seg fault.

    • +
    • Add a test for this in c++ (previously only covered in python unittests of Frame).

    • +
    +
  • +
  • 2023-04-05 Thomas Madlener (PR#399)

    +
      +
    • Add PODIO_ENABLE_SIO=1 to the public target_compile_definitions for podioSioIO so that all dependent targets automatically get it as well. This should make it easier to use SIO dependent features in dependencies.

    • +
    • Consistently use a scope for target_link_libraries in tests.

    • +
    +
  • +
  • 2023-04-03 Paul Gessinger-Befurt (PR#398)

    +
      +
    • Do not reject building if ROOT was built with C++20 (instead of C++17).

    • +
    +
  • +
  • 2023-04-03 Thomas Madlener (PR#397)

    +
      +
    • Remove the GENERATED property from generated files in CMake to avoid inconsistent removal of headers and source files with the clean target. Fixes #396

    • +
    +
  • +
  • 2023-03-15 Benedikt Hegner (PR#341)

    +
      +
    • Adding infrastructure for schema evolution

    • +
    • Added explicit version tracking to the metadata

    • +
    • Data model comparison tool w/ simple heuristics to identify potential omissions / mistakes (e.g. checking for the limits of the ROOT backend)

    • +
    • Changed handling of backwards compatibility for the collection info metadata

    • +
    +
  • +
+
+
+

v00-16-03

+
    +
  • 2023-03-14 jmcarcell (PR#391)

    +
      +
    • Catch an exception when a clang-format flag is not found

    • +
    +
  • +
  • 2023-03-14 jmcarcell (PR#390)

    +
      +
    • Modify the initial clang-format check to try to run with all the arguments that will be used later

    • +
    +
  • +
  • 2023-03-13 jmcarcell (PR#389)

    +
      +
    • Add .cache to the gitignore

    • +
    +
  • +
  • 2023-03-07 Thomas Madlener (PR#358)

    +
      +
    • Embed the EDM definition in JSON format into the shared core datamodel libraries

      +
        +
      • Generate an additional DatamodelDefinition.h header file containing the string literal json encoded definition

      • +
      • Statically register this to the newly introduced DatamodelRegistry and make collections aware of which datamodel they belong to

      • +
      +
    • +
    • Collect all EDM definitions from all collections that are written with a writer and write all these definitions to the resulting file

      +
        +
      • Currently only done for the FrameWriters

      • +
      +
    • +
    • Give podio-dump the necessary functionality to retrieve the stored models and dump them in YAML format again

      +
        +
      • Add roundtrip tests that compare the generated code from the original model and the one that has been dumped from a data file to ensure that all components work as intended.

      • +
      +
    • +
    • See the advanced topics documentation for more details.

    • +
    +
  • +
  • 2023-03-06 Dmitry Kalinkin (PR#384)

    +
      +
    • Added an operator for conversion to std::string for podio::version::Version

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#378)

    +
      +
    • Introduce deprecation warnings for the EventStore based I/O model as it will be removed in favor of the Frame based one

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#372)

    +
      +
    • Make double a supported type of GenericParameters. A similar thing has been added to LCIO in iLCSoft/LCIO#143 to support storing event weights that need double precision.

    • +
    • Add more unittests to the GenericParameters covering also the available constructors.

    • +
    +
  • +
  • 2023-02-27 Thomas Madlener (PR#380)

    +
      +
    • Add getParameters method to the Frame and deprecate getGenericParametersForWrite which offered the exact same functionality.

      +
        +
      • Make it easily possible to get all parameters that are currently stored in a Frame via an “official” channel

      • +
      • Replace all internal usages.

      • +
      +
    • +
    • Add a getParameterKeys templated method to get the keys for different parameter types that are currently stored in the Frame.

    • +
    +
  • +
  • 2023-02-22 jmcarcell (PR#377)

    +
      +
    • Add a visualization tool that converts a YAML description to a graph

    • +
    +
  • +
  • 2023-02-21 jmcarcell (PR#376)

    +
      +
    • Fix tests without SIO

    • +
    +
  • +
  • 2023-02-14 Thomas Madlener (PR#375)

    +
      +
    • Fix the PODIO_VERSION preprocessor macro to be actually usable in a preprocessor context. Fixes #374

    • +
    • Make podio_VERSION preprocessor constant something that can be used in a preprocessor context (now the same as PODIO_BUILD_VERSION

    • +
    • Add test that ensures that the macro and the constant are actually used in a preprocessor context.

    • +
    +
  • +
  • 2023-02-13 Juraj Smiesko (PR#373)

    +
      +
    • Adding ID to the short podio-dump output

    • +
    +
  • +
  • 2023-02-06 Nathan Brei (PR#369)

    +
      +
    • Mark non-templated definitions of Frame::Frame, Frame::get, Frame::put and Frame::putParameters as inline to fix linker errors.

    • +
    +
  • +
  • 2023-02-02 jmcarcell (PR#364)

    +
      +
    • Make workflows not trigger twice on pushes to PRs

    • +
    +
  • +
  • 2023-01-26 jmcarcell (PR#368)

    +
      +
    • CMAKE: Add option PODIO_RELAX_PYVER to allow relaxing the required match of python version with the one that ROOT has been built with to only check major and minor versions

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#363)

    +
      +
    • Move sio utility functionality defined in SIOFrameWriter.cc to private sioUtils.h header and use it also in the legacy SIOWriter.

    • +
    • Fix cmake configure dependencies (missed in #343) for datamodel generation macro.

    • +
    • Use defaultdict instead of hand rolling one in class generator.

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#361)

    +
      +
    • Add basic I/O tests for datatypes defined in the extension datamodel. Fixes #319

    • +
    +
  • +
  • 2023-01-11 jmcarcell (PR#355)

    +
      +
    • Change the readers so that when the file is missing they won’t crash

    • +
    +
  • +
  • 2023-01-10 jmcarcell (PR#365)

    +
      +
    • Fix the pre-commit workflow

    • +
    +
  • +
  • 2022-12-23 jmcarcell (PR#362)

    +
      +
    • Rename the variable match to avoid collisions with a python keyword from Python 3.10 onwards

    • +
    +
  • +
+
+
+

v00-16-02

+
    +
  • 2022-12-19 Thomas Madlener (PR#360)

    +
      +
    • Make the log output of loading the SIOBlock libraries more informative by also providing the absolute paths to the loaded (and rejected) shared libraries.

    • +
    +
  • +
  • 2022-12-16 Thomas Madlener (PR#333)

    +
      +
    • Initialize the unique_ptr<mutex> in the constructor initializer list instead of in the member variable declaration. This is more likely a bug in nvcc (or maybe a c++17 feature not yet supported by nvcc). Fixes key4hep/k4Clue#34

    • +
    • Pass --disable-new-dtags to the linker when using PODIO_SET_RPATH, to set RPATH and not RUNPATH in the binaries.

    • +
    • Pin the ubuntu version for runners that build on ubuntu to not accidentally go out of sync with the underlying LCG releases.

    • +
    • Disable the podio tests in the edm4hep workflows (see #359).

    • +
    +
  • +
+
+
+

v00-16-01

+
    +
  • 2022-12-06 jmcarcell (PR#356)

    +
      +
    • Fix path in the README

    • +
    • Use the functionality in argparse to choose between options

    • +
    +
  • +
  • 2022-12-06 Benedikt Hegner (PR#346)

    +
      +
    • Switched tp Apache 2.0 license to facilitate integration in experiment stacks.

    • +
    +
  • +
  • 2022-12-05 Thomas Madlener (PR#357)

    +
      +
    • Put <prefix>/bin onto PATH in order to make podio-dump available from environments created with env.sh

    • +
    +
  • +
  • 2022-12-02 jmcarcell (PR#354)

    +
      +
    • Make env.sh setup script POSIX compliant to run in shells other than bash

      +
        +
      • Change == to =

      • +
      • Change tabs to spaces (two) to avoid mix of spaces and tabs for indenting

      • +
      • Add <prefix>/include to ROOT_INCLUDE_PATH (as it is required since #343)

      • +
      +
    • +
    +
  • +
  • 2022-11-16 Thomas Madlener (PR#351)

    +
      +
    • Fix bug in Frame python bindings where empty collections were considered as non-existing. Replacing the original check relying on some implicit boolean conversions (which also caught empty collections) to an explicit check against nullptr.

    • +
    • Make podio-dump more robust in installations without SIO support, by guarding the corresponding import.

    • +
    +
  • +
  • 2022-11-14 Thomas Madlener (PR#344)

    +
      +
    • Make podio-dump work with new Frame based I/O (fixes #339)

    • +
    • Keep existing functionality intact by using the legacy readers introduced in #345.

    • +
    +
  • +
  • 2022-11-11 Thomas Madlener (PR#345)

    +
      +
    • Add a ROOTLegacyReader and a SIOLegacyReader that read files that have been written prior to #287 into podio::Frames and offers the same interface as the frame readers

      +
        +
      • Also including python bindings for it

      • +
      +
    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#349)

    +
      +
    • Fix bug in setting relations in nested get calls in podio::Frame. Fixes #348

    • +
    • Adapt the read test to actually check this. Previously this went unnoticed, because the necessary relations were already set in a previous call.

    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#343)

    +
      +
    • Add python bindings for Frame based I/O

      +
        +
      • Available from podio.root_io and podio.sio_io, where a Reader and a Writer is implemented for each.

      • +
      • Wrapper around podio::Frame. Requires that the podio/Frame.h header is available somewhere on the ROOT_INCLUDE_PATH.

      • +
      +
    • +
    • Add necessary functionality for python bindings to C++ API

      +
        +
      • untyped Frame::get method for getting collections

      • +
      • New constructor from FrameDataT&&

      • +
      • functionality to inspect file and Frame contents more easily

      • +
      +
    • +
    • Reorganize python code into structure that follows the usual python packaging conventions a bit more closely

      +
        +
      • Introduce the podio module. Make CMake generate the __init__.py with the correct version

      • +
      • Move everything except the generator script into module. Additionally also keep an EventStore wrapper to not break existing code.

      • +
      +
    • +
    • Refactor the CMakeLists.txt that is responsible for building the core and all required I/O libraries

      +
        +
      • Build more dictionaries for more python bindings.

      • +
      +
    • +
    +
  • +
  • 2022-11-02 Thomas Madlener (PR#342)

    +
      +
    • Migrate to actions/checkout@v3 as advised by github

    • +
    • Use the checkout action to clone the dependencies in the edm4hep workflow instead of doing an explicit clone in the body of the action

    • +
    +
  • +
  • 2022-11-02 Dmitry Kalinkin (PR#327)

    +
      +
    • fix typo in documentation

    • +
    +
  • +
  • 2022-10-24 Juraj Smiesko (PR#340)

    +
      +
    • Adding reading of specific entry from frame

    • +
    +
  • +
  • 2022-10-21 Thomas Madlener (PR#335)

    +
      +
    • Update the github-action-cvmfs and run-lcg-view actions to their latest available version to pick up the latest improvements (caching of dependencies, log groups)

    • +
    • Introduce log groups in github actions for easier to interpret outputs

    • +
    • Switch to LCG_102 for lcg based build environments

    • +
    • Add a workflow that builds and tests EDM4hep after building podio

    • +
    +
  • +
+
+
+

v00-16

+
    +
  • 2022-10-04 Thomas Madlener (PR#337)

    +
      +
    • Make the notebook pattern functionality return std::vectors instead of std::array to avoid having to specify a static size. Fixes #332

    • +
    • Backwards incompatible change as the return type as well as the call signature for the notebook pattern change.

    • +
    +
  • +
  • 2022-09-27 Andre Sailer (PR#336)

    +
      +
    • podioConfig.cmake: silence warning about cmake policy CMP00012

    • +
    • CMake: explicitly look for catch2 version 3 and fail at cmake instead of compile step

    • +
    +
  • +
  • 2022-09-27 Thomas Madlener (PR#334)

    +
      +
    • Fix a warning/error message from ROOT from attempts to stream the std::mutex members of GenericParameters by marking them as transient for the dictionary generation.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#323)

    +
      +
    • Add a podio-dump python script (installed to <prefix>/bin that can be used to dump event contents to stdout. By default prints an overview over the collections and their types, but can also be used to dump full events, via the -d or --detailed flag. Use --help to get all available options and their descriptions.

    • +
    • To allow podio-dump to work with all available backends also add support for reading SIO via the PythonEventStore.

      +
        +
      • Split off the necessary c++ functionality into a separate podioPythonStore library (+ necessary ROOT dictionaries).

      • +
      +
    • +
    • Add a print function to the collections for easier dumping from the python side.

    • +
    • Add a print function to the GenericParameters

    • +
    • Make goToEvent is a part of the IReader interface and correctly implemented it for the SIOReader.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#287)

    +
      +
    • Introduce the podio::Frame as a generalized, thread-safe (event) data container.

      +
        +
      • This first version offers all necessary functionality and an almost finalized interface, i.e. we plan to keep this as stable as possible, but we might still change things if it turns out that there are better ways to do some things

      • +
      • For details about the basic interface and the underlying design considerations please consult the corresponding documentation

      • +
      +
    • +
    • This will be the only way to work with podio data starting from version 1.0

      +
        +
      • For now the current I/O implementations remain in place unchanged, but they will be deprecated (and removed) in the not too distant future

      • +
      +
    • +
    +
  • +
+
+
+

v00-15

+
    +
  • 2022-08-09 Thomas Madlener (PR#312)

    +
      +
    • Add support for converting objects and collections to JSON using nlohmann/json.

      +
        +
      • To enable JSON support it is necessary to build the datamodel with PODIO_JSON_OUTPUT and to link against the nlohmann/json library.

      • +
      +
    • +
    +
  • +
  • 2022-08-05 Wouter Deconinck (PR#318)

    +
      +
    • CMake: PODIO_ADD_ROOT_IO_DICT: Bugfix for data models in OUTPUT_FOLDER not equal to source dir in root dictionary generation cmake macro.

      +
        +
      • Now SELECTION_XML can be passed either as absolute path or relative to OUTPUT_FOLDER.

      • +
      +
    • +
    +
  • +
  • 2022-08-03 Thomas Madlener (PR#317)

    +
      +
    • Make it possible to pass an upstream datamodel to the class generator such that datatypes and components defined there can be used in an unrelated datamodel. This makes it possible to extend datamodels and to prototype new datatypes with the aim of upstreaming them eventually without having to redefine all the necessary components.

    • +
    • Refactor the internals of the config reader / class generator slightly to make it possible to hold multiple datamodels in memory

    • +
    +
  • +
  • 2022-08-02 Thomas Madlener (PR#316)

    +
      +
    • Remove macOS CI workflows because github hosted runners will deprecate macOS 10.15 (announcement) and later versions of macOS no longer support fuse and as a consequence CVMFS.

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#315)

    +
      +
    • Make the is_trivial_type flag available in the template engine behave as expected (it behaved exactly oppositely to what was documented and what one would intuitively expect). The flag was originally introduced in #288

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#283)

    +
      +
    • Allow users to define default values for member variables, instead of default initializing all of them.

      +
        +
      • The syntax for specifying a default value is - <type> <name>{<init-value>} // <description>.

      • +
      • The passed value is not validated in any way. Apart from a very basic syntax check, there is no validation that the provided default initialization values are actually valid. This means that generated code might not compile.

      • +
      +
    • +
    • Remove some of the python2 compatibility and do some cleanup

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#276)

    +
      +
    • Remove support for having std::string members in datatypes and components, as they break PODness and it seems that this feature was not in use in any case.

    • +
    • Make ROOTReader slightly more robust against missing datatypes in dictionaries when reading files.

    • +
    +
  • +
  • 2022-06-22 Valentin Volkl (PR#307)

    +
      +
    • hotfix for https://github.com/AIDASoft/podio/issues/290: revert a clang-tidy change to make sure that there are no unknown symbols in podioDict

    • +
    +
  • +
  • 2022-06-21 Thomas Madlener (PR#282)

    +
      +
    • Add a PODIO_USE_CLANG_FORMAT option to the cmake configuration to toggle the autodiscovery of clang-format and a .clang-format configuration file. This option is also available for downstream packages that use podio to generate their EDM.

      +
        +
      • The default is AUTO, where we try to discover a suitable clang-format version as well as a .clang-format file and use it if we find it.

      • +
      • If set to OFF podio will not try to see whether clang-format and a .clang-format file are available and will also not try to format the code accordingly.

      • +
      • If set to ON podio will actually require a suitable clang-format version and the presence of a .clang-format file and will fail at the cmake stage if not present.

      • +
      +
    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#305)

    +
      +
    • Make sure generator warnings are printed

    • +
    • Add a deprecation warning for the upcoming removal of support of std::string in data types. (See also #276)

    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#294)

    +
      +
    • Remove the EventStore, CollectionIDTable and version::Version members from the SIOCollectionIDTableBlock to make it easier to use in the Frame context

    • +
    • Move the podio:version::build_version into its own SIOVersionBlock

    • +
    • This is a breaking change for the SIO backend and it will not be able to read files that have been written prior to this

    • +
    +
  • +
+
+
+

v00-14-02

+
    +
  • 2022-06-15 Thomas Madlener (PR#304)

    +
      +
    • Use the releases v3.0.1 version of Catch2 instead of an unreleased commit

    • +
    +
  • +
  • 2022-06-15 Thomas Madlener (PR#303)

    +
      +
    • Default initialize the array for the vectorized access.

    • +
    +
  • +
  • 2022-06-14 soumil (PR#296)

    +
      +
    • Add instructions on how to run pre-commit locally to the documentation

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#295)

    +
      +
    • Mark CollectionBase::prepareForWrite as const and make sure that the generated implementations are thread safe.

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#286)

    +
      +
    • Make sure that vector member buffers for writing point to the correct place even if a collection has been moved, by resetting them when the buffers are requested.

    • +
    • Add checks for this to the unittests, as this is sort of an interface for I/O backends.

    • +
    +
  • +
  • 2022-06-13 Kalina Stoimenova (PR#301)

    +
      +
    • Fixed the text in the cmake message for code generation to point to the correct readme file

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#300)

    +
      +
    • Newer versions of pylint have removed a few options and a few checks that aimed at python2-python3 compatibility.

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#299)

    +
      +
    • Explicitly add constructors to CollectionBase

    • +
    • Make sure to not use an unset LD_LIBRARY_PATH for detecting sio blocks shared libraries.

    • +
    +
  • +
  • 2022-06-02 soumil (PR#293)

    +
      +
    • Removing python2 compatibility imports

    • +
    • Removing ordered loading (obsolete) function

    • +
    +
  • +
  • 2022-06-01 Thomas Madlener (PR#285)

    +
      +
    • Fix potential bug in setting the collection ID for subset collections

    • +
    +
  • +
  • 2022-05-30 soumil (PR#291)

    +
      +
    • Replace the obj_needs_destructor flag in the generator code and templates with the is_trivial_type flag, since that is the more appropriate name. (Fixes #288)

    • +
    +
  • +
  • 2022-05-27 Thomas Madlener (PR#274)

    +
      +
    • Add documentation for the Jinja2 templates and the code generation process in general to make working with these parts of PODIO easier.

    • +
    +
  • +
  • 2022-05-23 Thomas Madlener (PR#262)

    +
      +
    • Make the getters and setters for the GenericParameters templated functions and add a deprecation warning for the untemplated ones.

    • +
    • Define a SupportedGenericDataTypes tuple defining the types (and vectors of those) that can be stored in GenericParameters

    • +
    • Add a podio/utilities/TypeHelpers.h header with some type handling helpers.

    • +
    +
  • +
  • 2022-05-20 Thomas Madlener (PR#277)

    +
      +
    • Avoid fetching the (remote) legacy input file for tests unnecessarily every time cmake is run.

    • +
    +
  • +
  • 2022-05-17 Thomas Madlener (PR#284)

    +
      +
    • Make sure the EventStore doesn’t try to read event meta data multiple times per event

    • +
    • Add a empty method to GenericParameters to check if any parameters are stored.

    • +
    +
  • +
  • 2022-04-04 Thomas Madlener (PR#280)

    +
      +
    • Only use --color option for diff in clang-format wrapper script if it is supported by the underlying diffutils.

    • +
    +
  • +
  • 2022-04-02 Thomas Madlener (PR#254)

    +
      +
    • Add a .clang-format and .clang-tidy config file for consistent formatting and following a few coding guidelines.

    • +
    • Add pre-commit hooks that run clang-tidy and clang-format

    • +
    • Make all currently present files follow the formatting and guidelines of the present configuration.

    • +
    • Make the PODIO_GENERATE_DATAMODEL macro look for a .clang-format file and the presence of clang-formatand automatically format all the generated files if both are there.

    • +
    +
  • +
  • 2022-04-01 Thomas Madlener (PR#279)

    +
      +
    • Fix test environment to work again in newest Key4hep release by unsetting ROOT_INCLUDE_PATH in the test environment to avoid potential clashes with existing other installations in the environment.

    • +
    • Add CI build against the Key4hep nightlies.

    • +
    • Switch to use the Catch2 installation from Key4hep for the workflows.

    • +
    +
  • +
  • 2022-03-31 Thomas Madlener (PR#253)

    +
      +
    • Add a basic setup for pre-commit and replace the python linting github workflow with one that is run via pre-commit.

      +
        +
      • Add additional checks for consistent line-endings and removal of trailing whitespaces.

      • +
      +
    • +
    • Update pylint and flake8 config to no longer check for python2/python3 compatibility but instead follow the same guidelines as e.g. in ILCDirac.

    • +
    • Fix all issues that were uncovered.

    • +
    +
  • +
  • 2022-03-23 Thomas Madlener (PR#270)

    +
      +
    • Remove duplicated printing of component members in the std::ostream& operator<< overloads of the datatypes. Fixes #269

    • +
    • Add an example datatype that broke compilation before these fixes.

    • +
    +
  • +
  • 2022-03-18 Andre Sailer (PR#265)

    +
      +
    • CI: use clang12 and gcc11 for tests based on dev stacks

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14

+
    +
  • 2021-10-13 Thomas Madlener (PR#234)

    +
      +
    • Make sure that #include <cstdint> is present when using fixed with integers in datatypes

    • +
    +
  • +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-14-00

+
    +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-13-02

+
    +
  • 2021-10-08 Thomas Madlener (PR#224)

    +
      +
    • Make the clone function always return a mutable object, also when called on an immutable object (Fixes #219)

    • +
    +
  • +
  • 2021-09-22 Thomas Madlener (PR#214)

    +
      +
    • Make the CMake datamodel generation macro use the python interpreter that is also found by CMake to avoid accidentally picking up an unsuitable system provided version that might be on PATH.

    • +
    +
  • +
  • 2021-09-21 Frank Gaede (PR#213)

    +
      +
    • add possibility to store additional user data as collections of fundamental types in PODIO files

      +
        +
      • uses std::vector<basic_type>

      • +
      • stored in simple branch in root (and simple block in SIO)

      • +
      • all fundamental types supported in PODIO (except bool) can be written

      • +
      +
    • +
    • example code:

    • +
    +
      auto& usrInts = store.create<podio::UserDataCollection<uint64_t> >("userInts");
    +  auto& usrDoubles = store.create<podio::UserDataCollection<double> >("userDoubles");
    +  // ...
    +
    +  // add some unsigned ints
    +  usrInts.resize( i + 1 ) ;
    +  int myInt = 0 ;
    +  for( auto& iu : usrInts ){
    +    iu = myInt++  ;
    +  }
    +  // and some user double values
    +  unsigned nd = 100 ;
    +  usrDoubles.resize( nd ) ;
    +  for(unsigned id=0 ; id<nd ; ++id){
    +    usrDoubles[id] = 42. ;
    +  }
    +
    +
    +
      +
    • should replace https://github.com/key4hep/EDM4hep/pull/114 in a more efficient way

    • +
    +
  • +
  • 2021-09-21 tmadlener (PR#143)

    +
      +
    • Generate an additional podio_generated_files.cmake file containing all generated source files as a header and sources list and make the code generation macro include this file to get the headers and source files.

      +
        +
      • Now only the files generated for the current settings are picked up by cmake

      • +
      • Makes it possible to have additional files in the folders where the generated files are placed, since these are no longer globbed over.

      • +
      +
    • +
    +
  • +
  • 2021-09-10 Thomas Madlener (PR#217)

    +
      +
    • Make the Obj destructors = default where possible, i.e. if a datatype has no relations to handle

    • +
    • Make the assignment operators of the user facing classes use the “copy-and-swap” idiom

    • +
    • Fix the problem where OneToOneRelations needed to be from the same namespace as the datatype they are used in (#216)

    • +
    +
  • +
  • 2021-09-06 Thomas Madlener (PR#211)

    +
      +
    • Fix test dependencies to allow running tests in parallel via ctest -jN

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#210)

    +
      +
    • Fix a few small issues in the datamodel yaml file validation. These do not change the behavior of code generation, they just try to catch problems earlier

      +
        +
      • Make sure that OneToManyRelations and OneToOneRelations have the same restrictions

      • +
      • Only allow components, builtins and arrays of those as Members

      • +
      +
    • +
    • Make the API of validate slightly more generic by taking a dict instead of multiple arguments.

    • +
    • Make the generator exit with an easier to read error message in case of a validation problem instead of printing a full backtrace.

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#197)

    +
      +
    • Introduce a podio::CollectionBuffers class that contains everything that is necessary for I/O of a given collection. This is a breaking change in the collection interface

    • +
    • Introduce and generate a CollectionData class for each datatype that only manages the storage of a given collection.

      +
        +
      • Exposes only the Obj entries of each collection as well as the necessary functionality to add a new object (and its relations) to the collection.

      • +
      +
    • +
    • Implement “subset” collections that behave exactly the same as normal collections apart from an additional function call when creating them.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#206)

    +
      +
    • Switch to Catch2 v3 test library and by default assume that it is available. Use the ‘USE_EXTERNAL_CATCH2` cmake option to control whether podio should use an external installation or if it should fetch and build it internally instead.

    • +
    • Remove catch.hpp header that was previously shipped, since it is no longer needed.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#201)

    +
      +
    • Make assignment operator increase the reference count to avoid possible heap-after-free usage. (Fixes #200)

    • +
    +
  • +
+
+
+

v00-13-01

+
    +
  • 2021-06-03 Thomas Madlener (PR#195)

    +
      +
    • Fix possible circular and self-includes in generated header files.

    • +
    +
  • +
  • 2021-06-03 Thomas Madlener (PR#194)

    +
      +
    • Make it possible to do indexed access on a RelationRange, making the interface more akin to a const std::vector

    • +
    +
  • +
  • 2021-05-31 tmadlener (PR#193)

    +
      +
    • Make collection element access const correct.

    • +
    +
  • +
  • 2021-05-31 Thomas Madlener (PR#192)

    +
      +
    • Fix const-correctness problems of meta data access via EventStore.

    • +
    +
  • +
  • 2021-05-28 Benedikt Hegner (PR#191)

    +
      +
    • Fix bug in validity check so that transient and persistent collections are treated the same

    • +
    +
  • +
  • 2021-05-28 Thomas Madlener (PR#186)

    +
      +
    • Add support for fixed width integer type members in components and datatypes.

      +
        +
      • Now possible to use int16_t, int32_t, int64_t, uint16_t, uint32_t and uint64_t as members. Other fixed width integer types that are potentially defined in <cstdint> are not considered valid as the intended use case is really only fixed width integers for now. These are rejected at the datamodel validation step.

      • +
      • Fixed width integers are considered to be “builtin” types for podio.

      • +
      +
    • +
    +
  • +
  • 2021-05-04 Valentin Volkl (PR#189)

    +
      +
    • [cmake] fix test dependencies: read_and_write.cpp reads the file example.root that is created by the write test. If the dependency is not declared, running the tests concurrently can lead to spurious test failures.

    • +
    +
  • +
  • 2021-04-28 tmadlener (PR#180)

    +
      +
    • Improve the branch look-up logic in ROOTReader and ROOTWriter. Triggered by a performance degradation in v6.22/06, where this logic was changed inside ROOT and our use case was affected badly. All ROOT versions profit from these changes as it is in general more efficient than the previous implementation.

    • +
    +
  • +
  • 2021-03-30 tmadlener (PR#182)

    +
      +
    • Use run-lcg-view github action and switch to more recent LCG releases to run CI.

    • +
    • Update README to include status of CI

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#185)

    +
      +
    • extended .gitignore

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#184)

    +
      +
    • Clean up AsciiWriter comments

    • +
    +
  • +
  • 2021-03-23 tmadlener (PR#183)

    +
      +
    • Use SIO targets in cmake, which are exported starting with v00-01 (iLCSoft/SIO#15)

    • +
    +
  • +
  • 2021-02-23 Marko Petric (PR#181)

    +
      +
    • Add coverity nightly scan based on run-lcg-view action

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#175)

    +
      +
    • Fully qualify return types for OneToOneRelation getters in generated .cc file for objects and Const objects. This fixes a bug described in https://github.com/AIDASoft/podio/issues/168#issuecomment-770751871 and now allows to mix different namespaces in the generated code. This allows to more easily extend already existing datamodels by compiling and linking against them.

    • +
    +
  • +
  • 2021-02-23 Dmitry Romanov (PR#173)

    +
      +
    • Added IO Handler argument to schema generation example in README

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#171)

    +
      +
    • Fix compiler warnings, that were uncovered by #153 and described in #170. Fix them in the core classes and also in the generated ones.

    • +
    • Enforce no new warnings with Werror in the CI builds.

    • +
    +
  • +
  • 2021-02-15 Joseph C Wang (PR#156)

    +
      +
    • Readers/writers are now noncopyable

    • +
    +
  • +
  • 2021-02-02 Joseph C Wang (PR#154)

    +
      +
    • Disable operator = for collections so that it maintains one copy of collections, fixes #111

    • +
    +
  • +
  • 2021-01-26 tmadlener (PR#172)

    +
      +
    • Fix deprecated brew install commands in mac workflow

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#165)

    +
      +
    • Add a convenience RelationRange::emtpy function for easily checking whether a range is empty.

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#162)

    +
      +
    • Fix cmake problem #161 on Ubuntu

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#155)

    +
      +
    • Add some benchmarking tools, including TimedReader and TimedWriter decorators that allow to wrap (interface conforming) readers and writers and record the times different operations take. The times are recorded on two levels: setup times, like constructing a reader or “one-time” calls and per event times, for things that happen each event (e.g. writeEvent or readCollection). Additionally the BenchmarkRecorder in principle also allows to track additional things outside of these decorators.

    • +
    +
  • +
+
+
+

v00-13

+
    +
  • 2020-12-03 Marko Petric (PR#153)

    +
      +
    • Set rpath for macOS and externalize compiler and linker flags

    • +
    • Search for the same version of python as was used for building ROOT

    • +
    +
  • +
  • 2020-12-03 Joseph C Wang (PR#152)

    +
      +
    • Make EventStore non-copyable

    • +
    +
  • +
  • 2020-12-03 tmadlener (PR#144)

    +
      +
    • Decouple the writers and the EventStore to allow to write collections that have previously been read from a file.

    • +
    +
  • +
  • 2020-11-24 Valentin Volkl (PR#149)

    +
      +
    • [cmake] add find_package_handle_standard_args() to podio config

    • +
    +
  • +
  • 2020-11-18 Frank Gaede (PR#147)

    +
      +
    • fix for MacOs when using SIO I/O with podio +- need to link edm-core library to edm-sioBlocks library

    • +
    +
  • +
  • 2020-11-10 Thomas Madlener (PR#130)

    +
      +
    • Add SIO as a second I/O backend (as alternative to ROOT) that can be enabled with ENABLE_SIO. If enabled, a separate podioSioIO library is built that allows reading and writing sio files. For serializing the different datatypes, additional code is generated to build an SioBlocks library that is loaded at runtime (if found somewhere on LD_LIBRARY_PATH). To facilitate the whole process at the cmake level, new cmake functions are provided to generate the core datamodel library PODIO_ADD_DATAMODEL_CORE_LIBRARY, to (conditionally) define the ROOT dictionary target PODIO_ADD_ROOT_IO_DICT and to (conditionally) define the Sio Blocks library target PODIO_ADD_SIO_IO_BLOCKS. The I/O backends that are supported by podio are exported via the PODIO_IO_HANDLERS list variable.

    • +
    • podio_generate_datamodel.py now additionally takes the I/O handlers that should be generated as arguments. This is also reflected in an additional argument to PODIO_GENERATE_DATAMODEL. To have backwards compatibility, this additional argument defaults to ROOT in both cases and downstream packages should work as usual without changes.

    • +
    +
  • +
  • 2020-10-06 tmadlener (PR#133)

    +
      +
    • Make ROOTReader handle file switches properly for meta data reading.

    • +
    +
  • +
  • 2020-09-29 tmadlener (PR#141)

    +
      +
    • Update CI actions to use LCG 96, 97, 98 for mac, centos7 and ubuntu1804

    • +
    • Make python bindings work with root 6.22 (and onwards)

    • +
    • Make sure that root has been built with c++17 at the cmake stage

    • +
    • Require at least CMake 3.12

    • +
    +
  • +
  • 2020-09-18 tmadlener (PR#134)

    +
      +
    • Make the EventStore actually take ownership of the metadata passed to it by the readers. (see #139)

    • +
    • Make the collections properly clean up data of VectorMembers (see #139)

    • +
    • Fix small memory leak in the EventStore for the CollectionIDTable.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#128)

    +
      +
    • Fix a possible nullptr access in the Writers and make registerForWrite return a boolean to make it easier to check from the calling site.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#127)

    +
      +
    • cleanup of GenericParameters for meta data +- remove mutable from internal maps

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#126)

    +
      +
    • No longer install python unittest files

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#125)

    +
      +
    • improve CollectionIDTable +- previously used a std::recursive_mutex which is unnecessary in this case +- made whatever can be made const const and now use std::distance to calculate the index.

    • +
    +
  • +
  • 2020-08-28 tmadlener (PR#129)

    +
      +
    • Reduce memory footprint by clearing intermediately used I/O buffers.

    • +
    +
  • +
+
+
+

v00-12

+
    +
  • 2020-08-11 Frank Gaede (PR#124)

    +
      +
    • minor bug fix for macos: +- add <sstream> to write.cpp +- fixes #123

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#122)

    +
      +
    • Update README to reflect the new requirements (i.e. jinja2)

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#121)

    +
      +
    • Update Ubuntu CI script to install the python requirements via pip.

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#120)

    +
      +
    • Use jinja2 template engine to generate c++ code. This makes it possible to more cleanly separate the generation of the c++ code and all the necessary pre-processing. Now only the pre-processing is done in python, while the complete generation is done using jinja2. This should make it much easier to make changes to the generated c++ code.

    • +
    +
  • +
  • 2020-08-05 tmadlener (PR#117)

    +
      +
    • Refactoring of the podio class generator to improve its readability. This refactoring is mainly focusing on reducing the size of some methods to make them easier to grasp as well as trying to more cleanly separate the validation of the inputs and the c++ code generation. The validation is stricter than the current version and will potentially break things. Specifically, the handling of ExtraCode and ConstExtraCode is now implemented according to the documentation. In the previous version this has somewhat diverged from there. The yaml declaration of components has been made equivalent to the ones of the datatypes but “old-style” definitions are still handled properly. In the latter case a deprecation warning is emitted. The generated c++ code is functionally equivalent, but not equal character by character. The differences are mainly whitespace, but at some places also some of the generated code has been updated to more recent c++ capabilities. Additionally, some tests for the validation are added. They are not really exhaustive and should be considered to serve mainly documenting purposes for the moment.

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#107)

    +
      +
    • Introduce range wrapper for OneToManyRelations and VectorMembers to allow range-based for loops

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#106)

    +
      +
    • Fix the possibility of running into infinite loops in the ostream operator with cyclical references

    • +
    +
  • +
  • 2020-08-03 Frank Gaede (PR#102)

    +
      +
    • add test example read_and_write.cpp

      +
        +
      • simple use case for reading in an event an writing (parts of it) to another file

      • +
      • currently fails with segmentation fault (to be fixed)

      • +
      +
    • +
    +
  • +
  • 2020-08-03 Valentin Volkl (PR#98)

    +
      +
    • add ubuntu ci build

    • +
    +
  • +
+
+
+

v00-11

+
    +
  • 2020-07-21 tmadlener (PR#101)

    +
      +
    • Fix bug where ConstObject with empty OneToManyRelations give an invalid iterator range, #100

    • +
    +
  • +
  • 2020-06-23 Andre Sailer (PR#99)

    +
      +
    • Point to libpodioDict.so instead of libpodio.so in rootmap file

    • +
    +
  • +
  • 2020-06-03 Frank Gaede (PR#92)

    +
      +
    • implement reading/writing of meta data for runs, events and collections

      +
        +
      • based on GenericParameters that hold named parameters of type int, float, string or vectors if these (copied from lcio::LCParameters)

      • +
      • meta data for the three types is always written

      • +
      • it is read only on request

      • +
      +
    • +
    • example for writing:

    • +
    +
       auto& evtMD = store.getEventMetaData() ;
    +    evtMD.setValue( "UserEventWeight" , (float) 100.*i ) ;
    +
    +
    +
      +
    • example for reading:

    • +
    +
      auto& evtMD = store.getEventMetaData() ;
    +  float evtWeight = evtMD.getFloatVal( "UserEventWeight" ) ;
    +
    +
    +
      +
    • addresses #49

    • +
    +
  • +
  • 2020-05-26 Andre Sailer (PR#91)

    +
      +
    • Ensure podioRootIO is linked against podioDict even when linker uses as-needed by default, fixes #90

    • +
    +
  • +
  • 2020-05-26 Thomas Madlener (PR#89)

    +
      +
    • Updated README and env.sh to reflect changes in install process

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#88)

    +
      +
    • change add relation naming addXxxx -> addToXxxxs

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#87)

    +
      +
    • update minimum required CMake version to 3.8

    • +
    • remove obsolete Jenkinsfile

    • +
    • make CPack config optional: cmake variable ENABLE_CPACK defaults to OFF

    • +
    • update Readme with Spack instructions

    • +
    +
  • +
  • 2020-04-14 Frank Gaede (PR#83)

    +
      +
    • allow automatic change of version in CMakeLists.txt

      +
        +
      • fixes #82

      • +
      +
    • +
    +
  • +
+
+
+

v00-10

+
    +
  • 2020-04-03 Frank Gaede (PR#81)

    +
      +
    • make compatible with macos and clang

      +
        +
      • use -Wl,-undefined,dynamic_lookup w/ AppleClang

        +
          +
        • make the same, default behavior on linux explicit w/ -Wl,--allow-shlib-undefined

        • +
        +
      • +
      • add ROOT::Core to TestDataModel library

      • +
      +
    • +
    +
  • +
  • 2020-04-03 Marko Petric (PR#80)

    +
      +
    • add a macOS test to GitHub actions

    • +
    +
  • +
  • 2020-04-03 Valentin Volkl (PR#75)

    +
      +
    • Fixes in python code for 2-3 compatibility

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#74)

    +
      +
    • Fix exception when podio_class_generator is called with -q/–quiet

    • +
    • Printout about includes only in verbose mode

    • +
    • Do not print warnings in quiet mode

    • +
    • Print each warning only once

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#73)

    +
      +
    • Added PODIO_GENERATE_DATAMODEL Cmake macro to call the class generator at the right time. see podioMacros for the signature

    • +
    +
  • +
  • 2020-03-11 Marko Petric (PR#72)

    +
      +
    • Update CI to use GitHub actions

    • +
    • Add test against a Python 3 LCG view

    • +
    • Remove travis

    • +
    • Add tests for Python 3 compatibility and flake8

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#70)

    +
      +
    • ClassGenerator: add option “includeSubfolder”, to always use `#include “<packagename>/<object>.h” etc. if set to “True”

    • +
    • Added sorting and “uniquing” of include lists. Some duplicates still occur because two different lists are used on occasion

    • +
    • Added $PACKAGE_NAME_ to include guards

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#69)

    +
      +
    • Move all Root dependencies (RootReader, RootWriter) of the podio Library into podioRootIO, rename podioDict to podioDict

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#68)

    +
      +
    • Add podioMacros.cmake to contain PODIO_GENERATE_DICTIONARY

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#67)

    +
      +
    • Change Yaml loader to preserve order of members as given in the yaml

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#65)

    +
      +
    • podio_class_generator: only write files if their content changed

    • +
    +
  • +
  • 2019-10-15 Valentin Volkl (PR#64)

    +
      +
    • Add BUILD_TESTS CMake option for building tests

    • +
    +
  • +
  • 2019-10-15 Pere Mato (PR#63)

    +
      +
    • Fix to avoid deprecated STL classes in C++17

    • +
    +
  • +
+
+
+

v00-09-02

+
    +
  • 2019-09-27 Frank Gaede (PR#60)

    +
      +
    • fixed the code generation for members with multi word types (long long, unsigned long,…) +- add example to ExampleHit: +- unsigned long long cellID // cellID

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59)

    +
      +
    • move templates inside the python directory when installing +- fixes: #58

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59) +/

  • +
  • 2019-09-27 Frank Gaede (PR#57)

    +
      +
    • allow for numbers in namespace and class names +- generate type name string for CollectionBase::getValueTypeName()
      +- fixes #56

    • +
    +
  • +
  • 2019-09-26 Frank Gaede (PR#55)

    +
      +
    • cache collection pointers for fast access in EventStore::get()

      +
        +
      • added EventStore::getFast(int id)

      • +
      • considerably speeds up XXCollection::setReferences() +when reading back collections

      • +
      +
    • +
    +
  • +
  • 2019-09-26 Ben Morgan (PR#54)

    +
      +
    • improve the CMake

      +
        +
      1. Consistent use of CMake usage requirements to propagate include and link dependencies

      2. +
      3. Full use of the CMakePackageConfigHelpers module to generate the podioConfig.cmake file and associated podioTargets.cmake

      4. +
      5. Automatically refind the ROOT dependency

      6. +
      7. Standardize install paths for CMake and template files +A podio client can, in CMake, do

      8. +
      +
    • +
    +
    find_package(podio REQUIRED)
    +add_executable(foo foo.cc)
    +target_link_libraries(foo podio::podio)
    +
    +
    +

    and all include/link paths will be set correctly.

    +
  • +
  • 2019-08-21 Javier Cervantes Villanueva (PR#51) +Do not install tests

    +
      +
    • Allow tests to run after the build phase

    • +
    • Paths have been modified to point to binary or source directories

    • +
    • Before, tests had to be run only after running make install

    • +
    • Test are not installed anymore

    • +
    • Fail tests if any error is reported (ROOT Interpreter error may not be considered by CMake)

    • +
    +
  • +
  • 2019-05-10 Frank Gaede (PR#45)

    +
      +
    • updated documentation

      +
        +
      • add guidelines for contributing

      • +
      +
    • +
    • reverted some name changes in tests/examples (fixes #44)

      +
        +
      • read-one now again called read

      • +
      +
    • +
    • enamble dryrun again for generate-edm test

    • +
    +
  • +
  • 2019-04-09 Marko Petric (PR#43)

    +
      +
    • Implementation of CI based on LCG views, as suggested in #42

    • +
    +
  • +
  • 2019-04-09 Graeme A Stewart (PR#41)

    +
      +
    • Improve convenience setup scripts and build instructions +- remove FCC specific code from init.sh +- factorise environment setup to env.sh +- updated README.md

    • +
    +
  • +
  • 2019-03-24 Javier Cervantes (PR#40)

    +
      +
    • ROOTReader now supports multiple inputs thanks to new implementation based on TChain

    • +
    • ROOTReader now supports opening files via xrootd (root:///eospublic.cern.ch//eos... for example)

    • +
    • Improved CMake and CPack configuration, sticking more closely to HSF template

    • +
    +
  • +
+
+
+

v00-09

+
    +
  • 2018-12-20 Frank Gaede (PR#39)

    +
      +
    • add some fixes and improvements

      +
        +
      • fix forward declarations in Object template when using a namespace for the EDM

      • +
      • fix array getter names when using the get/set syntax

      • +
      • add missing treatment for include statements in component’s header files

      • +
      • handle array members in ostream operators

      • +
      +
    • +
    • add CollectionBase::size() member function

      +
        +
      • allows to access collection size w/o knowing the concrete type

      • +
      • method is already generated in implementation classes

      • +
      +
    • +
    +
  • +
  • 2018-12-06 Frank Gaede (PR#38)

    +
      +
    • add code generation for I/O of vector members +- vector members are treated analogous to the reference vectors,i.e. +streamed as one large vector per collection

    • +
    • updated tests/datamodel accordingly (using clang-format)

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#37)

    +
      +
    • handle references and vector members in collection’s ostream operators

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#36)

    +
      +
    • add github templates for releaase notes, issues and contribution guidelines

    • +
    • add ReleaseNotes.md +- contains all commit logs so far (v00-08)

    • +
    +
  • +
+
+
+

v00-08

+
    +
  • 2017-11-02 hegner

    +
      +
    • Merge pull request #32 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-09-13 Colin Bernet

    +
      +
    • Merge pull request #60 from cbernet/nofile_fix

    • +
    +
  • +
  • 2017-09-12 Colin

    +
      +
    • fixed segv when opening a non accessible input file

    • +
    • fix test in interactive mode. write program had been moved

    • +
    +
  • +
  • 2017-06-21 Colin Bernet

    +
      +
    • Merge pull request #59 from cbernet/pyeventstore_filename

    • +
    +
  • +
  • 2017-06-20 Colin

    +
      +
    • can now get the name of the current file (useful when reporting exceptions)

    • +
    +
  • +
  • 2017-05-29 hegner

    +
      +
    • Merge pull request #58 from jlingema/clangf

    • +
    +
  • +
  • 2017-05-29 Joschka Lingemann

    +
      +
    • Fix bug introduced with clang format class gen would crash if clang-format was not used

    • +
    +
  • +
  • 2017-05-23 hegner

    +
      +
    • Merge pull request #53 from jlingema/array

    • +
    • Merge pull request #55 from jlingema/clangf

    • +
    • Merge pull request #57 from jlingema/fixWarnings

    • +
    +
  • +
  • 2017-05-22 Joschka Lingemann

    +
      +
    • Regenerate test datamodel

    • +
    • Add override statements

    • +
    +
  • +
  • 2017-04-20 Joschka Lingemann

    +
      +
    • Only call clang-format if it is in PATH

    • +
    +
  • +
  • 2017-04-11 Joschka Lingemann

    +
      +
    • Add language hints for syntax highlighting in docs

    • +
    • Add options of class generator to README

    • +
    • Add test for clang format

    • +
    • Add clang to path in init

    • +
    • Add clang-format application as option, closes #54

    • +
    +
  • +
  • 2017-04-07 Joschka Lingemann

    +
      +
    • Regenerated datamodel

    • +
    • Fix test in read and write for array of struct

    • +
    • Fixes in parser for arrays of struct

    • +
    • Add test for array of struct

    • +
    • Add includes for arrays of PODs

    • +
    +
  • +
  • 2017-04-04 Benedikt Hegner

    +
      +
    • temporarily disable outputstream for arrays

    • +
    +
  • +
  • 2017-04-04 hegner

    +
      +
    • Merge pull request #26 from gaede/add_ascii_io

    • +
    • Merge branch ‘master’ into add_ascii_io

    • +
    +
  • +
  • 2017-03-24 zaborowska

    +
      +
    • Merge pull request #52 from jlingema/array

    • +
    +
  • +
  • 2017-03-24 Joschka Lingemann

    +
      +
    • Add ROOT version requirement

    • +
    +
  • +
  • 2017-03-21 hegner

    +
      +
    • Merge pull request #30 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-03-20 hegner

    +
      +
    • Merge pull request #50 from jlingema/array

    • +
    +
  • +
  • 2017-03-13 Joschka Lingemann

    +
      +
    • Increase version requirement in README

    • +
    • Removing FindROOT macro, using standard use-file

    • +
    • Migrate to LCG_88

    • +
    • silence warning of unsigned -> int

    • +
    • Merge remote branch ‘origin/master’ into array

    • +
    +
  • +
  • 2017-03-02 Joschka Lingemann

    +
      +
    • Add implementation for array members

    • +
    +
  • +
  • 2017-02-15 Joschka Lingemann

    +
      +
    • Add test for datatype with array-member.

    • +
    +
  • +
  • 2017-02-21 zaborowska

    +
      +
    • Merge pull request #49 from jlingema/cvmfs

    • +
    +
  • +
  • 2017-02-21 Joschka Lingemann

    +
      +
    • Remove unused variable, add check if PODIO is set.

    • +
    • Move to cvmfs

    • +
    • Set ROOT_INCLUDE_PATH of pyunittest to avoid failure if FCC env is set.

    • +
    +
  • +
  • 2016-12-12 zaborowska

    +
      +
    • Merge pull request #47 from jlingema/master

    • +
    +
  • +
  • 2016-12-09 Joschka Lingemann

    +
      +
    • Regenerated datamodel with check against invalid collections.

    • +
    • Add check against OneToManyRelations to invalid collections

    • +
    • Move to LCG_87

    • +
    +
  • +
  • 2016-12-09 hegner

    +
      +
    • Merge pull request #46 from jlingema/master

    • +
    +
  • +
  • 2016-12-06 Joschka Lingemann

    +
      +
    • Require C++14.

    • +
    +
  • +
  • 2016-11-07 hegner

    +
      +
    • Merge pull request #45 from jlingema/master

    • +
    +
  • +
  • 2016-10-17 Benedikt Hegner

    +
      +
    • add method to register collection

    • +
    • remove need for templating on registering for writing

    • +
    +
  • +
  • 2016-09-30 Frank Gaede

    +
      +
    • remove debug printout for found components

    • +
    • add example for using ASCIWriter - write_ascii

    • +
    • fixed const_relation getters w/ getSyntax

    • +
    • regenerated EDM, ostream operator<<, id() and o.->

    • +
    • add ASCIIWriter

    • +
    • improved creation of ostream operators etc.

    • +
    +
  • +
  • 2016-09-26 Joschka Lingemann

    +
      +
    • Add non-const accessors for non-const collections.

    • +
    +
  • +
  • 2016-08-23 hegner

    +
      +
    • Merge pull request #44 from jlingema/docs

    • +
    • Merge pull request #43 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-08-23 Joschka Lingemann

    +
      +
    • Change option to be the same across projects.

    • +
    +
  • +
  • 2016-08-16 Joschka Lingemann

    +
      +
    • Improve readability of code base name and version.

    • +
    • Allow to customize version for doxygen via cli.

    • +
    • Use readme as title page for doxygen.

    • +
    • Change version to tags currently used.

    • +
    +
  • +
  • 2016-08-15 Joschka Lingemann

    +
      +
    • Add unsigned long to the list of builtins for consistency.

    • +
    • add test that regenerates datamodel in dry-run mode.

    • +
    • Add dry-run option.

    • +
    +
  • +
  • 2016-08-09 Joschka Lingemann

    +
      +
    • Remove unnecessary dict.

    • +
    +
  • +
  • 2016-07-29 Joschka Lingemann

    +
      +
    • Add support for (unsigned) long long

    • +
    • Fix indentation

    • +
    +
  • +
  • 2016-07-28 hegner

    +
      +
    • Merge pull request #25 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-28 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add a paragraph on options in the datamodel description files.

    • +
    • Add checks for clashing getter and setter names.

    • +
    • Add doxygen comments.

    • +
    +
  • +
  • 2016-07-27 hegner

    +
      +
    • Merge pull request #42 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-27 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add tests for direct accessors and setters of POD members.

    • +
    • Merge with changes for doxygen comments and member exposure

    • +
    • Merge pull request #24 from jlingema/fix_cpy_relations

    • +
    • Add missing ; and switch to operator==

    • +
    • Code cleanup.

    • +
    +
  • +
  • 2016-07-26 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Removing print info generation, as that creates compilation issues.

    • +
    • Merge with recent changes from hegner/podio.

    • +
    • Remove print outs

    • +
    • Regenerated datamodel.

    • +
    • Extend tests to have empty references.

    • +
    • Initialize relations on copy only if they are set.

    • +
    +
  • +
  • 2016-07-25 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add test for deep copy.

    • +
    • Bug fix: Initialisation of OneToOneRelations when copying.

    • +
    +
  • +
  • 2016-07-22 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’

    • +
    • Add tests for direct getter and setter of POD members.

    • +
    • Bug fix: option value already parsed to bool.

    • +
    • Add getters for POD members in Const objects.

    • +
    • Regenerated datamodel.

    • +
    • Remove trailing ; to silence compiler warning.

    • +
    • Add options to yaml files and parser for get syntax and pod data exposure.

    • +
    • Expose POD member members in objects.

    • +
    • Adding comments that show up in doxygen.

    • +
    +
  • +
  • 2016-07-12 hegner

    +
      +
    • Merge pull request #40 from jlingema/master

    • +
    +
  • +
  • 2016-07-12 Joschka Lingemann

    +
      +
    • Revert to operator[], add function checking presence of a collection.

    • +
    • Adding way to only clear the chaches (needed for FCCSW).

    • +
    • Change way to access IDs and names to allow catching exceptions.

    • +
    +
  • +
  • 2016-06-30 Benedikt Hegner

    +
      +
    • update doc as preparation for milestone document

    • +
    +
  • +
  • 2016-06-17 Joschka Lingemann

    +
      +
    • Add test for OneToManyRelations in namespaces. Fix class-generator.

    • +
    +
  • +
  • 2016-06-16 hegner

    +
      +
    • Merge pull request #22 from Steinweg/eike_operators_new

    • +
    +
  • +
  • 2016-06-15 Eike Steinweg

    +
      +
    • implemented ostream operators - std::ostream operator<<() created for components, objects and collections - create PrintInfo classes for formatted (tabular) printout of collections

    • +
    +
  • +
  • 2016-06-14 Benedikt Hegner

    +
      +
    • add convenience methods to python interface

    • +
    +
  • +
  • 2016-06-13 Benedikt Hegner

    +
      +
    • fix problem of wrong references being stored

    • +
    +
  • +
  • 2016-06-13 hegner

    +
      +
    • Merge pull request #21 from gaede/reference_bug_test

    • +
    +
  • +
  • 2016-06-13 Frank Gaede

    +
      +
    • fixed error message for test case

    • +
    • add test case for bug with reading back references

    • +
    +
  • +
  • 2016-06-03 hegner

    +
      +
    • Merge pull request #19 from jlingema/pyinterface

    • +
    +
  • +
  • 2016-05-24 Joschka Lingemann

    +
      +
    • Fix close method.

    • +
    • Improving py interface.

    • +
    • Merge remote branch ‘hegner/master’

    • +
    +
  • +
  • 2016-05-19 hegner

    +
      +
    • Merge pull request #39 from jlingema/master

    • +
    +
  • +
  • 2016-05-19 Joschka Lingemann

    +
      +
    • Remove hard-coded build-type.

    • +
    +
  • +
  • 2016-05-18 hegner

    +
      +
    • Merge pull request #38 from jlingema/master

    • +
    +
  • +
  • 2016-05-18 Joschka Lingemann

    +
      +
    • Increase write-test event number to 2000.

    • +
    • Merge pull request #18 from jlingema/master

    • +
    • Fixing indentation errors.

    • +
    • Reverting to LCG_83 and afs.

    • +
    +
  • +
  • 2016-05-12 Benedikt Hegner

    +
      +
    • style changes

    • +
    +
  • +
  • 2016-04-26 hegner

    +
      +
    • Merge pull request #17 from gaede/improve_doc

    • +
    +
  • +
  • 2016-04-26 Frank Gaede

    +
      +
    • made the ink to doxygen explicit

    • +
    • add more doc links to README

    • +
    • dde some documenation links to Readme

    • +
    +
  • +
  • 2016-04-22 hegner

    +
      +
    • Merge pull request #16 from gaede/relation_bug

    • +
    +
  • +
  • 2016-04-22 Frank Gaede

    +
      +
    • added ExampleMC to show bug in storing relations

    • +
    • bug fix in {ref}_end() for empty relation

    • +
    +
  • +
  • 2016-04-21 Frank Gaede

    +
      +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    +
  • +
  • 2016-04-20 hegner

    +
      +
    • Merge pull request #15 from gaede/add_getters_setters

    • +
    +
  • +
  • 2016-04-20 Frank Gaede

    +
      +
    • add unittest “AssociativeContainer” set/map

    • +
    • remove incorrect access to reference vector method

    • +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    • Merge pull request #13 from gaede/fix_extracode

    • +
    • optional get/set syntax; operator<(); acces to reference vector

    • +
    +
  • +
  • 2016-04-20 Benedikt Hegner

    +
      +
    • clean up references at better place

    • +
    • Merge pull request #14 from jlingema/memleaks

    • +
    +
  • +
  • 2016-04-20 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’ into memleaks

    • +
    • Fixing memory leak.

    • +
    +
  • +
  • 2016-04-19 Frank Gaede

    +
      +
    • fixed extra code generation for ConstObject

    • +
    +
  • +
  • 2016-04-19 hegner

    +
      +
    • Merge pull request #12 from gaede/extracode_in_components

    • +
    • add unit test for extracode in component

    • +
    +
  • +
  • 2016-04-19 Benedikt Hegner

    +
      +
    • add link to bug tracker

    • +
    • clear references properly

    • +
    • test for adding extra code to components

    • +
    • fix for handling components w/o extra code

    • +
    • allow for extra code declarations in components

    • +
    • fix object ownership and leak at deletion of collection

    • +
    +
  • +
  • 2016-04-18 Benedikt Hegner

    +
      +
    • add support for strings as members

    • +
    • removing wrong file

    • +
    • adding more docs

    • +
    • extend datamodel validation

    • +
    • add gitignore file

    • +
    +
  • +
  • 2016-04-17 Benedikt Hegner

    +
      +
    • move examples into tests to make space for real end-user examples

    • +
    • Merge branch ‘master’ of github.com:hegner/podio into catch

    • +
    • migrate from gtest to catch

    • +
    • move component cross-checking into validator

    • +
    • add hook for datamodel validator

    • +
    • fix PODIO-6

    • +
    • add support for user specified code snippets

    • +
    • add pointerless read interface

    • +
    • fix case when multiple many-relations are defined; fix writing example

    • +
    +
  • +
  • 2016-04-13 hegner

    +
      +
    • Merge pull request #11 from gaede/master

    • +
    +
  • +
  • 2016-04-13 Frank Gaede

    +
      +
    • added clusters in clusters as test for infinite recursion

    • +
    • Merge branch ‘master’ of https://github.com/gaede/podio

    • +
    • Merge branch ‘master’ of https://github.com/hegner/podio

    • +
    +
  • +
  • 2016-04-13 Benedikt Hegner

    +
      +
    • move to using LCG releases from CVMFS

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • Merge branch ‘master’ of github.com:hegner/podio

    • +
    • remove unneeded parameter from processEvent

    • +
    • Merge pull request #10 from gaede/master

    • +
    • starting to add more documentation

    • +
    +
  • +
  • 2016-04-12 Frank Gaede

    +
      +
    • big fix: clear vector of internal references in Collcection::clear()

    • +
    • set podio_LIBRARIES in podioConfig.cmake

    • +
    +
  • +
  • 2016-04-11 Frank Gaede

    +
      +
    • creare source directories for class generator if needed

    • +
    +
  • +
  • 2016-04-07 clementhelsens

    +
      +
    • Merge pull request #37 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 hegner

    +
      +
    • Merge pull request #9 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 Joschka Lingemann

    +
      +
    • Using TFile::Open allows to also read eos files.

    • +
    +
  • +
  • 2016-03-14 hegner

    +
      +
    • Merge pull request #8 from jlingema/master

    • +
    +
  • +
  • 2016-03-14 Joschka Lingemann

    +
      +
    • Add templates file.

    • +
    • Fixing whitespace in templates according to FCC style.

    • +
    • First round of code clean-up. Moving code templates out of the generator. Move re-used functionality in functions.

    • +
    +
  • +
  • 2016-03-10 Joschka Lingemann

    +
      +
    • Moving member parsing in separate function.

    • +
    +
  • +
  • 2016-03-09 Joschka Lingemann

    +
      +
    • Add missing class from example datamodel.

    • +
    +
  • +
  • 2016-03-03 hegner

    +
      +
    • Merge pull request #34 from cbernet/tutorial_2

    • +
    +
  • +
  • 2016-03-03 Joschka Lingemann

    +
      +
    • Merge pull request #36 from hegner/master

    • +
    +
  • +
  • 2016-03-01 Benedikt Hegner

    +
      +
    • help cmake finding the proper gtest

    • +
    • use LCG 83 view

    • +
    +
  • +
  • 2016-03-01 Colin

    +
      +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-22 Colin

    +
      +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Joschka Lingemann

    +
      +
    • Adding dependencies for tests of examples.

    • +
    +
  • +
  • 2016-02-19 Colin

    +
      +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    +
  • +
  • 2016-02-18 Joschka Lingemann

    +
      +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    +
  • +
  • 2016-02-11 Colin

    +
      +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    +
  • +
  • 2016-02-10 Colin

    +
      +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-03-01 Colin Bernet

    +
      +
    • Merge pull request #35 from cbernet/master

    • +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-23 Colin

    +
      +
    • updated README

    • +
    • updated README

    • +
    • updated README

    • +
    • improved README

    • +
    • added python read example

    • +
    +
  • +
  • 2016-02-23 Colin Bernet

    +
      +
    • Merge pull request #33 from cbernet/master

    • +
    • Merge remote-tracking branch ‘official/master’

    • +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Colin Bernet

    +
      +
    • Merge pull request #32 from jlingema/master

    • +
    • Adding dependencies for tests of examples.

    • +
    • Merge pull request #31 from cbernet/master

    • +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    • Merge pull request #30 from jlingema/fix_include

    • +
    • Merge pull request #28 from cbernet/master

    • +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    • Merge pull request #29 from hegner/master

    • +
    +
  • +
  • 2016-02-18 Benedikt Hegner

    +
      +
    • add missing ID setting when free-floating collections are added to the store

    • +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-02-09 hegner

    +
      +
    • Merge pull request #7 from HEP-FCC/master

    • +
    +
  • +
  • 2016-02-09 Joschka Lingemann

    +
      +
    • Merge pull request #26 from cbernet/unified_env

    • +
    • Merge pull request #27 from hegner/master

    • +
    • Merge pull request #5 from zaborowska/fileZombie

    • +
    • Merge pull request #6 from zaborowska/rename

    • +
    +
  • +
  • 2016-02-09 Benedikt Hegner

    +
      +
    • beautify generated doxygen

    • +
    +
  • +
  • 2016-02-09 Colin

    +
      +
    • improving readme

    • +
    +
  • +
  • 2016-01-08 Colin

    +
      +
    • pick up soft on afs only at cern

    • +
    +
  • +
  • 2016-01-07 Colin

    +
      +
    • unified environment initialization

    • +
    +
  • +
  • 2016-02-08 zaborowska

    +
      +
    • Renaming Albers to PODIO

    • +
    +
  • +
  • 2016-02-08 Anna

    +
      +
    • Checking if file opened correctly

    • +
    +
  • +
  • 2016-02-05 Benedikt Hegner

    +
      +
    • remove deprecated files after merge

    • +
    • Merge branch ‘hegner-master’

    • +
    • resolve conflicts

    • +
    +
  • +
  • 2016-02-05 hegner

    +
      +
    • Merge pull request #3 from jlingema/master

    • +
    +
  • +
  • 2016-02-04 Joschka Lingemann

    +
      +
    • Adding install target for templates.

    • +
    • Merge with remote.

    • +
    • Change to new options. Add how to list all options.

    • +
    • Adding options for doxygen and gtest.

    • +
    +
  • +
  • 2016-02-01 Joschka Lingemann

    +
      +
    • Merge with remote master.

    • +
    • Adding examples to library paths.

    • +
    • Changing install destination for pcm / rootmap.

    • +
    • Updating instructions to new test folder structure

    • +
    +
  • +
  • 2016-01-29 Joschka Lingemann

    +
      +
    • Small cosmetic fixes to read-me.

    • +
    +
  • +
  • 2016-01-28 Joschka Lingemann

    +
      +
    • Adding how to run tests.

    • +
    • Changing testing structure to make unit-tests optional.

    • +
    • Adapting to Apple specifics.

    • +
    • Re-adding Find-ROOT macro.

    • +
    +
  • +
  • 2016-01-26 Joschka Lingemann

    +
      +
    • Fixing namespaces of members of objects.

    • +
    • Fixing namespacing of members for components.

    • +
    • Fix: Namespaced component in another component.

    • +
    +
  • +
  • 2016-01-18 Joschka Lingemann

    +
      +
    • Fixing path for python environment

    • +
    +
  • +
  • 2016-01-15 Joschka Lingemann

    +
      +
    • Adding python environment and pytools for PyYAML.

    • +
    • Splitting implementation and header files.

    • +
    • Newly generated datamodel.

    • +
    • Adding tests for namespaced data.

    • +
    • Fix relations for namespaced datamembers.

    • +
    • Removing trailing ; to silence warning.

    • +
    • First iteration of namespace support.

    • +
    • Adding handling of non-builtin members and fixing compile warnings

    • +
    +
  • +
  • 2016-01-13 Joschka Lingemann

    +
      +
    • Updating externals according to current FCCSW.

    • +
    +
  • +
  • 2015-11-18 Benedikt Hegner

    +
      +
    • make vector member code compile

    • +
    • add more forward declarations handling class A->B->A reference cases

    • +
    • move setter/getter implementation into CC file’

    • +
    +
  • +
  • 2015-10-22 Benedikt Hegner

    +
      +
    • install dictionaries explicitly

    • +
    +
  • +
  • 2015-10-21 Benedikt Hegner

    +
      +
    • fix bug for storing unitialized references

    • +
    • add new unit test covering non-filled relations

    • +
    +
  • +
  • 2015-10-19 Benedikt Hegner

    +
      +
    • add more single-ref unit tests; fix infinite loop

    • +
    +
  • +
  • 2015-10-16 Benedikt Hegner

    +
      +
    • allow chaining of components

    • +
    +
  • +
  • 2015-10-16 hegner

    +
      +
    • Merge pull request #1 from zaborowska/master

    • +
    +
  • +
  • 2015-10-16 Anna

    +
      +
    • Merge branch ‘master’ into test

    • +
    • Rename of examples->tests in init and README

    • +
    • Missing include of gtest added

    • +
    • added ‘setter’ for components

    • +
    +
  • +
  • 2015-10-15 Benedikt Hegner

    +
      +
    • add tests for components

    • +
    • move data definition syntax into separate markdown file

    • +
    +
  • +
  • 2015-10-14 Benedikt Hegner

    +
      +
    • new iteration of data model w/ new reference accessors

    • +
    • add tests for python interface

    • +
    • enable tests for python interface

    • +
    • remove accidentally added file

    • +
    • install python files

    • +
    • move PythonEventStore into podio namespace

    • +
    • add at() to methods of the collection

    • +
    • renaming package creation script

    • +
    +
  • +
  • 2015-10-13 Benedikt Hegner

    +
      +
    • update to new datamodel; fix mem leak

    • +
    • major refurbishment of podio; new interfaces in doc/doc.md

    • +
    +
  • +
  • 2015-05-12 Benedikt Hegner

    +
      +
    • adjust scripts to new naming convention

    • +
    +
  • +
  • 2015-05-11 Benedikt Hegner

    +
      +
    • rename albers into podio

    • +
    +
  • +
  • 2015-04-24 Benedikt Hegner

    +
      +
    • add CollectionBase to dictionaries

    • +
    +
  • +
  • 2015-04-22 Benedikt Hegner

    +
      +
    • add new tests; feature complete for lcio

    • +
    • next step towards lcio modelling

    • +
    • prepare for future vector member feature

    • +
    • removing deprecated method for supporting XYZHandle convention

    • +
    • upgrading the lcio layout

    • +
    • add more buildin types

    • +
    • removed code duplication in code generation

    • +
    • complete testing of single references

    • +
    • remove debug printout for the garbage collection

    • +
    +
  • +
  • 2015-04-21 Benedikt Hegner

    +
      +
    • adding std::array support

    • +
    • update code templates for new refs

    • +
    +
  • +
  • 2015-04-20 Benedikt Hegner

    +
      +
    • streamline definition syntax

    • +
    • Merge branch ‘master’ of github.com:hegner/albers

    • +
    • remove wrongly committed files

    • +
    +
  • +
  • 2015-04-20 Pere Mato

    +
      +
    • Minor changes in CMakeLists.txt to cope with XCode generation

    • +
    • don’t use the factory of the collection to create hits and refs

    • +
    • clarify namespace

    • +
    • update examples w/ new code generation

    • +
    • properly set relation vectors in push_back

    • +
    • create constructor with full signature

    • +
    +
  • +
  • 2015-04-19 Benedikt Hegner

    +
      +
    • vector member code #1

    • +
    • whitespace fix

    • +
    • first step towards lcio yaml file

    • +
    +
  • +
  • 2015-04-17 Benedikt Hegner

    +
      +
    • trivial python wrapper for event store

    • +
    • add simple non-existence check

    • +
    • add some doc strings

    • +
    • start using IReader

    • +
    • use method names acquire/release in ObjBase

    • +
    • add more docs

    • +
    • unify ref-counting behaviour

    • +
    • let XXXObj create relation collections themselves

    • +
    • add cloning and better initialization; aligning method implementation order with declaration order

    • +
    +
  • +
  • 2015-04-16 Benedikt Hegner

    +
      +
    • add proper destructor for XXXObj

    • +
    • add header needed for gcc

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • introducing ObjBase

    • +
    +
  • +
  • 2015-04-16 Pere Mato

    +
      +
    • test target is reserved from CMake > 3.0

    • +
    • Simplify CMakeLists files making use of ROOTConfig.cmake (ROOT build with CMake)

    • +
    • move delete command for Obj into the ref counting method

    • +
    • inline trivial setters and getters

    • +
    +
  • +
  • 2015-04-15 Benedikt Hegner

    +
      +
    • improve documentation

    • +
    • add doxygen target

    • +
    • whitespace

    • +
    • remove unneeded headers

    • +
    • fix gcc warnings

    • +
    • move to ROOT 6 on linux

    • +
    +
  • +
  • 2015-04-14 Benedikt Hegner

    +
      +
    • allow cyclic dependencies between collections and objects

    • +
    • setting collection ID on read

    • +
    • deprecate registry

    • +
    • first step towards deprecation of Registry

    • +
    • rename FooEntry classes to FooObj

    • +
    • fix cmake

    • +
    • next simplification of class generator; move more code into templates

    • +
    • first step towards simplified class generator

    • +
    • break circular header dependency in case types have references to the same type

    • +
    +
  • +
  • 2015-04-13 Benedikt Hegner

    +
      +
    • add handling of improper refs on writing

    • +
    • move implementations into cc file

    • +
    • add documentation draft; whitespace cleanup

    • +
    • add some comments

    • +
    • add some comments

    • +
    • rename event store methods

    • +
    • remove deprecated methods from Registry

    • +
    • fixing wrong whitespace

    • +
    • upgrade to new API supporting free-floating objects

    • +
    +
  • +
  • 2015-04-01 Benedikt Hegner

    +
      +
    • add newline at the end of the file

    • +
    +
  • +
  • 2014-12-11 Colin Bernet

    +
      +
    • Merge pull request #24 from cbernet/clone

    • +
    +
  • +
  • 2014-12-11 Colin

    +
      +
    • can clone an existing handle into a new collection.

    • +
    +
  • +
  • 2014-12-04 Colin Bernet

    +
      +
    • Merge pull request #23 from cbernet/edm_1

    • +
    +
  • +
  • 2014-12-03 Colin

    +
      +
    • removed getters and accessors from Handle

    • +
    • edm v1 compiles and runs.

    • +
    • class generation: can now have components inside components

    • +
    • uniform syntax for members

    • +
    +
  • +
  • 2014-12-02 Colin

    +
      +
    • edm_1 done, but need to review naming scheme and simplify a bit

    • +
    • started to work on first detailed edm prototype.

    • +
    +
  • +
  • 2014-12-02 Benedikt Hegner

    +
      +
    • remove incomplete relation code; was accidental commit

    • +
    +
  • +
  • 2014-11-26 Benedikt Hegner

    +
      +
    • adjusted to new structure of headers

    • +
    +
  • +
  • 2014-10-26 Benedikt Hegner

    +
      +
    • make friend declaration confirm standard; needed by genreflex

    • +
    +
  • +
  • 2014-10-24 hegner

    +
      +
    • Merge pull request #22 from hegner/master

    • +
    +
  • +
  • 2014-10-24 Benedikt Hegner

    +
      +
    • fix warnings

    • +
    • Merge pull request #21 from hegner/master

    • +
    • fix merge problems at runtime

    • +
    • revert to original data model setup

    • +
    • merge HEAD

    • +
    • towards n-to-n relation improvements; make class generator create other directory structure

    • +
    +
  • +
  • 2014-10-10 Colin

    +
      +
    • fixes for python import

    • +
    +
  • +
  • 2014-10-10 Colin Bernet

    +
      +
    • Merge pull request #20 from cbernet/python

    • +
    • added python specific stuff to install scripts

    • +
    • Merge pull request #19 from cbernet/python

    • +
    +
  • +
  • 2014-10-09 Colin

    +
      +
    • reader can now navigate directly to a given event number

    • +
    +
  • +
  • 2014-10-07 Colin Bernet

    +
      +
    • Merge pull request #18 from cbernet/python

    • +
    +
  • +
  • 2014-10-07 Colin

    +
      +
    • python read example ready

    • +
    • Merge branch ‘python’ of github.com:cbernet/albers into python

    • +
    • code more pythonic; unittests

    • +
    • python event store working

    • +
    +
  • +
  • 2014-10-06 Colin Bernet

    +
      +
    • Merge pull request #17 from cbernet/python

    • +
    • Update README.md

    • +
    +
  • +
  • 2014-10-06 Colin

    +
      +
    • handles working in python

    • +
    • added python test file

    • +
    +
  • +
  • 2014-10-02 Colin Bernet

    +
      +
    • Merge pull request #16 from cbernet/leptons

    • +
    +
  • +
  • 2014-10-02 Colin

    +
      +
    • added a muon to the event, and computing its isolation.

    • +
    • added print operator for ParticleHandle in utilities

    • +
    • Merge pull request #15 from cbernet/more_utility

    • +
    • bug fix in Collections. particle overlap checking based on handles

    • +
    +
  • +
  • 2014-10-01 Colin

    +
      +
    • write and read on 100000 events. solved rare problems by setting an eta cut in the generator.

    • +
    +
  • +
  • 2014-10-01 Colin Bernet

    +
      +
    • Merge pull request #14 from cbernet/dummy_generator

    • +
    • Dummy generator generates two jets

    • +
    • on-demand reading tested in read example

    • +
    • now using only the jets and the particles from the DummyGenerator

    • +
    • Merge pull request #13 from cbernet/coll_in_registry

    • +
    • CollectionBase pointers now registered in Registry. Changed writer interface

    • +
    • added first version of a dummy multijet event generator

    • +
    +
  • +
  • 2014-09-30 Colin

    +
      +
    • new utility functions. < operator for handles.

    • +
    +
  • +
  • 2014-09-29 Colin

    +
      +
    • Jet and vector utility functions used in write and read

    • +
    • print functions for Collections, and first utility functions

    • +
    +
  • +
  • 2014-09-28 Benedikt Hegner

    +
      +
    • take last element and increment by one for end iterator

    • +
    • fix bug of invalid references in user land

    • +
    +
  • +
  • 2014-09-27 Benedikt Hegner

    +
      +
    • next step towards one-to-many-relations; collection has proper members now

    • +
    • update and clean templates

    • +
    • add first part of one-to-many capabilities to POD and Handle

    • +
    +
  • +
  • 2014-09-25 Colin

    +
      +
    • using the new datamodel in read and write. Reading problem at first event!

    • +
    • developed data model

    • +
    +
  • +
  • 2014-09-25 Colin Bernet

    +
      +
    • Merge pull request #12 from cbernet/few_easy_mods

    • +
    • macos X initialization script

    • +
    • Merge branch ‘master’ into merge_attempt

    • +
    +
  • +
  • 2014-09-24 Benedikt Hegner

    +
      +
    • change syntax for data generation; part 1

    • +
    +
  • +
  • 2014-09-24 Colin

    +
      +
    • a bit of clean up

    • +
    +
  • +
  • 2014-09-23 Benedikt Hegner

    +
      +
    • simplify the structure of the PODs; now really look like structs

    • +
    • add functionality of defining components; simplify datamodel example and writer code

    • +
    • fix pedantic compilation warning

    • +
    +
  • +
  • 2014-09-23 Colin Bernet

    +
      +
    • Merge pull request #11 from cbernet/event_loop

    • +
    +
  • +
  • 2014-09-23 Colin

    +
      +
    • event loop in reader working, but messy ! overall design to be clarified

    • +
    • bug fix: not writing to TFile anymore just after filling the tree

    • +
    • Merge pull request #10 from cbernet/event_loop

    • +
    • implemented event loop in writer. big performance issue

    • +
    • Merge pull request #9 from cbernet/simple_edm

    • +
    +
  • +
  • 2014-09-22 Colin

    +
      +
    • example mains adapted to new EDM

    • +
    • bug fix for multiple includes

    • +
    • realistic data model

    • +
    +
  • +
  • 2014-09-22 Colin Bernet

    +
      +
    • Merge pull request #8 from cbernet/auto_handle_ptr

    • +
    • buffer address in embedded handles set in prepareAfterRead automatically

    • +
    • initialed collectionID to 0, and improved const-correctness

    • +
    • collection id is now unsigned

    • +
    • Merge pull request #7 from cbernet/macos_build_merge

    • +
    • Merge branch ‘macos_build’ into macos_build_merge

    • +
    • Merge branch ‘master’ of github.com:HEP-FCC/albers

    • +
    • conditional for mac os x

    • +
    • able to build on macos, need to test lxplus6

    • +
    +
  • +
  • 2014-09-21 Colin Bernet

    +
      +
    • reformatted README properly

    • +
    +
  • +
  • 2014-09-21 Colin

    +
      +
    • commented the code: Reader, Handle

    • +
    +
  • +
  • 2014-09-19 Colin

    +
      +
    • Merge branch ‘documentation’ of github.com:cbernet/albers into documentation

    • +
    +
  • +
  • 2014-09-18 Colin

    +
      +
    • documentation and questions: EventStore, Collection, Registry, Writer

    • +
    • documentation and questions: EventStore, Collection, Registry

    • +
    • added an environment setup script

    • +
    +
  • +
  • 2014-09-17 Colin

    +
      +
    • more specific installation instructions

    • +
    • added a particle class, aiming for a Z boson example

    • +
    +
  • +
  • 2014-09-17 Benedikt Hegner

    +
      +
    • fix for the fact that yaml parsing doesn’t preserve ordering

    • +
    +
  • +
  • 2014-09-16 Benedikt Hegner

    +
      +
    • rearrange the example

    • +
    +
  • +
  • 2014-09-15 Benedikt Hegner

    +
      +
    • fix md

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • add initial descriptions

    • +
    • make it so

    • +
    +
  • +
  • 2014-09-15 hegner

    +
      +
    • Initial commit

    • +
    +
  • +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/_static/_sphinx_javascript_frameworks_compat.js b/v00-00-00/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/v00-00-00/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v00-00-00/_static/basic.css b/v00-00-00/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/v00-00-00/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v00-00-00/_static/check-solid.svg b/v00-00-00/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/v00-00-00/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/v00-00-00/_static/clipboard.min.js b/v00-00-00/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/v00-00-00/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/v00-00-00/_static/copybutton.css b/v00-00-00/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/v00-00-00/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/v00-00-00/_static/copybutton.js b/v00-00-00/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/v00-00-00/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/v00-00-00/_static/copybutton_funcs.js b/v00-00-00/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/v00-00-00/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/v00-00-00/_static/css/badge_only.css b/v00-00-00/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/v00-00-00/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v00-00-00/_static/css/fonts/Roboto-Slab-Bold.woff b/v00-00-00/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/v00-00-00/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v00-00-00/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v00-00-00/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/v00-00-00/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v00-00-00/_static/css/fonts/Roboto-Slab-Regular.woff b/v00-00-00/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/v00-00-00/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v00-00-00/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v00-00-00/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/v00-00-00/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v00-00-00/_static/css/fonts/fontawesome-webfont.eot b/v00-00-00/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/v00-00-00/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v00-00-00/_static/css/fonts/fontawesome-webfont.svg b/v00-00-00/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/v00-00-00/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v00-00-00/_static/css/fonts/fontawesome-webfont.ttf b/v00-00-00/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/v00-00-00/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v00-00-00/_static/css/fonts/fontawesome-webfont.woff b/v00-00-00/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/v00-00-00/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v00-00-00/_static/css/fonts/fontawesome-webfont.woff2 b/v00-00-00/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/v00-00-00/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v00-00-00/_static/css/fonts/lato-bold-italic.woff b/v00-00-00/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v00-00-00/_static/css/fonts/lato-bold-italic.woff2 b/v00-00-00/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v00-00-00/_static/css/fonts/lato-bold.woff b/v00-00-00/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-bold.woff differ diff --git a/v00-00-00/_static/css/fonts/lato-bold.woff2 b/v00-00-00/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-bold.woff2 differ diff --git a/v00-00-00/_static/css/fonts/lato-normal-italic.woff b/v00-00-00/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v00-00-00/_static/css/fonts/lato-normal-italic.woff2 b/v00-00-00/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v00-00-00/_static/css/fonts/lato-normal.woff b/v00-00-00/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-normal.woff differ diff --git a/v00-00-00/_static/css/fonts/lato-normal.woff2 b/v00-00-00/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/v00-00-00/_static/css/fonts/lato-normal.woff2 differ diff --git a/v00-00-00/_static/css/theme.css b/v00-00-00/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/v00-00-00/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/v00-00-00/_static/doctools.js b/v00-00-00/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/v00-00-00/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v00-00-00/_static/documentation_options.js b/v00-00-00/_static/documentation_options.js new file mode 100644 index 000000000..1823c1bde --- /dev/null +++ b/v00-00-00/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: false, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v00-00-00/_static/file.png b/v00-00-00/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/v00-00-00/_static/file.png differ diff --git a/v00-00-00/_static/jquery.js b/v00-00-00/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/v00-00-00/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v00-00-00/_static/js/html5shiv.min.js b/v00-00-00/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/v00-00-00/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v00-00-00/_static/js/theme.js b/v00-00-00/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/v00-00-00/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v00-00-00/_static/minus.png b/v00-00-00/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/v00-00-00/_static/minus.png differ diff --git a/v00-00-00/_static/plus.png b/v00-00-00/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/v00-00-00/_static/plus.png differ diff --git a/v00-00-00/_static/pygments.css b/v00-00-00/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/v00-00-00/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v00-00-00/_static/searchtools.js b/v00-00-00/_static/searchtools.js new file mode 100644 index 000000000..7918c3fab --- /dev/null +++ b/v00-00-00/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v00-00-00/_static/sphinx_highlight.js b/v00-00-00/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/v00-00-00/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v00-00-00/advanced_topics.html b/v00-00-00/advanced_topics.html new file mode 100644 index 000000000..20c5edad8 --- /dev/null +++ b/v00-00-00/advanced_topics.html @@ -0,0 +1,452 @@ + + + + + + + Advanced Topics — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Advanced Topics

+
+

Writing extra data outside the EDM

+

See here

+
+
+

Changing / creating new templates

+

See here

+
+
+

Persistency

+

The library is build such that it can support multiple storage backends. However, the tested storage system being used is ROOT. +The following explains the requirements for a user-provided storage back-end.

+
+

Writing Back-End

+

There is no interface a writing class has to fulfill. It only needs to take advantage of the interfaces provided in PODIO. To persistify a collection, three pieces of information have to be stored:

+
    +
  1. the ID of the collection,

  2. +
  3. the vector of PODs in the collection, and

  4. +
  5. the relation information in the collection

  6. +
+

Before writing out a collection, the data need to be put into the proper structure. For this, the method prepareForWrite needs to be invoked. In the case of trivial POD members this results in a no-op. In case, the collection contains references to other collections, the pointers are being translated into collID:objIndex pairs. A serialization solution would - in principle - then look like this:

+
     collection->prepareForWrite();
+     void* buffer = collection->getBufferAddress();
+     auto refCollections = collection->referenceCollections();
+     // ...
+     //   write buffer, collection ID, and refCollections
+     // ...
+
+
+
+
+

Reading Back-End

+

The main requirement for a reading backend is its capability of reading back all +the necessary data from which a collection can be constructed in the form of +podio::CollectionReadBuffers. From these buffers collections can then be +constructed. Each instance has to contain the (type erased) POD buffers (as a +std::vector), the (possibly empty) vectors of podio::ObjectIDs that contain +the relation information as well the (possibly empty) vectors for the vector +member buffers, which are currently stored as pairs of the type (as a +std::string) and (type erased) data buffers in the form of std::vectors.

+
+
+

Dumping JSON

+

It is possible to turn on an automatic conversion to JSON for podio generated datamodels using the nlohmann/json library. +To enable this feature the core datamodel library has to be compiled with the PODIO_JSON_OUTPUT and linked against the nlohmann/json library (needs at least version 3.10). +In cmake the necessary steps are (assuming that datamodel is the datamodel core library)

+
find_library(nlohmann_json 3.10 REQUIRED)
+target_link_library(datamodel PUBLIC nlohmann_json::nlohmann_json)
+target_compile_definitions(datamodel PUBLIC PODIO_JSON_OUTPUT)
+
+
+

With JSON support enabled it is possible to convert collections (or single objects) to JSON simply via

+
#include "nlohmann/json.hpp"
+
+auto collection = // get collection from somewhere
+
+nlohmann::json json{
+   {"collectionName", collection}
+};
+
+
+

Each element of the collection will be converted to a JSON object, where the keys are the same as in the datamodel definiton. +Components contained in the objects will similarly be similarly converted.

+

JSON is not foreseen as a mode for persistency, i.e. there is no plan to add the conversion from JSON to the in memory representation of the datamodel.

+
+
+
+

Thread-safety

+

PODIO was written with thread-safety in mind and avoids the usage of globals and statics. +However, a few assumptions about user code and use-patterns were made. +The following lists the caveats of the library when it comes to parallelization.

+
+

Changing user data

+

As explained in the section about mutability of data, thread-safety is only guaranteed if data are considered read-only after creation.

+
+
+

Serialization

+

During the calls of prepareForWriting and prepareAfterReading on collections other operations like object creation or addition will lead to an inconsistent state.

+
+
+

Not-thread-safe components

+

The Readers and Writers that ship with podio are assumed to run on a single +thread only (more precisely we assume that each Reader or Writer doesn’t have to +synchronize with any other for file operations).

+
+
+
+

Running pre-commit

+
    +
  • Install pre-commit

    +

    $ pip install pre-commit

    +
  • +
  • Run pre-commit manually

    +

    $ pre-commit run --all-files

    +
  • +
+
+
+

Retrieving the EDM definition from a data file

+

It is possible to get the EDM definition(s) that was used to generate the +datatypes that are stored in a data file. This makes it possible to re-generate +the necessary code and build all libraries again in case they are not easily +available otherwise. To see which EDM definitions are available in a data file +use the podio-dump utility

+
podio-dump <data-file>
+
+
+

which will give an (exemplary) output like this

+
input file: <data-file>
+
+EDM model definitions stored in this file: edm4hep
+
+[...]
+
+
+

To actually dump the model definition to stdout use the --dump-edm option +and the name of the datamodel you want to dump:

+
podio-dump --dump-edm edm4hep <data-file> > dumped_edm4hep.yaml
+
+
+

Here we directly redirected the output to a yaml file that can then again be +used by the podio_class_generator.py to generate the corresponding c++ code +(or be passed to the cmake macros).

+

Note that the dumped EDM definition is equivalent but not necessarily exactly +the same as the original EDM definition. E.g. all the datatypes will have all +their fields (Members, OneToOneRelations, OneToManyRelations, +VectorMembers) defined, and defaulted to empty lists in case they were not +present in the original EDM definition. The reason for this is that the embedded +EDM definition is the pre-processed and validated one as described +below

+
+

Accessing the EDM definition programmatically

+

The EDM definition can also be accessed programmatically via the +[ROOT|SIO]FrameReader::getEDMDefinition method. It takes an EDM name as its +single argument and returns the EDM definition as a JSON string. Most likely +this has to be decoded into an actual JSON structure in order to be usable (e.g. +via json.loads in python to get a dict).

+
+
+

Technical details on EDM definition embedding

+

The EDM definition is embedded into the core EDM library as a raw string literal +in JSON format. This string is generated into the DatamodelDefinition.h file as

+
namespace <package_name>::meta {
+static constexpr auto <package_name>__JSONDefinition = R"EDMDEFINITION(<json encoded definition>)EDMDEFINITION";
+}
+
+
+

where <package_name> is the name of the EDM as passed to the +podio_class_generator.py (or the cmake macro). The <json encoded definition> +is obtained from the pre-processed EDM definition that is read from the yaml +file. During this pre-processing the EDM definition is validated, and optional +fields are filled with empty defaults. Additionally, the includeSubfolder +option will be populated with the actual include subfolder, in case it has been +set to True in the yaml file. Since the json encoded definition is generated +right before the pre-processed model is passed to the class generator, this +definition is equivalent, but not necessarily equal to the original definition.

+
+

The DatamodelRegistry

+

To make access to information about currently loaded and available datamodels a +bit easier the DatamodelRegistry (singleton) keeps a map of all loaded +datamodels and provides access to this information possible. In this context we +refer to an EDM as the shared library (and the corresponding public headers) +that have been compiled from code that has been generated from a datamodel +definition in the original YAML file. In general whenever we refer to a +datamodel in this context we mean the enitity as a whole, i.e. its definition +in a YAML file, the concrete implementation as an EDM, as well as other related +information that is related to it.

+

Currently the DatamodelRegistry provides mainly access to the original +definition of available datamodels via two methods:

+
const std::string_view getDatamodelDefinition(const std::string& edmName) const;
+
+const std::string_view getDatamodelDefinition(size_t index) const;
+
+
+

where index can be obtained from each collection via +getDatamodelRegistryIndex. That in turn simply calls +<package_name>::meta::DatamodelRegistryIndex::value(), another singleton like object +that takes care of registering an EDM definition to the DatamodelRegistry +during its static initialization. It is also defined in the +DatamodelDefinition.h header.

+

Since the datamodel definition is embedded as a raw string literal into the core +EDM shared library, it is in principle also relatively straight forward to +retrieve it from this library by inspecting the binary, e.g. via

+
readelf -p .rodata libedm4hep.so | grep options
+
+
+

which will result in something like

+
  [   300]  {"options": {"getSyntax": true, "exposePODMembers": false, "includeSubfolder": "edm4hep/"}, "components": {<...>}, "datatypes": {<...>}}
+
+
+
+
+

I/O helpers for EDM definition storing

+

The podio/utilities/DatamodelRegistryIOHelpers.h header defines two utility +classes, that help with instrumenting readers and writers with functionality to +read and write all the necessary EDM definitions.

+
    +
  • The DatamodelDefinitionCollector is intended for usage in writers. It +essentially collects the datamodel definitions of all the collections it encounters. +The registerDatamodelDefinition method it provides should be called with every collection +that is written. The getDatamodelDefinitionsToWrite method returns a vector of all +datamodel names and their definition that were encountered during writing. It is +then the writers responsibility to actually store this information into the +file.

  • +
  • The DatamodelDefinitionHolder is intended to be used by readers. It +provides the getDatamodelDefinition and getAvailableDatamodels methods. +It is again the readers property to correctly populate it with the data it +has read from file. Currently the SIOFrameReader and the ROOTFrameReader +use it and also offer the same functionality as public methods with the help +of it.

  • +
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/contributing.html b/v00-00-00/contributing.html new file mode 100644 index 000000000..4cee600f2 --- /dev/null +++ b/v00-00-00/contributing.html @@ -0,0 +1,298 @@ + + + + + + + Contributing to PODIO — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Contributing to PODIO

+

Please read these guidelines if you want to contribute to the PODIO project.

+
+

Git workflow

+

For PODIO we would like to follow a so called “No Switch Yard” (NoSY) workflow.

+

In essence this means that you develop your (small) new feature in a dedicated +feature branch that is kept up to date with the master branch until you create +a PR, as we only allow rebase merges for PRs.

+
+

Example workflow

+
    +
  • checkout a copy of PODIO from the origin at AIDASoft:

    +

    git clone https://github.com/AIDASoft/podio.git +cd podio

    +
  • +
  • create a fork of the repository on the Github web page

    +
      +
    • if you have not yet done so earlier

    • +
    +
  • +
  • add your fork as remote downstream using your Github username

    +
    git remote add downstream  https://<yourUserName>@github.com/<yourUserName>/podio.git
    +
    +
    +
  • +
  • create a new feature branch; choose a meaningful name

    +
    git checkout -b <myNewBranch>
    +
    +
    +
  • +
  • make the changes to existing files (or add new ones) and frequently keep up to date with the master:

    +
    git fetch origin; git rebase origin/master
    +
    +
    +
  • +
  • after having committed everything to your new branch, push it to your fork of PODIO:

    +
    git push downstream <myNewBranch>
    +
    +
    +
  • +
  • reload your own github website (https://github.com//podio)

    +
      +
    • you should see your commit

    • +
    • now you can create a pull request on the web site

    • +
    +
  • +
+
+
+

Release Notes

+

Please make sure you fill in meaningful release notes in the comment field that is +provided at the Github web page when creating the PR, e.g.

+
BEGINRELEASENOTES
+- updated documentation
+    - add guidelines for contributing
+- reverted some name changes in tests/examples
+    - `read-one` now again called `read`
+
+ENDRELEASENOTES
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/datamodel_syntax.html b/v00-00-00/datamodel_syntax.html new file mode 100644 index 000000000..12b0bf56a --- /dev/null +++ b/v00-00-00/datamodel_syntax.html @@ -0,0 +1,395 @@ + + + + + + + Data Models and Data Model Definitions — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Models and Data Model Definitions

+

To describe a data model PODIO provides a data model definition syntax. +This is to ease the creation of optimised data formats, which may take advantage of a so-called struct-of-array data layout. +From the user-provided data model description PODIO creates all the files necessary to use this data model.

+
+

Basic Concepts and Supported Features

+

PODIO encourages the usage of composition, rather than inheritance. +One of the reasons for doing so is the focus on efficiency friendly plain-old-data. +For this reason, PODIO does not support inheritance within the defined data model. +Instead, users can combine multiple components to build a to be used datatype.

+

To allow the datatypes to be real PODs, the data stored within the data model are constrained to be +POD-compatible data. Those are

+
    +
  1. basic types like int, double, etc as well as a limited set of fixed width +integers from <cstdint> (the _leastN or _fastN types as well as all +8 bit types are not allowed).

  2. +
  3. components built up from basic types or other components

  4. +
  5. Fixed sized arrays of those types

  6. +
+

In addition, PODIO supports the storage of one-to-one and one-to-many relations between objects. +In the following the syntax for defining a given data model is explained. +A later section contains more details about the code being created from this.

+
+
+

Definition of custom components

+

A component is just a flat struct containing data. it can be defined via:

+
    components:
+      # My example component
+      MyComponent:
+        Members:
+          - float x
+          - float y
+          - float z
+          - AnotherComponent a
+
+
+
+
+

Definition of custom data classes

+

Here an excerpt from “datamodel.yaml” for a simple class, just containing one member of the type int.

+
    datatypes :
+      EventInfo :
+        Description : "My first data type"
+        Author : "It's me"
+        Members :
+        - int Number // event number
+
+
+

Using this definition, three classes will be created: EventInfo, EventInfoData and EventInfoCollection. These have the following signature:

+
    class EventInfoData {
+      public:
+        int Number;
+    }
+
+    class EventInfo {
+      public:
+      ...
+        int Number() const;
+        void Number(int);
+      ...
+    }
+
+
+
+

Defining members

+

The definition of a member is done in the Members section in the form:

+
    Members:
+      <type> <name> // <comment>
+
+
+

where type can be any builtin-type or a component.

+

It is also possible to specify default values for members via

+
    Members:
+      <type> <name>{<default-value>} // <comment>
+
+
+

Note that in this case it is extremely expensive to check whether the provided default-value results in valid c++. +Hence, there is only a very basic syntax check, but no actual type check, and wrong default values will be caught only when trying to compile the datamodel.

+

For describing physics quantities it is important to know their units. Thus it is possible to add the units to the member definition:

+
    Members:
+      <type> <name>{<default-value>} [<unit>] // <comment>
+
+
+
+
+

Definition of references between objects:

+

There can be one-to-one-relations and one-to-many relations being stored in a particular class. This happens either in the OneToOneRelations or OneToManyRelations section of the data definition. The definition has again the form:

+
    OneToOneRelations:
+      <type> <name> // <comment>
+    OneToManyRelations:
+      <type> <name> // <comment>
+
+
+
+
+

Explicit definition of methods

+

In a few cases, it makes sense to add some more functionality to the created classes. Thus this library provides two ways of defining additional methods and code. Either by defining them inline or in external files. Extra code has to be provided separately for immutable and mutable additions. +Note that the immutable (ExtraCode) will also be placed into the mutable classes, so that there is no need for duplicating the code. +Only if some additions should only be available for the mutable classes it is necessary to fill the MutableExtraCode section. +The includes will be add to the header files of the generated classes.

+
    ExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+    MutableExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+
+
+

The code being provided has to use the macro {name} in place of the concrete name of the class.

+
+
+
+

Global options

+

Some customization of the generated code is possible through flags. These flags are listed in the section options:

+
    options:
+      getSyntax: False
+      exposePODMembers: True
+    components:
+      # My simple component
+      ExampleComponent:
+        Members:
+          - int x
+    datatypes:
+      ExampleType:
+        Description: "My datatype with a component member"
+        Author: "Mr me"
+        Members:
+         - ExampleComponent comp // component from above
+
+
+
    +
  • getSyntax: steers the naming of get and set methods. If set to true, methods are prefixed with get and set following the capitalized member name, otherwise the member name is used for both.

  • +
  • exposePODMembers: whether get and set methods are also generated for members of a member-component. In the example corresponding methods would be generated to directly set / get x through ExampleType.

  • +
+
+
+

Extending a datamodel / using types from an upstream datamodel

+

It is possible to extend another datamodel with your own types, resp. use some datatypes or components from an upstream datamodel in your own datamodel. +This can be useful for prototyping new datatypes or for accomodating special requirements without having to reimplement / copy a complete datamodel.

+

To pass an upstream datamodel to the class generator use the --upstream-edm option that takes the package name as well as the yaml definition file of the upstream datamodel separated by a colon (‘:’). +This will effectively make all components and datatypes of the upstream datamodel available to the current definition for validation and generation of the necessary includes. +Nevertheless, only the code for the datatypes and components defined in the current yaml file will be generated. +The podio PODIO_GENERATE_DATAMODEL cmake macro has gained an additional parameter UPSTREAM_EDM to pass the arguments to the generator via the cmake macros.

+
+

Potential pitfalls

+
    +
  • The cmake macros do not handle linking against an upstream datamodel automatically. It is the users responsibility to explicitly link against the upstream datamodel.

  • +
  • When generating two datamodels side-by-side and into the same output directory and using the ROOT backend, the generated selection.xml file might be overwritten if both datamodels are generated into the same output directory.

  • +
+

Limiting this functionality to one upstream datamodel is a conscious choice to limit the potential for abuse of this feature.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/design.html b/v00-00-00/design.html new file mode 100644 index 000000000..5627d0adc --- /dev/null +++ b/v00-00-00/design.html @@ -0,0 +1,298 @@ + + + + + + + Design and Implementation Details — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Design and Implementation Details

+

The driving considerations for the PODIO design are:

+
    +
  1. the concrete data are contained within plain-old-data structures (PODs)

  2. +
  3. user-exposed data types are concrete and do not use inheritance

  4. +
  5. The C++ and Python interface should look as close as possible

  6. +
  7. The user does not do any explicit memory management

  8. +
  9. Classes are generated using a higher-level abstraction and code generators

  10. +
+

The following sections give some more technical details and explanations for the design choices. +More concrete implementation details can be found in the doxygen documentation.

+
+

Layout of Objects

+

The data model is based on four different kind of objects and layers, namely

+
    +
  1. user visible (physics) classes (e.g. Hit). These act as transparent references to the underlying data,

  2. +
  3. a transient object knowing about all data for a certain physics object, including inter-object relations (e.g. HitObject),

  4. +
  5. a plain-old-data (POD) type holding the persistent object information (e.g. HitData), and

  6. +
  7. a user-visible collection containing the physics objects (e.g. HitCollection).

  8. +
+

These layers are described in the following.

+
+

The User Layer

+

The user visible objects (e.g. Hit) act as light-weight references to the underlying data, and provide the necessary user interface. They come in two flavors, mutable and immutable, where the mutable classes are easily recognizable by their name (e.g. MutableHit). +Mutable classes are implicitly converted to immutable ones if necessary, so that interfaces that require only reading access to the data should always use the immutable classes. Only in cases where explicit mutability of the objects is required should mutable classes appear in interface definitions.

+

For each of the data-members and OneToOneRelations declared in the data model definition, corresponding getters (and setters for the mutable classes) are generated. +For each of the OneToManyRelations and VectorMembers a vector-like interface is provided.

+

With the chosen interface, the code written in C++ and Python looks almost identical, if taking proper advantage of the auto keyword.

+
+
+

The Internal Data Layer

+

The internal objects give access to the object data, i.e. the POD, and the references to other objects. +These objects inherit from podio::ObjBase, which takes care of object identification (podio::ObjectID), and object-ownership. The ObjectID consists of the index of the object and an ID of the collection it belongs to. If the object does not belong to a collection yet, the data object owns the POD containing the real data, otherwise the POD is owned by the respective collection. For details about the inter-object references and their handling within the data objects please see below.

+
+
+

The POD Layer

+

The plain-old-data (POD) contain just the data declared in the Members section of the datamodel definition as well as some bookkeeping data for data types with OneToManyRelations or VectorMembers. Ownership and lifetime of the PODs is managed by the other parts of the infrastructure, namely the data objects and the data collections.

+
+
+

The Collections

+

The collections created serve three purposes:

+
    +
  1. giving access to or creating the data items

  2. +
  3. preparing objects for writing into PODs or preparing them after reading

  4. +
  5. support for the so-called notebook pattern

  6. +
+

When used via the so called factory pattern (i.e. using the create function to create new objects) a collection will return mutable objects. +It is important to note that objects that are “owned” by a collection (i.e. they are either created via create or they are added to the collection via push_back) become invalid and can no longer be used once a collection is cleared.

+
+
+

Vectorization support / notebook pattern

+

As an end-user oriented library, PODIO provides only a limited support for struct-of-arrays (SoA) memory layouts. In the vision, that the data used for heavy calculations is best copied locally, the library provides convenience methods for extracting the necessary information from the collections. More details can be found in the examples section of this document.

+
+
+
+

Handling mutability

+

Depending on the policy of the client of PODIO, data collections may be read-only after creation, or may be altered still. +While the base assumption of PODIO is that once-created collections are immutable once leaving the scope of its creator, +it still allows for explicit unfreezing collections afterwards. +This feature has to handled with care, as it heavily impacts thread-safety.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/doc.html b/v00-00-00/doc.html new file mode 100644 index 000000000..40156c21e --- /dev/null +++ b/v00-00-00/doc.html @@ -0,0 +1,247 @@ + + + + + + + Introduction — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Introduction

+

PODIO, or plain-old-data I/O, is a C++ library to support the creation and handling of data models in particle physics. It is based on the idea of employing plain-old-data (POD) data structures wherever possible, while avoiding deep-object hierarchies and virtual inheritance. This is to both improve runtime performance and simplify the implementation of persistency services.

+

At the same time it provides the necessary high-level functionality to the physicist, such as support for inter-object relations, and automatic memory-management. In addition, it provides a (ROOT assisted) Python interface. To simplify the creation of efficient data models, PODIO employs code generation from a simple yaml-based markup syntax.

+

To support the usage of modern software technologies, PODIO was written with concurrency in mind and gives basic support for vectorization technologies.

+

This document describes first how to define and create a specific data model, then how to use the created data. Afterwards it will explain the overall design and a few of the technical details of the implementation.

+

Many of the design choices are inspired by previous experience of the LCIO package used for the studies of the international linear collider, and the Gaudi Object Description applied in the LHCb collaboration at the LHC.

+
+
+

Quick-start

+

An up-to-date installation and quick start guide for the impatient user can be found on the PODIO github page.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/doc_title.html b/v00-00-00/doc_title.html new file mode 100644 index 000000000..6bddf000e --- /dev/null +++ b/v00-00-00/doc_title.html @@ -0,0 +1,247 @@ + + + + + + + <no title> — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

\begin{titlepage} +\begin{center}

+

\vspace*{2.5cm}

+

\huge +PODIO - the POD I/O Library\ +Design Document v1.0

+

\vspace{0.5cm}

+

\normalsize +30.6.2016

+

\vspace{1cm}

+

Benedikt Hegner (CERN)\ +Frank Gaede (DESY)

+

\end{center} +\end{titlepage}

+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/examples.html b/v00-00-00/examples.html new file mode 100644 index 000000000..6e8ceda11 --- /dev/null +++ b/v00-00-00/examples.html @@ -0,0 +1,370 @@ + + + + + + + Examples for Supported Interface — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Examples for Supported Interface

+

The following snippets show the support of PODIO for the different use cases as +well as some potential pitfalls. These examples are mainly concerned with how +collections of objects and the objects themselve interact. As such they are +framework agnostic.

+
+

Object Ownership

+

Every data created is either explicitly owned by collections or automatically garbage-collected. There is no need for any new or delete call on user side. +As a general rule: If an object has been added to a collection, the collection +assumes ownership and if the collection goes out of scope all handles that point +to objects in this collection are invalidated as well.

+
+
+

Object Creation and Storage

+

Objects and collections can be created via factories, which ensure proper object ownership:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create(1.4,2.4,3.7,4.2);  // init with values
+    auto hit2 = hits.create(); // default-construct object
+    hit2.energy(42.23);
+
+
+

In addition, individual objects can be created in the free. If they aren’t attached to a collection, they are automatically garbage-collected:

+
    auto hit1 = Hit();
+    auto hit2 = Hit();
+    ...
+    hits.push_back(hit1);
+    ...
+    <automatic deletion of hit2>
+
+
+

In this respect all objects behave like objects in Python.

+
+
+

Object References

+

The library supports the creation of one-to-many relations:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create();
+    auto hit2 = hits.create();
+    auto clusters = ClusterCollection{};
+    auto cluster = clusters.create();
+    cluster.addHit(hit1);
+    cluster.addHit(hit2);
+
+
+

The references can be accessed via iterators on the referencing objects

+
    for (auto i = cluster.Hits_begin(), \
+         end = cluster.Hits_end(); i!=end; ++i){
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

or via direct accessors

+
    auto size = cluster.Hits_size();
+    auto hit  = cluster.Hits(<aNumber>);
+
+
+

If asking for an entry outside bounds, a std::out_of_range exception is thrown.

+
+
+

Looping through Collections

+

Looping through collections is supported in two ways. Via iterators:

+
    for(auto i = hits.begin(), end = hits.end(); i != end; ++i) {
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

and via direct object access:

+
    for(int i = 0, end = hits.size(), i != end, ++i){
+      std::cout << hit[i].energy() << std::endl;
+    }
+
+
+
+
+

Support for Notebook-Pattern

+

The notebook pattern uses the assumption that it is better to create a small +copy of only the data that are needed for a particular calculation. This +pattern is supported by providing access like

+
    auto x_array = hits.x();   // returning all values
+    auto y_array = hits.y(10); // or only the first 10 elements
+
+
+

The resulting std::vector can then be used in (auto-)vectorizable code. +Passing in a size argument is optional; If no argument is passed all elements will be returned, +if an argument is passed only as many elements as requested will be returned. +If the collection holds less elements than are requested, only as elements as are available will be returned.

+
+
+

podio::Frame container

+

The podio::Frame is the main container for containing and grouping collections +together. It has two main methods:

+
    /// Store a collection
+    template<typename T>
+    const T& put(T&& coll, const std::string& name);
+
+    /// access a collection
+    template<typename T>
+    const& T get(const std::string& name);
+
+
+

Note that for putting collections into the Frame an explicit std::move is +necessary to highlight the change of ownership that happens in this case.

+
+
+

Object Retrieval

+

Collections can be retrieved explicitly:

+
    auto& hits = frame.get<HitCollection>("hits");
+    if (hits.isValid()) { ... }
+
+
+

Or implicitly when following an object reference. In both cases the access to data that has been retrieved is const.

+
+
+

User defined Meta Data

+

Sometimes it is necessary or useful to store additional data that is not directly foreseen in the EDM. +This could be configuration parameters of simulation jobs, or parameter descriptions like cell-ID encoding etc. PODIO currently allows to store such meta data in terms of a GenericParameters class that +holds an arbitrary number of named parameters of type int, float, string or vectors if these. +Meta data can be stored and retrieved from the Frame via the templated putParameter and getParameter methods.

+
+

Python Interface

+

The Reader and Writer classes in the root_io and sio_io submodules +provide all the necessary functionality to read and write event files. An +example of reading files looks like this:

+
    from podio.root_io import Reader
+    reader = Reader("one or many input files")
+    for event in reader.get("events"):
+      hits = store.get("hits")
+      for hit in hits:
+        # ...
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/frame.html b/v00-00-00/frame.html new file mode 100644 index 000000000..e535fd961 --- /dev/null +++ b/v00-00-00/frame.html @@ -0,0 +1,402 @@ + + + + + + + The Frame concept — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

The Frame concept

+

The podio::Frame is a general data container for collection data of podio generated EDMs. +Additionally, it offers the functionality to store some (limited) data outside of an EDM. +The basic idea of the Frame is to give users of podio the possibility to organize EDM data into logical units and to potentially build a hierarchy of different Frames. +Common examples would be the organisation of data into Events and Runs. +However, it is important to note that podio does really not impose any meaning on any Frame and each Frame is essentially defined by its contents.

+
+

Basic functionality of a Frame

+

The main functionality of a Frame is to store and aggregate EDM collection data and it also offers the possibility to store some generic data alongside. +To ensure thread safety and const-correctness a Frame takes ownership of any data that is put into it and only gives read access to immutable data. +This is mandated by the interface for collection data (simplified here for better readability):

+
struct Frame {
+template<typename CollT>
+const CollT& put(CollT&& coll, const std::string& name);
+
+void put(std::unique_ptr<podio::CollectionBase> coll, const std::string& name);
+
+template<typename CollT>
+const CollT& get(const std::string& name) const;
+
+template<typename T>
+void putParameter(const std::string& name, T value);
+
+template<typename T>
+const T& getParameter(const std::string);
+};
+
+
+

In this case there are two ways to get collection data into the Frame

+
    +
  1. By passing a concrete collection (of type CollT) into the Frame as an rvalue. There are two ways to achieve this, either by passing the return value of a function directly into Frame::put or by explicitly moving it in the call via std::move if you are using a named variable.

  2. +
  3. By passing a std::unique_ptr to a collection. Similar to the first case, this can either be the return value of a function call, or has to be done via std::move (as mandated by the std::unique_ptr interface).

  4. +
+

In both cases, if you passed in a named variable, the user is left with a moved-from object, which has to be in a valid but indefinite state, and cannot be used afterwards. +Some compilers and static code analysis tools are able to detect the accidental usage of moved-from objects.

+

For putting in parameters the basic principle is very similar, with the major difference being, that for trivial types getParameter will actually return by value.

+

For all use cases there is some enable_if machinery in place to ensure that only valid collections and valid parameter types can actually be used. +These checks also make sure that it is impossible to put in collections without handing over ownership to the Frame.

+
+

Usage examples for collection data

+

These are a few very basic usage examples that highlight the main functionality (and potential pitfalls).

+
+

Putting collection data into the Frame

+

In all of the following examples, the following basic setup is assumed:

+
#include "podio/Frame.h"
+
+#include "edm4hep/MCParticleCollection.h" // just to have a concrete example
+
+// create an empty Frame
+auto frame = podio::Frame();
+
+
+

Assuming there is a function that creates an MCParticleCollection putting the return value into the Frame is very simple

+
edm4hep::MCParticleCollection createMCParticles(); // implemented somewhere else
+
+// put the return value of a function into the Frame
+frame.put(createMCParticles(), "particles");
+
+// put the return value into the Frame but keep the const reference
+auto& particles = frame.put(createMCParticles(), "moreParticles");
+
+
+

If working with named variables it is necessary to use std::move to put collections into the Frame. +The Frame will refuse to compile in case a named variable is not moved. +Assuming the same createMCParticles function as above, this looks like the following

+
auto coll = createMCParticles();
+// potentially still modify the collection
+
+// Need to use std::move now that the collection has a name
+frame.put(std::move(coll), "particles");
+
+// Keeping a const reference is also possible
+// NOTE: We are explicitly using a new variable name here
+auto coll2 = createMCParticles();
+auto& particles = frame.put(std::move(coll2), "MCParticles");
+
+
+

At this point only particles is in a valid and defined state.

+
+
+

Getting collection (references) from the Frame

+

Obtaining immutable (const) references to collections stored in the Frame is trivial. +Here we are assuming that the collections are actually present in the Frame.

+
auto& particles = frame.get<edm4hep::MCParticleCollection>("particles");
+
+
+
+
+
+

Usage for Parameters

+

Parameters are using the podio::GenericParameters class behind the scene. +Hence, the types that can be used are int, float, and std::string as well as as std::vectors of those. +For better usability, some overloads for putParameter exist to allow for an in-place construction, like, e.g.

+
// Passing in a const char* for a std::string
+frame.putParameter("aString", "a string value");
+
+// Creating a vector of ints on the fly
+frame.putParameter("ints", {1, 2, 3, 4});
+
+
+
+
+
+

I/O basics and philosophy

+

podio offers all the necessary functionality to read and write Frames. +However, it is not in the scope of podio to organize them into a hierarchy, nor +to maintain such a hierarchy. When writing data to file Frames are written to +the file in the order they are passed to the writer. For reading them back podio +offers random access to stored Frames, which should make it possible to +restore any hierarchy again. The Writers and Readers of podio are supposed to be +run on and accessed by only one single thread.

+
+

Writing a Frame

+

For writing a Frame the writers can ask each Frame for CollectionWriteBuffers for each collection that should be written. +In these buffers the underlying data is still owned by the collection, and by extension the Frame. +This makes it possible to write the same collection with several different writers. +Writers can access a Frame from several different threads, even though each writer is assumed to be on only one thread. +For writing the GenericParameters that are stored in the Frame and for other necessary data, similar access functionality is offered by the Frame.

+
+
+

Reading a Frame

+

When reading a Frame readers do not have to return a complete Frame. +Instead they return a more or less arbitrary type of FrameData that simply has to provide the following public interface.

+
struct FrameData {
+  /// Get a (copy) of the internal collection id table
+  podio::CollectionIDTable getIDTable() const;
+
+  /// Get the buffers to construct the collection with the given name
+  std::optional<podio::CollectionReadBuffers> getCollectionBuffers(const std::string& name);
+
+  /// Get the still available, i.e. yet unpacked, collections from the raw data
+  std::vector<std::string> getAvailableCollections() const;
+
+  /// Get the parameters that are stored in the raw data
+  std::unique_ptr<podio::GenericParameters> getParameters();
+};
+
+
+

A Frame is constructed with a (unique_ptr of such) FrameData and handles everything from there. +Note that the FrameData type of any I/O backend is a free type without inheritance as the Frame constructor is templated on this. +This splitting of reading data from file and constructing a Frame from it later has some advantages:

+
    +
  • Since podio assumes that reading is done single threaded the amount of time that is actually spent in a reader is minimized, as only the file operations need to be done on a single thread. All further processing (potential decompression, unpacking, etc.) can be done on a different thread where the Frame is actually constructed.

  • +
  • It gives different backends the necessary freedom to exploit different optimization strategies and does not force them to conform to an implementation that is potentially detrimental to performance.

  • +
  • It also makes it possible to pass around data from which a Frame can be constructed without having to actually construct one.

  • +
  • Readers do not have to know how to construct collections from the buffers, as they are only required to provide the buffers themselves.

  • +
+
+
+

Schema evolution

+

Schema evolution happens on the CollectionReadBuffers when they are requested from the FrameData inside the Frame. +It is possible for the I/O backend to handle schema evolution before the Frame sees the buffers for the first time. +In that case podio schema evolution becomes a simple check.

+
+
+
+
+

Frame implementation and design

+

One of the main concerns of the Frame is to offer one common, non-templated, interface while still supporting different I/O backends and potentially different policies. +The “classic” approach would be to have an abstract IFrame interface with several implementations that offer the desired functionality (and their small differences). +One problem with that approach is that a purely abstract interface cannot have templated member functions. Hence, the desired type-safe behavior of get and put would be very hard to implement. +Additionally, policies ideally affect orthogonal aspects of the Frame behavior. +Implementing all possible combinations of behaviors through implementations of an abstract interface would lead to quite a bit of code duplication and cannot take advantage of the factorization of the problem. +To solve these problems, we chose to implement the Frame via Type Erasure. +This also has the advantage that the Frame also has value semantics in line with the design of podio.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/genindex.html b/v00-00-00/genindex.html new file mode 100644 index 000000000..3abd3257c --- /dev/null +++ b/v00-00-00/genindex.html @@ -0,0 +1,238 @@ + + + + + + Index — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/index.html b/v00-00-00/index.html new file mode 100644 index 000000000..44479d254 --- /dev/null +++ b/v00-00-00/index.html @@ -0,0 +1,294 @@ + + + + + + + Welcome to PODIO’s documentation! — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/objects.inv b/v00-00-00/objects.inv new file mode 100644 index 000000000..35f908624 Binary files /dev/null and b/v00-00-00/objects.inv differ diff --git a/v00-00-00/search.html b/v00-00-00/search.html new file mode 100644 index 000000000..5ddb4ff3b --- /dev/null +++ b/v00-00-00/search.html @@ -0,0 +1,253 @@ + + + + + + Search — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/v00-00-00/searchindex.js b/v00-00-00/searchindex.js new file mode 100644 index 000000000..ac2a8470f --- /dev/null +++ b/v00-00-00/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["ReleaseNotes", "advanced_topics", "contributing", "datamodel_syntax", "design", "doc", "doc_title", "examples", "frame", "index", "templates", "userdata"], "filenames": ["ReleaseNotes.md", "advanced_topics.md", "contributing.md", "datamodel_syntax.md", "design.md", "doc.md", "doc_title.md", "examples.md", "frame.md", "index.rst", "templates.md", "userdata.md"], "titles": ["v00-17-04", "Advanced Topics", "Contributing to PODIO", "Data Models and Data Model Definitions", "Design and Implementation Details", "Introduction", "<no title>", "Examples for Supported Interface", "The Frame concept", "Welcome to PODIO\u2019s documentation!", "Changing / creating new templates", "Writing extra data outside an EDM"], "terms": {"2023": 0, "tmadlen": 0, "pr": [0, 2], "527": 0, "split": [0, 8, 10], "classgener": 0, "base": [0, 4, 5, 11], "class": [0, 1, 4, 7, 8, 9, 10, 11], "mixin": 0, "two": [0, 1, 3, 4, 7, 8, 10], "specif": [0, 5, 10], "c": [0, 1, 3, 4, 5, 10], "julia": 0, "code": [0, 1, 3, 4, 5, 7, 8], "gener": [0, 1, 3, 4, 5, 7, 8, 11], "onli": [0, 1, 2, 3, 4, 7, 8, 10], "deal": 0, "languag": [0, 10], "need": [0, 1, 3, 7, 8, 10], "instanti": [0, 10], "configur": [0, 7, 10], "correct": [0, 8, 10], "reader": [0, 1, 7, 8], "podio_class_gener": [0, 1, 10], "py": [0, 1, 10], "main": [0, 1, 7, 8, 10], "script": 0, "depend": [0, 4, 10], "desir": [0, 8], "slightli": [0, 10], "cleanup": 0, "membervari": 0, "declutt": 0, "its": [0, 1, 4, 8], "__init__": 0, "method": [0, 1, 4, 7, 10, 11], "bit": [0, 1, 3, 8], "530": 0, "remov": 0, "read": [0, 2, 4, 7, 10], "deprec": 0, "old": [0, 3, 4, 5], "style": 0, "format": [0, 1, 3, 10], "compon": [0, 9], "definit": [0, 4, 9, 10], "yaml": [0, 1, 3, 5, 9], "file": [0, 2, 3, 7, 8, 9], "485": 0, "eventstor": 0, "function": [0, 1, 3, 4, 5, 7, 9, 10, 11], "announc": 0, "429": 0, "529": 0, "switch": [0, 2], "relat": [0, 1, 3, 4, 5, 7, 10], "rang": [0, 11], "test": [0, 1, 2], "us": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11], "frame": [0, 9, 11], "i": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "o": [0, 5, 6, 9], "06": 0, "526": 0, "edm4hep": [0, 1, 8], "workflow": 0, "an": [0, 1, 4, 5, 7, 8, 9, 10], "lcg": 0, "stack": 0, "recent": 0, "enough": [0, 10, 11], "version": [0, 1, 10, 11], "cmake": [0, 1, 3, 10], "necessari": [0, 1, 3, 4, 5, 7, 8, 10, 11], "after": [0, 1, 2, 4, 10], "key4hep": 0, "235": 0, "jmcarcel": 0, "523": 0, "comment": [0, 2, 3], "name": [0, 1, 2, 3, 4, 7, 8, 10], "line": [0, 8], "number": [0, 3, 7, 11], "It": [0, 1, 3, 4, 5, 7, 8, 10, 11], "": [0, 1, 3, 8, 10], "veri": [0, 3, 8], "unlik": 0, "remain": 0, "up": [0, 2, 3, 5, 10], "date": [0, 2, 5], "when": [0, 1, 2, 3, 4, 7, 8, 10], "either": [0, 3, 4, 7, 8, 10], "content": [0, 8, 10], "chang": [0, 2, 7, 9], "521": 0, "do": [0, 3, 4, 8], "import": [0, 3, 4, 7, 8, 10], "root": [0, 1, 3, 5, 10], "podio": [0, 1, 3, 4, 5, 6, 8, 10, 11], "dump": 0, "help": [0, 1], "otherwis": [0, 1, 3, 4], "can": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "take": [0, 1, 3, 4, 8, 10], "while": [0, 4, 5, 8], "system": [0, 1], "print": 0, "514": 0, "introduc": 0, "maybesharedptr": 0, "manag": [0, 4, 5, 10], "obj": [0, 10], "user": [0, 3, 5, 8, 9, 10, 11], "face": [0, 10], "handl": [0, 3, 5, 7, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "control": [0, 10], "block": [0, 10], "object": [0, 1, 5, 8, 9, 10, 11], "distinct": 0, "entiti": 0, "potenti": [0, 7, 8, 10], "differ": [0, 4, 7, 8, 10, 11], "lifetim": [0, 4], "which": [0, 1, 3, 4, 7, 8, 10, 11], "allow": [0, 2, 3, 4, 7, 8, 10], "fix": [0, 3, 11], "174": 0, "492": 0, "increas": 0, "size": [0, 3, 7, 10, 11], "factor": [0, 8], "sinc": [0, 1, 8, 11], "thei": [0, 1, 4, 7, 8, 10], "ar": [0, 1, 3, 4, 5, 7, 8, 10, 11], "now": [0, 2, 8, 10], "effect": [0, 3], "pointer": [0, 1], "instead": [0, 3, 8, 10], "one": [0, 1, 2, 3, 7, 8, 10], "even": [0, 8], "initi": [0, 1, 10], "case": [0, 1, 3, 4, 7, 8, 11], "obtain": [0, 1, 8], "from": [0, 2, 4, 5, 7, 9, 10], "collect": [0, 1, 9, 10], "objbas": [0, 4], "make": [0, 1, 2, 3, 8, 10, 11], "objectid": [0, 1, 4], "member": [0, 1, 4, 8, 10], "constructor": [0, 8, 10], "privat": 0, "have": [0, 1, 2, 3, 8, 10, 11], "access": [0, 4, 7, 8, 10, 11], "raw": [0, 1, 8], "ani": [0, 1, 3, 4, 7, 8, 11], "static": [0, 1, 8], "makeempti": 0, "order": [0, 1, 8], "creat": [0, 2, 3, 4, 5, 7, 8, 9, 11], "empti": [0, 1, 8, 10], "also": [0, 1, 3, 8, 10, 11], "intern": [0, 5, 8], "unpersist": 0, "enabl": [0, 1], "more": [0, 1, 3, 4, 8], "exist": [0, 2, 8, 9], "sanit": 0, "ha": [0, 1, 3, 4, 7, 8], "becom": [0, 4, 8, 10], "possibl": [0, 1, 3, 4, 5, 8, 10, 11], "so": [0, 1, 2, 3, 4, 10], "ananya": 0, "gupta": 0, "473": 0, "ad": [0, 4, 7, 9, 11], "support": [0, 1, 5, 8, 9, 10], "python": [0, 1, 4, 5, 10], "interfac": [0, 1, 4, 5, 8, 9, 10, 11], "implement": [0, 1, 3, 5, 9, 10], "new": [0, 2, 3, 4, 7, 8, 9], "design": [0, 5, 6, 9, 10], "structur": [0, 1, 4, 5], "default": [0, 1, 3, 7, 10], "paramet": [0, 3, 7], "abstract": [0, 4, 8], "type": [0, 1, 4, 7, 8, 9, 10], "builtin": [0, 3, 10], "_sort_components_and_datatyp": 0, "perform": [0, 5, 8], "topolog": 0, "sort": 0, "datatyp": [0, 1, 3], "_has_static_arrays_import": 0, "check": [0, 3, 8], "arrai": [0, 3, 4, 10], "lang": 0, "l": 0, "program": 0, "argument": [0, 1, 3, 7, 10], "specifi": [0, 3], "current": [0, 1, 3, 7, 10, 11], "choic": [0, 3, 4, 5], "cpp": [0, 10], "upstream": [0, 9], "edm": [0, 3, 7, 8, 9, 10], "unit": [0, 3, 8], "suit": 0, "cover": 0, "exampl": [0, 3, 4, 9], "data": [0, 5, 9, 10], "model": [0, 1, 4, 5, 9, 10], "document": [0, 2, 4, 5, 6, 10], "enable_julia": 0, "toggl": 0, "option": [0, 1, 7, 8, 9, 10], "By": [0, 8, 10], "off": 0, "520": 0, "add": [0, 1, 2, 3, 10, 11], "error": [0, 11], "messag": 0, "std": [0, 1, 7, 8, 10, 11], "bad_function_cal": 0, "show": [0, 7], "stacktrac": 0, "quit": [0, 8], "uninform": 0, "519": 0, "getter": [0, 4, 10], "return": [0, 1, 4, 7, 8, 10], "valu": [0, 1, 3, 7, 8, 10, 11], "keep": [0, 1, 2, 8, 11], "const": [0, 1, 3, 7, 8, 11], "refer": [0, 1, 4, 9, 10, 11], "all": [0, 1, 3, 4, 7, 8, 10], "other": [0, 1, 3, 4, 8, 10], "518": 0, "488": 0, "bind": 0, "rntupl": 0, "writer": [0, 1, 7, 8], "understand": 0, "miss": 0, "storag": [0, 1, 3, 9, 10], "datamodel": [0, 1, 4, 9, 10], "513": 0, "rootframewrit": 0, "writefram": 0, "rootntuplewrit": 0, "ensur": [0, 7, 8], "consist": [0, 4], "given": [0, 3, 8], "categori": 0, "If": [0, 3, 4, 7, 8, 10], "inconsist": [0, 1], "found": [0, 4, 5], "except": [0, 7], "thrown": [0, 7], "befor": [0, 1, 8, 10], "might": [0, 3, 11], "lead": [0, 1, 8, 11], "crash": 0, "unread": 0, "382": 0, "refactor": 0, "map": [0, 1, 10], "track": 0, "set": [0, 1, 3, 11], "kept": [0, 2, 11], "511": 0, "decoupl": 0, "tool": [0, 8], "rest": 0, "folder": 0, "call": [0, 1, 2, 3, 4, 7, 8, 10], "podio_gen": [0, 10], "transpar": [0, 4], "time": [0, 5, 8], "neglig": 0, "again": [0, 1, 2, 3, 8], "becaus": 0, "we": [0, 1, 2, 8, 10, 11], "don": [0, 10], "t": [0, 1, 7, 8, 10], "load": [0, 1, 10], "librari": [0, 1, 3, 4, 5, 6, 7], "unnecessarili": 0, "longer": [0, 4], "simplifi": [0, 5, 8], "test_util": 0, "move": [0, 7, 8, 11], "write": [0, 4, 7, 9, 10], "where": [0, 1, 3, 4, 8, 10, 11], "belong": [0, 4], "sio": [0, 1, 10], "510": 0, "legaci": 0, "extra": [0, 3, 9, 10], "wa": [0, 1, 5], "being": [0, 1, 3, 8, 10], "pass": [0, 1, 3, 7, 8, 10], "example_fram": 0, "almost": [0, 4, 11], "alwai": [0, 4, 10], "anoth": [0, 1, 3], "hard": [0, 8], "notic": 0, "509": 0, "clang": [0, 10], "significantli": 0, "slower": 0, "run": [0, 8, 9, 10], "508": 0, "externaldata": 0, "modul": [0, 10], "let": 0, "care": [0, 1, 4, 10], "download": 0, "hash": 0, "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "addit": [0, 1, 3, 5, 7, 10, 11], "local": [0, 4], "store": [0, 3, 7, 8, 10, 11], "dexternaldata_object_stor": 0, "path": 0, "them": [0, 3, 4, 8, 10], "build": [0, 1, 3, 8], "scratch": 0, "won": 0, "507": 0, "copi": [0, 2, 3, 4, 7, 8], "dumpmodel": 0, "directori": [0, 3, 10], "some": [0, 2, 3, 4, 7, 8, 9, 10], "subdirectori": [0, 10], "try": [0, 3, 11], "find": 0, "look": [0, 1, 4, 7, 8, 10], "abov": [0, 3, 8, 10, 11], "doesn": [0, 1], "fail": 0, "505": 0, "bump": 0, "pylint": 0, "ci": 0, "2": [0, 6, 7, 8], "7": [0, 7], "502": 0, "deletebuff": 0, "popul": [0, 1], "collectionreadbuff": [0, 1, 8], "dispos": 0, "unconsum": 0, "buffer": [0, 1, 8], "leak": 0, "describ": [0, 1, 3, 4, 5], "500": 0, "rootframedata": 0, "clean": 0, "desctruct": 0, "sure": [0, 2, 8, 10], "delet": [0, 7], "collectiondata": [0, 10], "wouter": 0, "deconinck": 0, "503": 0, "instal": [0, 1, 5], "vi": 0, "497": 0, "podio_python_dir": 0, "top": [0, 10], "level": [0, 4, 5, 10], "cmakelist": 0, "build_test": 0, "496": 0, "oper": [0, 1, 8], "neg": 0, "comparison": 0, "http": [0, 2], "github": [0, 2, 5], "com": [0, 2], "aidasoft": [0, 2], "pull": [0, 2], "493": 0, "id": [0, 1, 4, 7, 8], "podioobjectid": 0, "29": 0, "mutabl": [0, 1, 3, 9, 10], "unsign": [0, 10, 11], "latter": 0, "useless": 0, "412": 0, "438": 0, "ostream": 0, "22": 0, "juraj": 0, "smiesko": 0, "491": 0, "warn": 0, "request": [0, 2, 7, 8], "entri": [0, 7, 10], "present": [0, 1, 8, 10, 11], "490": 0, "bug": 0, "built": [0, 3], "without": [0, 3, 8, 10], "489": 0, "486": 0, "untrack": 0, "properli": 0, "whether": [0, 3, 10], "been": [0, 1, 7], "collectionidt": [0, 8], "collectionid": 0, "signal": 0, "known": [0, 10], "tabl": [0, 8], "break": 0, "you": [0, 1, 2, 8, 11], "avoid": [0, 1, 5], "lookup": 0, "twice": 0, "subsequ": 0, "retriev": [0, 9], "overli": 0, "share": [0, 1], "rootntupleread": 0, "uncov": 0, "resolv": 0, "18": 0, "484": 0, "feel": 0, "benedikt": [0, 6], "hegner": [0, 6], "483": 0, "clarifi": 0, "schema": 0, "482": 0, "renam": 0, "macro": [0, 1, 3, 10], "createbuff": 0, "create_buff": 0, "481": 0, "execut": 0, "target": 0, "unittest": 0, "unittest_podio": 0, "collis": 0, "rel": [0, 1], "common": [0, 8, 10], "480": 0, "thoma": 0, "madlen": 0, "472": 0, "schemata": 0, "across": 0, "provid": [0, 1, 2, 3, 4, 5, 7, 8, 10], "syntax": [0, 3, 5], "intent": 0, "evolut": 0, "backend": [0, 1, 3, 8, 10], "includ": [0, 1, 3, 4, 8, 10, 11], "infrastructur": [0, 4], "futur": 0, "477": 0, "nlohmann": [0, 1], "json_fwd": 0, "hpp": [0, 1], "header": [0, 1, 3, 10], "reduc": 0, "unnecessari": 0, "templat": [0, 7, 8, 9], "475": 0, "478": 0, "collectionbas": [0, 8], "iter": [0, 7], "dmitri": 0, "kalinkin": 0, "465": 0, "typedef": 0, "referenc": [0, 7], "collection_typ": 0, "convers": [0, 1], "reachabl": 0, "objectcollect": 0, "value_typ": 0, "The": [0, 3, 7, 9, 10, 11], "reach": 0, "via": [0, 1, 3, 4, 7, 8, 11], "mutable_typ": 0, "30": [0, 6], "471": 0, "branch": [0, 2], "index": [0, 1, 4, 11], "e": [0, 1, 2, 4, 8, 10, 11], "behavior": [0, 8], "releas": 0, "seri": 0, "andr": 0, "sailer": 0, "469": 0, "updat": [0, 2], "requir": [0, 1, 3, 4, 8, 10], "catch2": 0, "3": [0, 1, 7, 8, 11], "4": [0, 7, 8], "20": 0, "clang16": 0, "el9": 0, "alma9": 0, "clang12": 0, "cs7": 0, "disabl": 0, "tabul": 0, "avail": [0, 1, 3, 7, 8, 9], "445": 0, "part": [0, 4, 10], "07": 0, "26": 0, "463": 0, "vector": [0, 1, 5, 7, 8, 10, 11], "vectormemb": [0, 1, 4, 10], "actual": [0, 1, 3, 8, 10], "subset": [0, 11], "work": [0, 8, 11], "462": 0, "reproduc": 0, "origin": [0, 1, 2], "issu": 0, "25": 0, "461": 0, "rootframeread": [0, 1], "master": [0, 2], "447": 0, "wrapper": 0, "around": [0, 8], "put": [0, 1, 7, 10, 11], "explicitli": [0, 3, 7, 8], "cppyi": 0, "gbl": 0, "432": 0, "457": 0, "setup": [0, 8], "explicit": [0, 4, 7], "enable_sio": 0, "rather": [0, 3, 10], "than": [0, 3, 7, 10], "presenc": [0, 10], "456": 0, "cach": 0, "455": 0, "cmake_binary_dir": 0, "project_binary_dir": 0, "439": 0, "framecategori": 0, "h": [0, 1, 8, 10, 11], "few": [0, 1, 3, 5, 8], "convent": 0, "hardcod": 0, "string": [0, 1, 3, 7, 8, 10], "variabl": [0, 8, 10], "454": 0, "cmake_": 0, "sourc": 0, "bin": 0, "_dir": 0, "project_": 0, "452": 0, "extend": [0, 9], "pre": [0, 9, 10], "processor": 0, "condit": 0, "to_json": 0, "visibl": [0, 4], "rootcl": 0, "interpret": 0, "435": 0, "450": 0, "descript": [0, 3, 5, 7, 10], "author": [0, 3], "field": [0, 1, 2, 10, 11], "449": 0, "commit": [0, 2, 9], "nightli": 0, "come": [0, 1, 4], "abl": [0, 8, 11], "395": 0, "minor": 0, "complaint": 0, "newer": 0, "tidi": 0, "anyth": 0, "essenti": [0, 1, 8, 10], "448": 0, "lcio": [0, 5], "datalayout": 0, "untouch": 0, "unbuilt": 0, "year": 0, "446": 0, "finish": 0, "sioframewrit": 0, "non": [0, 8], "mandatori": 0, "see": [0, 1, 2, 4, 8, 10], "442": 0, "437": 0, "modifi": [0, 8], "pars": [0, 10], "incorpor": 0, "436": 0, "27": 0, "413": 0, "schemaevolut": 0, "hold": [0, 4, 7], "offer": [0, 1, 8, 11], "evolvebuff": 0, "doe": [0, 3, 4, 8], "hook": 0, "framedata": [0, 8], "23": [0, 7], "434": 0, "433": 0, "rootlegacyread": 0, "428": 0, "sever": [0, 8], "less": [0, 7, 8], "topic": [0, 9], "sub": 0, "txt": 0, "commonli": 0, "podiotest": 0, "g": [0, 1, 2, 4, 8, 10, 11], "environ": 0, "config": 0, "427": 0, "delai": 0, "long": [0, 10, 11], "mainli": [0, 1, 7, 10], "quicker": 0, "respons": [0, 1, 3, 11], "flag": [0, 3, 10], "displai": 0, "alphabet": 0, "automat": [0, 1, 3, 5, 7], "adjust": 0, "column": 0, "width": [0, 3, 11], "fit": 0, "packag": [0, 3, 5, 10], "402": 0, "public": [0, 1, 3, 8], "constexpr": [0, 1], "char": [0, 8, 10], "getxxxnam": 0, "string_view": [0, 1], "reli": 0, "typenam": [0, 7, 8], "full": [0, 10], "gettypenam": 0, "valuetypenam": 0, "immut": [0, 3, 4, 8, 10], "getvaluetypenam": 0, "datatypenam": 0, "pod": [0, 1, 3, 5, 6, 10], "getdatatypenam": 0, "podio_sioblock_path": 0, "use_external_catch2": 0, "auto": [0, 1, 4, 7, 8, 11], "suitabl": 0, "fall": 0, "back": [0, 8], "fetch": [0, 2], "own": [0, 2, 3, 4, 7, 8], "426": 0, "ld_library_path": 0, "robust": 0, "incompat": 0, "425": 0, "skip_catch_discoveri": 0, "skip": 0, "discoveri": 0, "catch": 0, "unsuit": 0, "too": 0, "much": 0, "underli": [0, 4, 8, 11], "murmurhash": 0, "423": 0, "easier": [0, 1], "restructur": 0, "produc": [0, 10], "prior": 0, "421": 0, "appear": [0, 4], "insensit": 0, "written": [0, 1, 4, 5, 8, 11], "405": 0, "legibl": 0, "valid": [0, 1, 3, 8, 10], "improv": [0, 5], "interoper": 0, "rdatafram": 0, "169": 0, "follow": [0, 1, 2, 3, 4, 7, 8, 10, 11], "_": 0, "resp": [0, 3], "taken": 0, "singl": [0, 1, 8, 10], "_objidx": 0, "disambigu": 0, "normal": 0, "directli": [0, 1, 3, 7, 8, 10], "everyth": [0, 2, 8], "should": [0, 1, 2, 3, 4, 8, 10], "422": 0, "small": [0, 2, 7, 8], "could": [0, 7], "element": [0, 1, 7, 11], "420": 0, "insid": [0, 8], "rootread": 0, "segment": 0, "violat": 0, "417": 0, "multipl": [0, 1, 3], "411": 0, "api": 0, "open": 0, "418": 0, "bring": 0, "getmap": 0, "genericparamet": [0, 7, 8], "alreadi": [0, 10], "dd4hep": 0, "1112": 0, "mark": 0, "getxyzmap": 0, "brief": 0, "transit": 0, "period": 0, "These": [0, 3, 4, 7, 8, 10], "415": 0, "19": 0, "416": 0, "select": [0, 3, 10], "rule": [0, 7], "anymor": 0, "setter": [0, 4, 10], "410": 0, "squar": 0, "414": 0, "userdatacollect": [0, 11], "caus": 0, "first": [0, 3, 5, 7, 8], "394": 0, "collectionbufferfactori": 0, "factori": [0, 4, 7], "throughout": 0, "createschemaevolvablebuff": 0, "minimum": 0, "schema_vers": 0, "1": [0, 7, 8], "schemavers": 0, "datamodeldefinit": [0, 1], "package_nam": [0, 1, 10], "meta": [0, 1, 9], "propag": 0, "inform": [0, 1, 4, 9, 11], "place": [0, 3, 8, 10], "sioblock": [0, 10], "appropri": [0, 10], "christoph": 0, "dilk": 0, "408": 0, "between": 0, "accessor": [0, 7], "21": 0, "387": 0, "round": 0, "trip": 0, "extens": [0, 8], "400": 0, "sioframedata": 0, "getavailablecollect": [0, 8], "seg": 0, "fault": 0, "previous": 0, "399": 0, "podio_enable_sio": 0, "target_compile_definit": [0, 1], "podiosioio": 0, "get": [0, 1, 3, 7, 11], "well": [0, 1, 3, 4, 7, 8, 10], "featur": [0, 1, 2, 4, 9, 10], "scope": [0, 4, 7, 8], "target_link_librari": [0, 1], "paul": 0, "gessing": 0, "befurt": 0, "398": 0, "reject": 0, "397": 0, "properti": [0, 1], "396": 0, "341": 0, "metadata": 0, "w": 0, "simpl": [0, 3, 5, 8], "heurist": 0, "identifi": 0, "omiss": 0, "mistak": 0, "limit": [0, 3, 4, 8, 9], "backward": 0, "compat": [0, 3], "info": 0, "391": 0, "390": 0, "later": [0, 3, 8], "389": 0, "gitignor": 0, "358": 0, "emb": 0, "json": 0, "core": [0, 1], "contain": [0, 1, 3, 4, 8, 9, 10], "liter": [0, 1], "encod": [0, 1, 7], "regist": [0, 1], "newli": 0, "datamodelregistri": 0, "awar": [0, 10], "result": [0, 1, 3, 7], "done": [0, 2, 3, 8], "framewrit": 0, "give": [0, 1, 4, 5, 8, 10, 11], "roundtrip": 0, "compar": 0, "intend": [0, 1], "advanc": [0, 9], "detail": [0, 3, 5, 9, 10], "384": 0, "378": 0, "favor": 0, "372": 0, "doubl": [0, 3, 10, 11], "A": [0, 1, 3, 8, 10], "similar": [0, 8, 10, 11], "thing": 0, "ilcsoft": 0, "143": 0, "event": [0, 3, 7, 8, 11], "weight": [0, 4], "precis": [0, 1], "380": 0, "getparamet": [0, 7, 8], "getgenericparametersforwrit": 0, "exact": 0, "same": [0, 1, 3, 5, 8, 11], "easili": [0, 1, 4, 10], "offici": 0, "channel": 0, "replac": 0, "usag": [0, 1, 3, 5, 9], "getparameterkei": 0, "kei": [0, 1, 10], "377": 0, "visual": 0, "convert": [0, 1, 4], "graph": 0, "376": 0, "375": 0, "podio_vers": 0, "preprocessor": 0, "usabl": [0, 1, 8], "context": [0, 1], "374": 0, "constant": 0, "someth": [0, 1], "podio_build_vers": 0, "373": 0, "short": [0, 10], "output": [0, 1, 3, 10], "nathan": 0, "brei": 0, "369": 0, "putparamet": [0, 7, 8], "inlin": [0, 3], "linker": 0, "364": 0, "trigger": 0, "push": [0, 2], "368": 0, "podio_relax_pyv": 0, "relax": 0, "match": 0, "major": [0, 8, 10], "363": 0, "util": [0, 1], "defin": [0, 1, 5, 8, 9, 10], "cc": [0, 10], "sioutil": 0, "siowrit": 0, "343": 0, "defaultdict": 0, "hand": [0, 8], "roll": 0, "361": 0, "basic": [0, 5, 9, 10, 11], "319": 0, "355": 0, "365": 0, "2022": 0, "362": 0, "keyword": [0, 4], "onward": 0, "360": 0, "log": 0, "absolut": 0, "333": 0, "unique_ptr": [0, 8], "mutex": 0, "list": [0, 1, 3, 10, 11], "declar": [0, 3, 4, 10], "like": [0, 1, 2, 3, 4, 7, 8], "nvcc": 0, "mayb": 0, "yet": [0, 2, 4, 8, 11], "k4clue": 0, "34": 0, "dtag": 0, "podio_set_rpath": 0, "rpath": 0, "runpath": 0, "binari": [0, 1], "pin": 0, "ubuntu": 0, "runner": 0, "accident": [0, 8], "go": [0, 10], "out": [0, 1, 7], "sync": [0, 11], "359": 0, "356": 0, "readm": 0, "argpars": 0, "choos": [0, 2], "346": 0, "tp": 0, "apach": 0, "0": [0, 6, 7, 11], "licens": 0, "facilit": 0, "integr": 0, "experi": [0, 5], "357": 0, "prefix": [0, 3, 10], "onto": 0, "env": 0, "sh": 0, "354": 0, "posix": 0, "compliant": 0, "shell": 0, "bash": 0, "tab": 0, "space": 0, "mix": 0, "indent": 0, "root_include_path": 0, "351": 0, "were": [0, 1], "consid": [0, 1, 11], "implicit": 0, "boolean": 0, "caught": [0, 3], "against": [0, 1, 3], "nullptr": 0, "guard": 0, "correspond": [0, 1, 3, 4, 10], "344": 0, "339": 0, "intact": 0, "345": 0, "siolegacyread": 0, "287": 0, "349": 0, "nest": [0, 10], "348": 0, "adapt": 0, "went": 0, "unnot": 0, "previou": [0, 5], "root_io": [0, 7], "sio_io": [0, 7], "each": [0, 1, 4, 8, 10, 11], "somewher": [0, 1, 8], "untyp": 0, "framedatat": 0, "inspect": [0, 1], "reorgan": 0, "usual": [0, 11], "close": [0, 4], "addition": [0, 1, 8], "dictionari": [0, 10], "342": 0, "migrat": 0, "action": 0, "checkout": [0, 2], "v3": 0, "advis": 0, "clone": [0, 2], "bodi": 0, "327": 0, "typo": 0, "24": 0, "340": 0, "335": 0, "cvmf": 0, "view": 0, "latest": 0, "pick": [0, 10], "group": [0, 7], "lcg_102": 0, "337": 0, "notebook": [0, 9], "pattern": [0, 1, 9], "332": 0, "signatur": [0, 3, 10], "336": 0, "podioconfig": 0, "silenc": 0, "about": [0, 1, 3, 4], "polici": [0, 4, 8], "cmp00012": 0, "compil": [0, 1, 3, 8, 11], "step": [0, 1], "334": 0, "attempt": 0, "stream": [0, 10], "transient": [0, 4], "323": 0, "stdout": [0, 1], "overview": [0, 10], "over": [0, 8, 11], "d": 0, "To": [0, 1, 3, 5, 8, 11], "pythoneventstor": 0, "separ": [0, 3], "podiopythonstor": 0, "side": [0, 3, 7], "gotoev": 0, "iread": 0, "correctli": [0, 1], "sioread": 0, "thread": [0, 4, 8, 9], "safe": [0, 8], "final": 0, "plan": [0, 1], "stabl": 0, "still": [0, 4, 8, 10], "turn": [0, 1], "better": [0, 7, 8], "wai": [0, 3, 7, 8], "For": [0, 1, 2, 3, 4, 8, 11], "consider": [0, 4], "pleas": [0, 2, 4, 10], "consult": 0, "start": [0, 9], "unchang": 0, "distant": 0, "312": 0, "podio_json_output": [0, 1], "link": [0, 1, 3], "318": 0, "podio_add_root_io_dict": 0, "bugfix": 0, "output_fold": 0, "equal": [0, 1], "dir": 0, "selection_xml": 0, "317": 0, "unrel": 0, "prototyp": [0, 3, 10], "aim": 0, "eventu": 0, "redefin": 0, "memori": [0, 1, 4, 5], "316": 0, "maco": 0, "host": 0, "fuse": 0, "consequ": 0, "315": 0, "is_trivial_typ": [0, 10], "engin": [0, 10], "behav": [0, 7], "expect": 0, "exactli": [0, 1], "opposit": 0, "what": [0, 10, 11], "would": [0, 1, 2, 3, 8], "intuit": 0, "288": 0, "283": 0, "init": [0, 7], "apart": 0, "mean": [0, 1, 2, 8, 10, 11], "python2": 0, "276": 0, "seem": 0, "valentin": 0, "volkl": 0, "307": 0, "hotfix": 0, "290": 0, "revert": [0, 2], "unknown": 0, "symbol": 0, "podiodict": 0, "282": 0, "podio_use_clang_format": 0, "autodiscoveri": 0, "downstream": [0, 2], "discov": 0, "accordingli": 0, "ON": 0, "stage": 0, "305": 0, "upcom": 0, "294": 0, "siocollectionidtableblock": 0, "build_vers": 0, "sioversionblock": 0, "304": 0, "unreleas": 0, "303": 0, "soumil": 0, "296": 0, "instruct": 0, "how": [0, 5, 7, 8, 10], "295": 0, "prepareforwrit": [0, 1], "286": 0, "point": [0, 7, 8, 10], "reset": 0, "kalina": 0, "stoimenova": 0, "301": 0, "text": 0, "300": [0, 1], "python3": 0, "299": 0, "unset": 0, "detect": [0, 8], "293": 0, "obsolet": 0, "285": 0, "291": 0, "obj_needs_destructor": 0, "274": 0, "jinja2": [0, 10], "process": [0, 1, 8, 10], "262": 0, "untempl": 0, "ones": [0, 2, 4, 10], "supportedgenericdatatyp": 0, "tupl": 0, "those": [0, 3, 8], "typehelp": 0, "helper": 0, "277": 0, "remot": [0, 2], "input": [0, 1, 7], "everi": [0, 1, 7], "284": 0, "per": 0, "280": 0, "color": 0, "diff": 0, "diffutil": 0, "254": 0, "guidelin": [0, 2], "podio_generate_datamodel": [0, 3], "both": [0, 3, 5, 7, 8], "279": 0, "newest": 0, "clash": 0, "31": 0, "253": 0, "lint": 0, "end": [0, 4, 6, 7, 10], "trail": 0, "whitespac": 0, "flake8": 0, "ilcdirac": 0, "270": 0, "duplic": [0, 3, 8], "overload": [0, 8, 10], "269": 0, "broke": 0, "265": 0, "gcc11": 0, "dev": 0, "261": 0, "accept": 0, "integ": [0, 3, 11], "placido": 0, "fernandez": 0, "declara": 0, "259": 0, "filter": 0, "regex": 0, "complet": [0, 3, 8], "238": 0, "podiovers": 0, "three": [0, 1, 3, 4], "uint16_t": [0, 11], "patch": 0, "plu": 0, "expr": 0, "last": 0, "tag": 0, "64": [0, 11], "podio_": 0, "_version": 0, "extract": [0, 4], "reorder": 0, "section": [0, 1, 3, 4], "230": 0, "28": 0, "256": 0, "ignor": 0, "happen": [0, 3, 7, 8], "persist": [0, 4, 5, 9], "onc": [0, 4], "tri": 0, "isavail": 0, "observ": 0, "somewhat": 0, "setrefer": 0, "mistakenli": 0, "op": [0, 1], "mechan": 0, "restor": [0, 8], "obvious": 0, "252": 0, "wherev": [0, 5], "assign": 0, "thank": 0, "ownership": [0, 4, 8, 9], "ed": [0, 4], "251": 0, "had": 0, "onetoonerel": [0, 1, 3, 4, 10], "onetomanyrel": [0, 1, 3, 4, 10], "249": 0, "use_sanit": 0, "curent": 0, "address": 0, "withorigin": 0, "undefin": 0, "mutual": 0, "exlus": 0, "label": 0, "failur": 0, "force_run_all_test": 0, "overrid": 0, "develop": [0, 2], "209": 0, "mention": [0, 10, 11], "2021": 0, "245": 0, "render": 0, "241": 0, "prepar": [0, 4], "205": 0, "explictli": 0, "hit": [0, 4, 7, 11], "mutablehit": [0, 4], "discuss": 0, "204": 0, "reason": [0, 1, 3], "obviou": 0, "mutat": 0, "239": 0, "237": 0, "drop": 0, "colon": [0, 3], "236": 0, "problem": [0, 8], "spack": 0, "234": 0, "cstdint": [0, 3], "232": 0, "197": 0, "merg": [0, 2], "reconstruct": 0, "collectioninfotyp": 0, "simpli": [0, 1, 8], "assum": [0, 1, 7, 8], "proper": [0, 1, 4, 7], "didn": 0, "231": 0, "regress": 0, "223": 0, "213": 0, "224": 0, "219": 0, "214": 0, "frank": [0, 6], "gaed": [0, 6], "fundament": [0, 11], "basic_typ": 0, "bool": [0, 10], "usrint": 0, "uint64_t": [0, 11], "userint": 0, "usrdoubl": 0, "userdoubl": 0, "int": [0, 3, 7, 8, 10], "resiz": [0, 11], "myint": 0, "iu": 0, "nd": 0, "100": 0, "42": [0, 7], "114": 0, "effici": [0, 3, 5], "podio_generated_fil": 0, "glob": 0, "217": 0, "destructor": 0, "swap": 0, "idiom": 0, "namespac": [0, 1, 10], "216": 0, "211": 0, "parallel": [0, 1, 11], "ctest": 0, "jn": 0, "210": 0, "just": [0, 3, 4, 8, 10, 11], "earlier": [0, 2], "restrict": 0, "dict": [0, 1, 10], "exit": 0, "backtrac": 0, "collectionbuff": 0, "expos": [0, 4], "206": 0, "extern": [0, 3], "ship": [0, 1], "201": 0, "count": 0, "heap": 0, "free": [0, 7, 8], "200": 0, "195": 0, "circular": 0, "self": 0, "194": 0, "relationrang": 0, "akin": 0, "193": 0, "192": 0, "191": 0, "treat": 0, "186": 0, "int16_t": 0, "int32_t": 0, "int64_t": 0, "uint32_t": 0, "realli": [0, 8, 11], "189": 0, "read_and_writ": 0, "concurr": [0, 5], "spuriou": 0, "180": 0, "logic": [0, 8], "rootwrit": 0, "degrad": 0, "v6": 0, "our": 0, "affect": [0, 8], "badli": 0, "profit": 0, "182": 0, "statu": 0, "185": 0, "184": 0, "asciiwrit": 0, "183": 0, "export": 0, "marko": 0, "petric": 0, "181": 0, "scan": 0, "175": 0, "fulli": [0, 10], "qualifi": [0, 10], "168": 0, "issuecom": 0, "770751871": 0, "romanov": 0, "173": 0, "io": 0, "handler": 0, "171": 0, "153": 0, "170": 0, "enforc": 0, "werror": 0, "joseph": 0, "wang": 0, "156": 0, "noncopy": 0, "154": 0, "maintain": [0, 8], "111": 0, "172": 0, "brew": 0, "command": 0, "mac": 0, "2020": 0, "165": 0, "conveni": [0, 4], "emtpi": 0, "162": 0, "161": 0, "155": 0, "benchmark": 0, "timedread": 0, "timedwrit": 0, "decor": 0, "wrap": 0, "conform": [0, 8], "record": 0, "construct": [0, 1, 7, 8], "writeev": 0, "readcollect": 0, "benchmarkrecord": 0, "principl": [0, 1, 8, 10], "outsid": [0, 7, 8, 9], "search": 0, "152": 0, "copyabl": 0, "144": 0, "149": 0, "find_package_handle_standard_arg": 0, "147": 0, "130": 0, "second": 0, "altern": 0, "serial": 0, "runtim": [0, 5], "whole": [0, 1], "podio_add_datamodel_core_librari": 0, "condition": 0, "podio_add_sio_io_block": 0, "podio_io_handl": 0, "reflect": 0, "133": 0, "141": 0, "96": 0, "97": 0, "98": 0, "centos7": 0, "ubuntu1804": 0, "6": [0, 6], "least": [0, 1], "134": 0, "139": 0, "128": 0, "registerforwrit": 0, "site": [0, 2], "127": 0, "126": 0, "No": [0, 2], "125": 0, "recursive_mutex": 0, "made": [0, 1], "whatev": 0, "distanc": 0, "calcul": [0, 4, 7], "129": 0, "footprint": 0, "clear": [0, 4], "intermedi": 0, "124": 0, "sstream": 0, "123": 0, "122": 0, "121": 0, "pip": [0, 1], "120": 0, "cleanli": 0, "117": 0, "readabl": [0, 8], "focus": 0, "grasp": 0, "stricter": 0, "extracod": [0, 3, 10], "constextracod": 0, "accord": 0, "diverg": 0, "equival": [0, 1, 10, 11], "emit": 0, "charact": 0, "capabl": [0, 1, 11], "exhaust": 0, "serv": [0, 4], "purpos": [0, 4], "moment": [0, 10], "107": 0, "loop": [0, 9, 11], "106": 0, "infinit": 0, "cyclic": 0, "102": 0, "101": 0, "constobject": 0, "invalid": [0, 4, 7], "99": 0, "libpodiodict": 0, "libpodio": 0, "rootmap": 0, "92": 0, "float": [0, 3, 7, 8, 10, 11], "lcparamet": 0, "evtmd": 0, "geteventmetadata": 0, "setvalu": 0, "usereventweight": 0, "evtweight": 0, "getfloatv": 0, "49": 0, "91": 0, "podiorootio": 0, "90": 0, "89": 0, "88": 0, "addxxxx": 0, "addtoxxxx": 0, "87": 0, "8": [0, 3, 11], "jenkinsfil": 0, "cpack": 0, "enable_cpack": 0, "83": 0, "82": 0, "81": 0, "wl": 0, "dynamic_lookup": 0, "appleclang": 0, "linux": 0, "shlib": 0, "testdatamodel": 0, "80": 0, "75": 0, "74": 0, "q": 0, "quiet": 0, "printout": 0, "verbos": 0, "mode": [0, 1], "73": 0, "right": [0, 1], "podiomacro": 0, "72": 0, "travi": 0, "70": 0, "includesubfold": [0, 1, 10], "packagenam": 0, "etc": [0, 3, 7, 8], "true": [0, 1, 3], "uniqu": 0, "occur": 0, "occas": 0, "package_name_": 0, "69": 0, "68": 0, "podio_generate_dictionari": 0, "67": 0, "loader": 0, "preserv": 0, "65": 0, "2019": 0, "pere": 0, "mato": 0, "63": 0, "stl": [0, 10], "60": 0, "multi": 0, "word": 0, "examplehit": 0, "cellid": 0, "ben": 0, "morgan": 0, "59": 0, "58": 0, "57": 0, "56": 0, "55": 0, "fast": 0, "getfast": 0, "speed": 0, "xxcollect": 0, "54": 0, "cmakepackageconfighelp": 0, "associ": 0, "podiotarget": 0, "refind": 0, "standard": 0, "client": [0, 4], "find_packag": 0, "add_execut": 0, "foo": 0, "javier": 0, "cervant": 0, "villanueva": 0, "51": 0, "phase": 0, "report": 0, "mai": [0, 3, 4], "45": 0, "contribut": 0, "44": 0, "enambl": 0, "dryrun": 0, "43": 0, "suggest": 0, "graem": 0, "stewart": 0, "41": 0, "fcc": 0, "factoris": 0, "md": 0, "40": 0, "tchain": 0, "xrootd": 0, "eospubl": 0, "cern": [0, 6], "ch": 0, "eo": 0, "stick": 0, "hsf": 0, "2018": 0, "39": 0, "forward": [0, 1, 10], "treatment": 0, "statement": 0, "know": [0, 3, 4, 8], "concret": [0, 1, 3, 4, 8], "38": 0, "analog": 0, "larg": 0, "37": 0, "36": 0, "releaas": 0, "note": [0, 1, 3, 4, 7, 8, 10, 11], "releasenot": 0, "far": 0, "2017": 0, "32": [0, 11], "hep": 0, "colin": 0, "bernet": 0, "cbernet": 0, "nofile_fix": 0, "segv": 0, "interact": [0, 7], "pyeventstore_filenam": 0, "jlingema": 0, "clangf": 0, "joschka": 0, "lingemann": 0, "gen": 0, "53": 0, "fixwarn": 0, "regener": 0, "hint": 0, "highlight": [0, 7, 8], "doc": 0, "applic": 0, "struct": [0, 3, 4, 8, 10], "parser": 0, "temporarili": 0, "outputstream": 0, "add_ascii_io": 0, "zaborowska": 0, "52": 0, "50": 0, "findroot": 0, "lcg_88": 0, "unus": 0, "pyunittest": 0, "2016": [0, 6], "47": 0, "lcg_87": 0, "46": 0, "debug": 0, "asciwrit": 0, "write_ascii": 0, "const_rel": 0, "getsyntax": [0, 1, 3, 10], "creation": [0, 1, 3, 4, 5, 9], "fix_cpy_rel": 0, "project": [0, 2], "custom": [0, 9], "doxygen": [0, 4], "cli": 0, "titl": 0, "page": [0, 2, 5], "dry": 0, "paragraph": 0, "direct": [0, 7, 10], "exposur": 0, "deep": [0, 5], "initialis": 0, "chach": 0, "fccsw": 0, "mileston": 0, "steinweg": 0, "eike_operators_new": 0, "eik": 0, "printinfo": 0, "tabular": 0, "wrong": [0, 3], "reference_bug_test": 0, "pyinterfac": 0, "2000": 0, "lcg_83": 0, "af": 0, "improve_doc": 0, "ink": 0, "dde": 0, "documen": 0, "relation_bug": 0, "examplemc": 0, "ref": 0, "_end": 0, "add_getters_sett": 0, "associativecontain": 0, "incorrect": 0, "fix_extracod": 0, "acc": 0, "memleak": 0, "extracode_in_compon": 0, "tracker": 0, "real": [0, 3, 4], "gtest": 0, "cross": 0, "snippet": [0, 7, 10], "pointerless": 0, "mani": [0, 3, 5, 7, 10], "cluster": [0, 7], "recurs": 0, "build_typ": 0, "unneed": 0, "processev": 0, "big": 0, "collcect": 0, "podio_librari": 0, "crear": 0, "clementhelsen": 0, "fix_eo": 0, "9": 0, "tfile": 0, "re": [0, 1], "tutorial_2": 0, "chain": 0, "neater": 0, "fwd": 0, "fact": 0, "alber": 0, "tree": 0, "35": 0, "33": 0, "fix_includ": 0, "unified_env": 0, "5": 0, "filezombi": 0, "beautifi": 0, "soft": 0, "unifi": 0, "anna": 0, "conflict": 0, "destin": 0, "pcm": 0, "cosmet": 0, "me": [0, 3], "appl": 0, "pytool": 0, "pyyaml": 0, "datamemb": 0, "2015": 0, "b": [0, 2], "uniti": 0, "fill": [0, 1, 2, 3, 10, 11], "markdown": 0, "mem": 0, "refurbish": 0, "next": 0, "toward": 0, "xyzhandl": 0, "upgrad": 0, "layout": [0, 3, 9], "buildin": 0, "garbag": [0, 7], "streamlin": 0, "wrongli": 0, "cope": 0, "xcode": 0, "push_back": [0, 4, 7, 11], "trivial": [0, 1, 8, 10, 11], "acquir": 0, "behaviour": 0, "xxxobj": 0, "themselv": [0, 7, 8], "align": 0, "gcc": 0, "reserv": 0, "rootconfig": 0, "registri": 0, "fooentri": 0, "fooobj": 0, "simplif": 0, "improp": 0, "draft": 0, "newlin": [0, 3], "2014": 0, "edm_1": 0, "v1": [0, 6], "uniform": 0, "review": 0, "scheme": 0, "incomplet": 0, "friend": 0, "confirm": 0, "genreflex": 0, "head": 0, "n": [0, 11], "stuff": 0, "navig": 0, "readi": 0, "lepton": 0, "muon": 0, "comput": 0, "isol": 0, "particlehandl": 0, "more_util": 0, "particl": [0, 5, 8], "overlap": 0, "100000": 0, "solv": [0, 8], "rare": 0, "eta": 0, "cut": 0, "dummy_gener": 0, "dummi": 0, "jet": 0, "demand": 0, "dummygener": 0, "coll_in_registri": 0, "multijet": 0, "increment": 0, "land": 0, "few_easy_mod": 0, "x": [0, 3, 7], "merge_attempt": 0, "pedant": 0, "event_loop": 0, "messi": 0, "overal": [0, 5], "simple_edm": 0, "realist": 0, "auto_handle_ptr": 0, "embed": 0, "prepareafterread": [0, 1], "macos_build_merg": 0, "macos_build": 0, "lxplus6": 0, "reformat": 0, "question": 0, "z": [0, 3], "boson": 0, "rearrang": 0, "here": [1, 3, 8, 10, 11], "howev": [1, 8, 10, 11], "explain": [1, 3, 5], "There": [1, 3, 7, 8], "fulfil": 1, "advantag": [1, 3, 4, 8], "persistifi": 1, "piec": 1, "invok": 1, "translat": 1, "collid": [1, 5], "objindex": 1, "pair": 1, "solut": 1, "void": [1, 3, 8], "getbufferaddress": 1, "refcollect": 1, "referencecollect": 1, "form": [1, 3, 11], "instanc": 1, "eras": 1, "possibli": 1, "10": [1, 7, 11], "find_librari": 1, "nlohmann_json": 1, "With": [1, 4, 10], "collectionnam": 1, "definiton": 1, "similarli": 1, "foreseen": [1, 7], "represent": [1, 10], "mind": [1, 5], "global": [1, 9], "assumpt": [1, 4, 7], "caveat": 1, "As": [1, 4, 7, 11], "guarante": 1, "dure": 1, "state": [1, 8], "synchron": 1, "manual": [1, 11], "exemplari": 1, "want": [1, 2], "dumped_edm4hep": 1, "redirect": 1, "necessarili": 1, "below": [1, 4, 10], "frameread": 1, "getedmdefinit": 1, "most": [1, 10], "decod": 1, "__jsondefinit": 1, "r": 1, "edmdefinit": 1, "subfold": [1, 10], "singleton": 1, "whenev": 1, "enit": 1, "getdatamodeldefinit": 1, "edmnam": 1, "size_t": [1, 11], "getdatamodelregistryindex": 1, "That": 1, "datamodelregistryindex": 1, "straight": 1, "readelf": 1, "p": 1, "rodata": 1, "libedm4hep": 1, "grep": 1, "exposepodmemb": [1, 3], "fals": [1, 3], "datamodelregistryiohelp": 1, "instrument": 1, "datamodeldefinitioncollector": 1, "encount": 1, "registerdatamodeldefinit": 1, "getdatamodeldefinitionstowrit": 1, "datamodeldefinitionhold": 1, "getavailabledatamodel": 1, "sioframeread": 1, "yard": 2, "nosi": 2, "essenc": 2, "your": [2, 3], "dedic": 2, "until": 2, "rebas": 2, "cd": 2, "fork": 2, "repositori": 2, "web": 2, "usernam": 2, "yourusernam": 2, "meaning": 2, "mynewbranch": 2, "frequent": 2, "reload": 2, "websit": 2, "beginreleasenot": 2, "endreleasenot": 2, "eas": 3, "optimis": 3, "encourag": 3, "composit": 3, "inherit": [3, 4, 5, 8, 10], "One": [3, 8], "focu": 3, "friendli": 3, "plain": [3, 4, 5], "within": [3, 4, 10], "combin": [3, 8], "constrain": 3, "_leastn": 3, "_fastn": 3, "flat": 3, "my": 3, "mycompon": 3, "y": [3, 7], "anothercompon": 3, "excerpt": 3, "eventinfo": 3, "eventinfodata": 3, "eventinfocollect": 3, "extrem": 3, "expens": 3, "henc": [3, 8], "physic": [3, 4, 5], "quantiti": 3, "thu": 3, "particular": [3, 7], "sens": 3, "mutableextracod": 3, "declarationfil": 3, "implementationfil": 3, "through": [3, 8, 9, 10], "examplecompon": 3, "exampletyp": 3, "mr": 3, "comp": 3, "steer": 3, "capit": 3, "accomod": 3, "special": 3, "reimplement": 3, "nevertheless": 3, "gain": 3, "upstream_edm": 3, "xml": [3, 10], "overwritten": 3, "consciou": 3, "abus": 3, "drive": 4, "higher": 4, "technic": [4, 5], "explan": 4, "four": 4, "kind": 4, "act": 4, "certain": 4, "inter": [4, 5], "hitobject": 4, "hitdata": 4, "hitcollect": [4, 7, 11], "light": 4, "flavor": 4, "recogniz": 4, "implicitli": [4, 7], "chosen": 4, "ident": 4, "identif": 4, "respect": [4, 7], "bookkeep": 4, "item": 4, "orient": 4, "soa": 4, "vision": 4, "heavi": 4, "best": 4, "alter": 4, "leav": 4, "creator": 4, "unfreez": 4, "afterward": [4, 5, 8], "heavili": 4, "impact": 4, "safeti": [4, 8, 9], "idea": [5, 8], "emploi": 5, "hierarchi": [5, 8], "virtual": 5, "servic": 5, "At": [5, 8, 10], "high": 5, "physicist": 5, "assist": 5, "markup": 5, "modern": 5, "softwar": 5, "technologi": 5, "inspir": 5, "studi": 5, "linear": 5, "gaudi": 5, "appli": [5, 10], "lhcb": 5, "collabor": 5, "lhc": 5, "guid": 5, "impati": 5, "begin": [6, 7], "titlepag": 6, "center": 6, "vspace": 6, "5cm": 6, "huge": 6, "normals": 6, "1cm": 6, "desi": 6, "pitfal": [7, 8], "concern": [7, 8], "framework": 7, "agnost": 7, "goe": 7, "hit1": 7, "hit2": 7, "energi": 7, "individu": [7, 10], "aren": 7, "attach": 7, "clustercollect": 7, "addhit": 7, "hits_begin": 7, "hits_end": 7, "cout": 7, "endl": 7, "hits_siz": 7, "anumb": 7, "ask": [7, 8], "bound": 7, "out_of_rang": 7, "x_arrai": 7, "y_arrai": 7, "vectoriz": 7, "togeth": 7, "coll": [7, 8], "ting": 7, "isvalid": 7, "Or": 7, "sometim": 7, "simul": 7, "job": 7, "cell": 7, "term": 7, "arbitrari": [7, 8], "submodul": 7, "organ": 8, "organis": 8, "impos": 8, "aggreg": 8, "alongsid": [8, 11], "mandat": 8, "collt": 8, "rvalu": 8, "achiev": 8, "left": 8, "indefinit": 8, "cannot": 8, "analysi": 8, "enable_if": 8, "machineri": 8, "imposs": 8, "mcparticlecollect": 8, "createmcparticl": 8, "els": 8, "moreparticl": 8, "refus": 8, "coll2": 8, "mcparticl": 8, "behind": 8, "scene": 8, "astr": 8, "fly": 8, "nor": 8, "random": 8, "suppos": 8, "collectionwritebuff": 8, "though": 8, "getidt": 8, "getcollectionbuff": 8, "unpack": 8, "amount": 8, "spent": 8, "minim": 8, "further": [8, 10], "decompress": 8, "freedom": 8, "exploit": 8, "optim": 8, "strategi": 8, "forc": 8, "detriment": 8, "classic": 8, "approach": 8, "ifram": 8, "pure": 8, "ideal": 8, "orthogon": 8, "aspect": 8, "chose": 8, "erasur": 8, "semant": 8, "introduct": 9, "quick": 9, "concept": 9, "philosophi": 9, "preprocess": 9, "podio_config_read": 10, "generator_util": 10, "classgeneratorbasemixin": 10, "langaug": 10, "itself": 10, "digest": 10, "disk": 10, "consumpt": 10, "cppclassgener": 10, "juliaclassgener": 10, "broadli": 10, "along": 10, "live": 10, "layer": 10, "linv": 10, "resourc": 10, "src": 10, "mutablestruct": 10, "jl": 10, "parentmodul": 10, "jinja": 10, "immedi": 10, "activ": 10, "_get_filenames_templ": 10, "postfix": 10, "filenam": 10, "overridden": 10, "neccessari": 10, "_fill_templ": 10, "deleg": 10, "endfor": 10, "Be": 10, "mostli": 10, "use_get_syntax": 10, "incfold": 10, "includes_cc": 10, "implemen": 10, "includes_data": 10, "includes_obj": 10, "includes_cc_obj": 10, "includes_coll_cc": 10, "include_coll_data": 10, "forward_declar": 10, "leaf": 10, "forward_declarations_obj": 10, "is_pod": 10, "indic": 10, "ostream_collection_set": 10, "header_cont": 10, "bare_typ": 10, "full_typ": 10, "is_builtin": 10, "is_arrai": 10, "array_typ": 10, "array_s": 10, "getter_nam": 10, "setter_nam": 10, "jl_import": 10, "staticarrai": 10, "mvector": 10, "julia_typ": 10, "essenit": 10, "strip": 10, "down": 10, "experiment": 10, "int16": 10, "int32": 10, "uint32": 10, "float32": 10, "float64": 10, "int64": 10, "uint64": 10, "userfloat": 11, "userdata": 11, "14f": 11, "vec": 11, "deliber": 11, "biggest": 11, "hittag": 11, "intn_t": 11, "uintn_t": 11, "16": 11, "platform": 11, "static_assert": 11, "is_same_v": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"v00": 0, "17": 0, "04": 0, "03": 0, "02": 0, "01": 0, "16": 0, "05": 0, "15": 0, "14": 0, "00": 0, "13": 0, "12": 0, "11": 0, "10": 0, "09": 0, "08": 0, "advanc": 1, "topic": 1, "write": [1, 8, 11], "extra": [1, 11], "data": [1, 3, 4, 7, 8, 11], "outsid": [1, 11], "edm": [1, 11], "chang": [1, 10], "creat": [1, 10], "new": [1, 10], "templat": [1, 10], "persist": 1, "back": 1, "end": 1, "read": [1, 8], "dump": 1, "json": 1, "thread": 1, "safeti": 1, "user": [1, 4, 7], "serial": 1, "Not": 1, "safe": 1, "compon": [1, 3, 10], "run": 1, "pre": 1, "commit": 1, "retriev": [1, 7], "definit": [1, 3], "from": [1, 3, 8], "file": [1, 10], "access": 1, "programmat": 1, "technic": 1, "detail": [1, 4], "embed": 1, "The": [1, 4, 8], "datamodelregistri": 1, "i": [1, 8], "o": [1, 8], "helper": 1, "store": 1, "contribut": 2, "podio": [2, 7, 9], "git": 2, "workflow": 2, "exampl": [2, 7, 8, 11], "releas": 2, "note": 2, "model": 3, "basic": [3, 8], "concept": [3, 8], "support": [3, 4, 7, 11], "featur": 3, "custom": 3, "class": 3, "defin": [3, 7], "member": 3, "refer": [3, 7, 8], "between": 3, "object": [3, 4, 7], "explicit": 3, "method": 3, "global": 3, "option": 3, "extend": 3, "datamodel": 3, "us": 3, "type": [3, 11], "an": [3, 11], "upstream": 3, "potenti": 3, "pitfal": 3, "design": [4, 8], "implement": [4, 8], "layout": 4, "layer": 4, "intern": 4, "pod": 4, "collect": [4, 7, 8, 11], "vector": 4, "notebook": [4, 7], "pattern": [4, 7], "handl": 4, "mutabl": 4, "introduct": 5, "quick": 5, "start": 5, "interfac": 7, "ownership": 7, "creation": 7, "storag": 7, "loop": 7, "through": 7, "frame": [7, 8], "contain": 7, "meta": 7, "python": 7, "function": 8, "usag": [8, 11], "put": 8, "get": 8, "paramet": 8, "philosophi": 8, "schema": 8, "evolut": 8, "welcom": 9, "": 9, "document": 9, "preprocess": 10, "yaml": 10, "exist": 10, "ad": 10, "avail": 10, "inform": 10, "gener": 10, "datatyp": 10, "membervari": 10, "julia": 10, "code": 10, "some": 11, "limit": 11, "No": 11, "relat": 11, "other": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"v00-17-04": [[0, "v00-17-04"]], "v00-17-03": [[0, "v00-17-03"]], "v00-17-02": [[0, "v00-17-02"]], "v00-17-01": [[0, "v00-17-01"]], "v00-17": [[0, "v00-17"]], "v00-16-05": [[0, "v00-16-05"]], "v00-16-04": [[0, "v00-16-04"]], "v00-16-03": [[0, "v00-16-03"]], "v00-16-02": [[0, "v00-16-02"]], "v00-16-01": [[0, "v00-16-01"]], "v00-16": [[0, "v00-16"]], "v00-15": [[0, "v00-15"]], "v00-14-02": [[0, "v00-14-02"]], "v00-14-01": [[0, "v00-14-01"], [0, "id1"]], "v00-14": [[0, "v00-14"]], "v00-14-00": [[0, "v00-14-00"]], "v00-13-02": [[0, "v00-13-02"]], "v00-13-01": [[0, "v00-13-01"]], "v00-13": [[0, "v00-13"]], "v00-12": [[0, "v00-12"]], "v00-11": [[0, "v00-11"]], "v00-10": [[0, "v00-10"]], "v00-09-02": [[0, "v00-09-02"]], "v00-09": [[0, "v00-09"]], "v00-08": [[0, "v00-08"]], "Advanced Topics": [[1, "advanced-topics"]], "Writing extra data outside the EDM": [[1, "writing-extra-data-outside-the-edm"]], "Changing / creating new templates": [[1, "changing-creating-new-templates"], [10, "changing-creating-new-templates"]], "Persistency": [[1, "persistency"]], "Writing Back-End": [[1, "writing-back-end"]], "Reading Back-End": [[1, "reading-back-end"]], "Dumping JSON": [[1, "dumping-json"]], "Thread-safety": [[1, "thread-safety"]], "Changing user data": [[1, "changing-user-data"]], "Serialization": [[1, "serialization"]], "Not-thread-safe components": [[1, "not-thread-safe-components"]], "Running pre-commit": [[1, "running-pre-commit"]], "Retrieving the EDM definition from a data file": [[1, "retrieving-the-edm-definition-from-a-data-file"]], "Accessing the EDM definition programmatically": [[1, "accessing-the-edm-definition-programmatically"]], "Technical details on EDM definition embedding": [[1, "technical-details-on-edm-definition-embedding"]], "The DatamodelRegistry": [[1, "the-datamodelregistry"]], "I/O helpers for EDM definition storing": [[1, "i-o-helpers-for-edm-definition-storing"]], "Contributing to PODIO": [[2, "contributing-to-podio"]], "Git workflow": [[2, "git-workflow"]], "Example workflow": [[2, "example-workflow"]], "Release Notes": [[2, "release-notes"]], "Data Models and Data Model Definitions": [[3, "data-models-and-data-model-definitions"]], "Basic Concepts and Supported Features": [[3, "basic-concepts-and-supported-features"]], "Definition of custom components": [[3, "definition-of-custom-components"]], "Definition of custom data classes": [[3, "definition-of-custom-data-classes"]], "Defining members": [[3, "defining-members"]], "Definition of references between objects:": [[3, "definition-of-references-between-objects"]], "Explicit definition of methods": [[3, "explicit-definition-of-methods"]], "Global options": [[3, "global-options"]], "Extending a datamodel / using types from an upstream datamodel": [[3, "extending-a-datamodel-using-types-from-an-upstream-datamodel"]], "Potential pitfalls": [[3, "potential-pitfalls"]], "Design and Implementation Details": [[4, "design-and-implementation-details"]], "Layout of Objects": [[4, "layout-of-objects"]], "The User Layer": [[4, "the-user-layer"]], "The Internal Data Layer": [[4, "the-internal-data-layer"]], "The POD Layer": [[4, "the-pod-layer"]], "The Collections": [[4, "the-collections"]], "Vectorization support / notebook pattern": [[4, "vectorization-support-notebook-pattern"]], "Handling mutability": [[4, "handling-mutability"]], "Introduction": [[5, "introduction"]], "Quick-start": [[5, "quick-start"]], "Examples for Supported Interface": [[7, "examples-for-supported-interface"]], "Object Ownership": [[7, "object-ownership"]], "Object Creation and Storage": [[7, "object-creation-and-storage"]], "Object References": [[7, "object-references"]], "Looping through Collections": [[7, "looping-through-collections"]], "Support for Notebook-Pattern": [[7, "support-for-notebook-pattern"]], "podio::Frame container": [[7, "podio-frame-container"]], "Object Retrieval": [[7, "object-retrieval"]], "User defined Meta Data": [[7, "user-defined-meta-data"]], "Python Interface": [[7, "python-interface"]], "The Frame concept": [[8, "the-frame-concept"]], "Basic functionality of a Frame": [[8, "basic-functionality-of-a-frame"]], "Usage examples for collection data": [[8, "usage-examples-for-collection-data"]], "Putting collection data into the Frame": [[8, "putting-collection-data-into-the-frame"]], "Getting collection (references) from the Frame": [[8, "getting-collection-references-from-the-frame"]], "Usage for Parameters": [[8, "usage-for-parameters"]], "I/O basics and philosophy": [[8, "i-o-basics-and-philosophy"]], "Writing a Frame": [[8, "writing-a-frame"]], "Reading a Frame": [[8, "reading-a-frame"]], "Schema evolution": [[8, "schema-evolution"]], "Frame implementation and design": [[8, "frame-implementation-and-design"]], "Welcome to PODIO\u2019s documentation!": [[9, "welcome-to-podio-s-documentation"]], "Preprocessing of yaml file": [[10, "preprocessing-of-yaml-file"]], "Existing templates": [[10, "existing-templates"]], "Adding a new template": [[10, "adding-a-new-template"]], "Available information in the templates": [[10, "available-information-in-the-templates"]], "General information": [[10, "general-information"]], "Components": [[10, "components"]], "Datatypes": [[10, "datatypes"]], "MemberVariable": [[10, "membervariable"]], "DataType": [[10, "datatype"]], "Julia code generation": [[10, "julia-code-generation"]], "Writing extra data outside an EDM": [[11, "writing-extra-data-outside-an-edm"]], "Example usage": [[11, "example-usage"]], "Some limitations": [[11, "some-limitations"]], "No relations to other collections": [[11, "no-relations-to-other-collections"]], "Limited supported types": [[11, "limited-supported-types"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/v00-00-00/templates.html b/v00-00-00/templates.html new file mode 100644 index 000000000..ac5fa1d25 --- /dev/null +++ b/v00-00-00/templates.html @@ -0,0 +1,584 @@ + + + + + + + Changing / creating new templates — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Changing / creating new templates

+

PODIO uses the Jinja2 template engine to generate the c++ code from the yaml description. +This document here gives an overview of how PODIO uses the Jinja2 engine and how the yaml file is processed before it is passed to it. +We don’t go into many details of Jinja2 templates here, please refer to the Template Designer Document of Jinja2. +PODIO only makes use of rather basic Jinja2 templates, so it should in principle be possible to pick up the basics just by looking at some existing templates.

+
+

Preprocessing of yaml file

+

The entry point for reading yaml files is the python/podio_gen/podio_config_reader.py. +When reading the yaml file a basic validation is run and the data members, relations and vector members of components and datatypes are parsed into MemberVariable objects (defined in python/podio_gen/generator_utils.py). +The main entry point to the code generation is the python/podio_class_generator.py which takes care of instantiating the language specific code generator (either C++ or a prototype version for Julia at this point). +The language specific generators inherit from the ClassGeneratorBaseMixin which takes care of some common initialization and provides some common functionality for code generation. +In the end each langauge specific generator will take care of (either by itself or through the common functionality in ClassGeneratorBaseMixin):

+
    +
  • Configuring the Jinja2 template engine. At the moment this is mainly making the templates known to the engine.

  • +
  • The necessary preprocessing of all the datatypes and components. This includes collecting necessary include directories and forward declaration, as well as digesting ExtraCode snippets.

  • +
  • Putting all the necessary information into a dict that can be easily used in the Jinja2 templates. See below for what is available in the templates

  • +
  • Calling the template engine to fill the necessary templates for each datatype or component and making sure to only write to disk if the filled template actually changed. Optionally run clang-format on them before writing.

  • +
  • Producing a list of generated c++ files for consumption by the cmake macros of PODIO.

  • +
+

Currently two language specific generators are available: CPPClassGenerator and JuliaClassGenerator. +Note that some of the information below will only apply to either of these generators as they provide the template engine with slightly different content.

+
+
+

Existing templates

+

Currently PODIO loads templates that are placed in <prefix>/python/templates. +They are broadly split along the classes that are generated for each datatype or component from the EDM definition:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

template file(s)

content

generated file(s)

Component.h.jinja2

Definition for each component

[<package>/]<component-name>.h

Data.h.jinja2

POD struct of each datatype (living in the POD layer)

[<package>/]<datatype-name>Data.h

Obj.{h,cc}.jinja2

Obj class for each datatype (linving in the object layer) and managing resources

[<package>/]<datatype-name>Obj.h, src/<datatype-name>Obj.cc

[Mutable]Object.{h,cc}.jinja2

The user facing interfaces for each datatype (living in the user layer)

[<package>/][Mutable]<datatype-name>.h, src/[Mutable]<datatype-name>.cc

Collection.{h,cc}.jinja2

The user facing collection interface (living in the user layer)

[<package>/]<datatype-name>Collection.h, src/<datatype-name>Collection.cc

CollectionData.{h,cc}.jinja2

The classes managing the collection storage (not user facing!)

[<package>/]<datatype-name>CollectionData.h, src/<datatype-name>CollectionData.cc

selection.xml.jinja2

The selection.xml file that is necessary for generating a root dictionary for the generated datamodel

src/selection.xml

SIOBlock.{h,cc}.jinja2

The SIO blocks that are necessary for the SIO backend

[<package>/]<datatype-name>SIOBlock.h, src/<datatype-name>SIOBlock.cc

MutableStruct.jl.jinja2

The mutable struct definitions of components and datatypes for julia

[<package>/]<datatype-name>Struct.jl, [<package>/]<component-name>Struct.jl

ParentModule.jl.jinja2

The constructor and collection definitions of components and datatypes in the data model are contained within a single module named after the package-name

[<package>/]<package-name>.jl

+

The presence of a [<package>] subdirectory for the header files is controlled by the includeSubfolder option in the yaml definition file.

+

Jinja allows the definition of additional macros and supports importing them similar to python modules. +These are stored in the macros subfolder and are imported directly by the main templates where necessary.

+
+
+

Adding a new template

+

All templates that are placed in the templates directory mentioned above become immediately available to the template engine if it ends on .jinja2 +However, it is still necessary to actively fill them from the class generator. +If the available information for the new templates is already enough and no further pre-processing is necessary, than they need to be added to _get_filenames_templates function in the ClassGeneratorBaseMixin. +The prefix and postfix dictionaries define how the template filename will be mapped to the generated files: <prefix><template-filename><postfix>. +By default a .h and a .cc file will be generated, but this can be overridden by adding the template to the endings dictionary. +With that in place it is now only neccessary to call _fill_templates with the appropriate template name and the pre processed data. +Note that for most templates this means that they have to be filled for each datatype or component individually.

+

If additional preprocessing is necessary, it will be necessary to also add that to the the language specific generators. +The main entry point to the generation is the process method which essentially just delegates to other methods.

+
+
+

Available information in the templates

+

The following gives an overview of the information that is available from the dictionary that is passed to the templates from the different +Each (top level) key in this dict is directly available as a variable in the Jinja2 templates, e.g.

+
component['includes'] = # list of includes
+
+
+

will become available as

+
{% for include in includes %}
+{{ include }}
+{% endfor %}
+
+
+

Be aware that some of the information is only available for the language +specific generators. The following information mostly applies to the c++ code +generation!

+
+

General information

+

The following keys / variables are always available

+ + + + + + + + + + + + + + + + + +

key / variable name

content

package_name

The package name of the datamodel (passed to the generator as argument)

use_get_syntax

The value of the getSyntax option from the yaml definition file

incfolder

The [<package>/] part of the generated header files (See above)

+
+
+

Components

+

The following keys are filled for each component

+ + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The class of the component as DataType (see below)

Members

The members of the component as MemberVariables

includes

All the necessary includes for this component

ExtraCode

Optionally present extra code

+
+
+

Datatypes

+

The following keys / variables are filled for each datatype

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The (immutable, user-facing) class as DataType (see below)

Members

The members of the datatype as a list of MemberVariables (see below)

OneToOneRelations

The one-to-one relation members of the datatype as a list of MemberVariables

OneToManyRelations

The one-to-many relation members of the datatype as a list of MemberVariables

VectorMembers

The vector members of the datatype as a list of MemberVariables

includes

The include directives for the the user facing classes header files

includes_cc

The include directives for the implemenations of the user facing classes

includes_data

The necessary include directives for the Data POD types

includes_obj

The include directives for the Obj classes headers.

includes_cc_obj

The include directives for the implementation files of the Obj classes.

includes_coll_cc

The include directives for the implementation of the Collection classes

include_coll_data

The include directives for the header CollectionData header file

forward_declarations

The forward declarations for the user facing classes header files. This is a nested dict, where the keys are namespaces and the leaf values are classes.

forward_declarations_obj

The forward declarations for the Obj classes header files.

is_pod

Flag value indicating whether the Data class of this datatype is a POD or if it contains an STL member

is_trivial_type

Flag that indicates that this is a trivial data type, i.e. one without relations or vector members.

ostream_collection_settings

A dict with a single header_contents key that is necessary for the output stream overload implementation of collections

+
+
+

MemberVariable

+

Defined in python/generator_utils.py. +The string representation gives the definition of the member, including a potentially present description string. +In principle all members are accessible in the templates, however, the most important ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

description

name

The name of the member

namespace

The (potentially empty) namespace of the member

bare_type

The type of the member without namespace

full_type

The full, namespace qualified, type of the member, essentially {{ namespace }}::{{ bare_type }}

description

The (optional) description string of the member

is_builtin

Flag for indicating that a member is a builtin type

is_array

Flag for indicating that a member is a std::array

array_type

The type of the array if the member is a std::array

array_size

The size of the array if the member is a std::array

getter_name

Method for generating the correct name for getter functions, depending on the getSyntax option in the yaml definition file.

setter_name

Method for generating the correct name for setter functions, depending on the getSyntax option in the yaml definition file and on whether the member is a relation or not

signature

The signature of a data member that can be used in function signatures, corresponds to {{ full_type }} {{ name }}

jl_imports

Import required for StaticArrays: MVector

julia_type

Equivalent julia type for the c++ type

+
+
+

DataType

+

Defined in python/generator_utils.py. +This is essenitally a stripped down version of the MemberVariable with the major difference being that the string representation returns the fully qualified type instead. +The available fields are

+ + + + + + + + + + + + + + + + + +

field

description

bare_type

The type without the namespace

namespace

The (potentially empty) namespace

full_type

The fully qualified type, corresponding to {{ namespace }}::{{ bare_type }}.

+
+
+

Julia code generation

+

It is an experimental feature. +Builtin types mapping in Julia

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cpp

julia

bool

Bool

char

Char

short

Int16

int

Int32

unsigned int

UInt32

float

Float32

double

Float64

long

Int64

unsigned long

UInt64

long long

Int64

unsigned long long

UInt64

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-00-00/userdata.html b/v00-00-00/userdata.html new file mode 100644 index 000000000..0e169b20b --- /dev/null +++ b/v00-00-00/userdata.html @@ -0,0 +1,319 @@ + + + + + + + Writing extra data outside an EDM — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Writing extra data outside an EDM

+

In some cases it can be necessary to write some additional data that can not +(yet) be stored in the EDM. PODIO offers a possibility to store such extra user +data via the podio::UserDataCollection. It gives the user access to a +std::vector of a set of limited fundamental types, which is written alongside +the data stored in the EDM classes for each event.

+
+

Example usage

+

Creating or getting a UserDataCollection via the Frame works the same +as with any other collection of the EDM via the put or get functions:

+
#include "podio/UserDataCollection.h"
+
+// Create a collection and put it into a Frame
+userFloats = podio::UserDataCollection<float>();
+frame.put(std::move(userFloats), "userFloats");
+
+// get a collection
+const auto& userData = frame.get<podio::UserDataCollection<float>>("userFloats");
+
+
+

The interface of the UserDataCollection is similar to a basic version of the +std::vector, i.e. push_back, resize and the basic functions for accessing +elements are present:

+
userFloats.push_back(3.14f); // add elements
+userFloats.resize(10);       // make the collection have 10 elements
+auto value = userFloats[0];  // access elements by index
+
+for (auto&& value : userFloats) {
+    // necessary functionality for range-based for-loops
+}
+
+for (size_t i = 0; i < userFloats.size(); ++i) {i
+    // but also for index based loops
+}
+
+
+

For cases where this subset interface is not enough it is also possible to get a +reference to the underlying std::vector via the UserDataCollection::vec() +method.

+
+
+

Some limitations

+

Since adding additional fields to an EDM type is almost trivial for PODIO +generated EDMs the UserDataCollection capabilities are deliberately kept +limited. Here we list what we consider to be the biggest limitations:

+
+

No relations to other collections

+

Since a UserDataCollection is really just a list of numbers it is not possible +to form relations to other objects. This also means that users are responsible +for keeping a UserDataCollection in sync with an EDM collection if is used to +store additional information, e.g.

+
auto& hits = store.create<HitCollection>("hits");
+auto& hitTags = store.create<podio::UserDataCollection<uint16_t>>("hitTags");
+
+for (/* some loop */) {
+    auto hit = hits.create();
+    // To be able to loop over these in parallel, you have to fill the user data manually
+    uint16_t hitTag;
+    hitTags.push_back(hitTag);
+}
+
+
+
+
+

Limited supported types

+

As mentioned above the possible types that can be stored in a +UserDataCollection is currently (deliberately) limited to the following +fundamental types

+
    +
  • fixed width integers: intN_t and uintN_t, with N={8, 16, 32, 64}

  • +
  • float and double

  • +
+

Trying to store different types in a UserDataCollection will lead to a +compilation error. Note that the usual integer types might be the same as the +fixed width version on some platforms. However, the equivalences of different +types might be different on different platforms. E.g.

+
static_assert(std::is_same_v<unsigned long, uint64_t>);
+
+
+

might work on some platforms, but might not work on others.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-00-00 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/.buildinfo b/v00-99/.buildinfo new file mode 100644 index 000000000..fbd1a6f2e --- /dev/null +++ b/v00-99/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 2048ebcf4c1325f62f970b2af33e9538 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v00-99/.doctrees/ReleaseNotes.doctree b/v00-99/.doctrees/ReleaseNotes.doctree new file mode 100644 index 000000000..41dd00ebb Binary files /dev/null and b/v00-99/.doctrees/ReleaseNotes.doctree differ diff --git a/v00-99/.doctrees/advanced_topics.doctree b/v00-99/.doctrees/advanced_topics.doctree new file mode 100644 index 000000000..65ff3b8a3 Binary files /dev/null and b/v00-99/.doctrees/advanced_topics.doctree differ diff --git a/v00-99/.doctrees/contributing.doctree b/v00-99/.doctrees/contributing.doctree new file mode 100644 index 000000000..9e5f45034 Binary files /dev/null and b/v00-99/.doctrees/contributing.doctree differ diff --git a/v00-99/.doctrees/datamodel_syntax.doctree b/v00-99/.doctrees/datamodel_syntax.doctree new file mode 100644 index 000000000..8efd50f37 Binary files /dev/null and b/v00-99/.doctrees/datamodel_syntax.doctree differ diff --git a/v00-99/.doctrees/design.doctree b/v00-99/.doctrees/design.doctree new file mode 100644 index 000000000..9205d51b0 Binary files /dev/null and b/v00-99/.doctrees/design.doctree differ diff --git a/v00-99/.doctrees/doc.doctree b/v00-99/.doctrees/doc.doctree new file mode 100644 index 000000000..1f741e31f Binary files /dev/null and b/v00-99/.doctrees/doc.doctree differ diff --git a/v00-99/.doctrees/doc_title.doctree b/v00-99/.doctrees/doc_title.doctree new file mode 100644 index 000000000..09cacfc85 Binary files /dev/null and b/v00-99/.doctrees/doc_title.doctree differ diff --git a/v00-99/.doctrees/environment.pickle b/v00-99/.doctrees/environment.pickle new file mode 100644 index 000000000..81eed7093 Binary files /dev/null and b/v00-99/.doctrees/environment.pickle differ diff --git a/v00-99/.doctrees/examples.doctree b/v00-99/.doctrees/examples.doctree new file mode 100644 index 000000000..0d33eb149 Binary files /dev/null and b/v00-99/.doctrees/examples.doctree differ diff --git a/v00-99/.doctrees/frame.doctree b/v00-99/.doctrees/frame.doctree new file mode 100644 index 000000000..bf9020886 Binary files /dev/null and b/v00-99/.doctrees/frame.doctree differ diff --git a/v00-99/.doctrees/index.doctree b/v00-99/.doctrees/index.doctree new file mode 100644 index 000000000..51b2a21d3 Binary files /dev/null and b/v00-99/.doctrees/index.doctree differ diff --git a/v00-99/.doctrees/templates.doctree b/v00-99/.doctrees/templates.doctree new file mode 100644 index 000000000..32183246c Binary files /dev/null and b/v00-99/.doctrees/templates.doctree differ diff --git a/v00-99/.doctrees/userdata.doctree b/v00-99/.doctrees/userdata.doctree new file mode 100644 index 000000000..6bfbad060 Binary files /dev/null and b/v00-99/.doctrees/userdata.doctree differ diff --git a/v00-99/ReleaseNotes.html b/v00-99/ReleaseNotes.html new file mode 100644 index 000000000..e8856fdc7 --- /dev/null +++ b/v00-99/ReleaseNotes.html @@ -0,0 +1,3488 @@ + + + + + + + v00-17-04 — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

v00-17-04

+
    +
  • 2023-12-14 tmadlener (PR#527)

    +
      +
    • Split the ClassGenerator into a base class (mixin) and two specific c++ and julia code generators that only deal with their language specific needs.

      +
        +
      • Instantiate and configure the correct reader in the podio_class_generator.py main script depending on the desired language.

      • +
      +
    • +
    • Slightly cleanup the MemberVariable to declutter its __init__ method a bit.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#530)

    +
      +
    • Remove the reading of the deprecated old-style format of component definitions in the YAML files.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#485)

    +
      +
    • Remove the deprecated EventStore functionality as announced in #429

    • +
    +
  • +
  • 2023-12-12 tmadlener (PR#529)

    +
      +
    • Switch the relation range tests to use Frame based I/O.

    • +
    +
  • +
  • 2023-12-06 tmadlener (PR#526)

    +
      +
    • Switch the edm4hep workflows to an LCG stack with a recent enough version of CMake. Necessary after key4hep/EDM4hep#235

    • +
    +
  • +
  • 2023-12-05 jmcarcell (PR#523)

    +
      +
    • Remove comment with file name and line number. It’s very unlikely it remains up to date when either the name or the content of the files changes

    • +
    +
  • +
  • 2023-12-04 jmcarcell (PR#521)

    +
      +
    • Do not import ROOT when using podio-dump --help, otherwise it can take a while depending on the system only to print the help.

    • +
    +
  • +
  • 2023-12-04 tmadlener (PR#514)

    +
      +
    • Introduce the MaybeSharedPtr to manage the Obj* in the user facing handle classes.

      +
        +
      • This splits the control block and the managed object into two distinct entities with potentially different lifetimes, which allows to fix #174 and #492.

      • +
      • This increases the size of the user facing handle classes by a factor two, since they are now effectively two pointers instead of one, even if the control block will not be initialized in case a handle is obtained from a collection.

      • +
      +
    • +
    • Remove the ObjBase base class and make the ObjectID a member of the Obj classes.

    • +
    • Make the user facing handle class constructors from an Obj* private as users will not have access to raw Obj* in any case.

      +
        +
      • Introduce a static makeEmpty method for the generated classes in order to create an empty handle, which is also used internally to handle unpersisted relations.

      • +
      +
    • +
    • Enable more existing test cases in sanitizer workflows now that it has become possible to do so.

    • +
    +
  • +
  • 2023-12-04 Ananya Gupta (PR#473)

    +
      +
    • Added Julia code generation support in the existing Python interface.

    • +
    • Implemented a new design structure for generated Julia code.

    • +
    • Added default parameters in constructor definitions with support for Abstract types (for builtins).

    • +
    • Created _sort_components_and_datatypes function to perform topological sort on components and datatypes.

    • +
    • Created _has_static_arrays_import to check for the need of using Static Arrays in the generated julia code.

    • +
    • Added –lang (-l) programming language argument to specify the programming language for code generation, current choices: cpp and julia, default: cpp.

    • +
    • Added –upstream-edm code generation support for julia.

    • +
    • Added tests in the unit test suite, covering the Julia code generation of the example data models.

    • +
    • Added documentation for julia code generation.

    • +
    • Added ENABLE_JULIA toggle option. By default it is OFF.

    • +
    +
  • +
  • 2023-12-01 jmcarcell (PR#520)

    +
      +
    • Add an error message when there is an std::bad_function_call, which currently shows +a stacktrace and is quite uninformative.

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#519)

    +
      +
    • Make generated member getter functions return by value for builtin types. Keep return by const reference for all other types. Fixes #518

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#488)

    +
      +
    • Add python bindings for the RNTuple reader and writer

    • +
    • Make podio-dump understand RNTuple based files

    • +
    • Fix missing storage of datamodel definitions for RNTuple based files

    • +
    +
  • +
+
+
+

v00-17-03

+
    +
  • 2023-11-14 tmadlener (PR#513)

    +
      +
    • Introduce checks in ROOTFrameWriter::writeFrame and ROOTNTupleWriter::writeFrame that ensure consistent contents for all Frames of a given category. If inconsistent contents are found an exception is thrown. Before these changes this might lead to a crash or to unreadable files. Fixes #382

    • +
    • Refactor ROOTNTupleWriter internals to have only one map that keeps track of categories instead of two maps and a set that need to be kept consistent.

    • +
    +
  • +
+
+
+

v00-17-02

+
    +
  • 2023-11-08 jmcarcell (PR#511)

    +
      +
    • Decouple generation tools and files from the rest of the podio python files by creating a new folder called podio_gen. This is a transparent change for users that only use the generator script.

      +
        +
      • This makes the configuration / generation times negligible again, because we don’t load libraries unnecessarily any longer for the generation.

      • +
      +
    • +
    • Simplify the python bindings (podio) __init__.py and remove the test_utils from it.

    • +
    • Move the tests for writing frames in python to the tests folder, where they belong and also test the SIO python writer.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#510)

    +
      +
    • Fix legacy tests; an extra argument was being passed and default in the .cpp file example_frame.root was being used which (almost) always exists (because there is a another test creating it) so it was hard to notice.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#509)

    +
      +
    • Add an option for using clang format and set it to off by default. It is significantly slower to run cmake with this option on.

    • +
    +
  • +
  • 2023-11-02 jmcarcell (PR#508)

    +
      +
    • Use the cmake ExternalData module to manage test data. This lets cmake take care of downloading the tests by hash so they can be version controlled. In addition, it’s possible to set up a local store using -DExternalData_OBJECT_STORES=/path/to/store and it will download the test files there if they are not there but otherwise use them from there, so building from scratch won’t download the test files again.

    • +
    +
  • +
  • 2023-10-16 jmcarcell (PR#507)

    +
      +
    • Copy .clang-format to the dumpmodel test directory and fix some tests when the build directory is not a subdirectory of the main directory. In some tests clang-format will try to find a .clang-format looking in the directories above and if it doesn’t exist it will format files differently and some tests will fail.

    • +
    +
  • +
+
+
+

v00-17-01

+
    +
  • 2023-10-12 tmadlener (PR#505)

    +
      +
    • Bump the pylint version for CI to 2.17.7

    • +
    +
  • +
  • 2023-10-11 tmadlener (PR#502)

    +
      +
    • Add a deleteBuffers function that is populated at generation time to the CollectionReadBuffers to make it possible to dispose of unconsumed buffers. This fixes the main leaks described in #500

    • +
    • Make the ROOTFrameData clean up all unconsumed buffers at desctruction.

    • +
    • Make sure to delete buffers that are no longer necessary in the CollectionData constructor. This fixes some more leaks described in #500

    • +
    +
  • +
  • 2023-10-08 Wouter Deconinck (PR#503)

    +
      +
    • Install podio-vis

    • +
    +
  • +
  • 2023-10-04 jmcarcell (PR#497)

    +
      +
    • Move podio_PYTHON_DIR to the top level CMakeLists so that it is set even when BUILD_TESTING is off

    • +
    +
  • +
  • 2023-10-02 jmcarcell (PR#496)

    +
      +
    • Add an operator != to fix negative comparisons since after https://github.com/AIDASoft/podio/pull/493 now id() returns a podioObjectID

    • +
    +
  • +
  • 2023-09-29 tmadlener (PR#493)

    +
      +
    • Make [Mutable]Object::id() return a podio::ObjectID instead of unsigned, since the latter has become useless with #412. Fixes #438

    • +
    • Add an operator<<(std::ostream&) for podio::ObjectID

    • +
    +
  • +
+
+
+

v00-17

+
    +
  • 2023-09-22 Juraj Smiesko (PR#491)

    +
      +
    • podio-dump: print warning if requested entry not present in the file

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#490)

    +
      +
    • Fix bugs in python imports when podio is built without SIO support. Fixes #489

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#486)

    +
      +
    • Make sure to initialize ObjectIDs to untracked to properly track whether they have been added to a Frame or not

    • +
    • Change CollectionIDTable interfaces of name and collectionID to return optional to signal whether a collection (ID) is known to the table. This is a breaking change if you use the CollectionIDTable!

      +
        +
      • Avoids having to do the lookup twice to check existence and a subsequent retrieval

      • +
      +
    • +
    • Fix bug of overly shared CollectionIDTable in ROOTNTupleReader that was uncovered by the CollectionIDTable switch to optional returns.

    • +
    • Switch tests from EventStore to Frame based I/O.

    • +
    • Fix bug in Frame based I/O that lead to crashes when trying to resolve relations to unpersisted objects.

    • +
    +
  • +
  • 2023-09-18 tmadlener (PR#484)

    +
      +
    • Make the podio python bindings import structure “feel more pythonic”

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#483)

    +
      +
    • Clarify error message in case of not implemented schema changes

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#482)

    +
      +
    • rename CMake macro createBuffers into create_buffers

    • +
    +
  • +
  • 2023-09-13 jmcarcell (PR#481)

    +
      +
    • Rename the cmake executable or target unittest to unittest_podio, to avoid possible collisions since the unittest name is relatively common

    • +
    +
  • +
  • 2023-09-13 Benedikt Hegner (PR#480)

    +
      +
    • Move the code generation of buffers into the ‘create_buffers’ macro

    • +
    +
  • +
  • 2023-09-13 Thomas Madlener (PR#472)

    +
      +
    • Allow comparison of data schemata across versions

    • +
    • Provide syntax to clarify user intentions in schema evolution

    • +
    • Provide schema evolution implementation based on ROOT backend

    • +
    • Include infrastructure for future support for schema evolution in other backends

    • +
    • Documentation for schema evolution functionality

    • +
    +
  • +
  • 2023-09-11 tmadlener (PR#477)

    +
      +
    • Use nlohmann/json_fwd.hpp in headers to reduce unnecessary template instantiations. Fixes #475

    • +
    +
  • +
  • 2023-09-08 tmadlener (PR#478)

    +
      +
    • Add empty method to CollectionBase

    • +
    • Add operator== to the collection iterators

    • +
    +
  • +
  • 2023-09-08 Dmitry Kalinkin (PR#465)

    +
      +
    • Introduce member typedefs to the user facing classes.

      +
        +
      • Object’s collection type can now be referenced as Object::collection_type. Conversely, the object type is reachable as ObjectCollection::value_type. The mutable objects can be reached via Object::mutable_type.

      • +
      +
    • +
    +
  • +
  • 2023-08-30 tmadlener (PR#471)

    +
      +
    • Initialize the branch names to be index based for reading (i.e. legacy behavior) for all releases of the v00-16 series.

    • +
    +
  • +
  • 2023-08-22 Andre Sailer (PR#469)

    +
      +
    • Tests: update required catch2 version to 3.4 for builds with c++20

    • +
    • CI: use clang16 on el9 (alma9), instead of clang12 on cs7, using c++20

    • +
    • CI: disable key4hep-release-based tests (tabulate available)

    • +
    +
  • +
  • 2023-08-22 Benedikt Hegner (PR#445)

    +
      +
    • Allow to specify units as part of the datamodel definition

    • +
    +
  • +
  • 2023-07-26 tmadlener (PR#463)

    +
      +
    • Make sure to only access vector member buffers of collections of datatypes with VectorMembers if they actually exist. This is necessary to make subset collections of such datatypes work in I/O. Fixes #462

    • +
    • Add a test that reproduces the original issue and is fixed by this.

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#461)

    +
      +
    • Make sure the ROOTFrameReader on the master branch can read v00-16-06 files

    • +
    • Add v00-16-06 to the legacy versions that are tested

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#447)

    +
      +
    • Add a python wrapper around the different available Frame writers.

    • +
    • Add a put method to the Frame wrapper that allows to add collections to the Frame without having to explicitly use cppyy.gbl.std.move. Fixes #432

    • +
    • Add test cases that write via python bindings and read via c++.

    • +
    +
  • +
  • 2023-07-20 tmadlener (PR#457)

    +
      +
    • Simplify the test setup for SIO in CMake and make it explicit on the ENABLE_SIO option rather than on the presence of targets.

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#456)

    +
      +
    • Cache podio_PYTHON_DIR

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#455)

    +
      +
    • Rename CMAKE_BINARY_DIR to PROJECT_BINARY_DIR

    • +
    +
  • +
  • 2023-07-18 tmadlener (PR#439)

    +
      +
    • Introduce the FrameCategories.h header that puts a few of the conventions and otherwise hardcoded strings into variables / functions.

    • +
    +
  • +
  • 2023-07-14 jmcarcell (PR#454)

    +
      +
    • Rename CMAKE_{SOURCE,BIN}_DIR to PROJECT_{SOURCE,BIN}_DIR

    • +
    +
  • +
  • 2023-07-14 tmadlener (PR#452)

    +
      +
    • Extend the pre-processor condition for the to_json functionality to not be visible in rootcling or the root interpreter. Fixes #435

    • +
    +
  • +
  • 2023-07-13 Benedikt Hegner (PR#450)

    +
      +
    • Add optional description and author fields to component definition

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#449)

    +
      +
    • Fix the pre-commit workflow by making it run on top of the key4hep nightlies that come with a recent enough root version to be able to work with the RNTuple addition (#395)

    • +
    • Fix a few minor complaints from newer versions of clang-format, clang-tidy and pylint

    • +
    • Enable building the RNTuple backend for more workflows (anything that comes with a new enough ROOT essentially).

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#448)

    +
      +
    • Remove the lcio datalayout which has been untouched (and unbuilt) for quite a few years.

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#446)

    +
      +
    • Make calling finish for the SIOFrameWriter non-mandatory. See #442 for other related changes.

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#442)

    +
      +
    • Allow not calling finish() when using the writers

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#395)

    +
      +
    • Add support for the new RNTuple format by adding a writer, reader and tests.

    • +
    +
  • +
  • 2023-06-30 Ananya Gupta (PR#437)

    +
      +
    • Modified parse function definition to incorporate missing description in member definition error message. Fixes #436

    • +
    +
  • +
  • 2023-06-27 Thomas Madlener (PR#413)

    +
      +
    • Introduce podio::SchemaEvolution that can hold schema evolution functions and that offers an evolveBuffers method that does the schema evolution on these buffers before collections are created.

    • +
    • Add hooks in podio::Frame to call this when collections are read from the FrameData.

    • +
    +
  • +
  • 2023-06-23 tmadlener (PR#434)

    +
      +
    • Properly handle the slightly different branch contents before v00-16-04. Fixes #433

    • +
    • Add tests that use the ROOTLegacyReader to actually read the downloaded legacy files

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#428)

    +
      +
    • Split the tests directory into several (more or less) topical sub-directories to declutter the main test CMakeLists.txt a bit

    • +
    • Move commonly used functionality into cmake/podioTests.cmake (e.g. setting up a test environment)

    • +
    • Move python unittests config to the python directory

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#427)

    +
      +
    • Delay library loading as long as possible, mainly for quicker responses for --help

    • +
    • Add a --version flag for dumping the podio version

    • +
    • Display collections and parameters in alphabetical order and automatically adjust column widths to fit contents (using the tabulate package).

    • +
    +
  • +
  • 2023-06-09 Thomas Madlener (PR#402)

    +
      +
    • Add public static constexpr char* type names to the collections and make the getXXXName() methods return string_views to these strings. This is a breaking change to the interface of the collections if you explicitly rely on them being std::string

      +
        +
      • typeName: the full type name of the collection (returned also by getTypeName)

      • +
      • valueTypeName: the (immutable) type name of the objects of the collection (returned by getValueTypeName)

      • +
      • dataTypeName: the type name of the data PODs (returned by getDataTypeName)

      • +
      +
    • +
    • Make unittest environment properly use PODIO_SIOBLOCK_PATH

    • +
    • USE_EXTERNAL_CATCH2 now can also be set to AUTO to look for a suitable version of Catch2 before falling back and fetching and building it’s own version instead of a hard fail.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#426)

    +
      +
    • Check if PODIO_SIOBLOCK_PATH exists in the environment and use that to look for SIO Blocks libraries before falling back to LD_LIBRARY_PATH. This makes it possible to make slightly more robust environments if several (incompatible) podio installations are visible on LD_LIBRARY_PATH

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#425)

    +
      +
    • Add a SKIP_CATCH_DISCOVERY cmake option to skip the unittest discovery of Catch2 to avoid running the catch discovery in an unsuitable environment.

    • +
    • Make environment for unittests more specific to avoid catching too much of the underlying environment.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#412)

    +
      +
    • Using string hashes as CollectionID based on MurmurHash

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#423)

    +
      +
    • Add some more structure to make it easier to add more legacy tests.

      +
        +
      • Use this to download more legacy files automatically

      • +
      • Restructure CMake config to make this possible

      • +
      +
    • +
    • Add tests for Frame based root I/O reading files that have been produced with prior versions of podio

    • +
    • Add more tests for EventStore based root I/O reading files that have been produced with prior versions of podio

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#421)

    +
      +
    • Make the collections appear in alphabetical order in root files, using a case insensitive sorting of the collections that are written.

    • +
    +
  • +
  • 2023-06-05 Thomas Madlener (PR#405)

    +
      +
    • Make the branch names for relations and vector members more legible and valid c++ variable names to improve interoperability with RDataFrame. Fixes #169

      +
        +
      • The branch names will have the following structure: _<collection-name>_<relation-name>, resp. _<collection-name>_<vectormember-name>, where relation-name, resp.vectormember-name are taken from the YAML definitions.

      • +
      • Subset collections will have a single branch with <collection-name>_objIdx. This makes it easier to disambiguate them from normal collections.

      • +
      +
    • +
    • This is a breaking change if you use the root files directly! If you use the podio Readers/Writers everything should be transparent

    • +
    +
  • +
  • 2023-05-30 tmadlener (PR#422)

    +
      +
    • Fix small bug in Frame python bindings where set but empty parameters could crash podio-dump when trying to access a non-existent element

    • +
    +
  • +
+
+
+

v00-16-05

+
    +
  • 2023-05-23 tmadlener (PR#420)

    +
      +
    • Fix a version check inside the ROOTReader to avoid segmentation violations

    • +
    +
  • +
+
+
+

v00-16-04

+
    +
  • 2023-05-23 tmadlener (PR#417)

    +
      +
    • Fix an issue with reading multiple files via the ROOTFrameReader (#411)

      +
        +
      • Add documentation for API of opening file(s)

      • +
      • Add tests for reading multiple files

      • +
      +
    • +
    +
  • +
  • 2023-05-22 tmadlener (PR#418)

    +
      +
    • Bring back the public templated getMap functionality for podio::GenericParameters as they are already used in DD4hep (see AIDASoft/DD4hep#1112).

      +
        +
      • Mark the existing getXYZMap as deprecated but keep them for a brief transition period.

      • +
      • These have been removed in #415.

      • +
      +
    • +
    +
  • +
  • 2023-05-19 jmcarcell (PR#416)

    +
      +
    • Remove selection rules for classes that don’t exist anymore

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#415)

    +
      +
    • Remove the deprecated getters and setters from the generic parameters

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#410)

    +
      +
    • Remove the square that is run when cmake runs

    • +
    +
  • +
  • 2023-05-09 tmadlener (PR#414)

    +
      +
    • Fix off-by-one error in UserDataCollection::print that caused the first element to be printed twice.

    • +
    +
  • +
  • 2023-05-09 Thomas Madlener (PR#394)

    +
      +
    • Introduce a CollectionBufferFactory that can create the necessary buffers from a collection type, a schema version and a subset collection flag.

      +
        +
      • Use this factory throughout all existing Readers

      • +
      • Remove createBuffers and createSchemaEvolvableBuffers from podio::CollectionBase interface

      • +
      +
    • +
    • Make the minimum allowed schema_version 1 in the yaml definition files. Default to 1 if no schema_version is provided

    • +
    • Add a schemaVersion to the DatamodelDefinition.h header that is generated and that can be accessed via {{ package_name }}::meta::schemaVersion. Use this to propagate schema information to the necessary places.

    • +
    • Make SIOBlocks write the current schema version, such that on reading they can generate the appropriate buffers for the version on file.

    • +
    +
  • +
  • 2023-04-22 Christopher Dilks (PR#408)

    +
      +
    • fix type inconsistency between Collection::size() and index for const object accessors

    • +
    +
  • +
  • 2023-04-21 jmcarcell (PR#387)

    +
      +
    • Make sure that the dump model round trip tests work without ENABLE_SIO

    • +
    • Actually test the extension model dumping

    • +
    +
  • +
  • 2023-04-12 Thomas Madlener (PR#400)

    +
      +
    • Fix a bug in SIOFrameData::getAvailableCollections to also work with Frames where some of the collections have not been written and that could lead to a seg fault.

    • +
    • Add a test for this in c++ (previously only covered in python unittests of Frame).

    • +
    +
  • +
  • 2023-04-05 Thomas Madlener (PR#399)

    +
      +
    • Add PODIO_ENABLE_SIO=1 to the public target_compile_definitions for podioSioIO so that all dependent targets automatically get it as well. This should make it easier to use SIO dependent features in dependencies.

    • +
    • Consistently use a scope for target_link_libraries in tests.

    • +
    +
  • +
  • 2023-04-03 Paul Gessinger-Befurt (PR#398)

    +
      +
    • Do not reject building if ROOT was built with C++20 (instead of C++17).

    • +
    +
  • +
  • 2023-04-03 Thomas Madlener (PR#397)

    +
      +
    • Remove the GENERATED property from generated files in CMake to avoid inconsistent removal of headers and source files with the clean target. Fixes #396

    • +
    +
  • +
  • 2023-03-15 Benedikt Hegner (PR#341)

    +
      +
    • Adding infrastructure for schema evolution

    • +
    • Added explicit version tracking to the metadata

    • +
    • Data model comparison tool w/ simple heuristics to identify potential omissions / mistakes (e.g. checking for the limits of the ROOT backend)

    • +
    • Changed handling of backwards compatibility for the collection info metadata

    • +
    +
  • +
+
+
+

v00-16-03

+
    +
  • 2023-03-14 jmcarcell (PR#391)

    +
      +
    • Catch an exception when a clang-format flag is not found

    • +
    +
  • +
  • 2023-03-14 jmcarcell (PR#390)

    +
      +
    • Modify the initial clang-format check to try to run with all the arguments that will be used later

    • +
    +
  • +
  • 2023-03-13 jmcarcell (PR#389)

    +
      +
    • Add .cache to the gitignore

    • +
    +
  • +
  • 2023-03-07 Thomas Madlener (PR#358)

    +
      +
    • Embed the EDM definition in JSON format into the shared core datamodel libraries

      +
        +
      • Generate an additional DatamodelDefinition.h header file containing the string literal json encoded definition

      • +
      • Statically register this to the newly introduced DatamodelRegistry and make collections aware of which datamodel they belong to

      • +
      +
    • +
    • Collect all EDM definitions from all collections that are written with a writer and write all these definitions to the resulting file

      +
        +
      • Currently only done for the FrameWriters

      • +
      +
    • +
    • Give podio-dump the necessary functionality to retrieve the stored models and dump them in YAML format again

      +
        +
      • Add roundtrip tests that compare the generated code from the original model and the one that has been dumped from a data file to ensure that all components work as intended.

      • +
      +
    • +
    • See the advanced topics documentation for more details.

    • +
    +
  • +
  • 2023-03-06 Dmitry Kalinkin (PR#384)

    +
      +
    • Added an operator for conversion to std::string for podio::version::Version

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#378)

    +
      +
    • Introduce deprecation warnings for the EventStore based I/O model as it will be removed in favor of the Frame based one

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#372)

    +
      +
    • Make double a supported type of GenericParameters. A similar thing has been added to LCIO in iLCSoft/LCIO#143 to support storing event weights that need double precision.

    • +
    • Add more unittests to the GenericParameters covering also the available constructors.

    • +
    +
  • +
  • 2023-02-27 Thomas Madlener (PR#380)

    +
      +
    • Add getParameters method to the Frame and deprecate getGenericParametersForWrite which offered the exact same functionality.

      +
        +
      • Make it easily possible to get all parameters that are currently stored in a Frame via an “official” channel

      • +
      • Replace all internal usages.

      • +
      +
    • +
    • Add a getParameterKeys templated method to get the keys for different parameter types that are currently stored in the Frame.

    • +
    +
  • +
  • 2023-02-22 jmcarcell (PR#377)

    +
      +
    • Add a visualization tool that converts a YAML description to a graph

    • +
    +
  • +
  • 2023-02-21 jmcarcell (PR#376)

    +
      +
    • Fix tests without SIO

    • +
    +
  • +
  • 2023-02-14 Thomas Madlener (PR#375)

    +
      +
    • Fix the PODIO_VERSION preprocessor macro to be actually usable in a preprocessor context. Fixes #374

    • +
    • Make podio_VERSION preprocessor constant something that can be used in a preprocessor context (now the same as PODIO_BUILD_VERSION

    • +
    • Add test that ensures that the macro and the constant are actually used in a preprocessor context.

    • +
    +
  • +
  • 2023-02-13 Juraj Smiesko (PR#373)

    +
      +
    • Adding ID to the short podio-dump output

    • +
    +
  • +
  • 2023-02-06 Nathan Brei (PR#369)

    +
      +
    • Mark non-templated definitions of Frame::Frame, Frame::get, Frame::put and Frame::putParameters as inline to fix linker errors.

    • +
    +
  • +
  • 2023-02-02 jmcarcell (PR#364)

    +
      +
    • Make workflows not trigger twice on pushes to PRs

    • +
    +
  • +
  • 2023-01-26 jmcarcell (PR#368)

    +
      +
    • CMAKE: Add option PODIO_RELAX_PYVER to allow relaxing the required match of python version with the one that ROOT has been built with to only check major and minor versions

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#363)

    +
      +
    • Move sio utility functionality defined in SIOFrameWriter.cc to private sioUtils.h header and use it also in the legacy SIOWriter.

    • +
    • Fix cmake configure dependencies (missed in #343) for datamodel generation macro.

    • +
    • Use defaultdict instead of hand rolling one in class generator.

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#361)

    +
      +
    • Add basic I/O tests for datatypes defined in the extension datamodel. Fixes #319

    • +
    +
  • +
  • 2023-01-11 jmcarcell (PR#355)

    +
      +
    • Change the readers so that when the file is missing they won’t crash

    • +
    +
  • +
  • 2023-01-10 jmcarcell (PR#365)

    +
      +
    • Fix the pre-commit workflow

    • +
    +
  • +
  • 2022-12-23 jmcarcell (PR#362)

    +
      +
    • Rename the variable match to avoid collisions with a python keyword from Python 3.10 onwards

    • +
    +
  • +
+
+
+

v00-16-02

+
    +
  • 2022-12-19 Thomas Madlener (PR#360)

    +
      +
    • Make the log output of loading the SIOBlock libraries more informative by also providing the absolute paths to the loaded (and rejected) shared libraries.

    • +
    +
  • +
  • 2022-12-16 Thomas Madlener (PR#333)

    +
      +
    • Initialize the unique_ptr<mutex> in the constructor initializer list instead of in the member variable declaration. This is more likely a bug in nvcc (or maybe a c++17 feature not yet supported by nvcc). Fixes key4hep/k4Clue#34

    • +
    • Pass --disable-new-dtags to the linker when using PODIO_SET_RPATH, to set RPATH and not RUNPATH in the binaries.

    • +
    • Pin the ubuntu version for runners that build on ubuntu to not accidentally go out of sync with the underlying LCG releases.

    • +
    • Disable the podio tests in the edm4hep workflows (see #359).

    • +
    +
  • +
+
+
+

v00-16-01

+
    +
  • 2022-12-06 jmcarcell (PR#356)

    +
      +
    • Fix path in the README

    • +
    • Use the functionality in argparse to choose between options

    • +
    +
  • +
  • 2022-12-06 Benedikt Hegner (PR#346)

    +
      +
    • Switched tp Apache 2.0 license to facilitate integration in experiment stacks.

    • +
    +
  • +
  • 2022-12-05 Thomas Madlener (PR#357)

    +
      +
    • Put <prefix>/bin onto PATH in order to make podio-dump available from environments created with env.sh

    • +
    +
  • +
  • 2022-12-02 jmcarcell (PR#354)

    +
      +
    • Make env.sh setup script POSIX compliant to run in shells other than bash

      +
        +
      • Change == to =

      • +
      • Change tabs to spaces (two) to avoid mix of spaces and tabs for indenting

      • +
      • Add <prefix>/include to ROOT_INCLUDE_PATH (as it is required since #343)

      • +
      +
    • +
    +
  • +
  • 2022-11-16 Thomas Madlener (PR#351)

    +
      +
    • Fix bug in Frame python bindings where empty collections were considered as non-existing. Replacing the original check relying on some implicit boolean conversions (which also caught empty collections) to an explicit check against nullptr.

    • +
    • Make podio-dump more robust in installations without SIO support, by guarding the corresponding import.

    • +
    +
  • +
  • 2022-11-14 Thomas Madlener (PR#344)

    +
      +
    • Make podio-dump work with new Frame based I/O (fixes #339)

    • +
    • Keep existing functionality intact by using the legacy readers introduced in #345.

    • +
    +
  • +
  • 2022-11-11 Thomas Madlener (PR#345)

    +
      +
    • Add a ROOTLegacyReader and a SIOLegacyReader that read files that have been written prior to #287 into podio::Frames and offers the same interface as the frame readers

      +
        +
      • Also including python bindings for it

      • +
      +
    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#349)

    +
      +
    • Fix bug in setting relations in nested get calls in podio::Frame. Fixes #348

    • +
    • Adapt the read test to actually check this. Previously this went unnoticed, because the necessary relations were already set in a previous call.

    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#343)

    +
      +
    • Add python bindings for Frame based I/O

      +
        +
      • Available from podio.root_io and podio.sio_io, where a Reader and a Writer is implemented for each.

      • +
      • Wrapper around podio::Frame. Requires that the podio/Frame.h header is available somewhere on the ROOT_INCLUDE_PATH.

      • +
      +
    • +
    • Add necessary functionality for python bindings to C++ API

      +
        +
      • untyped Frame::get method for getting collections

      • +
      • New constructor from FrameDataT&&

      • +
      • functionality to inspect file and Frame contents more easily

      • +
      +
    • +
    • Reorganize python code into structure that follows the usual python packaging conventions a bit more closely

      +
        +
      • Introduce the podio module. Make CMake generate the __init__.py with the correct version

      • +
      • Move everything except the generator script into module. Additionally also keep an EventStore wrapper to not break existing code.

      • +
      +
    • +
    • Refactor the CMakeLists.txt that is responsible for building the core and all required I/O libraries

      +
        +
      • Build more dictionaries for more python bindings.

      • +
      +
    • +
    +
  • +
  • 2022-11-02 Thomas Madlener (PR#342)

    +
      +
    • Migrate to actions/checkout@v3 as advised by github

    • +
    • Use the checkout action to clone the dependencies in the edm4hep workflow instead of doing an explicit clone in the body of the action

    • +
    +
  • +
  • 2022-11-02 Dmitry Kalinkin (PR#327)

    +
      +
    • fix typo in documentation

    • +
    +
  • +
  • 2022-10-24 Juraj Smiesko (PR#340)

    +
      +
    • Adding reading of specific entry from frame

    • +
    +
  • +
  • 2022-10-21 Thomas Madlener (PR#335)

    +
      +
    • Update the github-action-cvmfs and run-lcg-view actions to their latest available version to pick up the latest improvements (caching of dependencies, log groups)

    • +
    • Introduce log groups in github actions for easier to interpret outputs

    • +
    • Switch to LCG_102 for lcg based build environments

    • +
    • Add a workflow that builds and tests EDM4hep after building podio

    • +
    +
  • +
+
+
+

v00-16

+
    +
  • 2022-10-04 Thomas Madlener (PR#337)

    +
      +
    • Make the notebook pattern functionality return std::vectors instead of std::array to avoid having to specify a static size. Fixes #332

    • +
    • Backwards incompatible change as the return type as well as the call signature for the notebook pattern change.

    • +
    +
  • +
  • 2022-09-27 Andre Sailer (PR#336)

    +
      +
    • podioConfig.cmake: silence warning about cmake policy CMP00012

    • +
    • CMake: explicitly look for catch2 version 3 and fail at cmake instead of compile step

    • +
    +
  • +
  • 2022-09-27 Thomas Madlener (PR#334)

    +
      +
    • Fix a warning/error message from ROOT from attempts to stream the std::mutex members of GenericParameters by marking them as transient for the dictionary generation.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#323)

    +
      +
    • Add a podio-dump python script (installed to <prefix>/bin that can be used to dump event contents to stdout. By default prints an overview over the collections and their types, but can also be used to dump full events, via the -d or --detailed flag. Use --help to get all available options and their descriptions.

    • +
    • To allow podio-dump to work with all available backends also add support for reading SIO via the PythonEventStore.

      +
        +
      • Split off the necessary c++ functionality into a separate podioPythonStore library (+ necessary ROOT dictionaries).

      • +
      +
    • +
    • Add a print function to the collections for easier dumping from the python side.

    • +
    • Add a print function to the GenericParameters

    • +
    • Make goToEvent is a part of the IReader interface and correctly implemented it for the SIOReader.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#287)

    +
      +
    • Introduce the podio::Frame as a generalized, thread-safe (event) data container.

      +
        +
      • This first version offers all necessary functionality and an almost finalized interface, i.e. we plan to keep this as stable as possible, but we might still change things if it turns out that there are better ways to do some things

      • +
      • For details about the basic interface and the underlying design considerations please consult the corresponding documentation

      • +
      +
    • +
    • This will be the only way to work with podio data starting from version 1.0

      +
        +
      • For now the current I/O implementations remain in place unchanged, but they will be deprecated (and removed) in the not too distant future

      • +
      +
    • +
    +
  • +
+
+
+

v00-15

+
    +
  • 2022-08-09 Thomas Madlener (PR#312)

    +
      +
    • Add support for converting objects and collections to JSON using nlohmann/json.

      +
        +
      • To enable JSON support it is necessary to build the datamodel with PODIO_JSON_OUTPUT and to link against the nlohmann/json library.

      • +
      +
    • +
    +
  • +
  • 2022-08-05 Wouter Deconinck (PR#318)

    +
      +
    • CMake: PODIO_ADD_ROOT_IO_DICT: Bugfix for data models in OUTPUT_FOLDER not equal to source dir in root dictionary generation cmake macro.

      +
        +
      • Now SELECTION_XML can be passed either as absolute path or relative to OUTPUT_FOLDER.

      • +
      +
    • +
    +
  • +
  • 2022-08-03 Thomas Madlener (PR#317)

    +
      +
    • Make it possible to pass an upstream datamodel to the class generator such that datatypes and components defined there can be used in an unrelated datamodel. This makes it possible to extend datamodels and to prototype new datatypes with the aim of upstreaming them eventually without having to redefine all the necessary components.

    • +
    • Refactor the internals of the config reader / class generator slightly to make it possible to hold multiple datamodels in memory

    • +
    +
  • +
  • 2022-08-02 Thomas Madlener (PR#316)

    +
      +
    • Remove macOS CI workflows because github hosted runners will deprecate macOS 10.15 (announcement) and later versions of macOS no longer support fuse and as a consequence CVMFS.

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#315)

    +
      +
    • Make the is_trivial_type flag available in the template engine behave as expected (it behaved exactly oppositely to what was documented and what one would intuitively expect). The flag was originally introduced in #288

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#283)

    +
      +
    • Allow users to define default values for member variables, instead of default initializing all of them.

      +
        +
      • The syntax for specifying a default value is - <type> <name>{<init-value>} // <description>.

      • +
      • The passed value is not validated in any way. Apart from a very basic syntax check, there is no validation that the provided default initialization values are actually valid. This means that generated code might not compile.

      • +
      +
    • +
    • Remove some of the python2 compatibility and do some cleanup

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#276)

    +
      +
    • Remove support for having std::string members in datatypes and components, as they break PODness and it seems that this feature was not in use in any case.

    • +
    • Make ROOTReader slightly more robust against missing datatypes in dictionaries when reading files.

    • +
    +
  • +
  • 2022-06-22 Valentin Volkl (PR#307)

    +
      +
    • hotfix for https://github.com/AIDASoft/podio/issues/290: revert a clang-tidy change to make sure that there are no unknown symbols in podioDict

    • +
    +
  • +
  • 2022-06-21 Thomas Madlener (PR#282)

    +
      +
    • Add a PODIO_USE_CLANG_FORMAT option to the cmake configuration to toggle the autodiscovery of clang-format and a .clang-format configuration file. This option is also available for downstream packages that use podio to generate their EDM.

      +
        +
      • The default is AUTO, where we try to discover a suitable clang-format version as well as a .clang-format file and use it if we find it.

      • +
      • If set to OFF podio will not try to see whether clang-format and a .clang-format file are available and will also not try to format the code accordingly.

      • +
      • If set to ON podio will actually require a suitable clang-format version and the presence of a .clang-format file and will fail at the cmake stage if not present.

      • +
      +
    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#305)

    +
      +
    • Make sure generator warnings are printed

    • +
    • Add a deprecation warning for the upcoming removal of support of std::string in data types. (See also #276)

    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#294)

    +
      +
    • Remove the EventStore, CollectionIDTable and version::Version members from the SIOCollectionIDTableBlock to make it easier to use in the Frame context

    • +
    • Move the podio:version::build_version into its own SIOVersionBlock

    • +
    • This is a breaking change for the SIO backend and it will not be able to read files that have been written prior to this

    • +
    +
  • +
+
+
+

v00-14-02

+
    +
  • 2022-06-15 Thomas Madlener (PR#304)

    +
      +
    • Use the releases v3.0.1 version of Catch2 instead of an unreleased commit

    • +
    +
  • +
  • 2022-06-15 Thomas Madlener (PR#303)

    +
      +
    • Default initialize the array for the vectorized access.

    • +
    +
  • +
  • 2022-06-14 soumil (PR#296)

    +
      +
    • Add instructions on how to run pre-commit locally to the documentation

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#295)

    +
      +
    • Mark CollectionBase::prepareForWrite as const and make sure that the generated implementations are thread safe.

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#286)

    +
      +
    • Make sure that vector member buffers for writing point to the correct place even if a collection has been moved, by resetting them when the buffers are requested.

    • +
    • Add checks for this to the unittests, as this is sort of an interface for I/O backends.

    • +
    +
  • +
  • 2022-06-13 Kalina Stoimenova (PR#301)

    +
      +
    • Fixed the text in the cmake message for code generation to point to the correct readme file

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#300)

    +
      +
    • Newer versions of pylint have removed a few options and a few checks that aimed at python2-python3 compatibility.

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#299)

    +
      +
    • Explicitly add constructors to CollectionBase

    • +
    • Make sure to not use an unset LD_LIBRARY_PATH for detecting sio blocks shared libraries.

    • +
    +
  • +
  • 2022-06-02 soumil (PR#293)

    +
      +
    • Removing python2 compatibility imports

    • +
    • Removing ordered loading (obsolete) function

    • +
    +
  • +
  • 2022-06-01 Thomas Madlener (PR#285)

    +
      +
    • Fix potential bug in setting the collection ID for subset collections

    • +
    +
  • +
  • 2022-05-30 soumil (PR#291)

    +
      +
    • Replace the obj_needs_destructor flag in the generator code and templates with the is_trivial_type flag, since that is the more appropriate name. (Fixes #288)

    • +
    +
  • +
  • 2022-05-27 Thomas Madlener (PR#274)

    +
      +
    • Add documentation for the Jinja2 templates and the code generation process in general to make working with these parts of PODIO easier.

    • +
    +
  • +
  • 2022-05-23 Thomas Madlener (PR#262)

    +
      +
    • Make the getters and setters for the GenericParameters templated functions and add a deprecation warning for the untemplated ones.

    • +
    • Define a SupportedGenericDataTypes tuple defining the types (and vectors of those) that can be stored in GenericParameters

    • +
    • Add a podio/utilities/TypeHelpers.h header with some type handling helpers.

    • +
    +
  • +
  • 2022-05-20 Thomas Madlener (PR#277)

    +
      +
    • Avoid fetching the (remote) legacy input file for tests unnecessarily every time cmake is run.

    • +
    +
  • +
  • 2022-05-17 Thomas Madlener (PR#284)

    +
      +
    • Make sure the EventStore doesn’t try to read event meta data multiple times per event

    • +
    • Add a empty method to GenericParameters to check if any parameters are stored.

    • +
    +
  • +
  • 2022-04-04 Thomas Madlener (PR#280)

    +
      +
    • Only use --color option for diff in clang-format wrapper script if it is supported by the underlying diffutils.

    • +
    +
  • +
  • 2022-04-02 Thomas Madlener (PR#254)

    +
      +
    • Add a .clang-format and .clang-tidy config file for consistent formatting and following a few coding guidelines.

    • +
    • Add pre-commit hooks that run clang-tidy and clang-format

    • +
    • Make all currently present files follow the formatting and guidelines of the present configuration.

    • +
    • Make the PODIO_GENERATE_DATAMODEL macro look for a .clang-format file and the presence of clang-formatand automatically format all the generated files if both are there.

    • +
    +
  • +
  • 2022-04-01 Thomas Madlener (PR#279)

    +
      +
    • Fix test environment to work again in newest Key4hep release by unsetting ROOT_INCLUDE_PATH in the test environment to avoid potential clashes with existing other installations in the environment.

    • +
    • Add CI build against the Key4hep nightlies.

    • +
    • Switch to use the Catch2 installation from Key4hep for the workflows.

    • +
    +
  • +
  • 2022-03-31 Thomas Madlener (PR#253)

    +
      +
    • Add a basic setup for pre-commit and replace the python linting github workflow with one that is run via pre-commit.

      +
        +
      • Add additional checks for consistent line-endings and removal of trailing whitespaces.

      • +
      +
    • +
    • Update pylint and flake8 config to no longer check for python2/python3 compatibility but instead follow the same guidelines as e.g. in ILCDirac.

    • +
    • Fix all issues that were uncovered.

    • +
    +
  • +
  • 2022-03-23 Thomas Madlener (PR#270)

    +
      +
    • Remove duplicated printing of component members in the std::ostream& operator<< overloads of the datatypes. Fixes #269

    • +
    • Add an example datatype that broke compilation before these fixes.

    • +
    +
  • +
  • 2022-03-18 Andre Sailer (PR#265)

    +
      +
    • CI: use clang12 and gcc11 for tests based on dev stacks

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14

+
    +
  • 2021-10-13 Thomas Madlener (PR#234)

    +
      +
    • Make sure that #include <cstdint> is present when using fixed with integers in datatypes

    • +
    +
  • +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-14-00

+
    +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-13-02

+
    +
  • 2021-10-08 Thomas Madlener (PR#224)

    +
      +
    • Make the clone function always return a mutable object, also when called on an immutable object (Fixes #219)

    • +
    +
  • +
  • 2021-09-22 Thomas Madlener (PR#214)

    +
      +
    • Make the CMake datamodel generation macro use the python interpreter that is also found by CMake to avoid accidentally picking up an unsuitable system provided version that might be on PATH.

    • +
    +
  • +
  • 2021-09-21 Frank Gaede (PR#213)

    +
      +
    • add possibility to store additional user data as collections of fundamental types in PODIO files

      +
        +
      • uses std::vector<basic_type>

      • +
      • stored in simple branch in root (and simple block in SIO)

      • +
      • all fundamental types supported in PODIO (except bool) can be written

      • +
      +
    • +
    • example code:

    • +
    +
      auto& usrInts = store.create<podio::UserDataCollection<uint64_t> >("userInts");
    +  auto& usrDoubles = store.create<podio::UserDataCollection<double> >("userDoubles");
    +  // ...
    +
    +  // add some unsigned ints
    +  usrInts.resize( i + 1 ) ;
    +  int myInt = 0 ;
    +  for( auto& iu : usrInts ){
    +    iu = myInt++  ;
    +  }
    +  // and some user double values
    +  unsigned nd = 100 ;
    +  usrDoubles.resize( nd ) ;
    +  for(unsigned id=0 ; id<nd ; ++id){
    +    usrDoubles[id] = 42. ;
    +  }
    +
    +
    +
      +
    • should replace https://github.com/key4hep/EDM4hep/pull/114 in a more efficient way

    • +
    +
  • +
  • 2021-09-21 tmadlener (PR#143)

    +
      +
    • Generate an additional podio_generated_files.cmake file containing all generated source files as a header and sources list and make the code generation macro include this file to get the headers and source files.

      +
        +
      • Now only the files generated for the current settings are picked up by cmake

      • +
      • Makes it possible to have additional files in the folders where the generated files are placed, since these are no longer globbed over.

      • +
      +
    • +
    +
  • +
  • 2021-09-10 Thomas Madlener (PR#217)

    +
      +
    • Make the Obj destructors = default where possible, i.e. if a datatype has no relations to handle

    • +
    • Make the assignment operators of the user facing classes use the “copy-and-swap” idiom

    • +
    • Fix the problem where OneToOneRelations needed to be from the same namespace as the datatype they are used in (#216)

    • +
    +
  • +
  • 2021-09-06 Thomas Madlener (PR#211)

    +
      +
    • Fix test dependencies to allow running tests in parallel via ctest -jN

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#210)

    +
      +
    • Fix a few small issues in the datamodel yaml file validation. These do not change the behavior of code generation, they just try to catch problems earlier

      +
        +
      • Make sure that OneToManyRelations and OneToOneRelations have the same restrictions

      • +
      • Only allow components, builtins and arrays of those as Members

      • +
      +
    • +
    • Make the API of validate slightly more generic by taking a dict instead of multiple arguments.

    • +
    • Make the generator exit with an easier to read error message in case of a validation problem instead of printing a full backtrace.

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#197)

    +
      +
    • Introduce a podio::CollectionBuffers class that contains everything that is necessary for I/O of a given collection. This is a breaking change in the collection interface

    • +
    • Introduce and generate a CollectionData class for each datatype that only manages the storage of a given collection.

      +
        +
      • Exposes only the Obj entries of each collection as well as the necessary functionality to add a new object (and its relations) to the collection.

      • +
      +
    • +
    • Implement “subset” collections that behave exactly the same as normal collections apart from an additional function call when creating them.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#206)

    +
      +
    • Switch to Catch2 v3 test library and by default assume that it is available. Use the ‘USE_EXTERNAL_CATCH2` cmake option to control whether podio should use an external installation or if it should fetch and build it internally instead.

    • +
    • Remove catch.hpp header that was previously shipped, since it is no longer needed.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#201)

    +
      +
    • Make assignment operator increase the reference count to avoid possible heap-after-free usage. (Fixes #200)

    • +
    +
  • +
+
+
+

v00-13-01

+
    +
  • 2021-06-03 Thomas Madlener (PR#195)

    +
      +
    • Fix possible circular and self-includes in generated header files.

    • +
    +
  • +
  • 2021-06-03 Thomas Madlener (PR#194)

    +
      +
    • Make it possible to do indexed access on a RelationRange, making the interface more akin to a const std::vector

    • +
    +
  • +
  • 2021-05-31 tmadlener (PR#193)

    +
      +
    • Make collection element access const correct.

    • +
    +
  • +
  • 2021-05-31 Thomas Madlener (PR#192)

    +
      +
    • Fix const-correctness problems of meta data access via EventStore.

    • +
    +
  • +
  • 2021-05-28 Benedikt Hegner (PR#191)

    +
      +
    • Fix bug in validity check so that transient and persistent collections are treated the same

    • +
    +
  • +
  • 2021-05-28 Thomas Madlener (PR#186)

    +
      +
    • Add support for fixed width integer type members in components and datatypes.

      +
        +
      • Now possible to use int16_t, int32_t, int64_t, uint16_t, uint32_t and uint64_t as members. Other fixed width integer types that are potentially defined in <cstdint> are not considered valid as the intended use case is really only fixed width integers for now. These are rejected at the datamodel validation step.

      • +
      • Fixed width integers are considered to be “builtin” types for podio.

      • +
      +
    • +
    +
  • +
  • 2021-05-04 Valentin Volkl (PR#189)

    +
      +
    • [cmake] fix test dependencies: read_and_write.cpp reads the file example.root that is created by the write test. If the dependency is not declared, running the tests concurrently can lead to spurious test failures.

    • +
    +
  • +
  • 2021-04-28 tmadlener (PR#180)

    +
      +
    • Improve the branch look-up logic in ROOTReader and ROOTWriter. Triggered by a performance degradation in v6.22/06, where this logic was changed inside ROOT and our use case was affected badly. All ROOT versions profit from these changes as it is in general more efficient than the previous implementation.

    • +
    +
  • +
  • 2021-03-30 tmadlener (PR#182)

    +
      +
    • Use run-lcg-view github action and switch to more recent LCG releases to run CI.

    • +
    • Update README to include status of CI

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#185)

    +
      +
    • extended .gitignore

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#184)

    +
      +
    • Clean up AsciiWriter comments

    • +
    +
  • +
  • 2021-03-23 tmadlener (PR#183)

    +
      +
    • Use SIO targets in cmake, which are exported starting with v00-01 (iLCSoft/SIO#15)

    • +
    +
  • +
  • 2021-02-23 Marko Petric (PR#181)

    +
      +
    • Add coverity nightly scan based on run-lcg-view action

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#175)

    +
      +
    • Fully qualify return types for OneToOneRelation getters in generated .cc file for objects and Const objects. This fixes a bug described in https://github.com/AIDASoft/podio/issues/168#issuecomment-770751871 and now allows to mix different namespaces in the generated code. This allows to more easily extend already existing datamodels by compiling and linking against them.

    • +
    +
  • +
  • 2021-02-23 Dmitry Romanov (PR#173)

    +
      +
    • Added IO Handler argument to schema generation example in README

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#171)

    +
      +
    • Fix compiler warnings, that were uncovered by #153 and described in #170. Fix them in the core classes and also in the generated ones.

    • +
    • Enforce no new warnings with Werror in the CI builds.

    • +
    +
  • +
  • 2021-02-15 Joseph C Wang (PR#156)

    +
      +
    • Readers/writers are now noncopyable

    • +
    +
  • +
  • 2021-02-02 Joseph C Wang (PR#154)

    +
      +
    • Disable operator = for collections so that it maintains one copy of collections, fixes #111

    • +
    +
  • +
  • 2021-01-26 tmadlener (PR#172)

    +
      +
    • Fix deprecated brew install commands in mac workflow

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#165)

    +
      +
    • Add a convenience RelationRange::emtpy function for easily checking whether a range is empty.

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#162)

    +
      +
    • Fix cmake problem #161 on Ubuntu

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#155)

    +
      +
    • Add some benchmarking tools, including TimedReader and TimedWriter decorators that allow to wrap (interface conforming) readers and writers and record the times different operations take. The times are recorded on two levels: setup times, like constructing a reader or “one-time” calls and per event times, for things that happen each event (e.g. writeEvent or readCollection). Additionally the BenchmarkRecorder in principle also allows to track additional things outside of these decorators.

    • +
    +
  • +
+
+
+

v00-13

+
    +
  • 2020-12-03 Marko Petric (PR#153)

    +
      +
    • Set rpath for macOS and externalize compiler and linker flags

    • +
    • Search for the same version of python as was used for building ROOT

    • +
    +
  • +
  • 2020-12-03 Joseph C Wang (PR#152)

    +
      +
    • Make EventStore non-copyable

    • +
    +
  • +
  • 2020-12-03 tmadlener (PR#144)

    +
      +
    • Decouple the writers and the EventStore to allow to write collections that have previously been read from a file.

    • +
    +
  • +
  • 2020-11-24 Valentin Volkl (PR#149)

    +
      +
    • [cmake] add find_package_handle_standard_args() to podio config

    • +
    +
  • +
  • 2020-11-18 Frank Gaede (PR#147)

    +
      +
    • fix for MacOs when using SIO I/O with podio +- need to link edm-core library to edm-sioBlocks library

    • +
    +
  • +
  • 2020-11-10 Thomas Madlener (PR#130)

    +
      +
    • Add SIO as a second I/O backend (as alternative to ROOT) that can be enabled with ENABLE_SIO. If enabled, a separate podioSioIO library is built that allows reading and writing sio files. For serializing the different datatypes, additional code is generated to build an SioBlocks library that is loaded at runtime (if found somewhere on LD_LIBRARY_PATH). To facilitate the whole process at the cmake level, new cmake functions are provided to generate the core datamodel library PODIO_ADD_DATAMODEL_CORE_LIBRARY, to (conditionally) define the ROOT dictionary target PODIO_ADD_ROOT_IO_DICT and to (conditionally) define the Sio Blocks library target PODIO_ADD_SIO_IO_BLOCKS. The I/O backends that are supported by podio are exported via the PODIO_IO_HANDLERS list variable.

    • +
    • podio_generate_datamodel.py now additionally takes the I/O handlers that should be generated as arguments. This is also reflected in an additional argument to PODIO_GENERATE_DATAMODEL. To have backwards compatibility, this additional argument defaults to ROOT in both cases and downstream packages should work as usual without changes.

    • +
    +
  • +
  • 2020-10-06 tmadlener (PR#133)

    +
      +
    • Make ROOTReader handle file switches properly for meta data reading.

    • +
    +
  • +
  • 2020-09-29 tmadlener (PR#141)

    +
      +
    • Update CI actions to use LCG 96, 97, 98 for mac, centos7 and ubuntu1804

    • +
    • Make python bindings work with root 6.22 (and onwards)

    • +
    • Make sure that root has been built with c++17 at the cmake stage

    • +
    • Require at least CMake 3.12

    • +
    +
  • +
  • 2020-09-18 tmadlener (PR#134)

    +
      +
    • Make the EventStore actually take ownership of the metadata passed to it by the readers. (see #139)

    • +
    • Make the collections properly clean up data of VectorMembers (see #139)

    • +
    • Fix small memory leak in the EventStore for the CollectionIDTable.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#128)

    +
      +
    • Fix a possible nullptr access in the Writers and make registerForWrite return a boolean to make it easier to check from the calling site.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#127)

    +
      +
    • cleanup of GenericParameters for meta data +- remove mutable from internal maps

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#126)

    +
      +
    • No longer install python unittest files

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#125)

    +
      +
    • improve CollectionIDTable +- previously used a std::recursive_mutex which is unnecessary in this case +- made whatever can be made const const and now use std::distance to calculate the index.

    • +
    +
  • +
  • 2020-08-28 tmadlener (PR#129)

    +
      +
    • Reduce memory footprint by clearing intermediately used I/O buffers.

    • +
    +
  • +
+
+
+

v00-12

+
    +
  • 2020-08-11 Frank Gaede (PR#124)

    +
      +
    • minor bug fix for macos: +- add <sstream> to write.cpp +- fixes #123

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#122)

    +
      +
    • Update README to reflect the new requirements (i.e. jinja2)

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#121)

    +
      +
    • Update Ubuntu CI script to install the python requirements via pip.

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#120)

    +
      +
    • Use jinja2 template engine to generate c++ code. This makes it possible to more cleanly separate the generation of the c++ code and all the necessary pre-processing. Now only the pre-processing is done in python, while the complete generation is done using jinja2. This should make it much easier to make changes to the generated c++ code.

    • +
    +
  • +
  • 2020-08-05 tmadlener (PR#117)

    +
      +
    • Refactoring of the podio class generator to improve its readability. This refactoring is mainly focusing on reducing the size of some methods to make them easier to grasp as well as trying to more cleanly separate the validation of the inputs and the c++ code generation. The validation is stricter than the current version and will potentially break things. Specifically, the handling of ExtraCode and ConstExtraCode is now implemented according to the documentation. In the previous version this has somewhat diverged from there. The yaml declaration of components has been made equivalent to the ones of the datatypes but “old-style” definitions are still handled properly. In the latter case a deprecation warning is emitted. The generated c++ code is functionally equivalent, but not equal character by character. The differences are mainly whitespace, but at some places also some of the generated code has been updated to more recent c++ capabilities. Additionally, some tests for the validation are added. They are not really exhaustive and should be considered to serve mainly documenting purposes for the moment.

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#107)

    +
      +
    • Introduce range wrapper for OneToManyRelations and VectorMembers to allow range-based for loops

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#106)

    +
      +
    • Fix the possibility of running into infinite loops in the ostream operator with cyclical references

    • +
    +
  • +
  • 2020-08-03 Frank Gaede (PR#102)

    +
      +
    • add test example read_and_write.cpp

      +
        +
      • simple use case for reading in an event an writing (parts of it) to another file

      • +
      • currently fails with segmentation fault (to be fixed)

      • +
      +
    • +
    +
  • +
  • 2020-08-03 Valentin Volkl (PR#98)

    +
      +
    • add ubuntu ci build

    • +
    +
  • +
+
+
+

v00-11

+
    +
  • 2020-07-21 tmadlener (PR#101)

    +
      +
    • Fix bug where ConstObject with empty OneToManyRelations give an invalid iterator range, #100

    • +
    +
  • +
  • 2020-06-23 Andre Sailer (PR#99)

    +
      +
    • Point to libpodioDict.so instead of libpodio.so in rootmap file

    • +
    +
  • +
  • 2020-06-03 Frank Gaede (PR#92)

    +
      +
    • implement reading/writing of meta data for runs, events and collections

      +
        +
      • based on GenericParameters that hold named parameters of type int, float, string or vectors if these (copied from lcio::LCParameters)

      • +
      • meta data for the three types is always written

      • +
      • it is read only on request

      • +
      +
    • +
    • example for writing:

    • +
    +
       auto& evtMD = store.getEventMetaData() ;
    +    evtMD.setValue( "UserEventWeight" , (float) 100.*i ) ;
    +
    +
    +
      +
    • example for reading:

    • +
    +
      auto& evtMD = store.getEventMetaData() ;
    +  float evtWeight = evtMD.getFloatVal( "UserEventWeight" ) ;
    +
    +
    +
      +
    • addresses #49

    • +
    +
  • +
  • 2020-05-26 Andre Sailer (PR#91)

    +
      +
    • Ensure podioRootIO is linked against podioDict even when linker uses as-needed by default, fixes #90

    • +
    +
  • +
  • 2020-05-26 Thomas Madlener (PR#89)

    +
      +
    • Updated README and env.sh to reflect changes in install process

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#88)

    +
      +
    • change add relation naming addXxxx -> addToXxxxs

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#87)

    +
      +
    • update minimum required CMake version to 3.8

    • +
    • remove obsolete Jenkinsfile

    • +
    • make CPack config optional: cmake variable ENABLE_CPACK defaults to OFF

    • +
    • update Readme with Spack instructions

    • +
    +
  • +
  • 2020-04-14 Frank Gaede (PR#83)

    +
      +
    • allow automatic change of version in CMakeLists.txt

      +
        +
      • fixes #82

      • +
      +
    • +
    +
  • +
+
+
+

v00-10

+
    +
  • 2020-04-03 Frank Gaede (PR#81)

    +
      +
    • make compatible with macos and clang

      +
        +
      • use -Wl,-undefined,dynamic_lookup w/ AppleClang

        +
          +
        • make the same, default behavior on linux explicit w/ -Wl,--allow-shlib-undefined

        • +
        +
      • +
      • add ROOT::Core to TestDataModel library

      • +
      +
    • +
    +
  • +
  • 2020-04-03 Marko Petric (PR#80)

    +
      +
    • add a macOS test to GitHub actions

    • +
    +
  • +
  • 2020-04-03 Valentin Volkl (PR#75)

    +
      +
    • Fixes in python code for 2-3 compatibility

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#74)

    +
      +
    • Fix exception when podio_class_generator is called with -q/–quiet

    • +
    • Printout about includes only in verbose mode

    • +
    • Do not print warnings in quiet mode

    • +
    • Print each warning only once

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#73)

    +
      +
    • Added PODIO_GENERATE_DATAMODEL Cmake macro to call the class generator at the right time. see podioMacros for the signature

    • +
    +
  • +
  • 2020-03-11 Marko Petric (PR#72)

    +
      +
    • Update CI to use GitHub actions

    • +
    • Add test against a Python 3 LCG view

    • +
    • Remove travis

    • +
    • Add tests for Python 3 compatibility and flake8

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#70)

    +
      +
    • ClassGenerator: add option “includeSubfolder”, to always use `#include “<packagename>/<object>.h” etc. if set to “True”

    • +
    • Added sorting and “uniquing” of include lists. Some duplicates still occur because two different lists are used on occasion

    • +
    • Added $PACKAGE_NAME_ to include guards

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#69)

    +
      +
    • Move all Root dependencies (RootReader, RootWriter) of the podio Library into podioRootIO, rename podioDict to podioDict

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#68)

    +
      +
    • Add podioMacros.cmake to contain PODIO_GENERATE_DICTIONARY

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#67)

    +
      +
    • Change Yaml loader to preserve order of members as given in the yaml

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#65)

    +
      +
    • podio_class_generator: only write files if their content changed

    • +
    +
  • +
  • 2019-10-15 Valentin Volkl (PR#64)

    +
      +
    • Add BUILD_TESTS CMake option for building tests

    • +
    +
  • +
  • 2019-10-15 Pere Mato (PR#63)

    +
      +
    • Fix to avoid deprecated STL classes in C++17

    • +
    +
  • +
+
+
+

v00-09-02

+
    +
  • 2019-09-27 Frank Gaede (PR#60)

    +
      +
    • fixed the code generation for members with multi word types (long long, unsigned long,…) +- add example to ExampleHit: +- unsigned long long cellID // cellID

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59)

    +
      +
    • move templates inside the python directory when installing +- fixes: #58

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59) +/

  • +
  • 2019-09-27 Frank Gaede (PR#57)

    +
      +
    • allow for numbers in namespace and class names +- generate type name string for CollectionBase::getValueTypeName()
      +- fixes #56

    • +
    +
  • +
  • 2019-09-26 Frank Gaede (PR#55)

    +
      +
    • cache collection pointers for fast access in EventStore::get()

      +
        +
      • added EventStore::getFast(int id)

      • +
      • considerably speeds up XXCollection::setReferences() +when reading back collections

      • +
      +
    • +
    +
  • +
  • 2019-09-26 Ben Morgan (PR#54)

    +
      +
    • improve the CMake

      +
        +
      1. Consistent use of CMake usage requirements to propagate include and link dependencies

      2. +
      3. Full use of the CMakePackageConfigHelpers module to generate the podioConfig.cmake file and associated podioTargets.cmake

      4. +
      5. Automatically refind the ROOT dependency

      6. +
      7. Standardize install paths for CMake and template files +A podio client can, in CMake, do

      8. +
      +
    • +
    +
    find_package(podio REQUIRED)
    +add_executable(foo foo.cc)
    +target_link_libraries(foo podio::podio)
    +
    +
    +

    and all include/link paths will be set correctly.

    +
  • +
  • 2019-08-21 Javier Cervantes Villanueva (PR#51) +Do not install tests

    +
      +
    • Allow tests to run after the build phase

    • +
    • Paths have been modified to point to binary or source directories

    • +
    • Before, tests had to be run only after running make install

    • +
    • Test are not installed anymore

    • +
    • Fail tests if any error is reported (ROOT Interpreter error may not be considered by CMake)

    • +
    +
  • +
  • 2019-05-10 Frank Gaede (PR#45)

    +
      +
    • updated documentation

      +
        +
      • add guidelines for contributing

      • +
      +
    • +
    • reverted some name changes in tests/examples (fixes #44)

      +
        +
      • read-one now again called read

      • +
      +
    • +
    • enamble dryrun again for generate-edm test

    • +
    +
  • +
  • 2019-04-09 Marko Petric (PR#43)

    +
      +
    • Implementation of CI based on LCG views, as suggested in #42

    • +
    +
  • +
  • 2019-04-09 Graeme A Stewart (PR#41)

    +
      +
    • Improve convenience setup scripts and build instructions +- remove FCC specific code from init.sh +- factorise environment setup to env.sh +- updated README.md

    • +
    +
  • +
  • 2019-03-24 Javier Cervantes (PR#40)

    +
      +
    • ROOTReader now supports multiple inputs thanks to new implementation based on TChain

    • +
    • ROOTReader now supports opening files via xrootd (root:///eospublic.cern.ch//eos... for example)

    • +
    • Improved CMake and CPack configuration, sticking more closely to HSF template

    • +
    +
  • +
+
+
+

v00-09

+
    +
  • 2018-12-20 Frank Gaede (PR#39)

    +
      +
    • add some fixes and improvements

      +
        +
      • fix forward declarations in Object template when using a namespace for the EDM

      • +
      • fix array getter names when using the get/set syntax

      • +
      • add missing treatment for include statements in component’s header files

      • +
      • handle array members in ostream operators

      • +
      +
    • +
    • add CollectionBase::size() member function

      +
        +
      • allows to access collection size w/o knowing the concrete type

      • +
      • method is already generated in implementation classes

      • +
      +
    • +
    +
  • +
  • 2018-12-06 Frank Gaede (PR#38)

    +
      +
    • add code generation for I/O of vector members +- vector members are treated analogous to the reference vectors,i.e. +streamed as one large vector per collection

    • +
    • updated tests/datamodel accordingly (using clang-format)

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#37)

    +
      +
    • handle references and vector members in collection’s ostream operators

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#36)

    +
      +
    • add github templates for releaase notes, issues and contribution guidelines

    • +
    • add ReleaseNotes.md +- contains all commit logs so far (v00-08)

    • +
    +
  • +
+
+
+

v00-08

+
    +
  • 2017-11-02 hegner

    +
      +
    • Merge pull request #32 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-09-13 Colin Bernet

    +
      +
    • Merge pull request #60 from cbernet/nofile_fix

    • +
    +
  • +
  • 2017-09-12 Colin

    +
      +
    • fixed segv when opening a non accessible input file

    • +
    • fix test in interactive mode. write program had been moved

    • +
    +
  • +
  • 2017-06-21 Colin Bernet

    +
      +
    • Merge pull request #59 from cbernet/pyeventstore_filename

    • +
    +
  • +
  • 2017-06-20 Colin

    +
      +
    • can now get the name of the current file (useful when reporting exceptions)

    • +
    +
  • +
  • 2017-05-29 hegner

    +
      +
    • Merge pull request #58 from jlingema/clangf

    • +
    +
  • +
  • 2017-05-29 Joschka Lingemann

    +
      +
    • Fix bug introduced with clang format class gen would crash if clang-format was not used

    • +
    +
  • +
  • 2017-05-23 hegner

    +
      +
    • Merge pull request #53 from jlingema/array

    • +
    • Merge pull request #55 from jlingema/clangf

    • +
    • Merge pull request #57 from jlingema/fixWarnings

    • +
    +
  • +
  • 2017-05-22 Joschka Lingemann

    +
      +
    • Regenerate test datamodel

    • +
    • Add override statements

    • +
    +
  • +
  • 2017-04-20 Joschka Lingemann

    +
      +
    • Only call clang-format if it is in PATH

    • +
    +
  • +
  • 2017-04-11 Joschka Lingemann

    +
      +
    • Add language hints for syntax highlighting in docs

    • +
    • Add options of class generator to README

    • +
    • Add test for clang format

    • +
    • Add clang to path in init

    • +
    • Add clang-format application as option, closes #54

    • +
    +
  • +
  • 2017-04-07 Joschka Lingemann

    +
      +
    • Regenerated datamodel

    • +
    • Fix test in read and write for array of struct

    • +
    • Fixes in parser for arrays of struct

    • +
    • Add test for array of struct

    • +
    • Add includes for arrays of PODs

    • +
    +
  • +
  • 2017-04-04 Benedikt Hegner

    +
      +
    • temporarily disable outputstream for arrays

    • +
    +
  • +
  • 2017-04-04 hegner

    +
      +
    • Merge pull request #26 from gaede/add_ascii_io

    • +
    • Merge branch ‘master’ into add_ascii_io

    • +
    +
  • +
  • 2017-03-24 zaborowska

    +
      +
    • Merge pull request #52 from jlingema/array

    • +
    +
  • +
  • 2017-03-24 Joschka Lingemann

    +
      +
    • Add ROOT version requirement

    • +
    +
  • +
  • 2017-03-21 hegner

    +
      +
    • Merge pull request #30 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-03-20 hegner

    +
      +
    • Merge pull request #50 from jlingema/array

    • +
    +
  • +
  • 2017-03-13 Joschka Lingemann

    +
      +
    • Increase version requirement in README

    • +
    • Removing FindROOT macro, using standard use-file

    • +
    • Migrate to LCG_88

    • +
    • silence warning of unsigned -> int

    • +
    • Merge remote branch ‘origin/master’ into array

    • +
    +
  • +
  • 2017-03-02 Joschka Lingemann

    +
      +
    • Add implementation for array members

    • +
    +
  • +
  • 2017-02-15 Joschka Lingemann

    +
      +
    • Add test for datatype with array-member.

    • +
    +
  • +
  • 2017-02-21 zaborowska

    +
      +
    • Merge pull request #49 from jlingema/cvmfs

    • +
    +
  • +
  • 2017-02-21 Joschka Lingemann

    +
      +
    • Remove unused variable, add check if PODIO is set.

    • +
    • Move to cvmfs

    • +
    • Set ROOT_INCLUDE_PATH of pyunittest to avoid failure if FCC env is set.

    • +
    +
  • +
  • 2016-12-12 zaborowska

    +
      +
    • Merge pull request #47 from jlingema/master

    • +
    +
  • +
  • 2016-12-09 Joschka Lingemann

    +
      +
    • Regenerated datamodel with check against invalid collections.

    • +
    • Add check against OneToManyRelations to invalid collections

    • +
    • Move to LCG_87

    • +
    +
  • +
  • 2016-12-09 hegner

    +
      +
    • Merge pull request #46 from jlingema/master

    • +
    +
  • +
  • 2016-12-06 Joschka Lingemann

    +
      +
    • Require C++14.

    • +
    +
  • +
  • 2016-11-07 hegner

    +
      +
    • Merge pull request #45 from jlingema/master

    • +
    +
  • +
  • 2016-10-17 Benedikt Hegner

    +
      +
    • add method to register collection

    • +
    • remove need for templating on registering for writing

    • +
    +
  • +
  • 2016-09-30 Frank Gaede

    +
      +
    • remove debug printout for found components

    • +
    • add example for using ASCIWriter - write_ascii

    • +
    • fixed const_relation getters w/ getSyntax

    • +
    • regenerated EDM, ostream operator<<, id() and o.->

    • +
    • add ASCIIWriter

    • +
    • improved creation of ostream operators etc.

    • +
    +
  • +
  • 2016-09-26 Joschka Lingemann

    +
      +
    • Add non-const accessors for non-const collections.

    • +
    +
  • +
  • 2016-08-23 hegner

    +
      +
    • Merge pull request #44 from jlingema/docs

    • +
    • Merge pull request #43 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-08-23 Joschka Lingemann

    +
      +
    • Change option to be the same across projects.

    • +
    +
  • +
  • 2016-08-16 Joschka Lingemann

    +
      +
    • Improve readability of code base name and version.

    • +
    • Allow to customize version for doxygen via cli.

    • +
    • Use readme as title page for doxygen.

    • +
    • Change version to tags currently used.

    • +
    +
  • +
  • 2016-08-15 Joschka Lingemann

    +
      +
    • Add unsigned long to the list of builtins for consistency.

    • +
    • add test that regenerates datamodel in dry-run mode.

    • +
    • Add dry-run option.

    • +
    +
  • +
  • 2016-08-09 Joschka Lingemann

    +
      +
    • Remove unnecessary dict.

    • +
    +
  • +
  • 2016-07-29 Joschka Lingemann

    +
      +
    • Add support for (unsigned) long long

    • +
    • Fix indentation

    • +
    +
  • +
  • 2016-07-28 hegner

    +
      +
    • Merge pull request #25 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-28 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add a paragraph on options in the datamodel description files.

    • +
    • Add checks for clashing getter and setter names.

    • +
    • Add doxygen comments.

    • +
    +
  • +
  • 2016-07-27 hegner

    +
      +
    • Merge pull request #42 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-27 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add tests for direct accessors and setters of POD members.

    • +
    • Merge with changes for doxygen comments and member exposure

    • +
    • Merge pull request #24 from jlingema/fix_cpy_relations

    • +
    • Add missing ; and switch to operator==

    • +
    • Code cleanup.

    • +
    +
  • +
  • 2016-07-26 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Removing print info generation, as that creates compilation issues.

    • +
    • Merge with recent changes from hegner/podio.

    • +
    • Remove print outs

    • +
    • Regenerated datamodel.

    • +
    • Extend tests to have empty references.

    • +
    • Initialize relations on copy only if they are set.

    • +
    +
  • +
  • 2016-07-25 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add test for deep copy.

    • +
    • Bug fix: Initialisation of OneToOneRelations when copying.

    • +
    +
  • +
  • 2016-07-22 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’

    • +
    • Add tests for direct getter and setter of POD members.

    • +
    • Bug fix: option value already parsed to bool.

    • +
    • Add getters for POD members in Const objects.

    • +
    • Regenerated datamodel.

    • +
    • Remove trailing ; to silence compiler warning.

    • +
    • Add options to yaml files and parser for get syntax and pod data exposure.

    • +
    • Expose POD member members in objects.

    • +
    • Adding comments that show up in doxygen.

    • +
    +
  • +
  • 2016-07-12 hegner

    +
      +
    • Merge pull request #40 from jlingema/master

    • +
    +
  • +
  • 2016-07-12 Joschka Lingemann

    +
      +
    • Revert to operator[], add function checking presence of a collection.

    • +
    • Adding way to only clear the chaches (needed for FCCSW).

    • +
    • Change way to access IDs and names to allow catching exceptions.

    • +
    +
  • +
  • 2016-06-30 Benedikt Hegner

    +
      +
    • update doc as preparation for milestone document

    • +
    +
  • +
  • 2016-06-17 Joschka Lingemann

    +
      +
    • Add test for OneToManyRelations in namespaces. Fix class-generator.

    • +
    +
  • +
  • 2016-06-16 hegner

    +
      +
    • Merge pull request #22 from Steinweg/eike_operators_new

    • +
    +
  • +
  • 2016-06-15 Eike Steinweg

    +
      +
    • implemented ostream operators - std::ostream operator<<() created for components, objects and collections - create PrintInfo classes for formatted (tabular) printout of collections

    • +
    +
  • +
  • 2016-06-14 Benedikt Hegner

    +
      +
    • add convenience methods to python interface

    • +
    +
  • +
  • 2016-06-13 Benedikt Hegner

    +
      +
    • fix problem of wrong references being stored

    • +
    +
  • +
  • 2016-06-13 hegner

    +
      +
    • Merge pull request #21 from gaede/reference_bug_test

    • +
    +
  • +
  • 2016-06-13 Frank Gaede

    +
      +
    • fixed error message for test case

    • +
    • add test case for bug with reading back references

    • +
    +
  • +
  • 2016-06-03 hegner

    +
      +
    • Merge pull request #19 from jlingema/pyinterface

    • +
    +
  • +
  • 2016-05-24 Joschka Lingemann

    +
      +
    • Fix close method.

    • +
    • Improving py interface.

    • +
    • Merge remote branch ‘hegner/master’

    • +
    +
  • +
  • 2016-05-19 hegner

    +
      +
    • Merge pull request #39 from jlingema/master

    • +
    +
  • +
  • 2016-05-19 Joschka Lingemann

    +
      +
    • Remove hard-coded build-type.

    • +
    +
  • +
  • 2016-05-18 hegner

    +
      +
    • Merge pull request #38 from jlingema/master

    • +
    +
  • +
  • 2016-05-18 Joschka Lingemann

    +
      +
    • Increase write-test event number to 2000.

    • +
    • Merge pull request #18 from jlingema/master

    • +
    • Fixing indentation errors.

    • +
    • Reverting to LCG_83 and afs.

    • +
    +
  • +
  • 2016-05-12 Benedikt Hegner

    +
      +
    • style changes

    • +
    +
  • +
  • 2016-04-26 hegner

    +
      +
    • Merge pull request #17 from gaede/improve_doc

    • +
    +
  • +
  • 2016-04-26 Frank Gaede

    +
      +
    • made the ink to doxygen explicit

    • +
    • add more doc links to README

    • +
    • dde some documenation links to Readme

    • +
    +
  • +
  • 2016-04-22 hegner

    +
      +
    • Merge pull request #16 from gaede/relation_bug

    • +
    +
  • +
  • 2016-04-22 Frank Gaede

    +
      +
    • added ExampleMC to show bug in storing relations

    • +
    • bug fix in {ref}_end() for empty relation

    • +
    +
  • +
  • 2016-04-21 Frank Gaede

    +
      +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    +
  • +
  • 2016-04-20 hegner

    +
      +
    • Merge pull request #15 from gaede/add_getters_setters

    • +
    +
  • +
  • 2016-04-20 Frank Gaede

    +
      +
    • add unittest “AssociativeContainer” set/map

    • +
    • remove incorrect access to reference vector method

    • +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    • Merge pull request #13 from gaede/fix_extracode

    • +
    • optional get/set syntax; operator<(); acces to reference vector

    • +
    +
  • +
  • 2016-04-20 Benedikt Hegner

    +
      +
    • clean up references at better place

    • +
    • Merge pull request #14 from jlingema/memleaks

    • +
    +
  • +
  • 2016-04-20 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’ into memleaks

    • +
    • Fixing memory leak.

    • +
    +
  • +
  • 2016-04-19 Frank Gaede

    +
      +
    • fixed extra code generation for ConstObject

    • +
    +
  • +
  • 2016-04-19 hegner

    +
      +
    • Merge pull request #12 from gaede/extracode_in_components

    • +
    • add unit test for extracode in component

    • +
    +
  • +
  • 2016-04-19 Benedikt Hegner

    +
      +
    • add link to bug tracker

    • +
    • clear references properly

    • +
    • test for adding extra code to components

    • +
    • fix for handling components w/o extra code

    • +
    • allow for extra code declarations in components

    • +
    • fix object ownership and leak at deletion of collection

    • +
    +
  • +
  • 2016-04-18 Benedikt Hegner

    +
      +
    • add support for strings as members

    • +
    • removing wrong file

    • +
    • adding more docs

    • +
    • extend datamodel validation

    • +
    • add gitignore file

    • +
    +
  • +
  • 2016-04-17 Benedikt Hegner

    +
      +
    • move examples into tests to make space for real end-user examples

    • +
    • Merge branch ‘master’ of github.com:hegner/podio into catch

    • +
    • migrate from gtest to catch

    • +
    • move component cross-checking into validator

    • +
    • add hook for datamodel validator

    • +
    • fix PODIO-6

    • +
    • add support for user specified code snippets

    • +
    • add pointerless read interface

    • +
    • fix case when multiple many-relations are defined; fix writing example

    • +
    +
  • +
  • 2016-04-13 hegner

    +
      +
    • Merge pull request #11 from gaede/master

    • +
    +
  • +
  • 2016-04-13 Frank Gaede

    +
      +
    • added clusters in clusters as test for infinite recursion

    • +
    • Merge branch ‘master’ of https://github.com/gaede/podio

    • +
    • Merge branch ‘master’ of https://github.com/hegner/podio

    • +
    +
  • +
  • 2016-04-13 Benedikt Hegner

    +
      +
    • move to using LCG releases from CVMFS

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • Merge branch ‘master’ of github.com:hegner/podio

    • +
    • remove unneeded parameter from processEvent

    • +
    • Merge pull request #10 from gaede/master

    • +
    • starting to add more documentation

    • +
    +
  • +
  • 2016-04-12 Frank Gaede

    +
      +
    • big fix: clear vector of internal references in Collcection::clear()

    • +
    • set podio_LIBRARIES in podioConfig.cmake

    • +
    +
  • +
  • 2016-04-11 Frank Gaede

    +
      +
    • creare source directories for class generator if needed

    • +
    +
  • +
  • 2016-04-07 clementhelsens

    +
      +
    • Merge pull request #37 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 hegner

    +
      +
    • Merge pull request #9 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 Joschka Lingemann

    +
      +
    • Using TFile::Open allows to also read eos files.

    • +
    +
  • +
  • 2016-03-14 hegner

    +
      +
    • Merge pull request #8 from jlingema/master

    • +
    +
  • +
  • 2016-03-14 Joschka Lingemann

    +
      +
    • Add templates file.

    • +
    • Fixing whitespace in templates according to FCC style.

    • +
    • First round of code clean-up. Moving code templates out of the generator. Move re-used functionality in functions.

    • +
    +
  • +
  • 2016-03-10 Joschka Lingemann

    +
      +
    • Moving member parsing in separate function.

    • +
    +
  • +
  • 2016-03-09 Joschka Lingemann

    +
      +
    • Add missing class from example datamodel.

    • +
    +
  • +
  • 2016-03-03 hegner

    +
      +
    • Merge pull request #34 from cbernet/tutorial_2

    • +
    +
  • +
  • 2016-03-03 Joschka Lingemann

    +
      +
    • Merge pull request #36 from hegner/master

    • +
    +
  • +
  • 2016-03-01 Benedikt Hegner

    +
      +
    • help cmake finding the proper gtest

    • +
    • use LCG 83 view

    • +
    +
  • +
  • 2016-03-01 Colin

    +
      +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-22 Colin

    +
      +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Joschka Lingemann

    +
      +
    • Adding dependencies for tests of examples.

    • +
    +
  • +
  • 2016-02-19 Colin

    +
      +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    +
  • +
  • 2016-02-18 Joschka Lingemann

    +
      +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    +
  • +
  • 2016-02-11 Colin

    +
      +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    +
  • +
  • 2016-02-10 Colin

    +
      +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-03-01 Colin Bernet

    +
      +
    • Merge pull request #35 from cbernet/master

    • +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-23 Colin

    +
      +
    • updated README

    • +
    • updated README

    • +
    • updated README

    • +
    • improved README

    • +
    • added python read example

    • +
    +
  • +
  • 2016-02-23 Colin Bernet

    +
      +
    • Merge pull request #33 from cbernet/master

    • +
    • Merge remote-tracking branch ‘official/master’

    • +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Colin Bernet

    +
      +
    • Merge pull request #32 from jlingema/master

    • +
    • Adding dependencies for tests of examples.

    • +
    • Merge pull request #31 from cbernet/master

    • +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    • Merge pull request #30 from jlingema/fix_include

    • +
    • Merge pull request #28 from cbernet/master

    • +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    • Merge pull request #29 from hegner/master

    • +
    +
  • +
  • 2016-02-18 Benedikt Hegner

    +
      +
    • add missing ID setting when free-floating collections are added to the store

    • +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-02-09 hegner

    +
      +
    • Merge pull request #7 from HEP-FCC/master

    • +
    +
  • +
  • 2016-02-09 Joschka Lingemann

    +
      +
    • Merge pull request #26 from cbernet/unified_env

    • +
    • Merge pull request #27 from hegner/master

    • +
    • Merge pull request #5 from zaborowska/fileZombie

    • +
    • Merge pull request #6 from zaborowska/rename

    • +
    +
  • +
  • 2016-02-09 Benedikt Hegner

    +
      +
    • beautify generated doxygen

    • +
    +
  • +
  • 2016-02-09 Colin

    +
      +
    • improving readme

    • +
    +
  • +
  • 2016-01-08 Colin

    +
      +
    • pick up soft on afs only at cern

    • +
    +
  • +
  • 2016-01-07 Colin

    +
      +
    • unified environment initialization

    • +
    +
  • +
  • 2016-02-08 zaborowska

    +
      +
    • Renaming Albers to PODIO

    • +
    +
  • +
  • 2016-02-08 Anna

    +
      +
    • Checking if file opened correctly

    • +
    +
  • +
  • 2016-02-05 Benedikt Hegner

    +
      +
    • remove deprecated files after merge

    • +
    • Merge branch ‘hegner-master’

    • +
    • resolve conflicts

    • +
    +
  • +
  • 2016-02-05 hegner

    +
      +
    • Merge pull request #3 from jlingema/master

    • +
    +
  • +
  • 2016-02-04 Joschka Lingemann

    +
      +
    • Adding install target for templates.

    • +
    • Merge with remote.

    • +
    • Change to new options. Add how to list all options.

    • +
    • Adding options for doxygen and gtest.

    • +
    +
  • +
  • 2016-02-01 Joschka Lingemann

    +
      +
    • Merge with remote master.

    • +
    • Adding examples to library paths.

    • +
    • Changing install destination for pcm / rootmap.

    • +
    • Updating instructions to new test folder structure

    • +
    +
  • +
  • 2016-01-29 Joschka Lingemann

    +
      +
    • Small cosmetic fixes to read-me.

    • +
    +
  • +
  • 2016-01-28 Joschka Lingemann

    +
      +
    • Adding how to run tests.

    • +
    • Changing testing structure to make unit-tests optional.

    • +
    • Adapting to Apple specifics.

    • +
    • Re-adding Find-ROOT macro.

    • +
    +
  • +
  • 2016-01-26 Joschka Lingemann

    +
      +
    • Fixing namespaces of members of objects.

    • +
    • Fixing namespacing of members for components.

    • +
    • Fix: Namespaced component in another component.

    • +
    +
  • +
  • 2016-01-18 Joschka Lingemann

    +
      +
    • Fixing path for python environment

    • +
    +
  • +
  • 2016-01-15 Joschka Lingemann

    +
      +
    • Adding python environment and pytools for PyYAML.

    • +
    • Splitting implementation and header files.

    • +
    • Newly generated datamodel.

    • +
    • Adding tests for namespaced data.

    • +
    • Fix relations for namespaced datamembers.

    • +
    • Removing trailing ; to silence warning.

    • +
    • First iteration of namespace support.

    • +
    • Adding handling of non-builtin members and fixing compile warnings

    • +
    +
  • +
  • 2016-01-13 Joschka Lingemann

    +
      +
    • Updating externals according to current FCCSW.

    • +
    +
  • +
  • 2015-11-18 Benedikt Hegner

    +
      +
    • make vector member code compile

    • +
    • add more forward declarations handling class A->B->A reference cases

    • +
    • move setter/getter implementation into CC file’

    • +
    +
  • +
  • 2015-10-22 Benedikt Hegner

    +
      +
    • install dictionaries explicitly

    • +
    +
  • +
  • 2015-10-21 Benedikt Hegner

    +
      +
    • fix bug for storing unitialized references

    • +
    • add new unit test covering non-filled relations

    • +
    +
  • +
  • 2015-10-19 Benedikt Hegner

    +
      +
    • add more single-ref unit tests; fix infinite loop

    • +
    +
  • +
  • 2015-10-16 Benedikt Hegner

    +
      +
    • allow chaining of components

    • +
    +
  • +
  • 2015-10-16 hegner

    +
      +
    • Merge pull request #1 from zaborowska/master

    • +
    +
  • +
  • 2015-10-16 Anna

    +
      +
    • Merge branch ‘master’ into test

    • +
    • Rename of examples->tests in init and README

    • +
    • Missing include of gtest added

    • +
    • added ‘setter’ for components

    • +
    +
  • +
  • 2015-10-15 Benedikt Hegner

    +
      +
    • add tests for components

    • +
    • move data definition syntax into separate markdown file

    • +
    +
  • +
  • 2015-10-14 Benedikt Hegner

    +
      +
    • new iteration of data model w/ new reference accessors

    • +
    • add tests for python interface

    • +
    • enable tests for python interface

    • +
    • remove accidentally added file

    • +
    • install python files

    • +
    • move PythonEventStore into podio namespace

    • +
    • add at() to methods of the collection

    • +
    • renaming package creation script

    • +
    +
  • +
  • 2015-10-13 Benedikt Hegner

    +
      +
    • update to new datamodel; fix mem leak

    • +
    • major refurbishment of podio; new interfaces in doc/doc.md

    • +
    +
  • +
  • 2015-05-12 Benedikt Hegner

    +
      +
    • adjust scripts to new naming convention

    • +
    +
  • +
  • 2015-05-11 Benedikt Hegner

    +
      +
    • rename albers into podio

    • +
    +
  • +
  • 2015-04-24 Benedikt Hegner

    +
      +
    • add CollectionBase to dictionaries

    • +
    +
  • +
  • 2015-04-22 Benedikt Hegner

    +
      +
    • add new tests; feature complete for lcio

    • +
    • next step towards lcio modelling

    • +
    • prepare for future vector member feature

    • +
    • removing deprecated method for supporting XYZHandle convention

    • +
    • upgrading the lcio layout

    • +
    • add more buildin types

    • +
    • removed code duplication in code generation

    • +
    • complete testing of single references

    • +
    • remove debug printout for the garbage collection

    • +
    +
  • +
  • 2015-04-21 Benedikt Hegner

    +
      +
    • adding std::array support

    • +
    • update code templates for new refs

    • +
    +
  • +
  • 2015-04-20 Benedikt Hegner

    +
      +
    • streamline definition syntax

    • +
    • Merge branch ‘master’ of github.com:hegner/albers

    • +
    • remove wrongly committed files

    • +
    +
  • +
  • 2015-04-20 Pere Mato

    +
      +
    • Minor changes in CMakeLists.txt to cope with XCode generation

    • +
    • don’t use the factory of the collection to create hits and refs

    • +
    • clarify namespace

    • +
    • update examples w/ new code generation

    • +
    • properly set relation vectors in push_back

    • +
    • create constructor with full signature

    • +
    +
  • +
  • 2015-04-19 Benedikt Hegner

    +
      +
    • vector member code #1

    • +
    • whitespace fix

    • +
    • first step towards lcio yaml file

    • +
    +
  • +
  • 2015-04-17 Benedikt Hegner

    +
      +
    • trivial python wrapper for event store

    • +
    • add simple non-existence check

    • +
    • add some doc strings

    • +
    • start using IReader

    • +
    • use method names acquire/release in ObjBase

    • +
    • add more docs

    • +
    • unify ref-counting behaviour

    • +
    • let XXXObj create relation collections themselves

    • +
    • add cloning and better initialization; aligning method implementation order with declaration order

    • +
    +
  • +
  • 2015-04-16 Benedikt Hegner

    +
      +
    • add proper destructor for XXXObj

    • +
    • add header needed for gcc

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • introducing ObjBase

    • +
    +
  • +
  • 2015-04-16 Pere Mato

    +
      +
    • test target is reserved from CMake > 3.0

    • +
    • Simplify CMakeLists files making use of ROOTConfig.cmake (ROOT build with CMake)

    • +
    • move delete command for Obj into the ref counting method

    • +
    • inline trivial setters and getters

    • +
    +
  • +
  • 2015-04-15 Benedikt Hegner

    +
      +
    • improve documentation

    • +
    • add doxygen target

    • +
    • whitespace

    • +
    • remove unneeded headers

    • +
    • fix gcc warnings

    • +
    • move to ROOT 6 on linux

    • +
    +
  • +
  • 2015-04-14 Benedikt Hegner

    +
      +
    • allow cyclic dependencies between collections and objects

    • +
    • setting collection ID on read

    • +
    • deprecate registry

    • +
    • first step towards deprecation of Registry

    • +
    • rename FooEntry classes to FooObj

    • +
    • fix cmake

    • +
    • next simplification of class generator; move more code into templates

    • +
    • first step towards simplified class generator

    • +
    • break circular header dependency in case types have references to the same type

    • +
    +
  • +
  • 2015-04-13 Benedikt Hegner

    +
      +
    • add handling of improper refs on writing

    • +
    • move implementations into cc file

    • +
    • add documentation draft; whitespace cleanup

    • +
    • add some comments

    • +
    • add some comments

    • +
    • rename event store methods

    • +
    • remove deprecated methods from Registry

    • +
    • fixing wrong whitespace

    • +
    • upgrade to new API supporting free-floating objects

    • +
    +
  • +
  • 2015-04-01 Benedikt Hegner

    +
      +
    • add newline at the end of the file

    • +
    +
  • +
  • 2014-12-11 Colin Bernet

    +
      +
    • Merge pull request #24 from cbernet/clone

    • +
    +
  • +
  • 2014-12-11 Colin

    +
      +
    • can clone an existing handle into a new collection.

    • +
    +
  • +
  • 2014-12-04 Colin Bernet

    +
      +
    • Merge pull request #23 from cbernet/edm_1

    • +
    +
  • +
  • 2014-12-03 Colin

    +
      +
    • removed getters and accessors from Handle

    • +
    • edm v1 compiles and runs.

    • +
    • class generation: can now have components inside components

    • +
    • uniform syntax for members

    • +
    +
  • +
  • 2014-12-02 Colin

    +
      +
    • edm_1 done, but need to review naming scheme and simplify a bit

    • +
    • started to work on first detailed edm prototype.

    • +
    +
  • +
  • 2014-12-02 Benedikt Hegner

    +
      +
    • remove incomplete relation code; was accidental commit

    • +
    +
  • +
  • 2014-11-26 Benedikt Hegner

    +
      +
    • adjusted to new structure of headers

    • +
    +
  • +
  • 2014-10-26 Benedikt Hegner

    +
      +
    • make friend declaration confirm standard; needed by genreflex

    • +
    +
  • +
  • 2014-10-24 hegner

    +
      +
    • Merge pull request #22 from hegner/master

    • +
    +
  • +
  • 2014-10-24 Benedikt Hegner

    +
      +
    • fix warnings

    • +
    • Merge pull request #21 from hegner/master

    • +
    • fix merge problems at runtime

    • +
    • revert to original data model setup

    • +
    • merge HEAD

    • +
    • towards n-to-n relation improvements; make class generator create other directory structure

    • +
    +
  • +
  • 2014-10-10 Colin

    +
      +
    • fixes for python import

    • +
    +
  • +
  • 2014-10-10 Colin Bernet

    +
      +
    • Merge pull request #20 from cbernet/python

    • +
    • added python specific stuff to install scripts

    • +
    • Merge pull request #19 from cbernet/python

    • +
    +
  • +
  • 2014-10-09 Colin

    +
      +
    • reader can now navigate directly to a given event number

    • +
    +
  • +
  • 2014-10-07 Colin Bernet

    +
      +
    • Merge pull request #18 from cbernet/python

    • +
    +
  • +
  • 2014-10-07 Colin

    +
      +
    • python read example ready

    • +
    • Merge branch ‘python’ of github.com:cbernet/albers into python

    • +
    • code more pythonic; unittests

    • +
    • python event store working

    • +
    +
  • +
  • 2014-10-06 Colin Bernet

    +
      +
    • Merge pull request #17 from cbernet/python

    • +
    • Update README.md

    • +
    +
  • +
  • 2014-10-06 Colin

    +
      +
    • handles working in python

    • +
    • added python test file

    • +
    +
  • +
  • 2014-10-02 Colin Bernet

    +
      +
    • Merge pull request #16 from cbernet/leptons

    • +
    +
  • +
  • 2014-10-02 Colin

    +
      +
    • added a muon to the event, and computing its isolation.

    • +
    • added print operator for ParticleHandle in utilities

    • +
    • Merge pull request #15 from cbernet/more_utility

    • +
    • bug fix in Collections. particle overlap checking based on handles

    • +
    +
  • +
  • 2014-10-01 Colin

    +
      +
    • write and read on 100000 events. solved rare problems by setting an eta cut in the generator.

    • +
    +
  • +
  • 2014-10-01 Colin Bernet

    +
      +
    • Merge pull request #14 from cbernet/dummy_generator

    • +
    • Dummy generator generates two jets

    • +
    • on-demand reading tested in read example

    • +
    • now using only the jets and the particles from the DummyGenerator

    • +
    • Merge pull request #13 from cbernet/coll_in_registry

    • +
    • CollectionBase pointers now registered in Registry. Changed writer interface

    • +
    • added first version of a dummy multijet event generator

    • +
    +
  • +
  • 2014-09-30 Colin

    +
      +
    • new utility functions. < operator for handles.

    • +
    +
  • +
  • 2014-09-29 Colin

    +
      +
    • Jet and vector utility functions used in write and read

    • +
    • print functions for Collections, and first utility functions

    • +
    +
  • +
  • 2014-09-28 Benedikt Hegner

    +
      +
    • take last element and increment by one for end iterator

    • +
    • fix bug of invalid references in user land

    • +
    +
  • +
  • 2014-09-27 Benedikt Hegner

    +
      +
    • next step towards one-to-many-relations; collection has proper members now

    • +
    • update and clean templates

    • +
    • add first part of one-to-many capabilities to POD and Handle

    • +
    +
  • +
  • 2014-09-25 Colin

    +
      +
    • using the new datamodel in read and write. Reading problem at first event!

    • +
    • developed data model

    • +
    +
  • +
  • 2014-09-25 Colin Bernet

    +
      +
    • Merge pull request #12 from cbernet/few_easy_mods

    • +
    • macos X initialization script

    • +
    • Merge branch ‘master’ into merge_attempt

    • +
    +
  • +
  • 2014-09-24 Benedikt Hegner

    +
      +
    • change syntax for data generation; part 1

    • +
    +
  • +
  • 2014-09-24 Colin

    +
      +
    • a bit of clean up

    • +
    +
  • +
  • 2014-09-23 Benedikt Hegner

    +
      +
    • simplify the structure of the PODs; now really look like structs

    • +
    • add functionality of defining components; simplify datamodel example and writer code

    • +
    • fix pedantic compilation warning

    • +
    +
  • +
  • 2014-09-23 Colin Bernet

    +
      +
    • Merge pull request #11 from cbernet/event_loop

    • +
    +
  • +
  • 2014-09-23 Colin

    +
      +
    • event loop in reader working, but messy ! overall design to be clarified

    • +
    • bug fix: not writing to TFile anymore just after filling the tree

    • +
    • Merge pull request #10 from cbernet/event_loop

    • +
    • implemented event loop in writer. big performance issue

    • +
    • Merge pull request #9 from cbernet/simple_edm

    • +
    +
  • +
  • 2014-09-22 Colin

    +
      +
    • example mains adapted to new EDM

    • +
    • bug fix for multiple includes

    • +
    • realistic data model

    • +
    +
  • +
  • 2014-09-22 Colin Bernet

    +
      +
    • Merge pull request #8 from cbernet/auto_handle_ptr

    • +
    • buffer address in embedded handles set in prepareAfterRead automatically

    • +
    • initialed collectionID to 0, and improved const-correctness

    • +
    • collection id is now unsigned

    • +
    • Merge pull request #7 from cbernet/macos_build_merge

    • +
    • Merge branch ‘macos_build’ into macos_build_merge

    • +
    • Merge branch ‘master’ of github.com:HEP-FCC/albers

    • +
    • conditional for mac os x

    • +
    • able to build on macos, need to test lxplus6

    • +
    +
  • +
  • 2014-09-21 Colin Bernet

    +
      +
    • reformatted README properly

    • +
    +
  • +
  • 2014-09-21 Colin

    +
      +
    • commented the code: Reader, Handle

    • +
    +
  • +
  • 2014-09-19 Colin

    +
      +
    • Merge branch ‘documentation’ of github.com:cbernet/albers into documentation

    • +
    +
  • +
  • 2014-09-18 Colin

    +
      +
    • documentation and questions: EventStore, Collection, Registry, Writer

    • +
    • documentation and questions: EventStore, Collection, Registry

    • +
    • added an environment setup script

    • +
    +
  • +
  • 2014-09-17 Colin

    +
      +
    • more specific installation instructions

    • +
    • added a particle class, aiming for a Z boson example

    • +
    +
  • +
  • 2014-09-17 Benedikt Hegner

    +
      +
    • fix for the fact that yaml parsing doesn’t preserve ordering

    • +
    +
  • +
  • 2014-09-16 Benedikt Hegner

    +
      +
    • rearrange the example

    • +
    +
  • +
  • 2014-09-15 Benedikt Hegner

    +
      +
    • fix md

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • add initial descriptions

    • +
    • make it so

    • +
    +
  • +
  • 2014-09-15 hegner

    +
      +
    • Initial commit

    • +
    +
  • +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/_static/_sphinx_javascript_frameworks_compat.js b/v00-99/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/v00-99/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v00-99/_static/basic.css b/v00-99/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/v00-99/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v00-99/_static/check-solid.svg b/v00-99/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/v00-99/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/v00-99/_static/clipboard.min.js b/v00-99/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/v00-99/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/v00-99/_static/copybutton.css b/v00-99/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/v00-99/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/v00-99/_static/copybutton.js b/v00-99/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/v00-99/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/v00-99/_static/copybutton_funcs.js b/v00-99/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/v00-99/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/v00-99/_static/css/badge_only.css b/v00-99/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/v00-99/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v00-99/_static/css/fonts/Roboto-Slab-Bold.woff b/v00-99/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/v00-99/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v00-99/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v00-99/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/v00-99/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v00-99/_static/css/fonts/Roboto-Slab-Regular.woff b/v00-99/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/v00-99/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v00-99/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v00-99/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/v00-99/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v00-99/_static/css/fonts/fontawesome-webfont.eot b/v00-99/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/v00-99/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v00-99/_static/css/fonts/fontawesome-webfont.svg b/v00-99/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/v00-99/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v00-99/_static/css/fonts/fontawesome-webfont.ttf b/v00-99/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/v00-99/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v00-99/_static/css/fonts/fontawesome-webfont.woff b/v00-99/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/v00-99/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v00-99/_static/css/fonts/fontawesome-webfont.woff2 b/v00-99/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/v00-99/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v00-99/_static/css/fonts/lato-bold-italic.woff b/v00-99/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/v00-99/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v00-99/_static/css/fonts/lato-bold-italic.woff2 b/v00-99/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/v00-99/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v00-99/_static/css/fonts/lato-bold.woff b/v00-99/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/v00-99/_static/css/fonts/lato-bold.woff differ diff --git a/v00-99/_static/css/fonts/lato-bold.woff2 b/v00-99/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/v00-99/_static/css/fonts/lato-bold.woff2 differ diff --git a/v00-99/_static/css/fonts/lato-normal-italic.woff b/v00-99/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/v00-99/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v00-99/_static/css/fonts/lato-normal-italic.woff2 b/v00-99/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/v00-99/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v00-99/_static/css/fonts/lato-normal.woff b/v00-99/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/v00-99/_static/css/fonts/lato-normal.woff differ diff --git a/v00-99/_static/css/fonts/lato-normal.woff2 b/v00-99/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/v00-99/_static/css/fonts/lato-normal.woff2 differ diff --git a/v00-99/_static/css/theme.css b/v00-99/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/v00-99/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/v00-99/_static/doctools.js b/v00-99/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/v00-99/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v00-99/_static/documentation_options.js b/v00-99/_static/documentation_options.js new file mode 100644 index 000000000..1823c1bde --- /dev/null +++ b/v00-99/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: false, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v00-99/_static/file.png b/v00-99/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/v00-99/_static/file.png differ diff --git a/v00-99/_static/jquery.js b/v00-99/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/v00-99/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v00-99/_static/js/html5shiv.min.js b/v00-99/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/v00-99/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v00-99/_static/js/theme.js b/v00-99/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/v00-99/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v00-99/_static/minus.png b/v00-99/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/v00-99/_static/minus.png differ diff --git a/v00-99/_static/plus.png b/v00-99/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/v00-99/_static/plus.png differ diff --git a/v00-99/_static/pygments.css b/v00-99/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/v00-99/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v00-99/_static/searchtools.js b/v00-99/_static/searchtools.js new file mode 100644 index 000000000..7918c3fab --- /dev/null +++ b/v00-99/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v00-99/_static/sphinx_highlight.js b/v00-99/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/v00-99/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v00-99/advanced_topics.html b/v00-99/advanced_topics.html new file mode 100644 index 000000000..ed5c082d2 --- /dev/null +++ b/v00-99/advanced_topics.html @@ -0,0 +1,452 @@ + + + + + + + Advanced Topics — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Advanced Topics

+
+

Writing extra data outside the EDM

+

See here

+
+
+

Changing / creating new templates

+

See here

+
+
+

Persistency

+

The library is build such that it can support multiple storage backends. However, the tested storage system being used is ROOT. +The following explains the requirements for a user-provided storage back-end.

+
+

Writing Back-End

+

There is no interface a writing class has to fulfill. It only needs to take advantage of the interfaces provided in PODIO. To persistify a collection, three pieces of information have to be stored:

+
    +
  1. the ID of the collection,

  2. +
  3. the vector of PODs in the collection, and

  4. +
  5. the relation information in the collection

  6. +
+

Before writing out a collection, the data need to be put into the proper structure. For this, the method prepareForWrite needs to be invoked. In the case of trivial POD members this results in a no-op. In case, the collection contains references to other collections, the pointers are being translated into collID:objIndex pairs. A serialization solution would - in principle - then look like this:

+
     collection->prepareForWrite();
+     void* buffer = collection->getBufferAddress();
+     auto refCollections = collection->referenceCollections();
+     // ...
+     //   write buffer, collection ID, and refCollections
+     // ...
+
+
+
+
+

Reading Back-End

+

The main requirement for a reading backend is its capability of reading back all +the necessary data from which a collection can be constructed in the form of +podio::CollectionReadBuffers. From these buffers collections can then be +constructed. Each instance has to contain the (type erased) POD buffers (as a +std::vector), the (possibly empty) vectors of podio::ObjectIDs that contain +the relation information as well the (possibly empty) vectors for the vector +member buffers, which are currently stored as pairs of the type (as a +std::string) and (type erased) data buffers in the form of std::vectors.

+
+
+

Dumping JSON

+

It is possible to turn on an automatic conversion to JSON for podio generated datamodels using the nlohmann/json library. +To enable this feature the core datamodel library has to be compiled with the PODIO_JSON_OUTPUT and linked against the nlohmann/json library (needs at least version 3.10). +In cmake the necessary steps are (assuming that datamodel is the datamodel core library)

+
find_library(nlohmann_json 3.10 REQUIRED)
+target_link_library(datamodel PUBLIC nlohmann_json::nlohmann_json)
+target_compile_definitions(datamodel PUBLIC PODIO_JSON_OUTPUT)
+
+
+

With JSON support enabled it is possible to convert collections (or single objects) to JSON simply via

+
#include "nlohmann/json.hpp"
+
+auto collection = // get collection from somewhere
+
+nlohmann::json json{
+   {"collectionName", collection}
+};
+
+
+

Each element of the collection will be converted to a JSON object, where the keys are the same as in the datamodel definiton. +Components contained in the objects will similarly be similarly converted.

+

JSON is not foreseen as a mode for persistency, i.e. there is no plan to add the conversion from JSON to the in memory representation of the datamodel.

+
+
+
+

Thread-safety

+

PODIO was written with thread-safety in mind and avoids the usage of globals and statics. +However, a few assumptions about user code and use-patterns were made. +The following lists the caveats of the library when it comes to parallelization.

+
+

Changing user data

+

As explained in the section about mutability of data, thread-safety is only guaranteed if data are considered read-only after creation.

+
+
+

Serialization

+

During the calls of prepareForWriting and prepareAfterReading on collections other operations like object creation or addition will lead to an inconsistent state.

+
+
+

Not-thread-safe components

+

The Readers and Writers that ship with podio are assumed to run on a single +thread only (more precisely we assume that each Reader or Writer doesn’t have to +synchronize with any other for file operations).

+
+
+
+

Running pre-commit

+
    +
  • Install pre-commit

    +

    $ pip install pre-commit

    +
  • +
  • Run pre-commit manually

    +

    $ pre-commit run --all-files

    +
  • +
+
+
+

Retrieving the EDM definition from a data file

+

It is possible to get the EDM definition(s) that was used to generate the +datatypes that are stored in a data file. This makes it possible to re-generate +the necessary code and build all libraries again in case they are not easily +available otherwise. To see which EDM definitions are available in a data file +use the podio-dump utility

+
podio-dump <data-file>
+
+
+

which will give an (exemplary) output like this

+
input file: <data-file>
+
+EDM model definitions stored in this file: edm4hep
+
+[...]
+
+
+

To actually dump the model definition to stdout use the --dump-edm option +and the name of the datamodel you want to dump:

+
podio-dump --dump-edm edm4hep <data-file> > dumped_edm4hep.yaml
+
+
+

Here we directly redirected the output to a yaml file that can then again be +used by the podio_class_generator.py to generate the corresponding c++ code +(or be passed to the cmake macros).

+

Note that the dumped EDM definition is equivalent but not necessarily exactly +the same as the original EDM definition. E.g. all the datatypes will have all +their fields (Members, OneToOneRelations, OneToManyRelations, +VectorMembers) defined, and defaulted to empty lists in case they were not +present in the original EDM definition. The reason for this is that the embedded +EDM definition is the pre-processed and validated one as described +below

+
+

Accessing the EDM definition programmatically

+

The EDM definition can also be accessed programmatically via the +[ROOT|SIO]FrameReader::getEDMDefinition method. It takes an EDM name as its +single argument and returns the EDM definition as a JSON string. Most likely +this has to be decoded into an actual JSON structure in order to be usable (e.g. +via json.loads in python to get a dict).

+
+
+

Technical details on EDM definition embedding

+

The EDM definition is embedded into the core EDM library as a raw string literal +in JSON format. This string is generated into the DatamodelDefinition.h file as

+
namespace <package_name>::meta {
+static constexpr auto <package_name>__JSONDefinition = R"EDMDEFINITION(<json encoded definition>)EDMDEFINITION";
+}
+
+
+

where <package_name> is the name of the EDM as passed to the +podio_class_generator.py (or the cmake macro). The <json encoded definition> +is obtained from the pre-processed EDM definition that is read from the yaml +file. During this pre-processing the EDM definition is validated, and optional +fields are filled with empty defaults. Additionally, the includeSubfolder +option will be populated with the actual include subfolder, in case it has been +set to True in the yaml file. Since the json encoded definition is generated +right before the pre-processed model is passed to the class generator, this +definition is equivalent, but not necessarily equal to the original definition.

+
+

The DatamodelRegistry

+

To make access to information about currently loaded and available datamodels a +bit easier the DatamodelRegistry (singleton) keeps a map of all loaded +datamodels and provides access to this information possible. In this context we +refer to an EDM as the shared library (and the corresponding public headers) +that have been compiled from code that has been generated from a datamodel +definition in the original YAML file. In general whenever we refer to a +datamodel in this context we mean the enitity as a whole, i.e. its definition +in a YAML file, the concrete implementation as an EDM, as well as other related +information that is related to it.

+

Currently the DatamodelRegistry provides mainly access to the original +definition of available datamodels via two methods:

+
const std::string_view getDatamodelDefinition(const std::string& edmName) const;
+
+const std::string_view getDatamodelDefinition(size_t index) const;
+
+
+

where index can be obtained from each collection via +getDatamodelRegistryIndex. That in turn simply calls +<package_name>::meta::DatamodelRegistryIndex::value(), another singleton like object +that takes care of registering an EDM definition to the DatamodelRegistry +during its static initialization. It is also defined in the +DatamodelDefinition.h header.

+

Since the datamodel definition is embedded as a raw string literal into the core +EDM shared library, it is in principle also relatively straight forward to +retrieve it from this library by inspecting the binary, e.g. via

+
readelf -p .rodata libedm4hep.so | grep options
+
+
+

which will result in something like

+
  [   300]  {"options": {"getSyntax": true, "exposePODMembers": false, "includeSubfolder": "edm4hep/"}, "components": {<...>}, "datatypes": {<...>}}
+
+
+
+
+

I/O helpers for EDM definition storing

+

The podio/utilities/DatamodelRegistryIOHelpers.h header defines two utility +classes, that help with instrumenting readers and writers with functionality to +read and write all the necessary EDM definitions.

+
    +
  • The DatamodelDefinitionCollector is intended for usage in writers. It +essentially collects the datamodel definitions of all the collections it encounters. +The registerDatamodelDefinition method it provides should be called with every collection +that is written. The getDatamodelDefinitionsToWrite method returns a vector of all +datamodel names and their definition that were encountered during writing. It is +then the writers responsibility to actually store this information into the +file.

  • +
  • The DatamodelDefinitionHolder is intended to be used by readers. It +provides the getDatamodelDefinition and getAvailableDatamodels methods. +It is again the readers property to correctly populate it with the data it +has read from file. Currently the SIOFrameReader and the ROOTFrameReader +use it and also offer the same functionality as public methods with the help +of it.

  • +
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/contributing.html b/v00-99/contributing.html new file mode 100644 index 000000000..2ef0cc05a --- /dev/null +++ b/v00-99/contributing.html @@ -0,0 +1,298 @@ + + + + + + + Contributing to PODIO — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Contributing to PODIO

+

Please read these guidelines if you want to contribute to the PODIO project.

+
+

Git workflow

+

For PODIO we would like to follow a so called “No Switch Yard” (NoSY) workflow.

+

In essence this means that you develop your (small) new feature in a dedicated +feature branch that is kept up to date with the master branch until you create +a PR, as we only allow rebase merges for PRs.

+
+

Example workflow

+
    +
  • checkout a copy of PODIO from the origin at AIDASoft:

    +

    git clone https://github.com/AIDASoft/podio.git +cd podio

    +
  • +
  • create a fork of the repository on the Github web page

    +
      +
    • if you have not yet done so earlier

    • +
    +
  • +
  • add your fork as remote downstream using your Github username

    +
    git remote add downstream  https://<yourUserName>@github.com/<yourUserName>/podio.git
    +
    +
    +
  • +
  • create a new feature branch; choose a meaningful name

    +
    git checkout -b <myNewBranch>
    +
    +
    +
  • +
  • make the changes to existing files (or add new ones) and frequently keep up to date with the master:

    +
    git fetch origin; git rebase origin/master
    +
    +
    +
  • +
  • after having committed everything to your new branch, push it to your fork of PODIO:

    +
    git push downstream <myNewBranch>
    +
    +
    +
  • +
  • reload your own github website (https://github.com//podio)

    +
      +
    • you should see your commit

    • +
    • now you can create a pull request on the web site

    • +
    +
  • +
+
+
+

Release Notes

+

Please make sure you fill in meaningful release notes in the comment field that is +provided at the Github web page when creating the PR, e.g.

+
BEGINRELEASENOTES
+- updated documentation
+    - add guidelines for contributing
+- reverted some name changes in tests/examples
+    - `read-one` now again called `read`
+
+ENDRELEASENOTES
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/datamodel_syntax.html b/v00-99/datamodel_syntax.html new file mode 100644 index 000000000..1329d1004 --- /dev/null +++ b/v00-99/datamodel_syntax.html @@ -0,0 +1,395 @@ + + + + + + + Data Models and Data Model Definitions — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Models and Data Model Definitions

+

To describe a data model PODIO provides a data model definition syntax. +This is to ease the creation of optimised data formats, which may take advantage of a so-called struct-of-array data layout. +From the user-provided data model description PODIO creates all the files necessary to use this data model.

+
+

Basic Concepts and Supported Features

+

PODIO encourages the usage of composition, rather than inheritance. +One of the reasons for doing so is the focus on efficiency friendly plain-old-data. +For this reason, PODIO does not support inheritance within the defined data model. +Instead, users can combine multiple components to build a to be used datatype.

+

To allow the datatypes to be real PODs, the data stored within the data model are constrained to be +POD-compatible data. Those are

+
    +
  1. basic types like int, double, etc as well as a limited set of fixed width +integers from <cstdint> (the _leastN or _fastN types as well as all +8 bit types are not allowed).

  2. +
  3. components built up from basic types or other components

  4. +
  5. Fixed sized arrays of those types

  6. +
+

In addition, PODIO supports the storage of one-to-one and one-to-many relations between objects. +In the following the syntax for defining a given data model is explained. +A later section contains more details about the code being created from this.

+
+
+

Definition of custom components

+

A component is just a flat struct containing data. it can be defined via:

+
    components:
+      # My example component
+      MyComponent:
+        Members:
+          - float x
+          - float y
+          - float z
+          - AnotherComponent a
+
+
+
+
+

Definition of custom data classes

+

Here an excerpt from “datamodel.yaml” for a simple class, just containing one member of the type int.

+
    datatypes :
+      EventInfo :
+        Description : "My first data type"
+        Author : "It's me"
+        Members :
+        - int Number // event number
+
+
+

Using this definition, three classes will be created: EventInfo, EventInfoData and EventInfoCollection. These have the following signature:

+
    class EventInfoData {
+      public:
+        int Number;
+    }
+
+    class EventInfo {
+      public:
+      ...
+        int Number() const;
+        void Number(int);
+      ...
+    }
+
+
+
+

Defining members

+

The definition of a member is done in the Members section in the form:

+
    Members:
+      <type> <name> // <comment>
+
+
+

where type can be any builtin-type or a component.

+

It is also possible to specify default values for members via

+
    Members:
+      <type> <name>{<default-value>} // <comment>
+
+
+

Note that in this case it is extremely expensive to check whether the provided default-value results in valid c++. +Hence, there is only a very basic syntax check, but no actual type check, and wrong default values will be caught only when trying to compile the datamodel.

+

For describing physics quantities it is important to know their units. Thus it is possible to add the units to the member definition:

+
    Members:
+      <type> <name>{<default-value>} [<unit>] // <comment>
+
+
+
+
+

Definition of references between objects:

+

There can be one-to-one-relations and one-to-many relations being stored in a particular class. This happens either in the OneToOneRelations or OneToManyRelations section of the data definition. The definition has again the form:

+
    OneToOneRelations:
+      <type> <name> // <comment>
+    OneToManyRelations:
+      <type> <name> // <comment>
+
+
+
+
+

Explicit definition of methods

+

In a few cases, it makes sense to add some more functionality to the created classes. Thus this library provides two ways of defining additional methods and code. Either by defining them inline or in external files. Extra code has to be provided separately for immutable and mutable additions. +Note that the immutable (ExtraCode) will also be placed into the mutable classes, so that there is no need for duplicating the code. +Only if some additions should only be available for the mutable classes it is necessary to fill the MutableExtraCode section. +The includes will be add to the header files of the generated classes.

+
    ExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+    MutableExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+
+
+

The code being provided has to use the macro {name} in place of the concrete name of the class.

+
+
+
+

Global options

+

Some customization of the generated code is possible through flags. These flags are listed in the section options:

+
    options:
+      getSyntax: False
+      exposePODMembers: True
+    components:
+      # My simple component
+      ExampleComponent:
+        Members:
+          - int x
+    datatypes:
+      ExampleType:
+        Description: "My datatype with a component member"
+        Author: "Mr me"
+        Members:
+         - ExampleComponent comp // component from above
+
+
+
    +
  • getSyntax: steers the naming of get and set methods. If set to true, methods are prefixed with get and set following the capitalized member name, otherwise the member name is used for both.

  • +
  • exposePODMembers: whether get and set methods are also generated for members of a member-component. In the example corresponding methods would be generated to directly set / get x through ExampleType.

  • +
+
+
+

Extending a datamodel / using types from an upstream datamodel

+

It is possible to extend another datamodel with your own types, resp. use some datatypes or components from an upstream datamodel in your own datamodel. +This can be useful for prototyping new datatypes or for accomodating special requirements without having to reimplement / copy a complete datamodel.

+

To pass an upstream datamodel to the class generator use the --upstream-edm option that takes the package name as well as the yaml definition file of the upstream datamodel separated by a colon (‘:’). +This will effectively make all components and datatypes of the upstream datamodel available to the current definition for validation and generation of the necessary includes. +Nevertheless, only the code for the datatypes and components defined in the current yaml file will be generated. +The podio PODIO_GENERATE_DATAMODEL cmake macro has gained an additional parameter UPSTREAM_EDM to pass the arguments to the generator via the cmake macros.

+
+

Potential pitfalls

+
    +
  • The cmake macros do not handle linking against an upstream datamodel automatically. It is the users responsibility to explicitly link against the upstream datamodel.

  • +
  • When generating two datamodels side-by-side and into the same output directory and using the ROOT backend, the generated selection.xml file might be overwritten if both datamodels are generated into the same output directory.

  • +
+

Limiting this functionality to one upstream datamodel is a conscious choice to limit the potential for abuse of this feature.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/design.html b/v00-99/design.html new file mode 100644 index 000000000..20c655363 --- /dev/null +++ b/v00-99/design.html @@ -0,0 +1,298 @@ + + + + + + + Design and Implementation Details — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Design and Implementation Details

+

The driving considerations for the PODIO design are:

+
    +
  1. the concrete data are contained within plain-old-data structures (PODs)

  2. +
  3. user-exposed data types are concrete and do not use inheritance

  4. +
  5. The C++ and Python interface should look as close as possible

  6. +
  7. The user does not do any explicit memory management

  8. +
  9. Classes are generated using a higher-level abstraction and code generators

  10. +
+

The following sections give some more technical details and explanations for the design choices. +More concrete implementation details can be found in the doxygen documentation.

+
+

Layout of Objects

+

The data model is based on four different kind of objects and layers, namely

+
    +
  1. user visible (physics) classes (e.g. Hit). These act as transparent references to the underlying data,

  2. +
  3. a transient object knowing about all data for a certain physics object, including inter-object relations (e.g. HitObject),

  4. +
  5. a plain-old-data (POD) type holding the persistent object information (e.g. HitData), and

  6. +
  7. a user-visible collection containing the physics objects (e.g. HitCollection).

  8. +
+

These layers are described in the following.

+
+

The User Layer

+

The user visible objects (e.g. Hit) act as light-weight references to the underlying data, and provide the necessary user interface. They come in two flavors, mutable and immutable, where the mutable classes are easily recognizable by their name (e.g. MutableHit). +Mutable classes are implicitly converted to immutable ones if necessary, so that interfaces that require only reading access to the data should always use the immutable classes. Only in cases where explicit mutability of the objects is required should mutable classes appear in interface definitions.

+

For each of the data-members and OneToOneRelations declared in the data model definition, corresponding getters (and setters for the mutable classes) are generated. +For each of the OneToManyRelations and VectorMembers a vector-like interface is provided.

+

With the chosen interface, the code written in C++ and Python looks almost identical, if taking proper advantage of the auto keyword.

+
+
+

The Internal Data Layer

+

The internal objects give access to the object data, i.e. the POD, and the references to other objects. +These objects inherit from podio::ObjBase, which takes care of object identification (podio::ObjectID), and object-ownership. The ObjectID consists of the index of the object and an ID of the collection it belongs to. If the object does not belong to a collection yet, the data object owns the POD containing the real data, otherwise the POD is owned by the respective collection. For details about the inter-object references and their handling within the data objects please see below.

+
+
+

The POD Layer

+

The plain-old-data (POD) contain just the data declared in the Members section of the datamodel definition as well as some bookkeeping data for data types with OneToManyRelations or VectorMembers. Ownership and lifetime of the PODs is managed by the other parts of the infrastructure, namely the data objects and the data collections.

+
+
+

The Collections

+

The collections created serve three purposes:

+
    +
  1. giving access to or creating the data items

  2. +
  3. preparing objects for writing into PODs or preparing them after reading

  4. +
  5. support for the so-called notebook pattern

  6. +
+

When used via the so called factory pattern (i.e. using the create function to create new objects) a collection will return mutable objects. +It is important to note that objects that are “owned” by a collection (i.e. they are either created via create or they are added to the collection via push_back) become invalid and can no longer be used once a collection is cleared.

+
+
+

Vectorization support / notebook pattern

+

As an end-user oriented library, PODIO provides only a limited support for struct-of-arrays (SoA) memory layouts. In the vision, that the data used for heavy calculations is best copied locally, the library provides convenience methods for extracting the necessary information from the collections. More details can be found in the examples section of this document.

+
+
+
+

Handling mutability

+

Depending on the policy of the client of PODIO, data collections may be read-only after creation, or may be altered still. +While the base assumption of PODIO is that once-created collections are immutable once leaving the scope of its creator, +it still allows for explicit unfreezing collections afterwards. +This feature has to handled with care, as it heavily impacts thread-safety.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/doc.html b/v00-99/doc.html new file mode 100644 index 000000000..a1193056c --- /dev/null +++ b/v00-99/doc.html @@ -0,0 +1,247 @@ + + + + + + + Introduction — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Introduction

+

PODIO, or plain-old-data I/O, is a C++ library to support the creation and handling of data models in particle physics. It is based on the idea of employing plain-old-data (POD) data structures wherever possible, while avoiding deep-object hierarchies and virtual inheritance. This is to both improve runtime performance and simplify the implementation of persistency services.

+

At the same time it provides the necessary high-level functionality to the physicist, such as support for inter-object relations, and automatic memory-management. In addition, it provides a (ROOT assisted) Python interface. To simplify the creation of efficient data models, PODIO employs code generation from a simple yaml-based markup syntax.

+

To support the usage of modern software technologies, PODIO was written with concurrency in mind and gives basic support for vectorization technologies.

+

This document describes first how to define and create a specific data model, then how to use the created data. Afterwards it will explain the overall design and a few of the technical details of the implementation.

+

Many of the design choices are inspired by previous experience of the LCIO package used for the studies of the international linear collider, and the Gaudi Object Description applied in the LHCb collaboration at the LHC.

+
+
+

Quick-start

+

An up-to-date installation and quick start guide for the impatient user can be found on the PODIO github page.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/doc_title.html b/v00-99/doc_title.html new file mode 100644 index 000000000..9a8f37644 --- /dev/null +++ b/v00-99/doc_title.html @@ -0,0 +1,247 @@ + + + + + + + <no title> — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

\begin{titlepage} +\begin{center}

+

\vspace*{2.5cm}

+

\huge +PODIO - the POD I/O Library\ +Design Document v1.0

+

\vspace{0.5cm}

+

\normalsize +30.6.2016

+

\vspace{1cm}

+

Benedikt Hegner (CERN)\ +Frank Gaede (DESY)

+

\end{center} +\end{titlepage}

+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/examples.html b/v00-99/examples.html new file mode 100644 index 000000000..ac9dc0053 --- /dev/null +++ b/v00-99/examples.html @@ -0,0 +1,370 @@ + + + + + + + Examples for Supported Interface — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Examples for Supported Interface

+

The following snippets show the support of PODIO for the different use cases as +well as some potential pitfalls. These examples are mainly concerned with how +collections of objects and the objects themselve interact. As such they are +framework agnostic.

+
+

Object Ownership

+

Every data created is either explicitly owned by collections or automatically garbage-collected. There is no need for any new or delete call on user side. +As a general rule: If an object has been added to a collection, the collection +assumes ownership and if the collection goes out of scope all handles that point +to objects in this collection are invalidated as well.

+
+
+

Object Creation and Storage

+

Objects and collections can be created via factories, which ensure proper object ownership:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create(1.4,2.4,3.7,4.2);  // init with values
+    auto hit2 = hits.create(); // default-construct object
+    hit2.energy(42.23);
+
+
+

In addition, individual objects can be created in the free. If they aren’t attached to a collection, they are automatically garbage-collected:

+
    auto hit1 = Hit();
+    auto hit2 = Hit();
+    ...
+    hits.push_back(hit1);
+    ...
+    <automatic deletion of hit2>
+
+
+

In this respect all objects behave like objects in Python.

+
+
+

Object References

+

The library supports the creation of one-to-many relations:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create();
+    auto hit2 = hits.create();
+    auto clusters = ClusterCollection{};
+    auto cluster = clusters.create();
+    cluster.addHit(hit1);
+    cluster.addHit(hit2);
+
+
+

The references can be accessed via iterators on the referencing objects

+
    for (auto i = cluster.Hits_begin(), \
+         end = cluster.Hits_end(); i!=end; ++i){
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

or via direct accessors

+
    auto size = cluster.Hits_size();
+    auto hit  = cluster.Hits(<aNumber>);
+
+
+

If asking for an entry outside bounds, a std::out_of_range exception is thrown.

+
+
+

Looping through Collections

+

Looping through collections is supported in two ways. Via iterators:

+
    for(auto i = hits.begin(), end = hits.end(); i != end; ++i) {
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

and via direct object access:

+
    for(int i = 0, end = hits.size(), i != end, ++i){
+      std::cout << hit[i].energy() << std::endl;
+    }
+
+
+
+
+

Support for Notebook-Pattern

+

The notebook pattern uses the assumption that it is better to create a small +copy of only the data that are needed for a particular calculation. This +pattern is supported by providing access like

+
    auto x_array = hits.x();   // returning all values
+    auto y_array = hits.y(10); // or only the first 10 elements
+
+
+

The resulting std::vector can then be used in (auto-)vectorizable code. +Passing in a size argument is optional; If no argument is passed all elements will be returned, +if an argument is passed only as many elements as requested will be returned. +If the collection holds less elements than are requested, only as elements as are available will be returned.

+
+
+

podio::Frame container

+

The podio::Frame is the main container for containing and grouping collections +together. It has two main methods:

+
    /// Store a collection
+    template<typename T>
+    const T& put(T&& coll, const std::string& name);
+
+    /// access a collection
+    template<typename T>
+    const& T get(const std::string& name);
+
+
+

Note that for putting collections into the Frame an explicit std::move is +necessary to highlight the change of ownership that happens in this case.

+
+
+

Object Retrieval

+

Collections can be retrieved explicitly:

+
    auto& hits = frame.get<HitCollection>("hits");
+    if (hits.isValid()) { ... }
+
+
+

Or implicitly when following an object reference. In both cases the access to data that has been retrieved is const.

+
+
+

User defined Meta Data

+

Sometimes it is necessary or useful to store additional data that is not directly foreseen in the EDM. +This could be configuration parameters of simulation jobs, or parameter descriptions like cell-ID encoding etc. PODIO currently allows to store such meta data in terms of a GenericParameters class that +holds an arbitrary number of named parameters of type int, float, string or vectors if these. +Meta data can be stored and retrieved from the Frame via the templated putParameter and getParameter methods.

+
+

Python Interface

+

The Reader and Writer classes in the root_io and sio_io submodules +provide all the necessary functionality to read and write event files. An +example of reading files looks like this:

+
    from podio.root_io import Reader
+    reader = Reader("one or many input files")
+    for event in reader.get("events"):
+      hits = store.get("hits")
+      for hit in hits:
+        # ...
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/frame.html b/v00-99/frame.html new file mode 100644 index 000000000..97cb8c674 --- /dev/null +++ b/v00-99/frame.html @@ -0,0 +1,402 @@ + + + + + + + The Frame concept — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

The Frame concept

+

The podio::Frame is a general data container for collection data of podio generated EDMs. +Additionally, it offers the functionality to store some (limited) data outside of an EDM. +The basic idea of the Frame is to give users of podio the possibility to organize EDM data into logical units and to potentially build a hierarchy of different Frames. +Common examples would be the organisation of data into Events and Runs. +However, it is important to note that podio does really not impose any meaning on any Frame and each Frame is essentially defined by its contents.

+
+

Basic functionality of a Frame

+

The main functionality of a Frame is to store and aggregate EDM collection data and it also offers the possibility to store some generic data alongside. +To ensure thread safety and const-correctness a Frame takes ownership of any data that is put into it and only gives read access to immutable data. +This is mandated by the interface for collection data (simplified here for better readability):

+
struct Frame {
+template<typename CollT>
+const CollT& put(CollT&& coll, const std::string& name);
+
+void put(std::unique_ptr<podio::CollectionBase> coll, const std::string& name);
+
+template<typename CollT>
+const CollT& get(const std::string& name) const;
+
+template<typename T>
+void putParameter(const std::string& name, T value);
+
+template<typename T>
+const T& getParameter(const std::string);
+};
+
+
+

In this case there are two ways to get collection data into the Frame

+
    +
  1. By passing a concrete collection (of type CollT) into the Frame as an rvalue. There are two ways to achieve this, either by passing the return value of a function directly into Frame::put or by explicitly moving it in the call via std::move if you are using a named variable.

  2. +
  3. By passing a std::unique_ptr to a collection. Similar to the first case, this can either be the return value of a function call, or has to be done via std::move (as mandated by the std::unique_ptr interface).

  4. +
+

In both cases, if you passed in a named variable, the user is left with a moved-from object, which has to be in a valid but indefinite state, and cannot be used afterwards. +Some compilers and static code analysis tools are able to detect the accidental usage of moved-from objects.

+

For putting in parameters the basic principle is very similar, with the major difference being, that for trivial types getParameter will actually return by value.

+

For all use cases there is some enable_if machinery in place to ensure that only valid collections and valid parameter types can actually be used. +These checks also make sure that it is impossible to put in collections without handing over ownership to the Frame.

+
+

Usage examples for collection data

+

These are a few very basic usage examples that highlight the main functionality (and potential pitfalls).

+
+

Putting collection data into the Frame

+

In all of the following examples, the following basic setup is assumed:

+
#include "podio/Frame.h"
+
+#include "edm4hep/MCParticleCollection.h" // just to have a concrete example
+
+// create an empty Frame
+auto frame = podio::Frame();
+
+
+

Assuming there is a function that creates an MCParticleCollection putting the return value into the Frame is very simple

+
edm4hep::MCParticleCollection createMCParticles(); // implemented somewhere else
+
+// put the return value of a function into the Frame
+frame.put(createMCParticles(), "particles");
+
+// put the return value into the Frame but keep the const reference
+auto& particles = frame.put(createMCParticles(), "moreParticles");
+
+
+

If working with named variables it is necessary to use std::move to put collections into the Frame. +The Frame will refuse to compile in case a named variable is not moved. +Assuming the same createMCParticles function as above, this looks like the following

+
auto coll = createMCParticles();
+// potentially still modify the collection
+
+// Need to use std::move now that the collection has a name
+frame.put(std::move(coll), "particles");
+
+// Keeping a const reference is also possible
+// NOTE: We are explicitly using a new variable name here
+auto coll2 = createMCParticles();
+auto& particles = frame.put(std::move(coll2), "MCParticles");
+
+
+

At this point only particles is in a valid and defined state.

+
+
+

Getting collection (references) from the Frame

+

Obtaining immutable (const) references to collections stored in the Frame is trivial. +Here we are assuming that the collections are actually present in the Frame.

+
auto& particles = frame.get<edm4hep::MCParticleCollection>("particles");
+
+
+
+
+
+

Usage for Parameters

+

Parameters are using the podio::GenericParameters class behind the scene. +Hence, the types that can be used are int, float, and std::string as well as as std::vectors of those. +For better usability, some overloads for putParameter exist to allow for an in-place construction, like, e.g.

+
// Passing in a const char* for a std::string
+frame.putParameter("aString", "a string value");
+
+// Creating a vector of ints on the fly
+frame.putParameter("ints", {1, 2, 3, 4});
+
+
+
+
+
+

I/O basics and philosophy

+

podio offers all the necessary functionality to read and write Frames. +However, it is not in the scope of podio to organize them into a hierarchy, nor +to maintain such a hierarchy. When writing data to file Frames are written to +the file in the order they are passed to the writer. For reading them back podio +offers random access to stored Frames, which should make it possible to +restore any hierarchy again. The Writers and Readers of podio are supposed to be +run on and accessed by only one single thread.

+
+

Writing a Frame

+

For writing a Frame the writers can ask each Frame for CollectionWriteBuffers for each collection that should be written. +In these buffers the underlying data is still owned by the collection, and by extension the Frame. +This makes it possible to write the same collection with several different writers. +Writers can access a Frame from several different threads, even though each writer is assumed to be on only one thread. +For writing the GenericParameters that are stored in the Frame and for other necessary data, similar access functionality is offered by the Frame.

+
+
+

Reading a Frame

+

When reading a Frame readers do not have to return a complete Frame. +Instead they return a more or less arbitrary type of FrameData that simply has to provide the following public interface.

+
struct FrameData {
+  /// Get a (copy) of the internal collection id table
+  podio::CollectionIDTable getIDTable() const;
+
+  /// Get the buffers to construct the collection with the given name
+  std::optional<podio::CollectionReadBuffers> getCollectionBuffers(const std::string& name);
+
+  /// Get the still available, i.e. yet unpacked, collections from the raw data
+  std::vector<std::string> getAvailableCollections() const;
+
+  /// Get the parameters that are stored in the raw data
+  std::unique_ptr<podio::GenericParameters> getParameters();
+};
+
+
+

A Frame is constructed with a (unique_ptr of such) FrameData and handles everything from there. +Note that the FrameData type of any I/O backend is a free type without inheritance as the Frame constructor is templated on this. +This splitting of reading data from file and constructing a Frame from it later has some advantages:

+
    +
  • Since podio assumes that reading is done single threaded the amount of time that is actually spent in a reader is minimized, as only the file operations need to be done on a single thread. All further processing (potential decompression, unpacking, etc.) can be done on a different thread where the Frame is actually constructed.

  • +
  • It gives different backends the necessary freedom to exploit different optimization strategies and does not force them to conform to an implementation that is potentially detrimental to performance.

  • +
  • It also makes it possible to pass around data from which a Frame can be constructed without having to actually construct one.

  • +
  • Readers do not have to know how to construct collections from the buffers, as they are only required to provide the buffers themselves.

  • +
+
+
+

Schema evolution

+

Schema evolution happens on the CollectionReadBuffers when they are requested from the FrameData inside the Frame. +It is possible for the I/O backend to handle schema evolution before the Frame sees the buffers for the first time. +In that case podio schema evolution becomes a simple check.

+
+
+
+
+

Frame implementation and design

+

One of the main concerns of the Frame is to offer one common, non-templated, interface while still supporting different I/O backends and potentially different policies. +The “classic” approach would be to have an abstract IFrame interface with several implementations that offer the desired functionality (and their small differences). +One problem with that approach is that a purely abstract interface cannot have templated member functions. Hence, the desired type-safe behavior of get and put would be very hard to implement. +Additionally, policies ideally affect orthogonal aspects of the Frame behavior. +Implementing all possible combinations of behaviors through implementations of an abstract interface would lead to quite a bit of code duplication and cannot take advantage of the factorization of the problem. +To solve these problems, we chose to implement the Frame via Type Erasure. +This also has the advantage that the Frame also has value semantics in line with the design of podio.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/genindex.html b/v00-99/genindex.html new file mode 100644 index 000000000..bfbeb8b36 --- /dev/null +++ b/v00-99/genindex.html @@ -0,0 +1,238 @@ + + + + + + Index — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/index.html b/v00-99/index.html new file mode 100644 index 000000000..b952f24a7 --- /dev/null +++ b/v00-99/index.html @@ -0,0 +1,294 @@ + + + + + + + Welcome to PODIO’s documentation! — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/objects.inv b/v00-99/objects.inv new file mode 100644 index 000000000..35f908624 Binary files /dev/null and b/v00-99/objects.inv differ diff --git a/v00-99/search.html b/v00-99/search.html new file mode 100644 index 000000000..b972c218f --- /dev/null +++ b/v00-99/search.html @@ -0,0 +1,253 @@ + + + + + + Search — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/v00-99/searchindex.js b/v00-99/searchindex.js new file mode 100644 index 000000000..ac2a8470f --- /dev/null +++ b/v00-99/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["ReleaseNotes", "advanced_topics", "contributing", "datamodel_syntax", "design", "doc", "doc_title", "examples", "frame", "index", "templates", "userdata"], "filenames": ["ReleaseNotes.md", "advanced_topics.md", "contributing.md", "datamodel_syntax.md", "design.md", "doc.md", "doc_title.md", "examples.md", "frame.md", "index.rst", "templates.md", "userdata.md"], "titles": ["v00-17-04", "Advanced Topics", "Contributing to PODIO", "Data Models and Data Model Definitions", "Design and Implementation Details", "Introduction", "<no title>", "Examples for Supported Interface", "The Frame concept", "Welcome to PODIO\u2019s documentation!", "Changing / creating new templates", "Writing extra data outside an EDM"], "terms": {"2023": 0, "tmadlen": 0, "pr": [0, 2], "527": 0, "split": [0, 8, 10], "classgener": 0, "base": [0, 4, 5, 11], "class": [0, 1, 4, 7, 8, 9, 10, 11], "mixin": 0, "two": [0, 1, 3, 4, 7, 8, 10], "specif": [0, 5, 10], "c": [0, 1, 3, 4, 5, 10], "julia": 0, "code": [0, 1, 3, 4, 5, 7, 8], "gener": [0, 1, 3, 4, 5, 7, 8, 11], "onli": [0, 1, 2, 3, 4, 7, 8, 10], "deal": 0, "languag": [0, 10], "need": [0, 1, 3, 7, 8, 10], "instanti": [0, 10], "configur": [0, 7, 10], "correct": [0, 8, 10], "reader": [0, 1, 7, 8], "podio_class_gener": [0, 1, 10], "py": [0, 1, 10], "main": [0, 1, 7, 8, 10], "script": 0, "depend": [0, 4, 10], "desir": [0, 8], "slightli": [0, 10], "cleanup": 0, "membervari": 0, "declutt": 0, "its": [0, 1, 4, 8], "__init__": 0, "method": [0, 1, 4, 7, 10, 11], "bit": [0, 1, 3, 8], "530": 0, "remov": 0, "read": [0, 2, 4, 7, 10], "deprec": 0, "old": [0, 3, 4, 5], "style": 0, "format": [0, 1, 3, 10], "compon": [0, 9], "definit": [0, 4, 9, 10], "yaml": [0, 1, 3, 5, 9], "file": [0, 2, 3, 7, 8, 9], "485": 0, "eventstor": 0, "function": [0, 1, 3, 4, 5, 7, 9, 10, 11], "announc": 0, "429": 0, "529": 0, "switch": [0, 2], "relat": [0, 1, 3, 4, 5, 7, 10], "rang": [0, 11], "test": [0, 1, 2], "us": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11], "frame": [0, 9, 11], "i": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "o": [0, 5, 6, 9], "06": 0, "526": 0, "edm4hep": [0, 1, 8], "workflow": 0, "an": [0, 1, 4, 5, 7, 8, 9, 10], "lcg": 0, "stack": 0, "recent": 0, "enough": [0, 10, 11], "version": [0, 1, 10, 11], "cmake": [0, 1, 3, 10], "necessari": [0, 1, 3, 4, 5, 7, 8, 10, 11], "after": [0, 1, 2, 4, 10], "key4hep": 0, "235": 0, "jmcarcel": 0, "523": 0, "comment": [0, 2, 3], "name": [0, 1, 2, 3, 4, 7, 8, 10], "line": [0, 8], "number": [0, 3, 7, 11], "It": [0, 1, 3, 4, 5, 7, 8, 10, 11], "": [0, 1, 3, 8, 10], "veri": [0, 3, 8], "unlik": 0, "remain": 0, "up": [0, 2, 3, 5, 10], "date": [0, 2, 5], "when": [0, 1, 2, 3, 4, 7, 8, 10], "either": [0, 3, 4, 7, 8, 10], "content": [0, 8, 10], "chang": [0, 2, 7, 9], "521": 0, "do": [0, 3, 4, 8], "import": [0, 3, 4, 7, 8, 10], "root": [0, 1, 3, 5, 10], "podio": [0, 1, 3, 4, 5, 6, 8, 10, 11], "dump": 0, "help": [0, 1], "otherwis": [0, 1, 3, 4], "can": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "take": [0, 1, 3, 4, 8, 10], "while": [0, 4, 5, 8], "system": [0, 1], "print": 0, "514": 0, "introduc": 0, "maybesharedptr": 0, "manag": [0, 4, 5, 10], "obj": [0, 10], "user": [0, 3, 5, 8, 9, 10, 11], "face": [0, 10], "handl": [0, 3, 5, 7, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "control": [0, 10], "block": [0, 10], "object": [0, 1, 5, 8, 9, 10, 11], "distinct": 0, "entiti": 0, "potenti": [0, 7, 8, 10], "differ": [0, 4, 7, 8, 10, 11], "lifetim": [0, 4], "which": [0, 1, 3, 4, 7, 8, 10, 11], "allow": [0, 2, 3, 4, 7, 8, 10], "fix": [0, 3, 11], "174": 0, "492": 0, "increas": 0, "size": [0, 3, 7, 10, 11], "factor": [0, 8], "sinc": [0, 1, 8, 11], "thei": [0, 1, 4, 7, 8, 10], "ar": [0, 1, 3, 4, 5, 7, 8, 10, 11], "now": [0, 2, 8, 10], "effect": [0, 3], "pointer": [0, 1], "instead": [0, 3, 8, 10], "one": [0, 1, 2, 3, 7, 8, 10], "even": [0, 8], "initi": [0, 1, 10], "case": [0, 1, 3, 4, 7, 8, 11], "obtain": [0, 1, 8], "from": [0, 2, 4, 5, 7, 9, 10], "collect": [0, 1, 9, 10], "objbas": [0, 4], "make": [0, 1, 2, 3, 8, 10, 11], "objectid": [0, 1, 4], "member": [0, 1, 4, 8, 10], "constructor": [0, 8, 10], "privat": 0, "have": [0, 1, 2, 3, 8, 10, 11], "access": [0, 4, 7, 8, 10, 11], "raw": [0, 1, 8], "ani": [0, 1, 3, 4, 7, 8, 11], "static": [0, 1, 8], "makeempti": 0, "order": [0, 1, 8], "creat": [0, 2, 3, 4, 5, 7, 8, 9, 11], "empti": [0, 1, 8, 10], "also": [0, 1, 3, 8, 10, 11], "intern": [0, 5, 8], "unpersist": 0, "enabl": [0, 1], "more": [0, 1, 3, 4, 8], "exist": [0, 2, 8, 9], "sanit": 0, "ha": [0, 1, 3, 4, 7, 8], "becom": [0, 4, 8, 10], "possibl": [0, 1, 3, 4, 5, 8, 10, 11], "so": [0, 1, 2, 3, 4, 10], "ananya": 0, "gupta": 0, "473": 0, "ad": [0, 4, 7, 9, 11], "support": [0, 1, 5, 8, 9, 10], "python": [0, 1, 4, 5, 10], "interfac": [0, 1, 4, 5, 8, 9, 10, 11], "implement": [0, 1, 3, 5, 9, 10], "new": [0, 2, 3, 4, 7, 8, 9], "design": [0, 5, 6, 9, 10], "structur": [0, 1, 4, 5], "default": [0, 1, 3, 7, 10], "paramet": [0, 3, 7], "abstract": [0, 4, 8], "type": [0, 1, 4, 7, 8, 9, 10], "builtin": [0, 3, 10], "_sort_components_and_datatyp": 0, "perform": [0, 5, 8], "topolog": 0, "sort": 0, "datatyp": [0, 1, 3], "_has_static_arrays_import": 0, "check": [0, 3, 8], "arrai": [0, 3, 4, 10], "lang": 0, "l": 0, "program": 0, "argument": [0, 1, 3, 7, 10], "specifi": [0, 3], "current": [0, 1, 3, 7, 10, 11], "choic": [0, 3, 4, 5], "cpp": [0, 10], "upstream": [0, 9], "edm": [0, 3, 7, 8, 9, 10], "unit": [0, 3, 8], "suit": 0, "cover": 0, "exampl": [0, 3, 4, 9], "data": [0, 5, 9, 10], "model": [0, 1, 4, 5, 9, 10], "document": [0, 2, 4, 5, 6, 10], "enable_julia": 0, "toggl": 0, "option": [0, 1, 7, 8, 9, 10], "By": [0, 8, 10], "off": 0, "520": 0, "add": [0, 1, 2, 3, 10, 11], "error": [0, 11], "messag": 0, "std": [0, 1, 7, 8, 10, 11], "bad_function_cal": 0, "show": [0, 7], "stacktrac": 0, "quit": [0, 8], "uninform": 0, "519": 0, "getter": [0, 4, 10], "return": [0, 1, 4, 7, 8, 10], "valu": [0, 1, 3, 7, 8, 10, 11], "keep": [0, 1, 2, 8, 11], "const": [0, 1, 3, 7, 8, 11], "refer": [0, 1, 4, 9, 10, 11], "all": [0, 1, 3, 4, 7, 8, 10], "other": [0, 1, 3, 4, 8, 10], "518": 0, "488": 0, "bind": 0, "rntupl": 0, "writer": [0, 1, 7, 8], "understand": 0, "miss": 0, "storag": [0, 1, 3, 9, 10], "datamodel": [0, 1, 4, 9, 10], "513": 0, "rootframewrit": 0, "writefram": 0, "rootntuplewrit": 0, "ensur": [0, 7, 8], "consist": [0, 4], "given": [0, 3, 8], "categori": 0, "If": [0, 3, 4, 7, 8, 10], "inconsist": [0, 1], "found": [0, 4, 5], "except": [0, 7], "thrown": [0, 7], "befor": [0, 1, 8, 10], "might": [0, 3, 11], "lead": [0, 1, 8, 11], "crash": 0, "unread": 0, "382": 0, "refactor": 0, "map": [0, 1, 10], "track": 0, "set": [0, 1, 3, 11], "kept": [0, 2, 11], "511": 0, "decoupl": 0, "tool": [0, 8], "rest": 0, "folder": 0, "call": [0, 1, 2, 3, 4, 7, 8, 10], "podio_gen": [0, 10], "transpar": [0, 4], "time": [0, 5, 8], "neglig": 0, "again": [0, 1, 2, 3, 8], "becaus": 0, "we": [0, 1, 2, 8, 10, 11], "don": [0, 10], "t": [0, 1, 7, 8, 10], "load": [0, 1, 10], "librari": [0, 1, 3, 4, 5, 6, 7], "unnecessarili": 0, "longer": [0, 4], "simplifi": [0, 5, 8], "test_util": 0, "move": [0, 7, 8, 11], "write": [0, 4, 7, 9, 10], "where": [0, 1, 3, 4, 8, 10, 11], "belong": [0, 4], "sio": [0, 1, 10], "510": 0, "legaci": 0, "extra": [0, 3, 9, 10], "wa": [0, 1, 5], "being": [0, 1, 3, 8, 10], "pass": [0, 1, 3, 7, 8, 10], "example_fram": 0, "almost": [0, 4, 11], "alwai": [0, 4, 10], "anoth": [0, 1, 3], "hard": [0, 8], "notic": 0, "509": 0, "clang": [0, 10], "significantli": 0, "slower": 0, "run": [0, 8, 9, 10], "508": 0, "externaldata": 0, "modul": [0, 10], "let": 0, "care": [0, 1, 4, 10], "download": 0, "hash": 0, "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "addit": [0, 1, 3, 5, 7, 10, 11], "local": [0, 4], "store": [0, 3, 7, 8, 10, 11], "dexternaldata_object_stor": 0, "path": 0, "them": [0, 3, 4, 8, 10], "build": [0, 1, 3, 8], "scratch": 0, "won": 0, "507": 0, "copi": [0, 2, 3, 4, 7, 8], "dumpmodel": 0, "directori": [0, 3, 10], "some": [0, 2, 3, 4, 7, 8, 9, 10], "subdirectori": [0, 10], "try": [0, 3, 11], "find": 0, "look": [0, 1, 4, 7, 8, 10], "abov": [0, 3, 8, 10, 11], "doesn": [0, 1], "fail": 0, "505": 0, "bump": 0, "pylint": 0, "ci": 0, "2": [0, 6, 7, 8], "7": [0, 7], "502": 0, "deletebuff": 0, "popul": [0, 1], "collectionreadbuff": [0, 1, 8], "dispos": 0, "unconsum": 0, "buffer": [0, 1, 8], "leak": 0, "describ": [0, 1, 3, 4, 5], "500": 0, "rootframedata": 0, "clean": 0, "desctruct": 0, "sure": [0, 2, 8, 10], "delet": [0, 7], "collectiondata": [0, 10], "wouter": 0, "deconinck": 0, "503": 0, "instal": [0, 1, 5], "vi": 0, "497": 0, "podio_python_dir": 0, "top": [0, 10], "level": [0, 4, 5, 10], "cmakelist": 0, "build_test": 0, "496": 0, "oper": [0, 1, 8], "neg": 0, "comparison": 0, "http": [0, 2], "github": [0, 2, 5], "com": [0, 2], "aidasoft": [0, 2], "pull": [0, 2], "493": 0, "id": [0, 1, 4, 7, 8], "podioobjectid": 0, "29": 0, "mutabl": [0, 1, 3, 9, 10], "unsign": [0, 10, 11], "latter": 0, "useless": 0, "412": 0, "438": 0, "ostream": 0, "22": 0, "juraj": 0, "smiesko": 0, "491": 0, "warn": 0, "request": [0, 2, 7, 8], "entri": [0, 7, 10], "present": [0, 1, 8, 10, 11], "490": 0, "bug": 0, "built": [0, 3], "without": [0, 3, 8, 10], "489": 0, "486": 0, "untrack": 0, "properli": 0, "whether": [0, 3, 10], "been": [0, 1, 7], "collectionidt": [0, 8], "collectionid": 0, "signal": 0, "known": [0, 10], "tabl": [0, 8], "break": 0, "you": [0, 1, 2, 8, 11], "avoid": [0, 1, 5], "lookup": 0, "twice": 0, "subsequ": 0, "retriev": [0, 9], "overli": 0, "share": [0, 1], "rootntupleread": 0, "uncov": 0, "resolv": 0, "18": 0, "484": 0, "feel": 0, "benedikt": [0, 6], "hegner": [0, 6], "483": 0, "clarifi": 0, "schema": 0, "482": 0, "renam": 0, "macro": [0, 1, 3, 10], "createbuff": 0, "create_buff": 0, "481": 0, "execut": 0, "target": 0, "unittest": 0, "unittest_podio": 0, "collis": 0, "rel": [0, 1], "common": [0, 8, 10], "480": 0, "thoma": 0, "madlen": 0, "472": 0, "schemata": 0, "across": 0, "provid": [0, 1, 2, 3, 4, 5, 7, 8, 10], "syntax": [0, 3, 5], "intent": 0, "evolut": 0, "backend": [0, 1, 3, 8, 10], "includ": [0, 1, 3, 4, 8, 10, 11], "infrastructur": [0, 4], "futur": 0, "477": 0, "nlohmann": [0, 1], "json_fwd": 0, "hpp": [0, 1], "header": [0, 1, 3, 10], "reduc": 0, "unnecessari": 0, "templat": [0, 7, 8, 9], "475": 0, "478": 0, "collectionbas": [0, 8], "iter": [0, 7], "dmitri": 0, "kalinkin": 0, "465": 0, "typedef": 0, "referenc": [0, 7], "collection_typ": 0, "convers": [0, 1], "reachabl": 0, "objectcollect": 0, "value_typ": 0, "The": [0, 3, 7, 9, 10, 11], "reach": 0, "via": [0, 1, 3, 4, 7, 8, 11], "mutable_typ": 0, "30": [0, 6], "471": 0, "branch": [0, 2], "index": [0, 1, 4, 11], "e": [0, 1, 2, 4, 8, 10, 11], "behavior": [0, 8], "releas": 0, "seri": 0, "andr": 0, "sailer": 0, "469": 0, "updat": [0, 2], "requir": [0, 1, 3, 4, 8, 10], "catch2": 0, "3": [0, 1, 7, 8, 11], "4": [0, 7, 8], "20": 0, "clang16": 0, "el9": 0, "alma9": 0, "clang12": 0, "cs7": 0, "disabl": 0, "tabul": 0, "avail": [0, 1, 3, 7, 8, 9], "445": 0, "part": [0, 4, 10], "07": 0, "26": 0, "463": 0, "vector": [0, 1, 5, 7, 8, 10, 11], "vectormemb": [0, 1, 4, 10], "actual": [0, 1, 3, 8, 10], "subset": [0, 11], "work": [0, 8, 11], "462": 0, "reproduc": 0, "origin": [0, 1, 2], "issu": 0, "25": 0, "461": 0, "rootframeread": [0, 1], "master": [0, 2], "447": 0, "wrapper": 0, "around": [0, 8], "put": [0, 1, 7, 10, 11], "explicitli": [0, 3, 7, 8], "cppyi": 0, "gbl": 0, "432": 0, "457": 0, "setup": [0, 8], "explicit": [0, 4, 7], "enable_sio": 0, "rather": [0, 3, 10], "than": [0, 3, 7, 10], "presenc": [0, 10], "456": 0, "cach": 0, "455": 0, "cmake_binary_dir": 0, "project_binary_dir": 0, "439": 0, "framecategori": 0, "h": [0, 1, 8, 10, 11], "few": [0, 1, 3, 5, 8], "convent": 0, "hardcod": 0, "string": [0, 1, 3, 7, 8, 10], "variabl": [0, 8, 10], "454": 0, "cmake_": 0, "sourc": 0, "bin": 0, "_dir": 0, "project_": 0, "452": 0, "extend": [0, 9], "pre": [0, 9, 10], "processor": 0, "condit": 0, "to_json": 0, "visibl": [0, 4], "rootcl": 0, "interpret": 0, "435": 0, "450": 0, "descript": [0, 3, 5, 7, 10], "author": [0, 3], "field": [0, 1, 2, 10, 11], "449": 0, "commit": [0, 2, 9], "nightli": 0, "come": [0, 1, 4], "abl": [0, 8, 11], "395": 0, "minor": 0, "complaint": 0, "newer": 0, "tidi": 0, "anyth": 0, "essenti": [0, 1, 8, 10], "448": 0, "lcio": [0, 5], "datalayout": 0, "untouch": 0, "unbuilt": 0, "year": 0, "446": 0, "finish": 0, "sioframewrit": 0, "non": [0, 8], "mandatori": 0, "see": [0, 1, 2, 4, 8, 10], "442": 0, "437": 0, "modifi": [0, 8], "pars": [0, 10], "incorpor": 0, "436": 0, "27": 0, "413": 0, "schemaevolut": 0, "hold": [0, 4, 7], "offer": [0, 1, 8, 11], "evolvebuff": 0, "doe": [0, 3, 4, 8], "hook": 0, "framedata": [0, 8], "23": [0, 7], "434": 0, "433": 0, "rootlegacyread": 0, "428": 0, "sever": [0, 8], "less": [0, 7, 8], "topic": [0, 9], "sub": 0, "txt": 0, "commonli": 0, "podiotest": 0, "g": [0, 1, 2, 4, 8, 10, 11], "environ": 0, "config": 0, "427": 0, "delai": 0, "long": [0, 10, 11], "mainli": [0, 1, 7, 10], "quicker": 0, "respons": [0, 1, 3, 11], "flag": [0, 3, 10], "displai": 0, "alphabet": 0, "automat": [0, 1, 3, 5, 7], "adjust": 0, "column": 0, "width": [0, 3, 11], "fit": 0, "packag": [0, 3, 5, 10], "402": 0, "public": [0, 1, 3, 8], "constexpr": [0, 1], "char": [0, 8, 10], "getxxxnam": 0, "string_view": [0, 1], "reli": 0, "typenam": [0, 7, 8], "full": [0, 10], "gettypenam": 0, "valuetypenam": 0, "immut": [0, 3, 4, 8, 10], "getvaluetypenam": 0, "datatypenam": 0, "pod": [0, 1, 3, 5, 6, 10], "getdatatypenam": 0, "podio_sioblock_path": 0, "use_external_catch2": 0, "auto": [0, 1, 4, 7, 8, 11], "suitabl": 0, "fall": 0, "back": [0, 8], "fetch": [0, 2], "own": [0, 2, 3, 4, 7, 8], "426": 0, "ld_library_path": 0, "robust": 0, "incompat": 0, "425": 0, "skip_catch_discoveri": 0, "skip": 0, "discoveri": 0, "catch": 0, "unsuit": 0, "too": 0, "much": 0, "underli": [0, 4, 8, 11], "murmurhash": 0, "423": 0, "easier": [0, 1], "restructur": 0, "produc": [0, 10], "prior": 0, "421": 0, "appear": [0, 4], "insensit": 0, "written": [0, 1, 4, 5, 8, 11], "405": 0, "legibl": 0, "valid": [0, 1, 3, 8, 10], "improv": [0, 5], "interoper": 0, "rdatafram": 0, "169": 0, "follow": [0, 1, 2, 3, 4, 7, 8, 10, 11], "_": 0, "resp": [0, 3], "taken": 0, "singl": [0, 1, 8, 10], "_objidx": 0, "disambigu": 0, "normal": 0, "directli": [0, 1, 3, 7, 8, 10], "everyth": [0, 2, 8], "should": [0, 1, 2, 3, 4, 8, 10], "422": 0, "small": [0, 2, 7, 8], "could": [0, 7], "element": [0, 1, 7, 11], "420": 0, "insid": [0, 8], "rootread": 0, "segment": 0, "violat": 0, "417": 0, "multipl": [0, 1, 3], "411": 0, "api": 0, "open": 0, "418": 0, "bring": 0, "getmap": 0, "genericparamet": [0, 7, 8], "alreadi": [0, 10], "dd4hep": 0, "1112": 0, "mark": 0, "getxyzmap": 0, "brief": 0, "transit": 0, "period": 0, "These": [0, 3, 4, 7, 8, 10], "415": 0, "19": 0, "416": 0, "select": [0, 3, 10], "rule": [0, 7], "anymor": 0, "setter": [0, 4, 10], "410": 0, "squar": 0, "414": 0, "userdatacollect": [0, 11], "caus": 0, "first": [0, 3, 5, 7, 8], "394": 0, "collectionbufferfactori": 0, "factori": [0, 4, 7], "throughout": 0, "createschemaevolvablebuff": 0, "minimum": 0, "schema_vers": 0, "1": [0, 7, 8], "schemavers": 0, "datamodeldefinit": [0, 1], "package_nam": [0, 1, 10], "meta": [0, 1, 9], "propag": 0, "inform": [0, 1, 4, 9, 11], "place": [0, 3, 8, 10], "sioblock": [0, 10], "appropri": [0, 10], "christoph": 0, "dilk": 0, "408": 0, "between": 0, "accessor": [0, 7], "21": 0, "387": 0, "round": 0, "trip": 0, "extens": [0, 8], "400": 0, "sioframedata": 0, "getavailablecollect": [0, 8], "seg": 0, "fault": 0, "previous": 0, "399": 0, "podio_enable_sio": 0, "target_compile_definit": [0, 1], "podiosioio": 0, "get": [0, 1, 3, 7, 11], "well": [0, 1, 3, 4, 7, 8, 10], "featur": [0, 1, 2, 4, 9, 10], "scope": [0, 4, 7, 8], "target_link_librari": [0, 1], "paul": 0, "gessing": 0, "befurt": 0, "398": 0, "reject": 0, "397": 0, "properti": [0, 1], "396": 0, "341": 0, "metadata": 0, "w": 0, "simpl": [0, 3, 5, 8], "heurist": 0, "identifi": 0, "omiss": 0, "mistak": 0, "limit": [0, 3, 4, 8, 9], "backward": 0, "compat": [0, 3], "info": 0, "391": 0, "390": 0, "later": [0, 3, 8], "389": 0, "gitignor": 0, "358": 0, "emb": 0, "json": 0, "core": [0, 1], "contain": [0, 1, 3, 4, 8, 9, 10], "liter": [0, 1], "encod": [0, 1, 7], "regist": [0, 1], "newli": 0, "datamodelregistri": 0, "awar": [0, 10], "result": [0, 1, 3, 7], "done": [0, 2, 3, 8], "framewrit": 0, "give": [0, 1, 4, 5, 8, 10, 11], "roundtrip": 0, "compar": 0, "intend": [0, 1], "advanc": [0, 9], "detail": [0, 3, 5, 9, 10], "384": 0, "378": 0, "favor": 0, "372": 0, "doubl": [0, 3, 10, 11], "A": [0, 1, 3, 8, 10], "similar": [0, 8, 10, 11], "thing": 0, "ilcsoft": 0, "143": 0, "event": [0, 3, 7, 8, 11], "weight": [0, 4], "precis": [0, 1], "380": 0, "getparamet": [0, 7, 8], "getgenericparametersforwrit": 0, "exact": 0, "same": [0, 1, 3, 5, 8, 11], "easili": [0, 1, 4, 10], "offici": 0, "channel": 0, "replac": 0, "usag": [0, 1, 3, 5, 9], "getparameterkei": 0, "kei": [0, 1, 10], "377": 0, "visual": 0, "convert": [0, 1, 4], "graph": 0, "376": 0, "375": 0, "podio_vers": 0, "preprocessor": 0, "usabl": [0, 1, 8], "context": [0, 1], "374": 0, "constant": 0, "someth": [0, 1], "podio_build_vers": 0, "373": 0, "short": [0, 10], "output": [0, 1, 3, 10], "nathan": 0, "brei": 0, "369": 0, "putparamet": [0, 7, 8], "inlin": [0, 3], "linker": 0, "364": 0, "trigger": 0, "push": [0, 2], "368": 0, "podio_relax_pyv": 0, "relax": 0, "match": 0, "major": [0, 8, 10], "363": 0, "util": [0, 1], "defin": [0, 1, 5, 8, 9, 10], "cc": [0, 10], "sioutil": 0, "siowrit": 0, "343": 0, "defaultdict": 0, "hand": [0, 8], "roll": 0, "361": 0, "basic": [0, 5, 9, 10, 11], "319": 0, "355": 0, "365": 0, "2022": 0, "362": 0, "keyword": [0, 4], "onward": 0, "360": 0, "log": 0, "absolut": 0, "333": 0, "unique_ptr": [0, 8], "mutex": 0, "list": [0, 1, 3, 10, 11], "declar": [0, 3, 4, 10], "like": [0, 1, 2, 3, 4, 7, 8], "nvcc": 0, "mayb": 0, "yet": [0, 2, 4, 8, 11], "k4clue": 0, "34": 0, "dtag": 0, "podio_set_rpath": 0, "rpath": 0, "runpath": 0, "binari": [0, 1], "pin": 0, "ubuntu": 0, "runner": 0, "accident": [0, 8], "go": [0, 10], "out": [0, 1, 7], "sync": [0, 11], "359": 0, "356": 0, "readm": 0, "argpars": 0, "choos": [0, 2], "346": 0, "tp": 0, "apach": 0, "0": [0, 6, 7, 11], "licens": 0, "facilit": 0, "integr": 0, "experi": [0, 5], "357": 0, "prefix": [0, 3, 10], "onto": 0, "env": 0, "sh": 0, "354": 0, "posix": 0, "compliant": 0, "shell": 0, "bash": 0, "tab": 0, "space": 0, "mix": 0, "indent": 0, "root_include_path": 0, "351": 0, "were": [0, 1], "consid": [0, 1, 11], "implicit": 0, "boolean": 0, "caught": [0, 3], "against": [0, 1, 3], "nullptr": 0, "guard": 0, "correspond": [0, 1, 3, 4, 10], "344": 0, "339": 0, "intact": 0, "345": 0, "siolegacyread": 0, "287": 0, "349": 0, "nest": [0, 10], "348": 0, "adapt": 0, "went": 0, "unnot": 0, "previou": [0, 5], "root_io": [0, 7], "sio_io": [0, 7], "each": [0, 1, 4, 8, 10, 11], "somewher": [0, 1, 8], "untyp": 0, "framedatat": 0, "inspect": [0, 1], "reorgan": 0, "usual": [0, 11], "close": [0, 4], "addition": [0, 1, 8], "dictionari": [0, 10], "342": 0, "migrat": 0, "action": 0, "checkout": [0, 2], "v3": 0, "advis": 0, "clone": [0, 2], "bodi": 0, "327": 0, "typo": 0, "24": 0, "340": 0, "335": 0, "cvmf": 0, "view": 0, "latest": 0, "pick": [0, 10], "group": [0, 7], "lcg_102": 0, "337": 0, "notebook": [0, 9], "pattern": [0, 1, 9], "332": 0, "signatur": [0, 3, 10], "336": 0, "podioconfig": 0, "silenc": 0, "about": [0, 1, 3, 4], "polici": [0, 4, 8], "cmp00012": 0, "compil": [0, 1, 3, 8, 11], "step": [0, 1], "334": 0, "attempt": 0, "stream": [0, 10], "transient": [0, 4], "323": 0, "stdout": [0, 1], "overview": [0, 10], "over": [0, 8, 11], "d": 0, "To": [0, 1, 3, 5, 8, 11], "pythoneventstor": 0, "separ": [0, 3], "podiopythonstor": 0, "side": [0, 3, 7], "gotoev": 0, "iread": 0, "correctli": [0, 1], "sioread": 0, "thread": [0, 4, 8, 9], "safe": [0, 8], "final": 0, "plan": [0, 1], "stabl": 0, "still": [0, 4, 8, 10], "turn": [0, 1], "better": [0, 7, 8], "wai": [0, 3, 7, 8], "For": [0, 1, 2, 3, 4, 8, 11], "consider": [0, 4], "pleas": [0, 2, 4, 10], "consult": 0, "start": [0, 9], "unchang": 0, "distant": 0, "312": 0, "podio_json_output": [0, 1], "link": [0, 1, 3], "318": 0, "podio_add_root_io_dict": 0, "bugfix": 0, "output_fold": 0, "equal": [0, 1], "dir": 0, "selection_xml": 0, "317": 0, "unrel": 0, "prototyp": [0, 3, 10], "aim": 0, "eventu": 0, "redefin": 0, "memori": [0, 1, 4, 5], "316": 0, "maco": 0, "host": 0, "fuse": 0, "consequ": 0, "315": 0, "is_trivial_typ": [0, 10], "engin": [0, 10], "behav": [0, 7], "expect": 0, "exactli": [0, 1], "opposit": 0, "what": [0, 10, 11], "would": [0, 1, 2, 3, 8], "intuit": 0, "288": 0, "283": 0, "init": [0, 7], "apart": 0, "mean": [0, 1, 2, 8, 10, 11], "python2": 0, "276": 0, "seem": 0, "valentin": 0, "volkl": 0, "307": 0, "hotfix": 0, "290": 0, "revert": [0, 2], "unknown": 0, "symbol": 0, "podiodict": 0, "282": 0, "podio_use_clang_format": 0, "autodiscoveri": 0, "downstream": [0, 2], "discov": 0, "accordingli": 0, "ON": 0, "stage": 0, "305": 0, "upcom": 0, "294": 0, "siocollectionidtableblock": 0, "build_vers": 0, "sioversionblock": 0, "304": 0, "unreleas": 0, "303": 0, "soumil": 0, "296": 0, "instruct": 0, "how": [0, 5, 7, 8, 10], "295": 0, "prepareforwrit": [0, 1], "286": 0, "point": [0, 7, 8, 10], "reset": 0, "kalina": 0, "stoimenova": 0, "301": 0, "text": 0, "300": [0, 1], "python3": 0, "299": 0, "unset": 0, "detect": [0, 8], "293": 0, "obsolet": 0, "285": 0, "291": 0, "obj_needs_destructor": 0, "274": 0, "jinja2": [0, 10], "process": [0, 1, 8, 10], "262": 0, "untempl": 0, "ones": [0, 2, 4, 10], "supportedgenericdatatyp": 0, "tupl": 0, "those": [0, 3, 8], "typehelp": 0, "helper": 0, "277": 0, "remot": [0, 2], "input": [0, 1, 7], "everi": [0, 1, 7], "284": 0, "per": 0, "280": 0, "color": 0, "diff": 0, "diffutil": 0, "254": 0, "guidelin": [0, 2], "podio_generate_datamodel": [0, 3], "both": [0, 3, 5, 7, 8], "279": 0, "newest": 0, "clash": 0, "31": 0, "253": 0, "lint": 0, "end": [0, 4, 6, 7, 10], "trail": 0, "whitespac": 0, "flake8": 0, "ilcdirac": 0, "270": 0, "duplic": [0, 3, 8], "overload": [0, 8, 10], "269": 0, "broke": 0, "265": 0, "gcc11": 0, "dev": 0, "261": 0, "accept": 0, "integ": [0, 3, 11], "placido": 0, "fernandez": 0, "declara": 0, "259": 0, "filter": 0, "regex": 0, "complet": [0, 3, 8], "238": 0, "podiovers": 0, "three": [0, 1, 3, 4], "uint16_t": [0, 11], "patch": 0, "plu": 0, "expr": 0, "last": 0, "tag": 0, "64": [0, 11], "podio_": 0, "_version": 0, "extract": [0, 4], "reorder": 0, "section": [0, 1, 3, 4], "230": 0, "28": 0, "256": 0, "ignor": 0, "happen": [0, 3, 7, 8], "persist": [0, 4, 5, 9], "onc": [0, 4], "tri": 0, "isavail": 0, "observ": 0, "somewhat": 0, "setrefer": 0, "mistakenli": 0, "op": [0, 1], "mechan": 0, "restor": [0, 8], "obvious": 0, "252": 0, "wherev": [0, 5], "assign": 0, "thank": 0, "ownership": [0, 4, 8, 9], "ed": [0, 4], "251": 0, "had": 0, "onetoonerel": [0, 1, 3, 4, 10], "onetomanyrel": [0, 1, 3, 4, 10], "249": 0, "use_sanit": 0, "curent": 0, "address": 0, "withorigin": 0, "undefin": 0, "mutual": 0, "exlus": 0, "label": 0, "failur": 0, "force_run_all_test": 0, "overrid": 0, "develop": [0, 2], "209": 0, "mention": [0, 10, 11], "2021": 0, "245": 0, "render": 0, "241": 0, "prepar": [0, 4], "205": 0, "explictli": 0, "hit": [0, 4, 7, 11], "mutablehit": [0, 4], "discuss": 0, "204": 0, "reason": [0, 1, 3], "obviou": 0, "mutat": 0, "239": 0, "237": 0, "drop": 0, "colon": [0, 3], "236": 0, "problem": [0, 8], "spack": 0, "234": 0, "cstdint": [0, 3], "232": 0, "197": 0, "merg": [0, 2], "reconstruct": 0, "collectioninfotyp": 0, "simpli": [0, 1, 8], "assum": [0, 1, 7, 8], "proper": [0, 1, 4, 7], "didn": 0, "231": 0, "regress": 0, "223": 0, "213": 0, "224": 0, "219": 0, "214": 0, "frank": [0, 6], "gaed": [0, 6], "fundament": [0, 11], "basic_typ": 0, "bool": [0, 10], "usrint": 0, "uint64_t": [0, 11], "userint": 0, "usrdoubl": 0, "userdoubl": 0, "int": [0, 3, 7, 8, 10], "resiz": [0, 11], "myint": 0, "iu": 0, "nd": 0, "100": 0, "42": [0, 7], "114": 0, "effici": [0, 3, 5], "podio_generated_fil": 0, "glob": 0, "217": 0, "destructor": 0, "swap": 0, "idiom": 0, "namespac": [0, 1, 10], "216": 0, "211": 0, "parallel": [0, 1, 11], "ctest": 0, "jn": 0, "210": 0, "just": [0, 3, 4, 8, 10, 11], "earlier": [0, 2], "restrict": 0, "dict": [0, 1, 10], "exit": 0, "backtrac": 0, "collectionbuff": 0, "expos": [0, 4], "206": 0, "extern": [0, 3], "ship": [0, 1], "201": 0, "count": 0, "heap": 0, "free": [0, 7, 8], "200": 0, "195": 0, "circular": 0, "self": 0, "194": 0, "relationrang": 0, "akin": 0, "193": 0, "192": 0, "191": 0, "treat": 0, "186": 0, "int16_t": 0, "int32_t": 0, "int64_t": 0, "uint32_t": 0, "realli": [0, 8, 11], "189": 0, "read_and_writ": 0, "concurr": [0, 5], "spuriou": 0, "180": 0, "logic": [0, 8], "rootwrit": 0, "degrad": 0, "v6": 0, "our": 0, "affect": [0, 8], "badli": 0, "profit": 0, "182": 0, "statu": 0, "185": 0, "184": 0, "asciiwrit": 0, "183": 0, "export": 0, "marko": 0, "petric": 0, "181": 0, "scan": 0, "175": 0, "fulli": [0, 10], "qualifi": [0, 10], "168": 0, "issuecom": 0, "770751871": 0, "romanov": 0, "173": 0, "io": 0, "handler": 0, "171": 0, "153": 0, "170": 0, "enforc": 0, "werror": 0, "joseph": 0, "wang": 0, "156": 0, "noncopy": 0, "154": 0, "maintain": [0, 8], "111": 0, "172": 0, "brew": 0, "command": 0, "mac": 0, "2020": 0, "165": 0, "conveni": [0, 4], "emtpi": 0, "162": 0, "161": 0, "155": 0, "benchmark": 0, "timedread": 0, "timedwrit": 0, "decor": 0, "wrap": 0, "conform": [0, 8], "record": 0, "construct": [0, 1, 7, 8], "writeev": 0, "readcollect": 0, "benchmarkrecord": 0, "principl": [0, 1, 8, 10], "outsid": [0, 7, 8, 9], "search": 0, "152": 0, "copyabl": 0, "144": 0, "149": 0, "find_package_handle_standard_arg": 0, "147": 0, "130": 0, "second": 0, "altern": 0, "serial": 0, "runtim": [0, 5], "whole": [0, 1], "podio_add_datamodel_core_librari": 0, "condition": 0, "podio_add_sio_io_block": 0, "podio_io_handl": 0, "reflect": 0, "133": 0, "141": 0, "96": 0, "97": 0, "98": 0, "centos7": 0, "ubuntu1804": 0, "6": [0, 6], "least": [0, 1], "134": 0, "139": 0, "128": 0, "registerforwrit": 0, "site": [0, 2], "127": 0, "126": 0, "No": [0, 2], "125": 0, "recursive_mutex": 0, "made": [0, 1], "whatev": 0, "distanc": 0, "calcul": [0, 4, 7], "129": 0, "footprint": 0, "clear": [0, 4], "intermedi": 0, "124": 0, "sstream": 0, "123": 0, "122": 0, "121": 0, "pip": [0, 1], "120": 0, "cleanli": 0, "117": 0, "readabl": [0, 8], "focus": 0, "grasp": 0, "stricter": 0, "extracod": [0, 3, 10], "constextracod": 0, "accord": 0, "diverg": 0, "equival": [0, 1, 10, 11], "emit": 0, "charact": 0, "capabl": [0, 1, 11], "exhaust": 0, "serv": [0, 4], "purpos": [0, 4], "moment": [0, 10], "107": 0, "loop": [0, 9, 11], "106": 0, "infinit": 0, "cyclic": 0, "102": 0, "101": 0, "constobject": 0, "invalid": [0, 4, 7], "99": 0, "libpodiodict": 0, "libpodio": 0, "rootmap": 0, "92": 0, "float": [0, 3, 7, 8, 10, 11], "lcparamet": 0, "evtmd": 0, "geteventmetadata": 0, "setvalu": 0, "usereventweight": 0, "evtweight": 0, "getfloatv": 0, "49": 0, "91": 0, "podiorootio": 0, "90": 0, "89": 0, "88": 0, "addxxxx": 0, "addtoxxxx": 0, "87": 0, "8": [0, 3, 11], "jenkinsfil": 0, "cpack": 0, "enable_cpack": 0, "83": 0, "82": 0, "81": 0, "wl": 0, "dynamic_lookup": 0, "appleclang": 0, "linux": 0, "shlib": 0, "testdatamodel": 0, "80": 0, "75": 0, "74": 0, "q": 0, "quiet": 0, "printout": 0, "verbos": 0, "mode": [0, 1], "73": 0, "right": [0, 1], "podiomacro": 0, "72": 0, "travi": 0, "70": 0, "includesubfold": [0, 1, 10], "packagenam": 0, "etc": [0, 3, 7, 8], "true": [0, 1, 3], "uniqu": 0, "occur": 0, "occas": 0, "package_name_": 0, "69": 0, "68": 0, "podio_generate_dictionari": 0, "67": 0, "loader": 0, "preserv": 0, "65": 0, "2019": 0, "pere": 0, "mato": 0, "63": 0, "stl": [0, 10], "60": 0, "multi": 0, "word": 0, "examplehit": 0, "cellid": 0, "ben": 0, "morgan": 0, "59": 0, "58": 0, "57": 0, "56": 0, "55": 0, "fast": 0, "getfast": 0, "speed": 0, "xxcollect": 0, "54": 0, "cmakepackageconfighelp": 0, "associ": 0, "podiotarget": 0, "refind": 0, "standard": 0, "client": [0, 4], "find_packag": 0, "add_execut": 0, "foo": 0, "javier": 0, "cervant": 0, "villanueva": 0, "51": 0, "phase": 0, "report": 0, "mai": [0, 3, 4], "45": 0, "contribut": 0, "44": 0, "enambl": 0, "dryrun": 0, "43": 0, "suggest": 0, "graem": 0, "stewart": 0, "41": 0, "fcc": 0, "factoris": 0, "md": 0, "40": 0, "tchain": 0, "xrootd": 0, "eospubl": 0, "cern": [0, 6], "ch": 0, "eo": 0, "stick": 0, "hsf": 0, "2018": 0, "39": 0, "forward": [0, 1, 10], "treatment": 0, "statement": 0, "know": [0, 3, 4, 8], "concret": [0, 1, 3, 4, 8], "38": 0, "analog": 0, "larg": 0, "37": 0, "36": 0, "releaas": 0, "note": [0, 1, 3, 4, 7, 8, 10, 11], "releasenot": 0, "far": 0, "2017": 0, "32": [0, 11], "hep": 0, "colin": 0, "bernet": 0, "cbernet": 0, "nofile_fix": 0, "segv": 0, "interact": [0, 7], "pyeventstore_filenam": 0, "jlingema": 0, "clangf": 0, "joschka": 0, "lingemann": 0, "gen": 0, "53": 0, "fixwarn": 0, "regener": 0, "hint": 0, "highlight": [0, 7, 8], "doc": 0, "applic": 0, "struct": [0, 3, 4, 8, 10], "parser": 0, "temporarili": 0, "outputstream": 0, "add_ascii_io": 0, "zaborowska": 0, "52": 0, "50": 0, "findroot": 0, "lcg_88": 0, "unus": 0, "pyunittest": 0, "2016": [0, 6], "47": 0, "lcg_87": 0, "46": 0, "debug": 0, "asciwrit": 0, "write_ascii": 0, "const_rel": 0, "getsyntax": [0, 1, 3, 10], "creation": [0, 1, 3, 4, 5, 9], "fix_cpy_rel": 0, "project": [0, 2], "custom": [0, 9], "doxygen": [0, 4], "cli": 0, "titl": 0, "page": [0, 2, 5], "dry": 0, "paragraph": 0, "direct": [0, 7, 10], "exposur": 0, "deep": [0, 5], "initialis": 0, "chach": 0, "fccsw": 0, "mileston": 0, "steinweg": 0, "eike_operators_new": 0, "eik": 0, "printinfo": 0, "tabular": 0, "wrong": [0, 3], "reference_bug_test": 0, "pyinterfac": 0, "2000": 0, "lcg_83": 0, "af": 0, "improve_doc": 0, "ink": 0, "dde": 0, "documen": 0, "relation_bug": 0, "examplemc": 0, "ref": 0, "_end": 0, "add_getters_sett": 0, "associativecontain": 0, "incorrect": 0, "fix_extracod": 0, "acc": 0, "memleak": 0, "extracode_in_compon": 0, "tracker": 0, "real": [0, 3, 4], "gtest": 0, "cross": 0, "snippet": [0, 7, 10], "pointerless": 0, "mani": [0, 3, 5, 7, 10], "cluster": [0, 7], "recurs": 0, "build_typ": 0, "unneed": 0, "processev": 0, "big": 0, "collcect": 0, "podio_librari": 0, "crear": 0, "clementhelsen": 0, "fix_eo": 0, "9": 0, "tfile": 0, "re": [0, 1], "tutorial_2": 0, "chain": 0, "neater": 0, "fwd": 0, "fact": 0, "alber": 0, "tree": 0, "35": 0, "33": 0, "fix_includ": 0, "unified_env": 0, "5": 0, "filezombi": 0, "beautifi": 0, "soft": 0, "unifi": 0, "anna": 0, "conflict": 0, "destin": 0, "pcm": 0, "cosmet": 0, "me": [0, 3], "appl": 0, "pytool": 0, "pyyaml": 0, "datamemb": 0, "2015": 0, "b": [0, 2], "uniti": 0, "fill": [0, 1, 2, 3, 10, 11], "markdown": 0, "mem": 0, "refurbish": 0, "next": 0, "toward": 0, "xyzhandl": 0, "upgrad": 0, "layout": [0, 3, 9], "buildin": 0, "garbag": [0, 7], "streamlin": 0, "wrongli": 0, "cope": 0, "xcode": 0, "push_back": [0, 4, 7, 11], "trivial": [0, 1, 8, 10, 11], "acquir": 0, "behaviour": 0, "xxxobj": 0, "themselv": [0, 7, 8], "align": 0, "gcc": 0, "reserv": 0, "rootconfig": 0, "registri": 0, "fooentri": 0, "fooobj": 0, "simplif": 0, "improp": 0, "draft": 0, "newlin": [0, 3], "2014": 0, "edm_1": 0, "v1": [0, 6], "uniform": 0, "review": 0, "scheme": 0, "incomplet": 0, "friend": 0, "confirm": 0, "genreflex": 0, "head": 0, "n": [0, 11], "stuff": 0, "navig": 0, "readi": 0, "lepton": 0, "muon": 0, "comput": 0, "isol": 0, "particlehandl": 0, "more_util": 0, "particl": [0, 5, 8], "overlap": 0, "100000": 0, "solv": [0, 8], "rare": 0, "eta": 0, "cut": 0, "dummy_gener": 0, "dummi": 0, "jet": 0, "demand": 0, "dummygener": 0, "coll_in_registri": 0, "multijet": 0, "increment": 0, "land": 0, "few_easy_mod": 0, "x": [0, 3, 7], "merge_attempt": 0, "pedant": 0, "event_loop": 0, "messi": 0, "overal": [0, 5], "simple_edm": 0, "realist": 0, "auto_handle_ptr": 0, "embed": 0, "prepareafterread": [0, 1], "macos_build_merg": 0, "macos_build": 0, "lxplus6": 0, "reformat": 0, "question": 0, "z": [0, 3], "boson": 0, "rearrang": 0, "here": [1, 3, 8, 10, 11], "howev": [1, 8, 10, 11], "explain": [1, 3, 5], "There": [1, 3, 7, 8], "fulfil": 1, "advantag": [1, 3, 4, 8], "persistifi": 1, "piec": 1, "invok": 1, "translat": 1, "collid": [1, 5], "objindex": 1, "pair": 1, "solut": 1, "void": [1, 3, 8], "getbufferaddress": 1, "refcollect": 1, "referencecollect": 1, "form": [1, 3, 11], "instanc": 1, "eras": 1, "possibli": 1, "10": [1, 7, 11], "find_librari": 1, "nlohmann_json": 1, "With": [1, 4, 10], "collectionnam": 1, "definiton": 1, "similarli": 1, "foreseen": [1, 7], "represent": [1, 10], "mind": [1, 5], "global": [1, 9], "assumpt": [1, 4, 7], "caveat": 1, "As": [1, 4, 7, 11], "guarante": 1, "dure": 1, "state": [1, 8], "synchron": 1, "manual": [1, 11], "exemplari": 1, "want": [1, 2], "dumped_edm4hep": 1, "redirect": 1, "necessarili": 1, "below": [1, 4, 10], "frameread": 1, "getedmdefinit": 1, "most": [1, 10], "decod": 1, "__jsondefinit": 1, "r": 1, "edmdefinit": 1, "subfold": [1, 10], "singleton": 1, "whenev": 1, "enit": 1, "getdatamodeldefinit": 1, "edmnam": 1, "size_t": [1, 11], "getdatamodelregistryindex": 1, "That": 1, "datamodelregistryindex": 1, "straight": 1, "readelf": 1, "p": 1, "rodata": 1, "libedm4hep": 1, "grep": 1, "exposepodmemb": [1, 3], "fals": [1, 3], "datamodelregistryiohelp": 1, "instrument": 1, "datamodeldefinitioncollector": 1, "encount": 1, "registerdatamodeldefinit": 1, "getdatamodeldefinitionstowrit": 1, "datamodeldefinitionhold": 1, "getavailabledatamodel": 1, "sioframeread": 1, "yard": 2, "nosi": 2, "essenc": 2, "your": [2, 3], "dedic": 2, "until": 2, "rebas": 2, "cd": 2, "fork": 2, "repositori": 2, "web": 2, "usernam": 2, "yourusernam": 2, "meaning": 2, "mynewbranch": 2, "frequent": 2, "reload": 2, "websit": 2, "beginreleasenot": 2, "endreleasenot": 2, "eas": 3, "optimis": 3, "encourag": 3, "composit": 3, "inherit": [3, 4, 5, 8, 10], "One": [3, 8], "focu": 3, "friendli": 3, "plain": [3, 4, 5], "within": [3, 4, 10], "combin": [3, 8], "constrain": 3, "_leastn": 3, "_fastn": 3, "flat": 3, "my": 3, "mycompon": 3, "y": [3, 7], "anothercompon": 3, "excerpt": 3, "eventinfo": 3, "eventinfodata": 3, "eventinfocollect": 3, "extrem": 3, "expens": 3, "henc": [3, 8], "physic": [3, 4, 5], "quantiti": 3, "thu": 3, "particular": [3, 7], "sens": 3, "mutableextracod": 3, "declarationfil": 3, "implementationfil": 3, "through": [3, 8, 9, 10], "examplecompon": 3, "exampletyp": 3, "mr": 3, "comp": 3, "steer": 3, "capit": 3, "accomod": 3, "special": 3, "reimplement": 3, "nevertheless": 3, "gain": 3, "upstream_edm": 3, "xml": [3, 10], "overwritten": 3, "consciou": 3, "abus": 3, "drive": 4, "higher": 4, "technic": [4, 5], "explan": 4, "four": 4, "kind": 4, "act": 4, "certain": 4, "inter": [4, 5], "hitobject": 4, "hitdata": 4, "hitcollect": [4, 7, 11], "light": 4, "flavor": 4, "recogniz": 4, "implicitli": [4, 7], "chosen": 4, "ident": 4, "identif": 4, "respect": [4, 7], "bookkeep": 4, "item": 4, "orient": 4, "soa": 4, "vision": 4, "heavi": 4, "best": 4, "alter": 4, "leav": 4, "creator": 4, "unfreez": 4, "afterward": [4, 5, 8], "heavili": 4, "impact": 4, "safeti": [4, 8, 9], "idea": [5, 8], "emploi": 5, "hierarchi": [5, 8], "virtual": 5, "servic": 5, "At": [5, 8, 10], "high": 5, "physicist": 5, "assist": 5, "markup": 5, "modern": 5, "softwar": 5, "technologi": 5, "inspir": 5, "studi": 5, "linear": 5, "gaudi": 5, "appli": [5, 10], "lhcb": 5, "collabor": 5, "lhc": 5, "guid": 5, "impati": 5, "begin": [6, 7], "titlepag": 6, "center": 6, "vspace": 6, "5cm": 6, "huge": 6, "normals": 6, "1cm": 6, "desi": 6, "pitfal": [7, 8], "concern": [7, 8], "framework": 7, "agnost": 7, "goe": 7, "hit1": 7, "hit2": 7, "energi": 7, "individu": [7, 10], "aren": 7, "attach": 7, "clustercollect": 7, "addhit": 7, "hits_begin": 7, "hits_end": 7, "cout": 7, "endl": 7, "hits_siz": 7, "anumb": 7, "ask": [7, 8], "bound": 7, "out_of_rang": 7, "x_arrai": 7, "y_arrai": 7, "vectoriz": 7, "togeth": 7, "coll": [7, 8], "ting": 7, "isvalid": 7, "Or": 7, "sometim": 7, "simul": 7, "job": 7, "cell": 7, "term": 7, "arbitrari": [7, 8], "submodul": 7, "organ": 8, "organis": 8, "impos": 8, "aggreg": 8, "alongsid": [8, 11], "mandat": 8, "collt": 8, "rvalu": 8, "achiev": 8, "left": 8, "indefinit": 8, "cannot": 8, "analysi": 8, "enable_if": 8, "machineri": 8, "imposs": 8, "mcparticlecollect": 8, "createmcparticl": 8, "els": 8, "moreparticl": 8, "refus": 8, "coll2": 8, "mcparticl": 8, "behind": 8, "scene": 8, "astr": 8, "fly": 8, "nor": 8, "random": 8, "suppos": 8, "collectionwritebuff": 8, "though": 8, "getidt": 8, "getcollectionbuff": 8, "unpack": 8, "amount": 8, "spent": 8, "minim": 8, "further": [8, 10], "decompress": 8, "freedom": 8, "exploit": 8, "optim": 8, "strategi": 8, "forc": 8, "detriment": 8, "classic": 8, "approach": 8, "ifram": 8, "pure": 8, "ideal": 8, "orthogon": 8, "aspect": 8, "chose": 8, "erasur": 8, "semant": 8, "introduct": 9, "quick": 9, "concept": 9, "philosophi": 9, "preprocess": 9, "podio_config_read": 10, "generator_util": 10, "classgeneratorbasemixin": 10, "langaug": 10, "itself": 10, "digest": 10, "disk": 10, "consumpt": 10, "cppclassgener": 10, "juliaclassgener": 10, "broadli": 10, "along": 10, "live": 10, "layer": 10, "linv": 10, "resourc": 10, "src": 10, "mutablestruct": 10, "jl": 10, "parentmodul": 10, "jinja": 10, "immedi": 10, "activ": 10, "_get_filenames_templ": 10, "postfix": 10, "filenam": 10, "overridden": 10, "neccessari": 10, "_fill_templ": 10, "deleg": 10, "endfor": 10, "Be": 10, "mostli": 10, "use_get_syntax": 10, "incfold": 10, "includes_cc": 10, "implemen": 10, "includes_data": 10, "includes_obj": 10, "includes_cc_obj": 10, "includes_coll_cc": 10, "include_coll_data": 10, "forward_declar": 10, "leaf": 10, "forward_declarations_obj": 10, "is_pod": 10, "indic": 10, "ostream_collection_set": 10, "header_cont": 10, "bare_typ": 10, "full_typ": 10, "is_builtin": 10, "is_arrai": 10, "array_typ": 10, "array_s": 10, "getter_nam": 10, "setter_nam": 10, "jl_import": 10, "staticarrai": 10, "mvector": 10, "julia_typ": 10, "essenit": 10, "strip": 10, "down": 10, "experiment": 10, "int16": 10, "int32": 10, "uint32": 10, "float32": 10, "float64": 10, "int64": 10, "uint64": 10, "userfloat": 11, "userdata": 11, "14f": 11, "vec": 11, "deliber": 11, "biggest": 11, "hittag": 11, "intn_t": 11, "uintn_t": 11, "16": 11, "platform": 11, "static_assert": 11, "is_same_v": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"v00": 0, "17": 0, "04": 0, "03": 0, "02": 0, "01": 0, "16": 0, "05": 0, "15": 0, "14": 0, "00": 0, "13": 0, "12": 0, "11": 0, "10": 0, "09": 0, "08": 0, "advanc": 1, "topic": 1, "write": [1, 8, 11], "extra": [1, 11], "data": [1, 3, 4, 7, 8, 11], "outsid": [1, 11], "edm": [1, 11], "chang": [1, 10], "creat": [1, 10], "new": [1, 10], "templat": [1, 10], "persist": 1, "back": 1, "end": 1, "read": [1, 8], "dump": 1, "json": 1, "thread": 1, "safeti": 1, "user": [1, 4, 7], "serial": 1, "Not": 1, "safe": 1, "compon": [1, 3, 10], "run": 1, "pre": 1, "commit": 1, "retriev": [1, 7], "definit": [1, 3], "from": [1, 3, 8], "file": [1, 10], "access": 1, "programmat": 1, "technic": 1, "detail": [1, 4], "embed": 1, "The": [1, 4, 8], "datamodelregistri": 1, "i": [1, 8], "o": [1, 8], "helper": 1, "store": 1, "contribut": 2, "podio": [2, 7, 9], "git": 2, "workflow": 2, "exampl": [2, 7, 8, 11], "releas": 2, "note": 2, "model": 3, "basic": [3, 8], "concept": [3, 8], "support": [3, 4, 7, 11], "featur": 3, "custom": 3, "class": 3, "defin": [3, 7], "member": 3, "refer": [3, 7, 8], "between": 3, "object": [3, 4, 7], "explicit": 3, "method": 3, "global": 3, "option": 3, "extend": 3, "datamodel": 3, "us": 3, "type": [3, 11], "an": [3, 11], "upstream": 3, "potenti": 3, "pitfal": 3, "design": [4, 8], "implement": [4, 8], "layout": 4, "layer": 4, "intern": 4, "pod": 4, "collect": [4, 7, 8, 11], "vector": 4, "notebook": [4, 7], "pattern": [4, 7], "handl": 4, "mutabl": 4, "introduct": 5, "quick": 5, "start": 5, "interfac": 7, "ownership": 7, "creation": 7, "storag": 7, "loop": 7, "through": 7, "frame": [7, 8], "contain": 7, "meta": 7, "python": 7, "function": 8, "usag": [8, 11], "put": 8, "get": 8, "paramet": 8, "philosophi": 8, "schema": 8, "evolut": 8, "welcom": 9, "": 9, "document": 9, "preprocess": 10, "yaml": 10, "exist": 10, "ad": 10, "avail": 10, "inform": 10, "gener": 10, "datatyp": 10, "membervari": 10, "julia": 10, "code": 10, "some": 11, "limit": 11, "No": 11, "relat": 11, "other": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"v00-17-04": [[0, "v00-17-04"]], "v00-17-03": [[0, "v00-17-03"]], "v00-17-02": [[0, "v00-17-02"]], "v00-17-01": [[0, "v00-17-01"]], "v00-17": [[0, "v00-17"]], "v00-16-05": [[0, "v00-16-05"]], "v00-16-04": [[0, "v00-16-04"]], "v00-16-03": [[0, "v00-16-03"]], "v00-16-02": [[0, "v00-16-02"]], "v00-16-01": [[0, "v00-16-01"]], "v00-16": [[0, "v00-16"]], "v00-15": [[0, "v00-15"]], "v00-14-02": [[0, "v00-14-02"]], "v00-14-01": [[0, "v00-14-01"], [0, "id1"]], "v00-14": [[0, "v00-14"]], "v00-14-00": [[0, "v00-14-00"]], "v00-13-02": [[0, "v00-13-02"]], "v00-13-01": [[0, "v00-13-01"]], "v00-13": [[0, "v00-13"]], "v00-12": [[0, "v00-12"]], "v00-11": [[0, "v00-11"]], "v00-10": [[0, "v00-10"]], "v00-09-02": [[0, "v00-09-02"]], "v00-09": [[0, "v00-09"]], "v00-08": [[0, "v00-08"]], "Advanced Topics": [[1, "advanced-topics"]], "Writing extra data outside the EDM": [[1, "writing-extra-data-outside-the-edm"]], "Changing / creating new templates": [[1, "changing-creating-new-templates"], [10, "changing-creating-new-templates"]], "Persistency": [[1, "persistency"]], "Writing Back-End": [[1, "writing-back-end"]], "Reading Back-End": [[1, "reading-back-end"]], "Dumping JSON": [[1, "dumping-json"]], "Thread-safety": [[1, "thread-safety"]], "Changing user data": [[1, "changing-user-data"]], "Serialization": [[1, "serialization"]], "Not-thread-safe components": [[1, "not-thread-safe-components"]], "Running pre-commit": [[1, "running-pre-commit"]], "Retrieving the EDM definition from a data file": [[1, "retrieving-the-edm-definition-from-a-data-file"]], "Accessing the EDM definition programmatically": [[1, "accessing-the-edm-definition-programmatically"]], "Technical details on EDM definition embedding": [[1, "technical-details-on-edm-definition-embedding"]], "The DatamodelRegistry": [[1, "the-datamodelregistry"]], "I/O helpers for EDM definition storing": [[1, "i-o-helpers-for-edm-definition-storing"]], "Contributing to PODIO": [[2, "contributing-to-podio"]], "Git workflow": [[2, "git-workflow"]], "Example workflow": [[2, "example-workflow"]], "Release Notes": [[2, "release-notes"]], "Data Models and Data Model Definitions": [[3, "data-models-and-data-model-definitions"]], "Basic Concepts and Supported Features": [[3, "basic-concepts-and-supported-features"]], "Definition of custom components": [[3, "definition-of-custom-components"]], "Definition of custom data classes": [[3, "definition-of-custom-data-classes"]], "Defining members": [[3, "defining-members"]], "Definition of references between objects:": [[3, "definition-of-references-between-objects"]], "Explicit definition of methods": [[3, "explicit-definition-of-methods"]], "Global options": [[3, "global-options"]], "Extending a datamodel / using types from an upstream datamodel": [[3, "extending-a-datamodel-using-types-from-an-upstream-datamodel"]], "Potential pitfalls": [[3, "potential-pitfalls"]], "Design and Implementation Details": [[4, "design-and-implementation-details"]], "Layout of Objects": [[4, "layout-of-objects"]], "The User Layer": [[4, "the-user-layer"]], "The Internal Data Layer": [[4, "the-internal-data-layer"]], "The POD Layer": [[4, "the-pod-layer"]], "The Collections": [[4, "the-collections"]], "Vectorization support / notebook pattern": [[4, "vectorization-support-notebook-pattern"]], "Handling mutability": [[4, "handling-mutability"]], "Introduction": [[5, "introduction"]], "Quick-start": [[5, "quick-start"]], "Examples for Supported Interface": [[7, "examples-for-supported-interface"]], "Object Ownership": [[7, "object-ownership"]], "Object Creation and Storage": [[7, "object-creation-and-storage"]], "Object References": [[7, "object-references"]], "Looping through Collections": [[7, "looping-through-collections"]], "Support for Notebook-Pattern": [[7, "support-for-notebook-pattern"]], "podio::Frame container": [[7, "podio-frame-container"]], "Object Retrieval": [[7, "object-retrieval"]], "User defined Meta Data": [[7, "user-defined-meta-data"]], "Python Interface": [[7, "python-interface"]], "The Frame concept": [[8, "the-frame-concept"]], "Basic functionality of a Frame": [[8, "basic-functionality-of-a-frame"]], "Usage examples for collection data": [[8, "usage-examples-for-collection-data"]], "Putting collection data into the Frame": [[8, "putting-collection-data-into-the-frame"]], "Getting collection (references) from the Frame": [[8, "getting-collection-references-from-the-frame"]], "Usage for Parameters": [[8, "usage-for-parameters"]], "I/O basics and philosophy": [[8, "i-o-basics-and-philosophy"]], "Writing a Frame": [[8, "writing-a-frame"]], "Reading a Frame": [[8, "reading-a-frame"]], "Schema evolution": [[8, "schema-evolution"]], "Frame implementation and design": [[8, "frame-implementation-and-design"]], "Welcome to PODIO\u2019s documentation!": [[9, "welcome-to-podio-s-documentation"]], "Preprocessing of yaml file": [[10, "preprocessing-of-yaml-file"]], "Existing templates": [[10, "existing-templates"]], "Adding a new template": [[10, "adding-a-new-template"]], "Available information in the templates": [[10, "available-information-in-the-templates"]], "General information": [[10, "general-information"]], "Components": [[10, "components"]], "Datatypes": [[10, "datatypes"]], "MemberVariable": [[10, "membervariable"]], "DataType": [[10, "datatype"]], "Julia code generation": [[10, "julia-code-generation"]], "Writing extra data outside an EDM": [[11, "writing-extra-data-outside-an-edm"]], "Example usage": [[11, "example-usage"]], "Some limitations": [[11, "some-limitations"]], "No relations to other collections": [[11, "no-relations-to-other-collections"]], "Limited supported types": [[11, "limited-supported-types"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/v00-99/templates.html b/v00-99/templates.html new file mode 100644 index 000000000..83e9c8d26 --- /dev/null +++ b/v00-99/templates.html @@ -0,0 +1,584 @@ + + + + + + + Changing / creating new templates — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Changing / creating new templates

+

PODIO uses the Jinja2 template engine to generate the c++ code from the yaml description. +This document here gives an overview of how PODIO uses the Jinja2 engine and how the yaml file is processed before it is passed to it. +We don’t go into many details of Jinja2 templates here, please refer to the Template Designer Document of Jinja2. +PODIO only makes use of rather basic Jinja2 templates, so it should in principle be possible to pick up the basics just by looking at some existing templates.

+
+

Preprocessing of yaml file

+

The entry point for reading yaml files is the python/podio_gen/podio_config_reader.py. +When reading the yaml file a basic validation is run and the data members, relations and vector members of components and datatypes are parsed into MemberVariable objects (defined in python/podio_gen/generator_utils.py). +The main entry point to the code generation is the python/podio_class_generator.py which takes care of instantiating the language specific code generator (either C++ or a prototype version for Julia at this point). +The language specific generators inherit from the ClassGeneratorBaseMixin which takes care of some common initialization and provides some common functionality for code generation. +In the end each langauge specific generator will take care of (either by itself or through the common functionality in ClassGeneratorBaseMixin):

+
    +
  • Configuring the Jinja2 template engine. At the moment this is mainly making the templates known to the engine.

  • +
  • The necessary preprocessing of all the datatypes and components. This includes collecting necessary include directories and forward declaration, as well as digesting ExtraCode snippets.

  • +
  • Putting all the necessary information into a dict that can be easily used in the Jinja2 templates. See below for what is available in the templates

  • +
  • Calling the template engine to fill the necessary templates for each datatype or component and making sure to only write to disk if the filled template actually changed. Optionally run clang-format on them before writing.

  • +
  • Producing a list of generated c++ files for consumption by the cmake macros of PODIO.

  • +
+

Currently two language specific generators are available: CPPClassGenerator and JuliaClassGenerator. +Note that some of the information below will only apply to either of these generators as they provide the template engine with slightly different content.

+
+
+

Existing templates

+

Currently PODIO loads templates that are placed in <prefix>/python/templates. +They are broadly split along the classes that are generated for each datatype or component from the EDM definition:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

template file(s)

content

generated file(s)

Component.h.jinja2

Definition for each component

[<package>/]<component-name>.h

Data.h.jinja2

POD struct of each datatype (living in the POD layer)

[<package>/]<datatype-name>Data.h

Obj.{h,cc}.jinja2

Obj class for each datatype (linving in the object layer) and managing resources

[<package>/]<datatype-name>Obj.h, src/<datatype-name>Obj.cc

[Mutable]Object.{h,cc}.jinja2

The user facing interfaces for each datatype (living in the user layer)

[<package>/][Mutable]<datatype-name>.h, src/[Mutable]<datatype-name>.cc

Collection.{h,cc}.jinja2

The user facing collection interface (living in the user layer)

[<package>/]<datatype-name>Collection.h, src/<datatype-name>Collection.cc

CollectionData.{h,cc}.jinja2

The classes managing the collection storage (not user facing!)

[<package>/]<datatype-name>CollectionData.h, src/<datatype-name>CollectionData.cc

selection.xml.jinja2

The selection.xml file that is necessary for generating a root dictionary for the generated datamodel

src/selection.xml

SIOBlock.{h,cc}.jinja2

The SIO blocks that are necessary for the SIO backend

[<package>/]<datatype-name>SIOBlock.h, src/<datatype-name>SIOBlock.cc

MutableStruct.jl.jinja2

The mutable struct definitions of components and datatypes for julia

[<package>/]<datatype-name>Struct.jl, [<package>/]<component-name>Struct.jl

ParentModule.jl.jinja2

The constructor and collection definitions of components and datatypes in the data model are contained within a single module named after the package-name

[<package>/]<package-name>.jl

+

The presence of a [<package>] subdirectory for the header files is controlled by the includeSubfolder option in the yaml definition file.

+

Jinja allows the definition of additional macros and supports importing them similar to python modules. +These are stored in the macros subfolder and are imported directly by the main templates where necessary.

+
+
+

Adding a new template

+

All templates that are placed in the templates directory mentioned above become immediately available to the template engine if it ends on .jinja2 +However, it is still necessary to actively fill them from the class generator. +If the available information for the new templates is already enough and no further pre-processing is necessary, than they need to be added to _get_filenames_templates function in the ClassGeneratorBaseMixin. +The prefix and postfix dictionaries define how the template filename will be mapped to the generated files: <prefix><template-filename><postfix>. +By default a .h and a .cc file will be generated, but this can be overridden by adding the template to the endings dictionary. +With that in place it is now only neccessary to call _fill_templates with the appropriate template name and the pre processed data. +Note that for most templates this means that they have to be filled for each datatype or component individually.

+

If additional preprocessing is necessary, it will be necessary to also add that to the the language specific generators. +The main entry point to the generation is the process method which essentially just delegates to other methods.

+
+
+

Available information in the templates

+

The following gives an overview of the information that is available from the dictionary that is passed to the templates from the different +Each (top level) key in this dict is directly available as a variable in the Jinja2 templates, e.g.

+
component['includes'] = # list of includes
+
+
+

will become available as

+
{% for include in includes %}
+{{ include }}
+{% endfor %}
+
+
+

Be aware that some of the information is only available for the language +specific generators. The following information mostly applies to the c++ code +generation!

+
+

General information

+

The following keys / variables are always available

+ + + + + + + + + + + + + + + + + +

key / variable name

content

package_name

The package name of the datamodel (passed to the generator as argument)

use_get_syntax

The value of the getSyntax option from the yaml definition file

incfolder

The [<package>/] part of the generated header files (See above)

+
+
+

Components

+

The following keys are filled for each component

+ + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The class of the component as DataType (see below)

Members

The members of the component as MemberVariables

includes

All the necessary includes for this component

ExtraCode

Optionally present extra code

+
+
+

Datatypes

+

The following keys / variables are filled for each datatype

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The (immutable, user-facing) class as DataType (see below)

Members

The members of the datatype as a list of MemberVariables (see below)

OneToOneRelations

The one-to-one relation members of the datatype as a list of MemberVariables

OneToManyRelations

The one-to-many relation members of the datatype as a list of MemberVariables

VectorMembers

The vector members of the datatype as a list of MemberVariables

includes

The include directives for the the user facing classes header files

includes_cc

The include directives for the implemenations of the user facing classes

includes_data

The necessary include directives for the Data POD types

includes_obj

The include directives for the Obj classes headers.

includes_cc_obj

The include directives for the implementation files of the Obj classes.

includes_coll_cc

The include directives for the implementation of the Collection classes

include_coll_data

The include directives for the header CollectionData header file

forward_declarations

The forward declarations for the user facing classes header files. This is a nested dict, where the keys are namespaces and the leaf values are classes.

forward_declarations_obj

The forward declarations for the Obj classes header files.

is_pod

Flag value indicating whether the Data class of this datatype is a POD or if it contains an STL member

is_trivial_type

Flag that indicates that this is a trivial data type, i.e. one without relations or vector members.

ostream_collection_settings

A dict with a single header_contents key that is necessary for the output stream overload implementation of collections

+
+
+

MemberVariable

+

Defined in python/generator_utils.py. +The string representation gives the definition of the member, including a potentially present description string. +In principle all members are accessible in the templates, however, the most important ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

description

name

The name of the member

namespace

The (potentially empty) namespace of the member

bare_type

The type of the member without namespace

full_type

The full, namespace qualified, type of the member, essentially {{ namespace }}::{{ bare_type }}

description

The (optional) description string of the member

is_builtin

Flag for indicating that a member is a builtin type

is_array

Flag for indicating that a member is a std::array

array_type

The type of the array if the member is a std::array

array_size

The size of the array if the member is a std::array

getter_name

Method for generating the correct name for getter functions, depending on the getSyntax option in the yaml definition file.

setter_name

Method for generating the correct name for setter functions, depending on the getSyntax option in the yaml definition file and on whether the member is a relation or not

signature

The signature of a data member that can be used in function signatures, corresponds to {{ full_type }} {{ name }}

jl_imports

Import required for StaticArrays: MVector

julia_type

Equivalent julia type for the c++ type

+
+
+

DataType

+

Defined in python/generator_utils.py. +This is essenitally a stripped down version of the MemberVariable with the major difference being that the string representation returns the fully qualified type instead. +The available fields are

+ + + + + + + + + + + + + + + + + +

field

description

bare_type

The type without the namespace

namespace

The (potentially empty) namespace

full_type

The fully qualified type, corresponding to {{ namespace }}::{{ bare_type }}.

+
+
+

Julia code generation

+

It is an experimental feature. +Builtin types mapping in Julia

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cpp

julia

bool

Bool

char

Char

short

Int16

int

Int32

unsigned int

UInt32

float

Float32

double

Float64

long

Int64

unsigned long

UInt64

long long

Int64

unsigned long long

UInt64

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v00-99/userdata.html b/v00-99/userdata.html new file mode 100644 index 000000000..dc1cfed6e --- /dev/null +++ b/v00-99/userdata.html @@ -0,0 +1,319 @@ + + + + + + + Writing extra data outside an EDM — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Writing extra data outside an EDM

+

In some cases it can be necessary to write some additional data that can not +(yet) be stored in the EDM. PODIO offers a possibility to store such extra user +data via the podio::UserDataCollection. It gives the user access to a +std::vector of a set of limited fundamental types, which is written alongside +the data stored in the EDM classes for each event.

+
+

Example usage

+

Creating or getting a UserDataCollection via the Frame works the same +as with any other collection of the EDM via the put or get functions:

+
#include "podio/UserDataCollection.h"
+
+// Create a collection and put it into a Frame
+userFloats = podio::UserDataCollection<float>();
+frame.put(std::move(userFloats), "userFloats");
+
+// get a collection
+const auto& userData = frame.get<podio::UserDataCollection<float>>("userFloats");
+
+
+

The interface of the UserDataCollection is similar to a basic version of the +std::vector, i.e. push_back, resize and the basic functions for accessing +elements are present:

+
userFloats.push_back(3.14f); // add elements
+userFloats.resize(10);       // make the collection have 10 elements
+auto value = userFloats[0];  // access elements by index
+
+for (auto&& value : userFloats) {
+    // necessary functionality for range-based for-loops
+}
+
+for (size_t i = 0; i < userFloats.size(); ++i) {i
+    // but also for index based loops
+}
+
+
+

For cases where this subset interface is not enough it is also possible to get a +reference to the underlying std::vector via the UserDataCollection::vec() +method.

+
+
+

Some limitations

+

Since adding additional fields to an EDM type is almost trivial for PODIO +generated EDMs the UserDataCollection capabilities are deliberately kept +limited. Here we list what we consider to be the biggest limitations:

+
+

No relations to other collections

+

Since a UserDataCollection is really just a list of numbers it is not possible +to form relations to other objects. This also means that users are responsible +for keeping a UserDataCollection in sync with an EDM collection if is used to +store additional information, e.g.

+
auto& hits = store.create<HitCollection>("hits");
+auto& hitTags = store.create<podio::UserDataCollection<uint16_t>>("hitTags");
+
+for (/* some loop */) {
+    auto hit = hits.create();
+    // To be able to loop over these in parallel, you have to fill the user data manually
+    uint16_t hitTag;
+    hitTags.push_back(hitTag);
+}
+
+
+
+
+

Limited supported types

+

As mentioned above the possible types that can be stored in a +UserDataCollection is currently (deliberately) limited to the following +fundamental types

+
    +
  • fixed width integers: intN_t and uintN_t, with N={8, 16, 32, 64}

  • +
  • float and double

  • +
+

Trying to store different types in a UserDataCollection will lead to a +compilation error. Note that the usual integer types might be the same as the +fixed width version on some platforms. However, the equivalences of different +types might be different on different platforms. E.g.

+
static_assert(std::is_same_v<unsigned long, uint64_t>);
+
+
+

might work on some platforms, but might not work on others.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v00-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/.buildinfo b/v99-99-99/.buildinfo new file mode 100644 index 000000000..8a5884313 --- /dev/null +++ b/v99-99-99/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1fc56d91bc325588f9368f94783c195c +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v99-99-99/.doctrees/ReleaseNotes.doctree b/v99-99-99/.doctrees/ReleaseNotes.doctree new file mode 100644 index 000000000..0fb8510f2 Binary files /dev/null and b/v99-99-99/.doctrees/ReleaseNotes.doctree differ diff --git a/v99-99-99/.doctrees/advanced_topics.doctree b/v99-99-99/.doctrees/advanced_topics.doctree new file mode 100644 index 000000000..aa7be0273 Binary files /dev/null and b/v99-99-99/.doctrees/advanced_topics.doctree differ diff --git a/v99-99-99/.doctrees/contributing.doctree b/v99-99-99/.doctrees/contributing.doctree new file mode 100644 index 000000000..bff865152 Binary files /dev/null and b/v99-99-99/.doctrees/contributing.doctree differ diff --git a/v99-99-99/.doctrees/datamodel_syntax.doctree b/v99-99-99/.doctrees/datamodel_syntax.doctree new file mode 100644 index 000000000..ced7f65f1 Binary files /dev/null and b/v99-99-99/.doctrees/datamodel_syntax.doctree differ diff --git a/v99-99-99/.doctrees/design.doctree b/v99-99-99/.doctrees/design.doctree new file mode 100644 index 000000000..0a54c6ee1 Binary files /dev/null and b/v99-99-99/.doctrees/design.doctree differ diff --git a/v99-99-99/.doctrees/doc.doctree b/v99-99-99/.doctrees/doc.doctree new file mode 100644 index 000000000..72d57afa0 Binary files /dev/null and b/v99-99-99/.doctrees/doc.doctree differ diff --git a/v99-99-99/.doctrees/doc_title.doctree b/v99-99-99/.doctrees/doc_title.doctree new file mode 100644 index 000000000..e820920ff Binary files /dev/null and b/v99-99-99/.doctrees/doc_title.doctree differ diff --git a/v99-99-99/.doctrees/environment.pickle b/v99-99-99/.doctrees/environment.pickle new file mode 100644 index 000000000..b63a99e57 Binary files /dev/null and b/v99-99-99/.doctrees/environment.pickle differ diff --git a/v99-99-99/.doctrees/examples.doctree b/v99-99-99/.doctrees/examples.doctree new file mode 100644 index 000000000..4011f00d0 Binary files /dev/null and b/v99-99-99/.doctrees/examples.doctree differ diff --git a/v99-99-99/.doctrees/frame.doctree b/v99-99-99/.doctrees/frame.doctree new file mode 100644 index 000000000..6169cf88e Binary files /dev/null and b/v99-99-99/.doctrees/frame.doctree differ diff --git a/v99-99-99/.doctrees/index.doctree b/v99-99-99/.doctrees/index.doctree new file mode 100644 index 000000000..ee5f02086 Binary files /dev/null and b/v99-99-99/.doctrees/index.doctree differ diff --git a/v99-99-99/.doctrees/templates.doctree b/v99-99-99/.doctrees/templates.doctree new file mode 100644 index 000000000..0e3e14ce5 Binary files /dev/null and b/v99-99-99/.doctrees/templates.doctree differ diff --git a/v99-99-99/.doctrees/userdata.doctree b/v99-99-99/.doctrees/userdata.doctree new file mode 100644 index 000000000..906f21685 Binary files /dev/null and b/v99-99-99/.doctrees/userdata.doctree differ diff --git a/v99-99-99/ReleaseNotes.html b/v99-99-99/ReleaseNotes.html new file mode 100644 index 000000000..4051dd4cc --- /dev/null +++ b/v99-99-99/ReleaseNotes.html @@ -0,0 +1,3488 @@ + + + + + + + v00-17-04 — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

v00-17-04

+
    +
  • 2023-12-14 tmadlener (PR#527)

    +
      +
    • Split the ClassGenerator into a base class (mixin) and two specific c++ and julia code generators that only deal with their language specific needs.

      +
        +
      • Instantiate and configure the correct reader in the podio_class_generator.py main script depending on the desired language.

      • +
      +
    • +
    • Slightly cleanup the MemberVariable to declutter its __init__ method a bit.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#530)

    +
      +
    • Remove the reading of the deprecated old-style format of component definitions in the YAML files.

    • +
    +
  • +
  • 2023-12-13 tmadlener (PR#485)

    +
      +
    • Remove the deprecated EventStore functionality as announced in #429

    • +
    +
  • +
  • 2023-12-12 tmadlener (PR#529)

    +
      +
    • Switch the relation range tests to use Frame based I/O.

    • +
    +
  • +
  • 2023-12-06 tmadlener (PR#526)

    +
      +
    • Switch the edm4hep workflows to an LCG stack with a recent enough version of CMake. Necessary after key4hep/EDM4hep#235

    • +
    +
  • +
  • 2023-12-05 jmcarcell (PR#523)

    +
      +
    • Remove comment with file name and line number. It’s very unlikely it remains up to date when either the name or the content of the files changes

    • +
    +
  • +
  • 2023-12-04 jmcarcell (PR#521)

    +
      +
    • Do not import ROOT when using podio-dump --help, otherwise it can take a while depending on the system only to print the help.

    • +
    +
  • +
  • 2023-12-04 tmadlener (PR#514)

    +
      +
    • Introduce the MaybeSharedPtr to manage the Obj* in the user facing handle classes.

      +
        +
      • This splits the control block and the managed object into two distinct entities with potentially different lifetimes, which allows to fix #174 and #492.

      • +
      • This increases the size of the user facing handle classes by a factor two, since they are now effectively two pointers instead of one, even if the control block will not be initialized in case a handle is obtained from a collection.

      • +
      +
    • +
    • Remove the ObjBase base class and make the ObjectID a member of the Obj classes.

    • +
    • Make the user facing handle class constructors from an Obj* private as users will not have access to raw Obj* in any case.

      +
        +
      • Introduce a static makeEmpty method for the generated classes in order to create an empty handle, which is also used internally to handle unpersisted relations.

      • +
      +
    • +
    • Enable more existing test cases in sanitizer workflows now that it has become possible to do so.

    • +
    +
  • +
  • 2023-12-04 Ananya Gupta (PR#473)

    +
      +
    • Added Julia code generation support in the existing Python interface.

    • +
    • Implemented a new design structure for generated Julia code.

    • +
    • Added default parameters in constructor definitions with support for Abstract types (for builtins).

    • +
    • Created _sort_components_and_datatypes function to perform topological sort on components and datatypes.

    • +
    • Created _has_static_arrays_import to check for the need of using Static Arrays in the generated julia code.

    • +
    • Added –lang (-l) programming language argument to specify the programming language for code generation, current choices: cpp and julia, default: cpp.

    • +
    • Added –upstream-edm code generation support for julia.

    • +
    • Added tests in the unit test suite, covering the Julia code generation of the example data models.

    • +
    • Added documentation for julia code generation.

    • +
    • Added ENABLE_JULIA toggle option. By default it is OFF.

    • +
    +
  • +
  • 2023-12-01 jmcarcell (PR#520)

    +
      +
    • Add an error message when there is an std::bad_function_call, which currently shows +a stacktrace and is quite uninformative.

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#519)

    +
      +
    • Make generated member getter functions return by value for builtin types. Keep return by const reference for all other types. Fixes #518

    • +
    +
  • +
  • 2023-12-01 tmadlener (PR#488)

    +
      +
    • Add python bindings for the RNTuple reader and writer

    • +
    • Make podio-dump understand RNTuple based files

    • +
    • Fix missing storage of datamodel definitions for RNTuple based files

    • +
    +
  • +
+
+
+

v00-17-03

+
    +
  • 2023-11-14 tmadlener (PR#513)

    +
      +
    • Introduce checks in ROOTFrameWriter::writeFrame and ROOTNTupleWriter::writeFrame that ensure consistent contents for all Frames of a given category. If inconsistent contents are found an exception is thrown. Before these changes this might lead to a crash or to unreadable files. Fixes #382

    • +
    • Refactor ROOTNTupleWriter internals to have only one map that keeps track of categories instead of two maps and a set that need to be kept consistent.

    • +
    +
  • +
+
+
+

v00-17-02

+
    +
  • 2023-11-08 jmcarcell (PR#511)

    +
      +
    • Decouple generation tools and files from the rest of the podio python files by creating a new folder called podio_gen. This is a transparent change for users that only use the generator script.

      +
        +
      • This makes the configuration / generation times negligible again, because we don’t load libraries unnecessarily any longer for the generation.

      • +
      +
    • +
    • Simplify the python bindings (podio) __init__.py and remove the test_utils from it.

    • +
    • Move the tests for writing frames in python to the tests folder, where they belong and also test the SIO python writer.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#510)

    +
      +
    • Fix legacy tests; an extra argument was being passed and default in the .cpp file example_frame.root was being used which (almost) always exists (because there is a another test creating it) so it was hard to notice.

    • +
    +
  • +
  • 2023-11-06 jmcarcell (PR#509)

    +
      +
    • Add an option for using clang format and set it to off by default. It is significantly slower to run cmake with this option on.

    • +
    +
  • +
  • 2023-11-02 jmcarcell (PR#508)

    +
      +
    • Use the cmake ExternalData module to manage test data. This lets cmake take care of downloading the tests by hash so they can be version controlled. In addition, it’s possible to set up a local store using -DExternalData_OBJECT_STORES=/path/to/store and it will download the test files there if they are not there but otherwise use them from there, so building from scratch won’t download the test files again.

    • +
    +
  • +
  • 2023-10-16 jmcarcell (PR#507)

    +
      +
    • Copy .clang-format to the dumpmodel test directory and fix some tests when the build directory is not a subdirectory of the main directory. In some tests clang-format will try to find a .clang-format looking in the directories above and if it doesn’t exist it will format files differently and some tests will fail.

    • +
    +
  • +
+
+
+

v00-17-01

+
    +
  • 2023-10-12 tmadlener (PR#505)

    +
      +
    • Bump the pylint version for CI to 2.17.7

    • +
    +
  • +
  • 2023-10-11 tmadlener (PR#502)

    +
      +
    • Add a deleteBuffers function that is populated at generation time to the CollectionReadBuffers to make it possible to dispose of unconsumed buffers. This fixes the main leaks described in #500

    • +
    • Make the ROOTFrameData clean up all unconsumed buffers at desctruction.

    • +
    • Make sure to delete buffers that are no longer necessary in the CollectionData constructor. This fixes some more leaks described in #500

    • +
    +
  • +
  • 2023-10-08 Wouter Deconinck (PR#503)

    +
      +
    • Install podio-vis

    • +
    +
  • +
  • 2023-10-04 jmcarcell (PR#497)

    +
      +
    • Move podio_PYTHON_DIR to the top level CMakeLists so that it is set even when BUILD_TESTING is off

    • +
    +
  • +
  • 2023-10-02 jmcarcell (PR#496)

    +
      +
    • Add an operator != to fix negative comparisons since after https://github.com/AIDASoft/podio/pull/493 now id() returns a podioObjectID

    • +
    +
  • +
  • 2023-09-29 tmadlener (PR#493)

    +
      +
    • Make [Mutable]Object::id() return a podio::ObjectID instead of unsigned, since the latter has become useless with #412. Fixes #438

    • +
    • Add an operator<<(std::ostream&) for podio::ObjectID

    • +
    +
  • +
+
+
+

v00-17

+
    +
  • 2023-09-22 Juraj Smiesko (PR#491)

    +
      +
    • podio-dump: print warning if requested entry not present in the file

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#490)

    +
      +
    • Fix bugs in python imports when podio is built without SIO support. Fixes #489

    • +
    +
  • +
  • 2023-09-22 tmadlener (PR#486)

    +
      +
    • Make sure to initialize ObjectIDs to untracked to properly track whether they have been added to a Frame or not

    • +
    • Change CollectionIDTable interfaces of name and collectionID to return optional to signal whether a collection (ID) is known to the table. This is a breaking change if you use the CollectionIDTable!

      +
        +
      • Avoids having to do the lookup twice to check existence and a subsequent retrieval

      • +
      +
    • +
    • Fix bug of overly shared CollectionIDTable in ROOTNTupleReader that was uncovered by the CollectionIDTable switch to optional returns.

    • +
    • Switch tests from EventStore to Frame based I/O.

    • +
    • Fix bug in Frame based I/O that lead to crashes when trying to resolve relations to unpersisted objects.

    • +
    +
  • +
  • 2023-09-18 tmadlener (PR#484)

    +
      +
    • Make the podio python bindings import structure “feel more pythonic”

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#483)

    +
      +
    • Clarify error message in case of not implemented schema changes

    • +
    +
  • +
  • 2023-09-15 Benedikt Hegner (PR#482)

    +
      +
    • rename CMake macro createBuffers into create_buffers

    • +
    +
  • +
  • 2023-09-13 jmcarcell (PR#481)

    +
      +
    • Rename the cmake executable or target unittest to unittest_podio, to avoid possible collisions since the unittest name is relatively common

    • +
    +
  • +
  • 2023-09-13 Benedikt Hegner (PR#480)

    +
      +
    • Move the code generation of buffers into the ‘create_buffers’ macro

    • +
    +
  • +
  • 2023-09-13 Thomas Madlener (PR#472)

    +
      +
    • Allow comparison of data schemata across versions

    • +
    • Provide syntax to clarify user intentions in schema evolution

    • +
    • Provide schema evolution implementation based on ROOT backend

    • +
    • Include infrastructure for future support for schema evolution in other backends

    • +
    • Documentation for schema evolution functionality

    • +
    +
  • +
  • 2023-09-11 tmadlener (PR#477)

    +
      +
    • Use nlohmann/json_fwd.hpp in headers to reduce unnecessary template instantiations. Fixes #475

    • +
    +
  • +
  • 2023-09-08 tmadlener (PR#478)

    +
      +
    • Add empty method to CollectionBase

    • +
    • Add operator== to the collection iterators

    • +
    +
  • +
  • 2023-09-08 Dmitry Kalinkin (PR#465)

    +
      +
    • Introduce member typedefs to the user facing classes.

      +
        +
      • Object’s collection type can now be referenced as Object::collection_type. Conversely, the object type is reachable as ObjectCollection::value_type. The mutable objects can be reached via Object::mutable_type.

      • +
      +
    • +
    +
  • +
  • 2023-08-30 tmadlener (PR#471)

    +
      +
    • Initialize the branch names to be index based for reading (i.e. legacy behavior) for all releases of the v00-16 series.

    • +
    +
  • +
  • 2023-08-22 Andre Sailer (PR#469)

    +
      +
    • Tests: update required catch2 version to 3.4 for builds with c++20

    • +
    • CI: use clang16 on el9 (alma9), instead of clang12 on cs7, using c++20

    • +
    • CI: disable key4hep-release-based tests (tabulate available)

    • +
    +
  • +
  • 2023-08-22 Benedikt Hegner (PR#445)

    +
      +
    • Allow to specify units as part of the datamodel definition

    • +
    +
  • +
  • 2023-07-26 tmadlener (PR#463)

    +
      +
    • Make sure to only access vector member buffers of collections of datatypes with VectorMembers if they actually exist. This is necessary to make subset collections of such datatypes work in I/O. Fixes #462

    • +
    • Add a test that reproduces the original issue and is fixed by this.

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#461)

    +
      +
    • Make sure the ROOTFrameReader on the master branch can read v00-16-06 files

    • +
    • Add v00-16-06 to the legacy versions that are tested

    • +
    +
  • +
  • 2023-07-25 tmadlener (PR#447)

    +
      +
    • Add a python wrapper around the different available Frame writers.

    • +
    • Add a put method to the Frame wrapper that allows to add collections to the Frame without having to explicitly use cppyy.gbl.std.move. Fixes #432

    • +
    • Add test cases that write via python bindings and read via c++.

    • +
    +
  • +
  • 2023-07-20 tmadlener (PR#457)

    +
      +
    • Simplify the test setup for SIO in CMake and make it explicit on the ENABLE_SIO option rather than on the presence of targets.

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#456)

    +
      +
    • Cache podio_PYTHON_DIR

    • +
    +
  • +
  • 2023-07-18 jmcarcell (PR#455)

    +
      +
    • Rename CMAKE_BINARY_DIR to PROJECT_BINARY_DIR

    • +
    +
  • +
  • 2023-07-18 tmadlener (PR#439)

    +
      +
    • Introduce the FrameCategories.h header that puts a few of the conventions and otherwise hardcoded strings into variables / functions.

    • +
    +
  • +
  • 2023-07-14 jmcarcell (PR#454)

    +
      +
    • Rename CMAKE_{SOURCE,BIN}_DIR to PROJECT_{SOURCE,BIN}_DIR

    • +
    +
  • +
  • 2023-07-14 tmadlener (PR#452)

    +
      +
    • Extend the pre-processor condition for the to_json functionality to not be visible in rootcling or the root interpreter. Fixes #435

    • +
    +
  • +
  • 2023-07-13 Benedikt Hegner (PR#450)

    +
      +
    • Add optional description and author fields to component definition

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#449)

    +
      +
    • Fix the pre-commit workflow by making it run on top of the key4hep nightlies that come with a recent enough root version to be able to work with the RNTuple addition (#395)

    • +
    • Fix a few minor complaints from newer versions of clang-format, clang-tidy and pylint

    • +
    • Enable building the RNTuple backend for more workflows (anything that comes with a new enough ROOT essentially).

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#448)

    +
      +
    • Remove the lcio datalayout which has been untouched (and unbuilt) for quite a few years.

    • +
    +
  • +
  • 2023-07-13 tmadlener (PR#446)

    +
      +
    • Make calling finish for the SIOFrameWriter non-mandatory. See #442 for other related changes.

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#442)

    +
      +
    • Allow not calling finish() when using the writers

    • +
    +
  • +
  • 2023-07-11 jmcarcell (PR#395)

    +
      +
    • Add support for the new RNTuple format by adding a writer, reader and tests.

    • +
    +
  • +
  • 2023-06-30 Ananya Gupta (PR#437)

    +
      +
    • Modified parse function definition to incorporate missing description in member definition error message. Fixes #436

    • +
    +
  • +
  • 2023-06-27 Thomas Madlener (PR#413)

    +
      +
    • Introduce podio::SchemaEvolution that can hold schema evolution functions and that offers an evolveBuffers method that does the schema evolution on these buffers before collections are created.

    • +
    • Add hooks in podio::Frame to call this when collections are read from the FrameData.

    • +
    +
  • +
  • 2023-06-23 tmadlener (PR#434)

    +
      +
    • Properly handle the slightly different branch contents before v00-16-04. Fixes #433

    • +
    • Add tests that use the ROOTLegacyReader to actually read the downloaded legacy files

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#428)

    +
      +
    • Split the tests directory into several (more or less) topical sub-directories to declutter the main test CMakeLists.txt a bit

    • +
    • Move commonly used functionality into cmake/podioTests.cmake (e.g. setting up a test environment)

    • +
    • Move python unittests config to the python directory

    • +
    +
  • +
  • 2023-06-15 tmadlener (PR#427)

    +
      +
    • Delay library loading as long as possible, mainly for quicker responses for --help

    • +
    • Add a --version flag for dumping the podio version

    • +
    • Display collections and parameters in alphabetical order and automatically adjust column widths to fit contents (using the tabulate package).

    • +
    +
  • +
  • 2023-06-09 Thomas Madlener (PR#402)

    +
      +
    • Add public static constexpr char* type names to the collections and make the getXXXName() methods return string_views to these strings. This is a breaking change to the interface of the collections if you explicitly rely on them being std::string

      +
        +
      • typeName: the full type name of the collection (returned also by getTypeName)

      • +
      • valueTypeName: the (immutable) type name of the objects of the collection (returned by getValueTypeName)

      • +
      • dataTypeName: the type name of the data PODs (returned by getDataTypeName)

      • +
      +
    • +
    • Make unittest environment properly use PODIO_SIOBLOCK_PATH

    • +
    • USE_EXTERNAL_CATCH2 now can also be set to AUTO to look for a suitable version of Catch2 before falling back and fetching and building it’s own version instead of a hard fail.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#426)

    +
      +
    • Check if PODIO_SIOBLOCK_PATH exists in the environment and use that to look for SIO Blocks libraries before falling back to LD_LIBRARY_PATH. This makes it possible to make slightly more robust environments if several (incompatible) podio installations are visible on LD_LIBRARY_PATH

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#425)

    +
      +
    • Add a SKIP_CATCH_DISCOVERY cmake option to skip the unittest discovery of Catch2 to avoid running the catch discovery in an unsuitable environment.

    • +
    • Make environment for unittests more specific to avoid catching too much of the underlying environment.

    • +
    +
  • +
  • 2023-06-08 tmadlener (PR#412)

    +
      +
    • Using string hashes as CollectionID based on MurmurHash

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#423)

    +
      +
    • Add some more structure to make it easier to add more legacy tests.

      +
        +
      • Use this to download more legacy files automatically

      • +
      • Restructure CMake config to make this possible

      • +
      +
    • +
    • Add tests for Frame based root I/O reading files that have been produced with prior versions of podio

    • +
    • Add more tests for EventStore based root I/O reading files that have been produced with prior versions of podio

    • +
    +
  • +
  • 2023-06-05 tmadlener (PR#421)

    +
      +
    • Make the collections appear in alphabetical order in root files, using a case insensitive sorting of the collections that are written.

    • +
    +
  • +
  • 2023-06-05 Thomas Madlener (PR#405)

    +
      +
    • Make the branch names for relations and vector members more legible and valid c++ variable names to improve interoperability with RDataFrame. Fixes #169

      +
        +
      • The branch names will have the following structure: _<collection-name>_<relation-name>, resp. _<collection-name>_<vectormember-name>, where relation-name, resp.vectormember-name are taken from the YAML definitions.

      • +
      • Subset collections will have a single branch with <collection-name>_objIdx. This makes it easier to disambiguate them from normal collections.

      • +
      +
    • +
    • This is a breaking change if you use the root files directly! If you use the podio Readers/Writers everything should be transparent

    • +
    +
  • +
  • 2023-05-30 tmadlener (PR#422)

    +
      +
    • Fix small bug in Frame python bindings where set but empty parameters could crash podio-dump when trying to access a non-existent element

    • +
    +
  • +
+
+
+

v00-16-05

+
    +
  • 2023-05-23 tmadlener (PR#420)

    +
      +
    • Fix a version check inside the ROOTReader to avoid segmentation violations

    • +
    +
  • +
+
+
+

v00-16-04

+
    +
  • 2023-05-23 tmadlener (PR#417)

    +
      +
    • Fix an issue with reading multiple files via the ROOTFrameReader (#411)

      +
        +
      • Add documentation for API of opening file(s)

      • +
      • Add tests for reading multiple files

      • +
      +
    • +
    +
  • +
  • 2023-05-22 tmadlener (PR#418)

    +
      +
    • Bring back the public templated getMap functionality for podio::GenericParameters as they are already used in DD4hep (see AIDASoft/DD4hep#1112).

      +
        +
      • Mark the existing getXYZMap as deprecated but keep them for a brief transition period.

      • +
      • These have been removed in #415.

      • +
      +
    • +
    +
  • +
  • 2023-05-19 jmcarcell (PR#416)

    +
      +
    • Remove selection rules for classes that don’t exist anymore

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#415)

    +
      +
    • Remove the deprecated getters and setters from the generic parameters

    • +
    +
  • +
  • 2023-05-15 jmcarcell (PR#410)

    +
      +
    • Remove the square that is run when cmake runs

    • +
    +
  • +
  • 2023-05-09 tmadlener (PR#414)

    +
      +
    • Fix off-by-one error in UserDataCollection::print that caused the first element to be printed twice.

    • +
    +
  • +
  • 2023-05-09 Thomas Madlener (PR#394)

    +
      +
    • Introduce a CollectionBufferFactory that can create the necessary buffers from a collection type, a schema version and a subset collection flag.

      +
        +
      • Use this factory throughout all existing Readers

      • +
      • Remove createBuffers and createSchemaEvolvableBuffers from podio::CollectionBase interface

      • +
      +
    • +
    • Make the minimum allowed schema_version 1 in the yaml definition files. Default to 1 if no schema_version is provided

    • +
    • Add a schemaVersion to the DatamodelDefinition.h header that is generated and that can be accessed via {{ package_name }}::meta::schemaVersion. Use this to propagate schema information to the necessary places.

    • +
    • Make SIOBlocks write the current schema version, such that on reading they can generate the appropriate buffers for the version on file.

    • +
    +
  • +
  • 2023-04-22 Christopher Dilks (PR#408)

    +
      +
    • fix type inconsistency between Collection::size() and index for const object accessors

    • +
    +
  • +
  • 2023-04-21 jmcarcell (PR#387)

    +
      +
    • Make sure that the dump model round trip tests work without ENABLE_SIO

    • +
    • Actually test the extension model dumping

    • +
    +
  • +
  • 2023-04-12 Thomas Madlener (PR#400)

    +
      +
    • Fix a bug in SIOFrameData::getAvailableCollections to also work with Frames where some of the collections have not been written and that could lead to a seg fault.

    • +
    • Add a test for this in c++ (previously only covered in python unittests of Frame).

    • +
    +
  • +
  • 2023-04-05 Thomas Madlener (PR#399)

    +
      +
    • Add PODIO_ENABLE_SIO=1 to the public target_compile_definitions for podioSioIO so that all dependent targets automatically get it as well. This should make it easier to use SIO dependent features in dependencies.

    • +
    • Consistently use a scope for target_link_libraries in tests.

    • +
    +
  • +
  • 2023-04-03 Paul Gessinger-Befurt (PR#398)

    +
      +
    • Do not reject building if ROOT was built with C++20 (instead of C++17).

    • +
    +
  • +
  • 2023-04-03 Thomas Madlener (PR#397)

    +
      +
    • Remove the GENERATED property from generated files in CMake to avoid inconsistent removal of headers and source files with the clean target. Fixes #396

    • +
    +
  • +
  • 2023-03-15 Benedikt Hegner (PR#341)

    +
      +
    • Adding infrastructure for schema evolution

    • +
    • Added explicit version tracking to the metadata

    • +
    • Data model comparison tool w/ simple heuristics to identify potential omissions / mistakes (e.g. checking for the limits of the ROOT backend)

    • +
    • Changed handling of backwards compatibility for the collection info metadata

    • +
    +
  • +
+
+
+

v00-16-03

+
    +
  • 2023-03-14 jmcarcell (PR#391)

    +
      +
    • Catch an exception when a clang-format flag is not found

    • +
    +
  • +
  • 2023-03-14 jmcarcell (PR#390)

    +
      +
    • Modify the initial clang-format check to try to run with all the arguments that will be used later

    • +
    +
  • +
  • 2023-03-13 jmcarcell (PR#389)

    +
      +
    • Add .cache to the gitignore

    • +
    +
  • +
  • 2023-03-07 Thomas Madlener (PR#358)

    +
      +
    • Embed the EDM definition in JSON format into the shared core datamodel libraries

      +
        +
      • Generate an additional DatamodelDefinition.h header file containing the string literal json encoded definition

      • +
      • Statically register this to the newly introduced DatamodelRegistry and make collections aware of which datamodel they belong to

      • +
      +
    • +
    • Collect all EDM definitions from all collections that are written with a writer and write all these definitions to the resulting file

      +
        +
      • Currently only done for the FrameWriters

      • +
      +
    • +
    • Give podio-dump the necessary functionality to retrieve the stored models and dump them in YAML format again

      +
        +
      • Add roundtrip tests that compare the generated code from the original model and the one that has been dumped from a data file to ensure that all components work as intended.

      • +
      +
    • +
    • See the advanced topics documentation for more details.

    • +
    +
  • +
  • 2023-03-06 Dmitry Kalinkin (PR#384)

    +
      +
    • Added an operator for conversion to std::string for podio::version::Version

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#378)

    +
      +
    • Introduce deprecation warnings for the EventStore based I/O model as it will be removed in favor of the Frame based one

    • +
    +
  • +
  • 2023-03-01 Thomas Madlener (PR#372)

    +
      +
    • Make double a supported type of GenericParameters. A similar thing has been added to LCIO in iLCSoft/LCIO#143 to support storing event weights that need double precision.

    • +
    • Add more unittests to the GenericParameters covering also the available constructors.

    • +
    +
  • +
  • 2023-02-27 Thomas Madlener (PR#380)

    +
      +
    • Add getParameters method to the Frame and deprecate getGenericParametersForWrite which offered the exact same functionality.

      +
        +
      • Make it easily possible to get all parameters that are currently stored in a Frame via an “official” channel

      • +
      • Replace all internal usages.

      • +
      +
    • +
    • Add a getParameterKeys templated method to get the keys for different parameter types that are currently stored in the Frame.

    • +
    +
  • +
  • 2023-02-22 jmcarcell (PR#377)

    +
      +
    • Add a visualization tool that converts a YAML description to a graph

    • +
    +
  • +
  • 2023-02-21 jmcarcell (PR#376)

    +
      +
    • Fix tests without SIO

    • +
    +
  • +
  • 2023-02-14 Thomas Madlener (PR#375)

    +
      +
    • Fix the PODIO_VERSION preprocessor macro to be actually usable in a preprocessor context. Fixes #374

    • +
    • Make podio_VERSION preprocessor constant something that can be used in a preprocessor context (now the same as PODIO_BUILD_VERSION

    • +
    • Add test that ensures that the macro and the constant are actually used in a preprocessor context.

    • +
    +
  • +
  • 2023-02-13 Juraj Smiesko (PR#373)

    +
      +
    • Adding ID to the short podio-dump output

    • +
    +
  • +
  • 2023-02-06 Nathan Brei (PR#369)

    +
      +
    • Mark non-templated definitions of Frame::Frame, Frame::get, Frame::put and Frame::putParameters as inline to fix linker errors.

    • +
    +
  • +
  • 2023-02-02 jmcarcell (PR#364)

    +
      +
    • Make workflows not trigger twice on pushes to PRs

    • +
    +
  • +
  • 2023-01-26 jmcarcell (PR#368)

    +
      +
    • CMAKE: Add option PODIO_RELAX_PYVER to allow relaxing the required match of python version with the one that ROOT has been built with to only check major and minor versions

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#363)

    +
      +
    • Move sio utility functionality defined in SIOFrameWriter.cc to private sioUtils.h header and use it also in the legacy SIOWriter.

    • +
    • Fix cmake configure dependencies (missed in #343) for datamodel generation macro.

    • +
    • Use defaultdict instead of hand rolling one in class generator.

    • +
    +
  • +
  • 2023-01-16 Thomas Madlener (PR#361)

    +
      +
    • Add basic I/O tests for datatypes defined in the extension datamodel. Fixes #319

    • +
    +
  • +
  • 2023-01-11 jmcarcell (PR#355)

    +
      +
    • Change the readers so that when the file is missing they won’t crash

    • +
    +
  • +
  • 2023-01-10 jmcarcell (PR#365)

    +
      +
    • Fix the pre-commit workflow

    • +
    +
  • +
  • 2022-12-23 jmcarcell (PR#362)

    +
      +
    • Rename the variable match to avoid collisions with a python keyword from Python 3.10 onwards

    • +
    +
  • +
+
+
+

v00-16-02

+
    +
  • 2022-12-19 Thomas Madlener (PR#360)

    +
      +
    • Make the log output of loading the SIOBlock libraries more informative by also providing the absolute paths to the loaded (and rejected) shared libraries.

    • +
    +
  • +
  • 2022-12-16 Thomas Madlener (PR#333)

    +
      +
    • Initialize the unique_ptr<mutex> in the constructor initializer list instead of in the member variable declaration. This is more likely a bug in nvcc (or maybe a c++17 feature not yet supported by nvcc). Fixes key4hep/k4Clue#34

    • +
    • Pass --disable-new-dtags to the linker when using PODIO_SET_RPATH, to set RPATH and not RUNPATH in the binaries.

    • +
    • Pin the ubuntu version for runners that build on ubuntu to not accidentally go out of sync with the underlying LCG releases.

    • +
    • Disable the podio tests in the edm4hep workflows (see #359).

    • +
    +
  • +
+
+
+

v00-16-01

+
    +
  • 2022-12-06 jmcarcell (PR#356)

    +
      +
    • Fix path in the README

    • +
    • Use the functionality in argparse to choose between options

    • +
    +
  • +
  • 2022-12-06 Benedikt Hegner (PR#346)

    +
      +
    • Switched tp Apache 2.0 license to facilitate integration in experiment stacks.

    • +
    +
  • +
  • 2022-12-05 Thomas Madlener (PR#357)

    +
      +
    • Put <prefix>/bin onto PATH in order to make podio-dump available from environments created with env.sh

    • +
    +
  • +
  • 2022-12-02 jmcarcell (PR#354)

    +
      +
    • Make env.sh setup script POSIX compliant to run in shells other than bash

      +
        +
      • Change == to =

      • +
      • Change tabs to spaces (two) to avoid mix of spaces and tabs for indenting

      • +
      • Add <prefix>/include to ROOT_INCLUDE_PATH (as it is required since #343)

      • +
      +
    • +
    +
  • +
  • 2022-11-16 Thomas Madlener (PR#351)

    +
      +
    • Fix bug in Frame python bindings where empty collections were considered as non-existing. Replacing the original check relying on some implicit boolean conversions (which also caught empty collections) to an explicit check against nullptr.

    • +
    • Make podio-dump more robust in installations without SIO support, by guarding the corresponding import.

    • +
    +
  • +
  • 2022-11-14 Thomas Madlener (PR#344)

    +
      +
    • Make podio-dump work with new Frame based I/O (fixes #339)

    • +
    • Keep existing functionality intact by using the legacy readers introduced in #345.

    • +
    +
  • +
  • 2022-11-11 Thomas Madlener (PR#345)

    +
      +
    • Add a ROOTLegacyReader and a SIOLegacyReader that read files that have been written prior to #287 into podio::Frames and offers the same interface as the frame readers

      +
        +
      • Also including python bindings for it

      • +
      +
    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#349)

    +
      +
    • Fix bug in setting relations in nested get calls in podio::Frame. Fixes #348

    • +
    • Adapt the read test to actually check this. Previously this went unnoticed, because the necessary relations were already set in a previous call.

    • +
    +
  • +
  • 2022-11-10 Thomas Madlener (PR#343)

    +
      +
    • Add python bindings for Frame based I/O

      +
        +
      • Available from podio.root_io and podio.sio_io, where a Reader and a Writer is implemented for each.

      • +
      • Wrapper around podio::Frame. Requires that the podio/Frame.h header is available somewhere on the ROOT_INCLUDE_PATH.

      • +
      +
    • +
    • Add necessary functionality for python bindings to C++ API

      +
        +
      • untyped Frame::get method for getting collections

      • +
      • New constructor from FrameDataT&&

      • +
      • functionality to inspect file and Frame contents more easily

      • +
      +
    • +
    • Reorganize python code into structure that follows the usual python packaging conventions a bit more closely

      +
        +
      • Introduce the podio module. Make CMake generate the __init__.py with the correct version

      • +
      • Move everything except the generator script into module. Additionally also keep an EventStore wrapper to not break existing code.

      • +
      +
    • +
    • Refactor the CMakeLists.txt that is responsible for building the core and all required I/O libraries

      +
        +
      • Build more dictionaries for more python bindings.

      • +
      +
    • +
    +
  • +
  • 2022-11-02 Thomas Madlener (PR#342)

    +
      +
    • Migrate to actions/checkout@v3 as advised by github

    • +
    • Use the checkout action to clone the dependencies in the edm4hep workflow instead of doing an explicit clone in the body of the action

    • +
    +
  • +
  • 2022-11-02 Dmitry Kalinkin (PR#327)

    +
      +
    • fix typo in documentation

    • +
    +
  • +
  • 2022-10-24 Juraj Smiesko (PR#340)

    +
      +
    • Adding reading of specific entry from frame

    • +
    +
  • +
  • 2022-10-21 Thomas Madlener (PR#335)

    +
      +
    • Update the github-action-cvmfs and run-lcg-view actions to their latest available version to pick up the latest improvements (caching of dependencies, log groups)

    • +
    • Introduce log groups in github actions for easier to interpret outputs

    • +
    • Switch to LCG_102 for lcg based build environments

    • +
    • Add a workflow that builds and tests EDM4hep after building podio

    • +
    +
  • +
+
+
+

v00-16

+
    +
  • 2022-10-04 Thomas Madlener (PR#337)

    +
      +
    • Make the notebook pattern functionality return std::vectors instead of std::array to avoid having to specify a static size. Fixes #332

    • +
    • Backwards incompatible change as the return type as well as the call signature for the notebook pattern change.

    • +
    +
  • +
  • 2022-09-27 Andre Sailer (PR#336)

    +
      +
    • podioConfig.cmake: silence warning about cmake policy CMP00012

    • +
    • CMake: explicitly look for catch2 version 3 and fail at cmake instead of compile step

    • +
    +
  • +
  • 2022-09-27 Thomas Madlener (PR#334)

    +
      +
    • Fix a warning/error message from ROOT from attempts to stream the std::mutex members of GenericParameters by marking them as transient for the dictionary generation.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#323)

    +
      +
    • Add a podio-dump python script (installed to <prefix>/bin that can be used to dump event contents to stdout. By default prints an overview over the collections and their types, but can also be used to dump full events, via the -d or --detailed flag. Use --help to get all available options and their descriptions.

    • +
    • To allow podio-dump to work with all available backends also add support for reading SIO via the PythonEventStore.

      +
        +
      • Split off the necessary c++ functionality into a separate podioPythonStore library (+ necessary ROOT dictionaries).

      • +
      +
    • +
    • Add a print function to the collections for easier dumping from the python side.

    • +
    • Add a print function to the GenericParameters

    • +
    • Make goToEvent is a part of the IReader interface and correctly implemented it for the SIOReader.

    • +
    +
  • +
  • 2022-09-16 Thomas Madlener (PR#287)

    +
      +
    • Introduce the podio::Frame as a generalized, thread-safe (event) data container.

      +
        +
      • This first version offers all necessary functionality and an almost finalized interface, i.e. we plan to keep this as stable as possible, but we might still change things if it turns out that there are better ways to do some things

      • +
      • For details about the basic interface and the underlying design considerations please consult the corresponding documentation

      • +
      +
    • +
    • This will be the only way to work with podio data starting from version 1.0

      +
        +
      • For now the current I/O implementations remain in place unchanged, but they will be deprecated (and removed) in the not too distant future

      • +
      +
    • +
    +
  • +
+
+
+

v00-15

+
    +
  • 2022-08-09 Thomas Madlener (PR#312)

    +
      +
    • Add support for converting objects and collections to JSON using nlohmann/json.

      +
        +
      • To enable JSON support it is necessary to build the datamodel with PODIO_JSON_OUTPUT and to link against the nlohmann/json library.

      • +
      +
    • +
    +
  • +
  • 2022-08-05 Wouter Deconinck (PR#318)

    +
      +
    • CMake: PODIO_ADD_ROOT_IO_DICT: Bugfix for data models in OUTPUT_FOLDER not equal to source dir in root dictionary generation cmake macro.

      +
        +
      • Now SELECTION_XML can be passed either as absolute path or relative to OUTPUT_FOLDER.

      • +
      +
    • +
    +
  • +
  • 2022-08-03 Thomas Madlener (PR#317)

    +
      +
    • Make it possible to pass an upstream datamodel to the class generator such that datatypes and components defined there can be used in an unrelated datamodel. This makes it possible to extend datamodels and to prototype new datatypes with the aim of upstreaming them eventually without having to redefine all the necessary components.

    • +
    • Refactor the internals of the config reader / class generator slightly to make it possible to hold multiple datamodels in memory

    • +
    +
  • +
  • 2022-08-02 Thomas Madlener (PR#316)

    +
      +
    • Remove macOS CI workflows because github hosted runners will deprecate macOS 10.15 (announcement) and later versions of macOS no longer support fuse and as a consequence CVMFS.

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#315)

    +
      +
    • Make the is_trivial_type flag available in the template engine behave as expected (it behaved exactly oppositely to what was documented and what one would intuitively expect). The flag was originally introduced in #288

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#283)

    +
      +
    • Allow users to define default values for member variables, instead of default initializing all of them.

      +
        +
      • The syntax for specifying a default value is - <type> <name>{<init-value>} // <description>.

      • +
      • The passed value is not validated in any way. Apart from a very basic syntax check, there is no validation that the provided default initialization values are actually valid. This means that generated code might not compile.

      • +
      +
    • +
    • Remove some of the python2 compatibility and do some cleanup

    • +
    +
  • +
  • 2022-07-27 Thomas Madlener (PR#276)

    +
      +
    • Remove support for having std::string members in datatypes and components, as they break PODness and it seems that this feature was not in use in any case.

    • +
    • Make ROOTReader slightly more robust against missing datatypes in dictionaries when reading files.

    • +
    +
  • +
  • 2022-06-22 Valentin Volkl (PR#307)

    +
      +
    • hotfix for https://github.com/AIDASoft/podio/issues/290: revert a clang-tidy change to make sure that there are no unknown symbols in podioDict

    • +
    +
  • +
  • 2022-06-21 Thomas Madlener (PR#282)

    +
      +
    • Add a PODIO_USE_CLANG_FORMAT option to the cmake configuration to toggle the autodiscovery of clang-format and a .clang-format configuration file. This option is also available for downstream packages that use podio to generate their EDM.

      +
        +
      • The default is AUTO, where we try to discover a suitable clang-format version as well as a .clang-format file and use it if we find it.

      • +
      • If set to OFF podio will not try to see whether clang-format and a .clang-format file are available and will also not try to format the code accordingly.

      • +
      • If set to ON podio will actually require a suitable clang-format version and the presence of a .clang-format file and will fail at the cmake stage if not present.

      • +
      +
    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#305)

    +
      +
    • Make sure generator warnings are printed

    • +
    • Add a deprecation warning for the upcoming removal of support of std::string in data types. (See also #276)

    • +
    +
  • +
  • 2022-06-16 Thomas Madlener (PR#294)

    +
      +
    • Remove the EventStore, CollectionIDTable and version::Version members from the SIOCollectionIDTableBlock to make it easier to use in the Frame context

    • +
    • Move the podio:version::build_version into its own SIOVersionBlock

    • +
    • This is a breaking change for the SIO backend and it will not be able to read files that have been written prior to this

    • +
    +
  • +
+
+
+

v00-14-02

+
    +
  • 2022-06-15 Thomas Madlener (PR#304)

    +
      +
    • Use the releases v3.0.1 version of Catch2 instead of an unreleased commit

    • +
    +
  • +
  • 2022-06-15 Thomas Madlener (PR#303)

    +
      +
    • Default initialize the array for the vectorized access.

    • +
    +
  • +
  • 2022-06-14 soumil (PR#296)

    +
      +
    • Add instructions on how to run pre-commit locally to the documentation

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#295)

    +
      +
    • Mark CollectionBase::prepareForWrite as const and make sure that the generated implementations are thread safe.

    • +
    +
  • +
  • 2022-06-14 Thomas Madlener (PR#286)

    +
      +
    • Make sure that vector member buffers for writing point to the correct place even if a collection has been moved, by resetting them when the buffers are requested.

    • +
    • Add checks for this to the unittests, as this is sort of an interface for I/O backends.

    • +
    +
  • +
  • 2022-06-13 Kalina Stoimenova (PR#301)

    +
      +
    • Fixed the text in the cmake message for code generation to point to the correct readme file

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#300)

    +
      +
    • Newer versions of pylint have removed a few options and a few checks that aimed at python2-python3 compatibility.

    • +
    +
  • +
  • 2022-06-13 Thomas Madlener (PR#299)

    +
      +
    • Explicitly add constructors to CollectionBase

    • +
    • Make sure to not use an unset LD_LIBRARY_PATH for detecting sio blocks shared libraries.

    • +
    +
  • +
  • 2022-06-02 soumil (PR#293)

    +
      +
    • Removing python2 compatibility imports

    • +
    • Removing ordered loading (obsolete) function

    • +
    +
  • +
  • 2022-06-01 Thomas Madlener (PR#285)

    +
      +
    • Fix potential bug in setting the collection ID for subset collections

    • +
    +
  • +
  • 2022-05-30 soumil (PR#291)

    +
      +
    • Replace the obj_needs_destructor flag in the generator code and templates with the is_trivial_type flag, since that is the more appropriate name. (Fixes #288)

    • +
    +
  • +
  • 2022-05-27 Thomas Madlener (PR#274)

    +
      +
    • Add documentation for the Jinja2 templates and the code generation process in general to make working with these parts of PODIO easier.

    • +
    +
  • +
  • 2022-05-23 Thomas Madlener (PR#262)

    +
      +
    • Make the getters and setters for the GenericParameters templated functions and add a deprecation warning for the untemplated ones.

    • +
    • Define a SupportedGenericDataTypes tuple defining the types (and vectors of those) that can be stored in GenericParameters

    • +
    • Add a podio/utilities/TypeHelpers.h header with some type handling helpers.

    • +
    +
  • +
  • 2022-05-20 Thomas Madlener (PR#277)

    +
      +
    • Avoid fetching the (remote) legacy input file for tests unnecessarily every time cmake is run.

    • +
    +
  • +
  • 2022-05-17 Thomas Madlener (PR#284)

    +
      +
    • Make sure the EventStore doesn’t try to read event meta data multiple times per event

    • +
    • Add a empty method to GenericParameters to check if any parameters are stored.

    • +
    +
  • +
  • 2022-04-04 Thomas Madlener (PR#280)

    +
      +
    • Only use --color option for diff in clang-format wrapper script if it is supported by the underlying diffutils.

    • +
    +
  • +
  • 2022-04-02 Thomas Madlener (PR#254)

    +
      +
    • Add a .clang-format and .clang-tidy config file for consistent formatting and following a few coding guidelines.

    • +
    • Add pre-commit hooks that run clang-tidy and clang-format

    • +
    • Make all currently present files follow the formatting and guidelines of the present configuration.

    • +
    • Make the PODIO_GENERATE_DATAMODEL macro look for a .clang-format file and the presence of clang-formatand automatically format all the generated files if both are there.

    • +
    +
  • +
  • 2022-04-01 Thomas Madlener (PR#279)

    +
      +
    • Fix test environment to work again in newest Key4hep release by unsetting ROOT_INCLUDE_PATH in the test environment to avoid potential clashes with existing other installations in the environment.

    • +
    • Add CI build against the Key4hep nightlies.

    • +
    • Switch to use the Catch2 installation from Key4hep for the workflows.

    • +
    +
  • +
  • 2022-03-31 Thomas Madlener (PR#253)

    +
      +
    • Add a basic setup for pre-commit and replace the python linting github workflow with one that is run via pre-commit.

      +
        +
      • Add additional checks for consistent line-endings and removal of trailing whitespaces.

      • +
      +
    • +
    • Update pylint and flake8 config to no longer check for python2/python3 compatibility but instead follow the same guidelines as e.g. in ILCDirac.

    • +
    • Fix all issues that were uncovered.

    • +
    +
  • +
  • 2022-03-23 Thomas Madlener (PR#270)

    +
      +
    • Remove duplicated printing of component members in the std::ostream& operator<< overloads of the datatypes. Fixes #269

    • +
    • Add an example datatype that broke compilation before these fixes.

    • +
    +
  • +
  • 2022-03-18 Andre Sailer (PR#265)

    +
      +
    • CI: use clang12 and gcc11 for tests based on dev stacks

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14-01

+
    +
  • 2022-03-04 Thomas Madlener (PR#261)

    +
      +
    • Make the datamodel validation accept arrays of fixed width integer types.

    • +
    +
  • +
  • 2022-02-09 Placido Fernandez Declara (PR#259)

    +
      +
    • Filter files with regex based on file name, not complete path

    • +
    +
  • +
  • 2022-02-08 Thomas Madlener (PR#238)

    +
      +
    • Extend the podioVersion.h header that is configured by cmake to hold some version utilities.

      +
        +
      • podio::version::Version class holding three uint16_ts for major, minor and patch version, plus constexpr comparison operators.

      • +
      • static const(expr) podio::version::build_version that holds the current (i.e. last tag) version of podio

      • +
      • Add preprocessor macros with similar functionality

        +
          +
        • PODIO_VERSION takes a major, minor and a patch version number and encodes it into a 64 bit version constant.

        • +
        • PODIO_[MAJOR|MINOR|PATCH]_VERSION macros can extracts these values again from a 64 bit encoded version.

        • +
        • PODIO_BUILD_VERSION holds the 64 bit encoded current (i.e. last tag) version of podio

        • +
        +
      • +
      +
    • +
    • Reorder the read tests slightly and make some sections version dependent

    • +
    • Add legacy file read test from #230

    • +
    +
  • +
  • 2022-01-28 Thomas Madlener (PR#256)

    +
      +
    • Ignore the test introduced in #235 in sanitizer builds as it currently breaks.

    • +
    +
  • +
  • 2022-01-24 Placido Fernandez Declara (PR#235)

    +
      +
    • Fix crashes that happen when reading collections that have related objects in collections that have not been persisted.

    • +
    • Fix similar crashes for subset collections where the original collection has not been persisted.

      +
        +
      • The expected behavior in both cases is that podio does not crash when reading such collections, but only once the user tries to actually access such a missing object. Each object has an isAvailable function to guard against such crashes if need be.

      • +
      +
    • +
    • Add a test that makes sure that the expected behavior is the one that is observed.

    • +
    • Fix a somewhat related bug in setReferences which was mistakenly a no-op for collections of a type without relations. Since this is the mechanism we use for restoring subset collections it obviously has to be present for all types.

    • +
    +
  • +
  • 2022-01-21 Thomas Madlener (PR#252)

    +
      +
    • Make the CollectionData classes use unique_ptr instead of raw pointers, wherever they actually own the pointer.

    • +
    • Implement move constructors and move assignment operators for collections. Thanks to the usage of unique_ptr for ownership management in the CollectionData, these can be defaulted in Collection and CollectionData.

    • +
    • Add a few tests to check that moving collections actually works.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#251)

    +
      +
    • Make sure that collections of types without relations can still be used properly as subset collections. Previous to these changes, the necessary functionality was not generated if a datatype had no relations (i.e. not a single OneToOneRelation or OneToManyRelation).

    • +
    • Add a check of this functionality to the write/read tests.

    • +
    +
  • +
  • 2022-01-20 Thomas Madlener (PR#249)

    +
      +
    • Add a USE_SANITIZER build option to more easily build podio with sanitizers for testing. Curently Address, Memory[WithOrigin], Undefined and Thread are available as options. Given the limitations of the sanitizers these are more or less mutually exlusive.

    • +
    • Label all the Catch2 test cases which makes it easier to run them selectively.

    • +
    • For builds with sanitizers enabled, by default ignore tests with known failures, but add a FORCE_RUN_ALL_TESTS cmake option that overrides this for local development.

    • +
    • Run CI workflows with a selection of sanitizers enabled (on a limited list of tests).

    • +
    +
  • +
  • 2022-01-20 hegner (PR#209)

    +
      +
    • Remove mention of Python 2 compatibility

    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#245)

    +
      +
    • Make it possible to call prepareForWrite multiple times on collections by rendering all but the first call no-ops. Fixes #241

      +
        +
      • Collections are marked as prepared, either if they are read from file or once prepareForWrite has been called on them.

      • +
      +
    • +
    +
  • +
  • 2021-12-03 Thomas Madlener (PR#205)

    +
      +
    • Make the default classes immutable and mark mutable classes explictly via their class name (e.g. Hit and MutableHit). See a brief discussion in #204 for more details on the reasons for this breaking change.

    • +
    • After these changes collections return mutable objects via their create functionality, and will only give access to the default (immutable) objects when they are const (e.g. when they are read from file).

    • +
    • In general these changes should make it easier for users to write interface that behave as expected, and also make it very obvious where objects are actually mutated already from looking at an interface definition.

    • +
    +
  • +
  • 2021-10-22 Thomas Madlener (PR#239)

    +
      +
    • Fix a typo in the cmake config for finding the correct python version when cmake is used in downstream packages.

    • +
    +
  • +
  • 2021-10-21 Thomas Madlener (PR#237)

    +
      +
    • Mistakenly dropped colon in #236

    • +
    +
  • +
  • 2021-10-14 Thomas Madlener (PR#236)

    +
      +
    • Fix problem in python tests that appears in spack builds

    • +
    +
  • +
+
+
+

v00-14

+
    +
  • 2021-10-13 Thomas Madlener (PR#234)

    +
      +
    • Make sure that #include <cstdint> is present when using fixed with integers in datatypes

    • +
    +
  • +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-14-00

+
    +
  • 2021-10-12 Thomas Madlener (PR#232)

    +
      +
    • Make it possible to read “old” podio data files that have been written with podio < 0.13.1 (i.e. before #197) was merged.

      +
        +
      • For ROOT: Reconstruct the "CollectionInfoType" branch that as introduced there via other means and simply assume that all collections are proper collections (since subset collections didn’t exist prior).

      • +
      • For SIO: Bump the version of the SIOCollectionIDTableBlock to 0.2 and only read the subset collection bits when they are available.

      • +
      +
    • +
    +
  • +
  • 2021-10-12 Valentin Volkl (PR#231)

    +
      +
    • Add regression test for mutable clones of const objects

    • +
    +
  • +
  • 2021-10-11 Thomas Madlener (PR#223)

    +
      +
    • Add brief documentation for the newly added UserDataCollection added in #213

    • +
    +
  • +
+
+
+

v00-13-02

+
    +
  • 2021-10-08 Thomas Madlener (PR#224)

    +
      +
    • Make the clone function always return a mutable object, also when called on an immutable object (Fixes #219)

    • +
    +
  • +
  • 2021-09-22 Thomas Madlener (PR#214)

    +
      +
    • Make the CMake datamodel generation macro use the python interpreter that is also found by CMake to avoid accidentally picking up an unsuitable system provided version that might be on PATH.

    • +
    +
  • +
  • 2021-09-21 Frank Gaede (PR#213)

    +
      +
    • add possibility to store additional user data as collections of fundamental types in PODIO files

      +
        +
      • uses std::vector<basic_type>

      • +
      • stored in simple branch in root (and simple block in SIO)

      • +
      • all fundamental types supported in PODIO (except bool) can be written

      • +
      +
    • +
    • example code:

    • +
    +
      auto& usrInts = store.create<podio::UserDataCollection<uint64_t> >("userInts");
    +  auto& usrDoubles = store.create<podio::UserDataCollection<double> >("userDoubles");
    +  // ...
    +
    +  // add some unsigned ints
    +  usrInts.resize( i + 1 ) ;
    +  int myInt = 0 ;
    +  for( auto& iu : usrInts ){
    +    iu = myInt++  ;
    +  }
    +  // and some user double values
    +  unsigned nd = 100 ;
    +  usrDoubles.resize( nd ) ;
    +  for(unsigned id=0 ; id<nd ; ++id){
    +    usrDoubles[id] = 42. ;
    +  }
    +
    +
    +
      +
    • should replace https://github.com/key4hep/EDM4hep/pull/114 in a more efficient way

    • +
    +
  • +
  • 2021-09-21 tmadlener (PR#143)

    +
      +
    • Generate an additional podio_generated_files.cmake file containing all generated source files as a header and sources list and make the code generation macro include this file to get the headers and source files.

      +
        +
      • Now only the files generated for the current settings are picked up by cmake

      • +
      • Makes it possible to have additional files in the folders where the generated files are placed, since these are no longer globbed over.

      • +
      +
    • +
    +
  • +
  • 2021-09-10 Thomas Madlener (PR#217)

    +
      +
    • Make the Obj destructors = default where possible, i.e. if a datatype has no relations to handle

    • +
    • Make the assignment operators of the user facing classes use the “copy-and-swap” idiom

    • +
    • Fix the problem where OneToOneRelations needed to be from the same namespace as the datatype they are used in (#216)

    • +
    +
  • +
  • 2021-09-06 Thomas Madlener (PR#211)

    +
      +
    • Fix test dependencies to allow running tests in parallel via ctest -jN

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#210)

    +
      +
    • Fix a few small issues in the datamodel yaml file validation. These do not change the behavior of code generation, they just try to catch problems earlier

      +
        +
      • Make sure that OneToManyRelations and OneToOneRelations have the same restrictions

      • +
      • Only allow components, builtins and arrays of those as Members

      • +
      +
    • +
    • Make the API of validate slightly more generic by taking a dict instead of multiple arguments.

    • +
    • Make the generator exit with an easier to read error message in case of a validation problem instead of printing a full backtrace.

    • +
    +
  • +
  • 2021-08-18 Thomas Madlener (PR#197)

    +
      +
    • Introduce a podio::CollectionBuffers class that contains everything that is necessary for I/O of a given collection. This is a breaking change in the collection interface

    • +
    • Introduce and generate a CollectionData class for each datatype that only manages the storage of a given collection.

      +
        +
      • Exposes only the Obj entries of each collection as well as the necessary functionality to add a new object (and its relations) to the collection.

      • +
      +
    • +
    • Implement “subset” collections that behave exactly the same as normal collections apart from an additional function call when creating them.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#206)

    +
      +
    • Switch to Catch2 v3 test library and by default assume that it is available. Use the ‘USE_EXTERNAL_CATCH2` cmake option to control whether podio should use an external installation or if it should fetch and build it internally instead.

    • +
    • Remove catch.hpp header that was previously shipped, since it is no longer needed.

    • +
    +
  • +
  • 2021-08-13 Thomas Madlener (PR#201)

    +
      +
    • Make assignment operator increase the reference count to avoid possible heap-after-free usage. (Fixes #200)

    • +
    +
  • +
+
+
+

v00-13-01

+
    +
  • 2021-06-03 Thomas Madlener (PR#195)

    +
      +
    • Fix possible circular and self-includes in generated header files.

    • +
    +
  • +
  • 2021-06-03 Thomas Madlener (PR#194)

    +
      +
    • Make it possible to do indexed access on a RelationRange, making the interface more akin to a const std::vector

    • +
    +
  • +
  • 2021-05-31 tmadlener (PR#193)

    +
      +
    • Make collection element access const correct.

    • +
    +
  • +
  • 2021-05-31 Thomas Madlener (PR#192)

    +
      +
    • Fix const-correctness problems of meta data access via EventStore.

    • +
    +
  • +
  • 2021-05-28 Benedikt Hegner (PR#191)

    +
      +
    • Fix bug in validity check so that transient and persistent collections are treated the same

    • +
    +
  • +
  • 2021-05-28 Thomas Madlener (PR#186)

    +
      +
    • Add support for fixed width integer type members in components and datatypes.

      +
        +
      • Now possible to use int16_t, int32_t, int64_t, uint16_t, uint32_t and uint64_t as members. Other fixed width integer types that are potentially defined in <cstdint> are not considered valid as the intended use case is really only fixed width integers for now. These are rejected at the datamodel validation step.

      • +
      • Fixed width integers are considered to be “builtin” types for podio.

      • +
      +
    • +
    +
  • +
  • 2021-05-04 Valentin Volkl (PR#189)

    +
      +
    • [cmake] fix test dependencies: read_and_write.cpp reads the file example.root that is created by the write test. If the dependency is not declared, running the tests concurrently can lead to spurious test failures.

    • +
    +
  • +
  • 2021-04-28 tmadlener (PR#180)

    +
      +
    • Improve the branch look-up logic in ROOTReader and ROOTWriter. Triggered by a performance degradation in v6.22/06, where this logic was changed inside ROOT and our use case was affected badly. All ROOT versions profit from these changes as it is in general more efficient than the previous implementation.

    • +
    +
  • +
  • 2021-03-30 tmadlener (PR#182)

    +
      +
    • Use run-lcg-view github action and switch to more recent LCG releases to run CI.

    • +
    • Update README to include status of CI

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#185)

    +
      +
    • extended .gitignore

    • +
    +
  • +
  • 2021-03-23 Valentin Volkl (PR#184)

    +
      +
    • Clean up AsciiWriter comments

    • +
    +
  • +
  • 2021-03-23 tmadlener (PR#183)

    +
      +
    • Use SIO targets in cmake, which are exported starting with v00-01 (iLCSoft/SIO#15)

    • +
    +
  • +
  • 2021-02-23 Marko Petric (PR#181)

    +
      +
    • Add coverity nightly scan based on run-lcg-view action

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#175)

    +
      +
    • Fully qualify return types for OneToOneRelation getters in generated .cc file for objects and Const objects. This fixes a bug described in https://github.com/AIDASoft/podio/issues/168#issuecomment-770751871 and now allows to mix different namespaces in the generated code. This allows to more easily extend already existing datamodels by compiling and linking against them.

    • +
    +
  • +
  • 2021-02-23 Dmitry Romanov (PR#173)

    +
      +
    • Added IO Handler argument to schema generation example in README

    • +
    +
  • +
  • 2021-02-23 tmadlener (PR#171)

    +
      +
    • Fix compiler warnings, that were uncovered by #153 and described in #170. Fix them in the core classes and also in the generated ones.

    • +
    • Enforce no new warnings with Werror in the CI builds.

    • +
    +
  • +
  • 2021-02-15 Joseph C Wang (PR#156)

    +
      +
    • Readers/writers are now noncopyable

    • +
    +
  • +
  • 2021-02-02 Joseph C Wang (PR#154)

    +
      +
    • Disable operator = for collections so that it maintains one copy of collections, fixes #111

    • +
    +
  • +
  • 2021-01-26 tmadlener (PR#172)

    +
      +
    • Fix deprecated brew install commands in mac workflow

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#165)

    +
      +
    • Add a convenience RelationRange::emtpy function for easily checking whether a range is empty.

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#162)

    +
      +
    • Fix cmake problem #161 on Ubuntu

    • +
    +
  • +
  • 2020-12-18 tmadlener (PR#155)

    +
      +
    • Add some benchmarking tools, including TimedReader and TimedWriter decorators that allow to wrap (interface conforming) readers and writers and record the times different operations take. The times are recorded on two levels: setup times, like constructing a reader or “one-time” calls and per event times, for things that happen each event (e.g. writeEvent or readCollection). Additionally the BenchmarkRecorder in principle also allows to track additional things outside of these decorators.

    • +
    +
  • +
+
+
+

v00-13

+
    +
  • 2020-12-03 Marko Petric (PR#153)

    +
      +
    • Set rpath for macOS and externalize compiler and linker flags

    • +
    • Search for the same version of python as was used for building ROOT

    • +
    +
  • +
  • 2020-12-03 Joseph C Wang (PR#152)

    +
      +
    • Make EventStore non-copyable

    • +
    +
  • +
  • 2020-12-03 tmadlener (PR#144)

    +
      +
    • Decouple the writers and the EventStore to allow to write collections that have previously been read from a file.

    • +
    +
  • +
  • 2020-11-24 Valentin Volkl (PR#149)

    +
      +
    • [cmake] add find_package_handle_standard_args() to podio config

    • +
    +
  • +
  • 2020-11-18 Frank Gaede (PR#147)

    +
      +
    • fix for MacOs when using SIO I/O with podio +- need to link edm-core library to edm-sioBlocks library

    • +
    +
  • +
  • 2020-11-10 Thomas Madlener (PR#130)

    +
      +
    • Add SIO as a second I/O backend (as alternative to ROOT) that can be enabled with ENABLE_SIO. If enabled, a separate podioSioIO library is built that allows reading and writing sio files. For serializing the different datatypes, additional code is generated to build an SioBlocks library that is loaded at runtime (if found somewhere on LD_LIBRARY_PATH). To facilitate the whole process at the cmake level, new cmake functions are provided to generate the core datamodel library PODIO_ADD_DATAMODEL_CORE_LIBRARY, to (conditionally) define the ROOT dictionary target PODIO_ADD_ROOT_IO_DICT and to (conditionally) define the Sio Blocks library target PODIO_ADD_SIO_IO_BLOCKS. The I/O backends that are supported by podio are exported via the PODIO_IO_HANDLERS list variable.

    • +
    • podio_generate_datamodel.py now additionally takes the I/O handlers that should be generated as arguments. This is also reflected in an additional argument to PODIO_GENERATE_DATAMODEL. To have backwards compatibility, this additional argument defaults to ROOT in both cases and downstream packages should work as usual without changes.

    • +
    +
  • +
  • 2020-10-06 tmadlener (PR#133)

    +
      +
    • Make ROOTReader handle file switches properly for meta data reading.

    • +
    +
  • +
  • 2020-09-29 tmadlener (PR#141)

    +
      +
    • Update CI actions to use LCG 96, 97, 98 for mac, centos7 and ubuntu1804

    • +
    • Make python bindings work with root 6.22 (and onwards)

    • +
    • Make sure that root has been built with c++17 at the cmake stage

    • +
    • Require at least CMake 3.12

    • +
    +
  • +
  • 2020-09-18 tmadlener (PR#134)

    +
      +
    • Make the EventStore actually take ownership of the metadata passed to it by the readers. (see #139)

    • +
    • Make the collections properly clean up data of VectorMembers (see #139)

    • +
    • Fix small memory leak in the EventStore for the CollectionIDTable.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#128)

    +
      +
    • Fix a possible nullptr access in the Writers and make registerForWrite return a boolean to make it easier to check from the calling site.

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#127)

    +
      +
    • cleanup of GenericParameters for meta data +- remove mutable from internal maps

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#126)

    +
      +
    • No longer install python unittest files

    • +
    +
  • +
  • 2020-09-04 tmadlener (PR#125)

    +
      +
    • improve CollectionIDTable +- previously used a std::recursive_mutex which is unnecessary in this case +- made whatever can be made const const and now use std::distance to calculate the index.

    • +
    +
  • +
  • 2020-08-28 tmadlener (PR#129)

    +
      +
    • Reduce memory footprint by clearing intermediately used I/O buffers.

    • +
    +
  • +
+
+
+

v00-12

+
    +
  • 2020-08-11 Frank Gaede (PR#124)

    +
      +
    • minor bug fix for macos: +- add <sstream> to write.cpp +- fixes #123

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#122)

    +
      +
    • Update README to reflect the new requirements (i.e. jinja2)

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#121)

    +
      +
    • Update Ubuntu CI script to install the python requirements via pip.

    • +
    +
  • +
  • 2020-08-11 tmadlener (PR#120)

    +
      +
    • Use jinja2 template engine to generate c++ code. This makes it possible to more cleanly separate the generation of the c++ code and all the necessary pre-processing. Now only the pre-processing is done in python, while the complete generation is done using jinja2. This should make it much easier to make changes to the generated c++ code.

    • +
    +
  • +
  • 2020-08-05 tmadlener (PR#117)

    +
      +
    • Refactoring of the podio class generator to improve its readability. This refactoring is mainly focusing on reducing the size of some methods to make them easier to grasp as well as trying to more cleanly separate the validation of the inputs and the c++ code generation. The validation is stricter than the current version and will potentially break things. Specifically, the handling of ExtraCode and ConstExtraCode is now implemented according to the documentation. In the previous version this has somewhat diverged from there. The yaml declaration of components has been made equivalent to the ones of the datatypes but “old-style” definitions are still handled properly. In the latter case a deprecation warning is emitted. The generated c++ code is functionally equivalent, but not equal character by character. The differences are mainly whitespace, but at some places also some of the generated code has been updated to more recent c++ capabilities. Additionally, some tests for the validation are added. They are not really exhaustive and should be considered to serve mainly documenting purposes for the moment.

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#107)

    +
      +
    • Introduce range wrapper for OneToManyRelations and VectorMembers to allow range-based for loops

    • +
    +
  • +
  • 2020-08-03 tmadlener (PR#106)

    +
      +
    • Fix the possibility of running into infinite loops in the ostream operator with cyclical references

    • +
    +
  • +
  • 2020-08-03 Frank Gaede (PR#102)

    +
      +
    • add test example read_and_write.cpp

      +
        +
      • simple use case for reading in an event an writing (parts of it) to another file

      • +
      • currently fails with segmentation fault (to be fixed)

      • +
      +
    • +
    +
  • +
  • 2020-08-03 Valentin Volkl (PR#98)

    +
      +
    • add ubuntu ci build

    • +
    +
  • +
+
+
+

v00-11

+
    +
  • 2020-07-21 tmadlener (PR#101)

    +
      +
    • Fix bug where ConstObject with empty OneToManyRelations give an invalid iterator range, #100

    • +
    +
  • +
  • 2020-06-23 Andre Sailer (PR#99)

    +
      +
    • Point to libpodioDict.so instead of libpodio.so in rootmap file

    • +
    +
  • +
  • 2020-06-03 Frank Gaede (PR#92)

    +
      +
    • implement reading/writing of meta data for runs, events and collections

      +
        +
      • based on GenericParameters that hold named parameters of type int, float, string or vectors if these (copied from lcio::LCParameters)

      • +
      • meta data for the three types is always written

      • +
      • it is read only on request

      • +
      +
    • +
    • example for writing:

    • +
    +
       auto& evtMD = store.getEventMetaData() ;
    +    evtMD.setValue( "UserEventWeight" , (float) 100.*i ) ;
    +
    +
    +
      +
    • example for reading:

    • +
    +
      auto& evtMD = store.getEventMetaData() ;
    +  float evtWeight = evtMD.getFloatVal( "UserEventWeight" ) ;
    +
    +
    +
      +
    • addresses #49

    • +
    +
  • +
  • 2020-05-26 Andre Sailer (PR#91)

    +
      +
    • Ensure podioRootIO is linked against podioDict even when linker uses as-needed by default, fixes #90

    • +
    +
  • +
  • 2020-05-26 Thomas Madlener (PR#89)

    +
      +
    • Updated README and env.sh to reflect changes in install process

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#88)

    +
      +
    • change add relation naming addXxxx -> addToXxxxs

    • +
    +
  • +
  • 2020-05-12 Valentin Volkl (PR#87)

    +
      +
    • update minimum required CMake version to 3.8

    • +
    • remove obsolete Jenkinsfile

    • +
    • make CPack config optional: cmake variable ENABLE_CPACK defaults to OFF

    • +
    • update Readme with Spack instructions

    • +
    +
  • +
  • 2020-04-14 Frank Gaede (PR#83)

    +
      +
    • allow automatic change of version in CMakeLists.txt

      +
        +
      • fixes #82

      • +
      +
    • +
    +
  • +
+
+
+

v00-10

+
    +
  • 2020-04-03 Frank Gaede (PR#81)

    +
      +
    • make compatible with macos and clang

      +
        +
      • use -Wl,-undefined,dynamic_lookup w/ AppleClang

        +
          +
        • make the same, default behavior on linux explicit w/ -Wl,--allow-shlib-undefined

        • +
        +
      • +
      • add ROOT::Core to TestDataModel library

      • +
      +
    • +
    +
  • +
  • 2020-04-03 Marko Petric (PR#80)

    +
      +
    • add a macOS test to GitHub actions

    • +
    +
  • +
  • 2020-04-03 Valentin Volkl (PR#75)

    +
      +
    • Fixes in python code for 2-3 compatibility

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#74)

    +
      +
    • Fix exception when podio_class_generator is called with -q/–quiet

    • +
    • Printout about includes only in verbose mode

    • +
    • Do not print warnings in quiet mode

    • +
    • Print each warning only once

    • +
    +
  • +
  • 2020-03-23 Andre Sailer (PR#73)

    +
      +
    • Added PODIO_GENERATE_DATAMODEL Cmake macro to call the class generator at the right time. see podioMacros for the signature

    • +
    +
  • +
  • 2020-03-11 Marko Petric (PR#72)

    +
      +
    • Update CI to use GitHub actions

    • +
    • Add test against a Python 3 LCG view

    • +
    • Remove travis

    • +
    • Add tests for Python 3 compatibility and flake8

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#70)

    +
      +
    • ClassGenerator: add option “includeSubfolder”, to always use `#include “<packagename>/<object>.h” etc. if set to “True”

    • +
    • Added sorting and “uniquing” of include lists. Some duplicates still occur because two different lists are used on occasion

    • +
    • Added $PACKAGE_NAME_ to include guards

    • +
    +
  • +
  • 2020-03-11 Andre Sailer (PR#69)

    +
      +
    • Move all Root dependencies (RootReader, RootWriter) of the podio Library into podioRootIO, rename podioDict to podioDict

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#68)

    +
      +
    • Add podioMacros.cmake to contain PODIO_GENERATE_DICTIONARY

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#67)

    +
      +
    • Change Yaml loader to preserve order of members as given in the yaml

    • +
    +
  • +
  • 2020-02-17 Andre Sailer (PR#65)

    +
      +
    • podio_class_generator: only write files if their content changed

    • +
    +
  • +
  • 2019-10-15 Valentin Volkl (PR#64)

    +
      +
    • Add BUILD_TESTS CMake option for building tests

    • +
    +
  • +
  • 2019-10-15 Pere Mato (PR#63)

    +
      +
    • Fix to avoid deprecated STL classes in C++17

    • +
    +
  • +
+
+
+

v00-09-02

+
    +
  • 2019-09-27 Frank Gaede (PR#60)

    +
      +
    • fixed the code generation for members with multi word types (long long, unsigned long,…) +- add example to ExampleHit: +- unsigned long long cellID // cellID

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59)

    +
      +
    • move templates inside the python directory when installing +- fixes: #58

    • +
    +
  • +
  • 2019-09-27 Ben Morgan (PR#59) +/

  • +
  • 2019-09-27 Frank Gaede (PR#57)

    +
      +
    • allow for numbers in namespace and class names +- generate type name string for CollectionBase::getValueTypeName()
      +- fixes #56

    • +
    +
  • +
  • 2019-09-26 Frank Gaede (PR#55)

    +
      +
    • cache collection pointers for fast access in EventStore::get()

      +
        +
      • added EventStore::getFast(int id)

      • +
      • considerably speeds up XXCollection::setReferences() +when reading back collections

      • +
      +
    • +
    +
  • +
  • 2019-09-26 Ben Morgan (PR#54)

    +
      +
    • improve the CMake

      +
        +
      1. Consistent use of CMake usage requirements to propagate include and link dependencies

      2. +
      3. Full use of the CMakePackageConfigHelpers module to generate the podioConfig.cmake file and associated podioTargets.cmake

      4. +
      5. Automatically refind the ROOT dependency

      6. +
      7. Standardize install paths for CMake and template files +A podio client can, in CMake, do

      8. +
      +
    • +
    +
    find_package(podio REQUIRED)
    +add_executable(foo foo.cc)
    +target_link_libraries(foo podio::podio)
    +
    +
    +

    and all include/link paths will be set correctly.

    +
  • +
  • 2019-08-21 Javier Cervantes Villanueva (PR#51) +Do not install tests

    +
      +
    • Allow tests to run after the build phase

    • +
    • Paths have been modified to point to binary or source directories

    • +
    • Before, tests had to be run only after running make install

    • +
    • Test are not installed anymore

    • +
    • Fail tests if any error is reported (ROOT Interpreter error may not be considered by CMake)

    • +
    +
  • +
  • 2019-05-10 Frank Gaede (PR#45)

    +
      +
    • updated documentation

      +
        +
      • add guidelines for contributing

      • +
      +
    • +
    • reverted some name changes in tests/examples (fixes #44)

      +
        +
      • read-one now again called read

      • +
      +
    • +
    • enamble dryrun again for generate-edm test

    • +
    +
  • +
  • 2019-04-09 Marko Petric (PR#43)

    +
      +
    • Implementation of CI based on LCG views, as suggested in #42

    • +
    +
  • +
  • 2019-04-09 Graeme A Stewart (PR#41)

    +
      +
    • Improve convenience setup scripts and build instructions +- remove FCC specific code from init.sh +- factorise environment setup to env.sh +- updated README.md

    • +
    +
  • +
  • 2019-03-24 Javier Cervantes (PR#40)

    +
      +
    • ROOTReader now supports multiple inputs thanks to new implementation based on TChain

    • +
    • ROOTReader now supports opening files via xrootd (root:///eospublic.cern.ch//eos... for example)

    • +
    • Improved CMake and CPack configuration, sticking more closely to HSF template

    • +
    +
  • +
+
+
+

v00-09

+
    +
  • 2018-12-20 Frank Gaede (PR#39)

    +
      +
    • add some fixes and improvements

      +
        +
      • fix forward declarations in Object template when using a namespace for the EDM

      • +
      • fix array getter names when using the get/set syntax

      • +
      • add missing treatment for include statements in component’s header files

      • +
      • handle array members in ostream operators

      • +
      +
    • +
    • add CollectionBase::size() member function

      +
        +
      • allows to access collection size w/o knowing the concrete type

      • +
      • method is already generated in implementation classes

      • +
      +
    • +
    +
  • +
  • 2018-12-06 Frank Gaede (PR#38)

    +
      +
    • add code generation for I/O of vector members +- vector members are treated analogous to the reference vectors,i.e. +streamed as one large vector per collection

    • +
    • updated tests/datamodel accordingly (using clang-format)

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#37)

    +
      +
    • handle references and vector members in collection’s ostream operators

    • +
    +
  • +
  • 2018-11-30 Frank Gaede (PR#36)

    +
      +
    • add github templates for releaase notes, issues and contribution guidelines

    • +
    • add ReleaseNotes.md +- contains all commit logs so far (v00-08)

    • +
    +
  • +
+
+
+

v00-08

+
    +
  • 2017-11-02 hegner

    +
      +
    • Merge pull request #32 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-09-13 Colin Bernet

    +
      +
    • Merge pull request #60 from cbernet/nofile_fix

    • +
    +
  • +
  • 2017-09-12 Colin

    +
      +
    • fixed segv when opening a non accessible input file

    • +
    • fix test in interactive mode. write program had been moved

    • +
    +
  • +
  • 2017-06-21 Colin Bernet

    +
      +
    • Merge pull request #59 from cbernet/pyeventstore_filename

    • +
    +
  • +
  • 2017-06-20 Colin

    +
      +
    • can now get the name of the current file (useful when reporting exceptions)

    • +
    +
  • +
  • 2017-05-29 hegner

    +
      +
    • Merge pull request #58 from jlingema/clangf

    • +
    +
  • +
  • 2017-05-29 Joschka Lingemann

    +
      +
    • Fix bug introduced with clang format class gen would crash if clang-format was not used

    • +
    +
  • +
  • 2017-05-23 hegner

    +
      +
    • Merge pull request #53 from jlingema/array

    • +
    • Merge pull request #55 from jlingema/clangf

    • +
    • Merge pull request #57 from jlingema/fixWarnings

    • +
    +
  • +
  • 2017-05-22 Joschka Lingemann

    +
      +
    • Regenerate test datamodel

    • +
    • Add override statements

    • +
    +
  • +
  • 2017-04-20 Joschka Lingemann

    +
      +
    • Only call clang-format if it is in PATH

    • +
    +
  • +
  • 2017-04-11 Joschka Lingemann

    +
      +
    • Add language hints for syntax highlighting in docs

    • +
    • Add options of class generator to README

    • +
    • Add test for clang format

    • +
    • Add clang to path in init

    • +
    • Add clang-format application as option, closes #54

    • +
    +
  • +
  • 2017-04-07 Joschka Lingemann

    +
      +
    • Regenerated datamodel

    • +
    • Fix test in read and write for array of struct

    • +
    • Fixes in parser for arrays of struct

    • +
    • Add test for array of struct

    • +
    • Add includes for arrays of PODs

    • +
    +
  • +
  • 2017-04-04 Benedikt Hegner

    +
      +
    • temporarily disable outputstream for arrays

    • +
    +
  • +
  • 2017-04-04 hegner

    +
      +
    • Merge pull request #26 from gaede/add_ascii_io

    • +
    • Merge branch ‘master’ into add_ascii_io

    • +
    +
  • +
  • 2017-03-24 zaborowska

    +
      +
    • Merge pull request #52 from jlingema/array

    • +
    +
  • +
  • 2017-03-24 Joschka Lingemann

    +
      +
    • Add ROOT version requirement

    • +
    +
  • +
  • 2017-03-21 hegner

    +
      +
    • Merge pull request #30 from HEP-FCC/master

    • +
    • Merge branch ‘master’ into master

    • +
    +
  • +
  • 2017-03-20 hegner

    +
      +
    • Merge pull request #50 from jlingema/array

    • +
    +
  • +
  • 2017-03-13 Joschka Lingemann

    +
      +
    • Increase version requirement in README

    • +
    • Removing FindROOT macro, using standard use-file

    • +
    • Migrate to LCG_88

    • +
    • silence warning of unsigned -> int

    • +
    • Merge remote branch ‘origin/master’ into array

    • +
    +
  • +
  • 2017-03-02 Joschka Lingemann

    +
      +
    • Add implementation for array members

    • +
    +
  • +
  • 2017-02-15 Joschka Lingemann

    +
      +
    • Add test for datatype with array-member.

    • +
    +
  • +
  • 2017-02-21 zaborowska

    +
      +
    • Merge pull request #49 from jlingema/cvmfs

    • +
    +
  • +
  • 2017-02-21 Joschka Lingemann

    +
      +
    • Remove unused variable, add check if PODIO is set.

    • +
    • Move to cvmfs

    • +
    • Set ROOT_INCLUDE_PATH of pyunittest to avoid failure if FCC env is set.

    • +
    +
  • +
  • 2016-12-12 zaborowska

    +
      +
    • Merge pull request #47 from jlingema/master

    • +
    +
  • +
  • 2016-12-09 Joschka Lingemann

    +
      +
    • Regenerated datamodel with check against invalid collections.

    • +
    • Add check against OneToManyRelations to invalid collections

    • +
    • Move to LCG_87

    • +
    +
  • +
  • 2016-12-09 hegner

    +
      +
    • Merge pull request #46 from jlingema/master

    • +
    +
  • +
  • 2016-12-06 Joschka Lingemann

    +
      +
    • Require C++14.

    • +
    +
  • +
  • 2016-11-07 hegner

    +
      +
    • Merge pull request #45 from jlingema/master

    • +
    +
  • +
  • 2016-10-17 Benedikt Hegner

    +
      +
    • add method to register collection

    • +
    • remove need for templating on registering for writing

    • +
    +
  • +
  • 2016-09-30 Frank Gaede

    +
      +
    • remove debug printout for found components

    • +
    • add example for using ASCIWriter - write_ascii

    • +
    • fixed const_relation getters w/ getSyntax

    • +
    • regenerated EDM, ostream operator<<, id() and o.->

    • +
    • add ASCIIWriter

    • +
    • improved creation of ostream operators etc.

    • +
    +
  • +
  • 2016-09-26 Joschka Lingemann

    +
      +
    • Add non-const accessors for non-const collections.

    • +
    +
  • +
  • 2016-08-23 hegner

    +
      +
    • Merge pull request #44 from jlingema/docs

    • +
    • Merge pull request #43 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-08-23 Joschka Lingemann

    +
      +
    • Change option to be the same across projects.

    • +
    +
  • +
  • 2016-08-16 Joschka Lingemann

    +
      +
    • Improve readability of code base name and version.

    • +
    • Allow to customize version for doxygen via cli.

    • +
    • Use readme as title page for doxygen.

    • +
    • Change version to tags currently used.

    • +
    +
  • +
  • 2016-08-15 Joschka Lingemann

    +
      +
    • Add unsigned long to the list of builtins for consistency.

    • +
    • add test that regenerates datamodel in dry-run mode.

    • +
    • Add dry-run option.

    • +
    +
  • +
  • 2016-08-09 Joschka Lingemann

    +
      +
    • Remove unnecessary dict.

    • +
    +
  • +
  • 2016-07-29 Joschka Lingemann

    +
      +
    • Add support for (unsigned) long long

    • +
    • Fix indentation

    • +
    +
  • +
  • 2016-07-28 hegner

    +
      +
    • Merge pull request #25 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-28 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add a paragraph on options in the datamodel description files.

    • +
    • Add checks for clashing getter and setter names.

    • +
    • Add doxygen comments.

    • +
    +
  • +
  • 2016-07-27 hegner

    +
      +
    • Merge pull request #42 from jlingema/fix_cpy_relations

    • +
    +
  • +
  • 2016-07-27 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add tests for direct accessors and setters of POD members.

    • +
    • Merge with changes for doxygen comments and member exposure

    • +
    • Merge pull request #24 from jlingema/fix_cpy_relations

    • +
    • Add missing ; and switch to operator==

    • +
    • Code cleanup.

    • +
    +
  • +
  • 2016-07-26 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Removing print info generation, as that creates compilation issues.

    • +
    • Merge with recent changes from hegner/podio.

    • +
    • Remove print outs

    • +
    • Regenerated datamodel.

    • +
    • Extend tests to have empty references.

    • +
    • Initialize relations on copy only if they are set.

    • +
    +
  • +
  • 2016-07-25 Joschka Lingemann

    +
      +
    • Regenerated datamodel.

    • +
    • Add test for deep copy.

    • +
    • Bug fix: Initialisation of OneToOneRelations when copying.

    • +
    +
  • +
  • 2016-07-22 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’

    • +
    • Add tests for direct getter and setter of POD members.

    • +
    • Bug fix: option value already parsed to bool.

    • +
    • Add getters for POD members in Const objects.

    • +
    • Regenerated datamodel.

    • +
    • Remove trailing ; to silence compiler warning.

    • +
    • Add options to yaml files and parser for get syntax and pod data exposure.

    • +
    • Expose POD member members in objects.

    • +
    • Adding comments that show up in doxygen.

    • +
    +
  • +
  • 2016-07-12 hegner

    +
      +
    • Merge pull request #40 from jlingema/master

    • +
    +
  • +
  • 2016-07-12 Joschka Lingemann

    +
      +
    • Revert to operator[], add function checking presence of a collection.

    • +
    • Adding way to only clear the chaches (needed for FCCSW).

    • +
    • Change way to access IDs and names to allow catching exceptions.

    • +
    +
  • +
  • 2016-06-30 Benedikt Hegner

    +
      +
    • update doc as preparation for milestone document

    • +
    +
  • +
  • 2016-06-17 Joschka Lingemann

    +
      +
    • Add test for OneToManyRelations in namespaces. Fix class-generator.

    • +
    +
  • +
  • 2016-06-16 hegner

    +
      +
    • Merge pull request #22 from Steinweg/eike_operators_new

    • +
    +
  • +
  • 2016-06-15 Eike Steinweg

    +
      +
    • implemented ostream operators - std::ostream operator<<() created for components, objects and collections - create PrintInfo classes for formatted (tabular) printout of collections

    • +
    +
  • +
  • 2016-06-14 Benedikt Hegner

    +
      +
    • add convenience methods to python interface

    • +
    +
  • +
  • 2016-06-13 Benedikt Hegner

    +
      +
    • fix problem of wrong references being stored

    • +
    +
  • +
  • 2016-06-13 hegner

    +
      +
    • Merge pull request #21 from gaede/reference_bug_test

    • +
    +
  • +
  • 2016-06-13 Frank Gaede

    +
      +
    • fixed error message for test case

    • +
    • add test case for bug with reading back references

    • +
    +
  • +
  • 2016-06-03 hegner

    +
      +
    • Merge pull request #19 from jlingema/pyinterface

    • +
    +
  • +
  • 2016-05-24 Joschka Lingemann

    +
      +
    • Fix close method.

    • +
    • Improving py interface.

    • +
    • Merge remote branch ‘hegner/master’

    • +
    +
  • +
  • 2016-05-19 hegner

    +
      +
    • Merge pull request #39 from jlingema/master

    • +
    +
  • +
  • 2016-05-19 Joschka Lingemann

    +
      +
    • Remove hard-coded build-type.

    • +
    +
  • +
  • 2016-05-18 hegner

    +
      +
    • Merge pull request #38 from jlingema/master

    • +
    +
  • +
  • 2016-05-18 Joschka Lingemann

    +
      +
    • Increase write-test event number to 2000.

    • +
    • Merge pull request #18 from jlingema/master

    • +
    • Fixing indentation errors.

    • +
    • Reverting to LCG_83 and afs.

    • +
    +
  • +
  • 2016-05-12 Benedikt Hegner

    +
      +
    • style changes

    • +
    +
  • +
  • 2016-04-26 hegner

    +
      +
    • Merge pull request #17 from gaede/improve_doc

    • +
    +
  • +
  • 2016-04-26 Frank Gaede

    +
      +
    • made the ink to doxygen explicit

    • +
    • add more doc links to README

    • +
    • dde some documenation links to Readme

    • +
    +
  • +
  • 2016-04-22 hegner

    +
      +
    • Merge pull request #16 from gaede/relation_bug

    • +
    +
  • +
  • 2016-04-22 Frank Gaede

    +
      +
    • added ExampleMC to show bug in storing relations

    • +
    • bug fix in {ref}_end() for empty relation

    • +
    +
  • +
  • 2016-04-21 Frank Gaede

    +
      +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    +
  • +
  • 2016-04-20 hegner

    +
      +
    • Merge pull request #15 from gaede/add_getters_setters

    • +
    +
  • +
  • 2016-04-20 Frank Gaede

    +
      +
    • add unittest “AssociativeContainer” set/map

    • +
    • remove incorrect access to reference vector method

    • +
    • Merge remote-tracking branch ‘hegner/master’

    • +
    • Merge pull request #13 from gaede/fix_extracode

    • +
    • optional get/set syntax; operator<(); acces to reference vector

    • +
    +
  • +
  • 2016-04-20 Benedikt Hegner

    +
      +
    • clean up references at better place

    • +
    • Merge pull request #14 from jlingema/memleaks

    • +
    +
  • +
  • 2016-04-20 Joschka Lingemann

    +
      +
    • Merge remote branch ‘origin/master’ into memleaks

    • +
    • Fixing memory leak.

    • +
    +
  • +
  • 2016-04-19 Frank Gaede

    +
      +
    • fixed extra code generation for ConstObject

    • +
    +
  • +
  • 2016-04-19 hegner

    +
      +
    • Merge pull request #12 from gaede/extracode_in_components

    • +
    • add unit test for extracode in component

    • +
    +
  • +
  • 2016-04-19 Benedikt Hegner

    +
      +
    • add link to bug tracker

    • +
    • clear references properly

    • +
    • test for adding extra code to components

    • +
    • fix for handling components w/o extra code

    • +
    • allow for extra code declarations in components

    • +
    • fix object ownership and leak at deletion of collection

    • +
    +
  • +
  • 2016-04-18 Benedikt Hegner

    +
      +
    • add support for strings as members

    • +
    • removing wrong file

    • +
    • adding more docs

    • +
    • extend datamodel validation

    • +
    • add gitignore file

    • +
    +
  • +
  • 2016-04-17 Benedikt Hegner

    +
      +
    • move examples into tests to make space for real end-user examples

    • +
    • Merge branch ‘master’ of github.com:hegner/podio into catch

    • +
    • migrate from gtest to catch

    • +
    • move component cross-checking into validator

    • +
    • add hook for datamodel validator

    • +
    • fix PODIO-6

    • +
    • add support for user specified code snippets

    • +
    • add pointerless read interface

    • +
    • fix case when multiple many-relations are defined; fix writing example

    • +
    +
  • +
  • 2016-04-13 hegner

    +
      +
    • Merge pull request #11 from gaede/master

    • +
    +
  • +
  • 2016-04-13 Frank Gaede

    +
      +
    • added clusters in clusters as test for infinite recursion

    • +
    • Merge branch ‘master’ of https://github.com/gaede/podio

    • +
    • Merge branch ‘master’ of https://github.com/hegner/podio

    • +
    +
  • +
  • 2016-04-13 Benedikt Hegner

    +
      +
    • move to using LCG releases from CVMFS

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • set BUILD_TYPE to Debug for now

    • +
    • break infinite recursion in EventStore::get

    • +
    • add ‘long’ to built in types

    • +
    • Merge branch ‘master’ of github.com:hegner/podio

    • +
    • remove unneeded parameter from processEvent

    • +
    • Merge pull request #10 from gaede/master

    • +
    • starting to add more documentation

    • +
    +
  • +
  • 2016-04-12 Frank Gaede

    +
      +
    • big fix: clear vector of internal references in Collcection::clear()

    • +
    • set podio_LIBRARIES in podioConfig.cmake

    • +
    +
  • +
  • 2016-04-11 Frank Gaede

    +
      +
    • creare source directories for class generator if needed

    • +
    +
  • +
  • 2016-04-07 clementhelsens

    +
      +
    • Merge pull request #37 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 hegner

    +
      +
    • Merge pull request #9 from jlingema/fix_eos

    • +
    +
  • +
  • 2016-03-17 Joschka Lingemann

    +
      +
    • Using TFile::Open allows to also read eos files.

    • +
    +
  • +
  • 2016-03-14 hegner

    +
      +
    • Merge pull request #8 from jlingema/master

    • +
    +
  • +
  • 2016-03-14 Joschka Lingemann

    +
      +
    • Add templates file.

    • +
    • Fixing whitespace in templates according to FCC style.

    • +
    • First round of code clean-up. Moving code templates out of the generator. Move re-used functionality in functions.

    • +
    +
  • +
  • 2016-03-10 Joschka Lingemann

    +
      +
    • Moving member parsing in separate function.

    • +
    +
  • +
  • 2016-03-09 Joschka Lingemann

    +
      +
    • Add missing class from example datamodel.

    • +
    +
  • +
  • 2016-03-03 hegner

    +
      +
    • Merge pull request #34 from cbernet/tutorial_2

    • +
    +
  • +
  • 2016-03-03 Joschka Lingemann

    +
      +
    • Merge pull request #36 from hegner/master

    • +
    +
  • +
  • 2016-03-01 Benedikt Hegner

    +
      +
    • help cmake finding the proper gtest

    • +
    • use LCG 83 view

    • +
    +
  • +
  • 2016-03-01 Colin

    +
      +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-22 Colin

    +
      +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Joschka Lingemann

    +
      +
    • Adding dependencies for tests of examples.

    • +
    +
  • +
  • 2016-02-19 Colin

    +
      +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    +
  • +
  • 2016-02-18 Joschka Lingemann

    +
      +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    +
  • +
  • 2016-02-11 Colin

    +
      +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    +
  • +
  • 2016-02-10 Colin

    +
      +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-03-01 Colin Bernet

    +
      +
    • Merge pull request #35 from cbernet/master

    • +
    • operator== for ObjectID, for python equality tests

    • +
    • chaining of files really working

    • +
    +
  • +
  • 2016-02-23 Colin

    +
      +
    • updated README

    • +
    • updated README

    • +
    • updated README

    • +
    • improved README

    • +
    • added python read example

    • +
    +
  • +
  • 2016-02-23 Colin Bernet

    +
      +
    • Merge pull request #33 from cbernet/master

    • +
    • Merge remote-tracking branch ‘official/master’

    • +
    • can now use several input files in python

    • +
    +
  • +
  • 2016-02-19 Colin Bernet

    +
      +
    • Merge pull request #32 from jlingema/master

    • +
    • Adding dependencies for tests of examples.

    • +
    • Merge pull request #31 from cbernet/master

    • +
    • re-added python unittest

    • +
    • removed python test temporarily

    • +
    • Merge pull request #30 from jlingema/fix_include

    • +
    • Merge pull request #28 from cbernet/master

    • +
    • Slightly neater way of picking up headers.

    • +
    • Replacing fwd declaration with include for EventStore.

    • +
    • Merge pull request #29 from hegner/master

    • +
    +
  • +
  • 2016-02-18 Benedikt Hegner

    +
      +
    • add missing ID setting when free-floating collections are added to the store

    • +
    • removed read.py which is in fact a unit test. could add a read.py script

    • +
    • re-adding EventStore unittest from albers-core and adapted to new tree

    • +
    • back to right python path

    • +
    +
  • +
  • 2016-02-09 hegner

    +
      +
    • Merge pull request #7 from HEP-FCC/master

    • +
    +
  • +
  • 2016-02-09 Joschka Lingemann

    +
      +
    • Merge pull request #26 from cbernet/unified_env

    • +
    • Merge pull request #27 from hegner/master

    • +
    • Merge pull request #5 from zaborowska/fileZombie

    • +
    • Merge pull request #6 from zaborowska/rename

    • +
    +
  • +
  • 2016-02-09 Benedikt Hegner

    +
      +
    • beautify generated doxygen

    • +
    +
  • +
  • 2016-02-09 Colin

    +
      +
    • improving readme

    • +
    +
  • +
  • 2016-01-08 Colin

    +
      +
    • pick up soft on afs only at cern

    • +
    +
  • +
  • 2016-01-07 Colin

    +
      +
    • unified environment initialization

    • +
    +
  • +
  • 2016-02-08 zaborowska

    +
      +
    • Renaming Albers to PODIO

    • +
    +
  • +
  • 2016-02-08 Anna

    +
      +
    • Checking if file opened correctly

    • +
    +
  • +
  • 2016-02-05 Benedikt Hegner

    +
      +
    • remove deprecated files after merge

    • +
    • Merge branch ‘hegner-master’

    • +
    • resolve conflicts

    • +
    +
  • +
  • 2016-02-05 hegner

    +
      +
    • Merge pull request #3 from jlingema/master

    • +
    +
  • +
  • 2016-02-04 Joschka Lingemann

    +
      +
    • Adding install target for templates.

    • +
    • Merge with remote.

    • +
    • Change to new options. Add how to list all options.

    • +
    • Adding options for doxygen and gtest.

    • +
    +
  • +
  • 2016-02-01 Joschka Lingemann

    +
      +
    • Merge with remote master.

    • +
    • Adding examples to library paths.

    • +
    • Changing install destination for pcm / rootmap.

    • +
    • Updating instructions to new test folder structure

    • +
    +
  • +
  • 2016-01-29 Joschka Lingemann

    +
      +
    • Small cosmetic fixes to read-me.

    • +
    +
  • +
  • 2016-01-28 Joschka Lingemann

    +
      +
    • Adding how to run tests.

    • +
    • Changing testing structure to make unit-tests optional.

    • +
    • Adapting to Apple specifics.

    • +
    • Re-adding Find-ROOT macro.

    • +
    +
  • +
  • 2016-01-26 Joschka Lingemann

    +
      +
    • Fixing namespaces of members of objects.

    • +
    • Fixing namespacing of members for components.

    • +
    • Fix: Namespaced component in another component.

    • +
    +
  • +
  • 2016-01-18 Joschka Lingemann

    +
      +
    • Fixing path for python environment

    • +
    +
  • +
  • 2016-01-15 Joschka Lingemann

    +
      +
    • Adding python environment and pytools for PyYAML.

    • +
    • Splitting implementation and header files.

    • +
    • Newly generated datamodel.

    • +
    • Adding tests for namespaced data.

    • +
    • Fix relations for namespaced datamembers.

    • +
    • Removing trailing ; to silence warning.

    • +
    • First iteration of namespace support.

    • +
    • Adding handling of non-builtin members and fixing compile warnings

    • +
    +
  • +
  • 2016-01-13 Joschka Lingemann

    +
      +
    • Updating externals according to current FCCSW.

    • +
    +
  • +
  • 2015-11-18 Benedikt Hegner

    +
      +
    • make vector member code compile

    • +
    • add more forward declarations handling class A->B->A reference cases

    • +
    • move setter/getter implementation into CC file’

    • +
    +
  • +
  • 2015-10-22 Benedikt Hegner

    +
      +
    • install dictionaries explicitly

    • +
    +
  • +
  • 2015-10-21 Benedikt Hegner

    +
      +
    • fix bug for storing unitialized references

    • +
    • add new unit test covering non-filled relations

    • +
    +
  • +
  • 2015-10-19 Benedikt Hegner

    +
      +
    • add more single-ref unit tests; fix infinite loop

    • +
    +
  • +
  • 2015-10-16 Benedikt Hegner

    +
      +
    • allow chaining of components

    • +
    +
  • +
  • 2015-10-16 hegner

    +
      +
    • Merge pull request #1 from zaborowska/master

    • +
    +
  • +
  • 2015-10-16 Anna

    +
      +
    • Merge branch ‘master’ into test

    • +
    • Rename of examples->tests in init and README

    • +
    • Missing include of gtest added

    • +
    • added ‘setter’ for components

    • +
    +
  • +
  • 2015-10-15 Benedikt Hegner

    +
      +
    • add tests for components

    • +
    • move data definition syntax into separate markdown file

    • +
    +
  • +
  • 2015-10-14 Benedikt Hegner

    +
      +
    • new iteration of data model w/ new reference accessors

    • +
    • add tests for python interface

    • +
    • enable tests for python interface

    • +
    • remove accidentally added file

    • +
    • install python files

    • +
    • move PythonEventStore into podio namespace

    • +
    • add at() to methods of the collection

    • +
    • renaming package creation script

    • +
    +
  • +
  • 2015-10-13 Benedikt Hegner

    +
      +
    • update to new datamodel; fix mem leak

    • +
    • major refurbishment of podio; new interfaces in doc/doc.md

    • +
    +
  • +
  • 2015-05-12 Benedikt Hegner

    +
      +
    • adjust scripts to new naming convention

    • +
    +
  • +
  • 2015-05-11 Benedikt Hegner

    +
      +
    • rename albers into podio

    • +
    +
  • +
  • 2015-04-24 Benedikt Hegner

    +
      +
    • add CollectionBase to dictionaries

    • +
    +
  • +
  • 2015-04-22 Benedikt Hegner

    +
      +
    • add new tests; feature complete for lcio

    • +
    • next step towards lcio modelling

    • +
    • prepare for future vector member feature

    • +
    • removing deprecated method for supporting XYZHandle convention

    • +
    • upgrading the lcio layout

    • +
    • add more buildin types

    • +
    • removed code duplication in code generation

    • +
    • complete testing of single references

    • +
    • remove debug printout for the garbage collection

    • +
    +
  • +
  • 2015-04-21 Benedikt Hegner

    +
      +
    • adding std::array support

    • +
    • update code templates for new refs

    • +
    +
  • +
  • 2015-04-20 Benedikt Hegner

    +
      +
    • streamline definition syntax

    • +
    • Merge branch ‘master’ of github.com:hegner/albers

    • +
    • remove wrongly committed files

    • +
    +
  • +
  • 2015-04-20 Pere Mato

    +
      +
    • Minor changes in CMakeLists.txt to cope with XCode generation

    • +
    • don’t use the factory of the collection to create hits and refs

    • +
    • clarify namespace

    • +
    • update examples w/ new code generation

    • +
    • properly set relation vectors in push_back

    • +
    • create constructor with full signature

    • +
    +
  • +
  • 2015-04-19 Benedikt Hegner

    +
      +
    • vector member code #1

    • +
    • whitespace fix

    • +
    • first step towards lcio yaml file

    • +
    +
  • +
  • 2015-04-17 Benedikt Hegner

    +
      +
    • trivial python wrapper for event store

    • +
    • add simple non-existence check

    • +
    • add some doc strings

    • +
    • start using IReader

    • +
    • use method names acquire/release in ObjBase

    • +
    • add more docs

    • +
    • unify ref-counting behaviour

    • +
    • let XXXObj create relation collections themselves

    • +
    • add cloning and better initialization; aligning method implementation order with declaration order

    • +
    +
  • +
  • 2015-04-16 Benedikt Hegner

    +
      +
    • add proper destructor for XXXObj

    • +
    • add header needed for gcc

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • introducing ObjBase

    • +
    +
  • +
  • 2015-04-16 Pere Mato

    +
      +
    • test target is reserved from CMake > 3.0

    • +
    • Simplify CMakeLists files making use of ROOTConfig.cmake (ROOT build with CMake)

    • +
    • move delete command for Obj into the ref counting method

    • +
    • inline trivial setters and getters

    • +
    +
  • +
  • 2015-04-15 Benedikt Hegner

    +
      +
    • improve documentation

    • +
    • add doxygen target

    • +
    • whitespace

    • +
    • remove unneeded headers

    • +
    • fix gcc warnings

    • +
    • move to ROOT 6 on linux

    • +
    +
  • +
  • 2015-04-14 Benedikt Hegner

    +
      +
    • allow cyclic dependencies between collections and objects

    • +
    • setting collection ID on read

    • +
    • deprecate registry

    • +
    • first step towards deprecation of Registry

    • +
    • rename FooEntry classes to FooObj

    • +
    • fix cmake

    • +
    • next simplification of class generator; move more code into templates

    • +
    • first step towards simplified class generator

    • +
    • break circular header dependency in case types have references to the same type

    • +
    +
  • +
  • 2015-04-13 Benedikt Hegner

    +
      +
    • add handling of improper refs on writing

    • +
    • move implementations into cc file

    • +
    • add documentation draft; whitespace cleanup

    • +
    • add some comments

    • +
    • add some comments

    • +
    • rename event store methods

    • +
    • remove deprecated methods from Registry

    • +
    • fixing wrong whitespace

    • +
    • upgrade to new API supporting free-floating objects

    • +
    +
  • +
  • 2015-04-01 Benedikt Hegner

    +
      +
    • add newline at the end of the file

    • +
    +
  • +
  • 2014-12-11 Colin Bernet

    +
      +
    • Merge pull request #24 from cbernet/clone

    • +
    +
  • +
  • 2014-12-11 Colin

    +
      +
    • can clone an existing handle into a new collection.

    • +
    +
  • +
  • 2014-12-04 Colin Bernet

    +
      +
    • Merge pull request #23 from cbernet/edm_1

    • +
    +
  • +
  • 2014-12-03 Colin

    +
      +
    • removed getters and accessors from Handle

    • +
    • edm v1 compiles and runs.

    • +
    • class generation: can now have components inside components

    • +
    • uniform syntax for members

    • +
    +
  • +
  • 2014-12-02 Colin

    +
      +
    • edm_1 done, but need to review naming scheme and simplify a bit

    • +
    • started to work on first detailed edm prototype.

    • +
    +
  • +
  • 2014-12-02 Benedikt Hegner

    +
      +
    • remove incomplete relation code; was accidental commit

    • +
    +
  • +
  • 2014-11-26 Benedikt Hegner

    +
      +
    • adjusted to new structure of headers

    • +
    +
  • +
  • 2014-10-26 Benedikt Hegner

    +
      +
    • make friend declaration confirm standard; needed by genreflex

    • +
    +
  • +
  • 2014-10-24 hegner

    +
      +
    • Merge pull request #22 from hegner/master

    • +
    +
  • +
  • 2014-10-24 Benedikt Hegner

    +
      +
    • fix warnings

    • +
    • Merge pull request #21 from hegner/master

    • +
    • fix merge problems at runtime

    • +
    • revert to original data model setup

    • +
    • merge HEAD

    • +
    • towards n-to-n relation improvements; make class generator create other directory structure

    • +
    +
  • +
  • 2014-10-10 Colin

    +
      +
    • fixes for python import

    • +
    +
  • +
  • 2014-10-10 Colin Bernet

    +
      +
    • Merge pull request #20 from cbernet/python

    • +
    • added python specific stuff to install scripts

    • +
    • Merge pull request #19 from cbernet/python

    • +
    +
  • +
  • 2014-10-09 Colin

    +
      +
    • reader can now navigate directly to a given event number

    • +
    +
  • +
  • 2014-10-07 Colin Bernet

    +
      +
    • Merge pull request #18 from cbernet/python

    • +
    +
  • +
  • 2014-10-07 Colin

    +
      +
    • python read example ready

    • +
    • Merge branch ‘python’ of github.com:cbernet/albers into python

    • +
    • code more pythonic; unittests

    • +
    • python event store working

    • +
    +
  • +
  • 2014-10-06 Colin Bernet

    +
      +
    • Merge pull request #17 from cbernet/python

    • +
    • Update README.md

    • +
    +
  • +
  • 2014-10-06 Colin

    +
      +
    • handles working in python

    • +
    • added python test file

    • +
    +
  • +
  • 2014-10-02 Colin Bernet

    +
      +
    • Merge pull request #16 from cbernet/leptons

    • +
    +
  • +
  • 2014-10-02 Colin

    +
      +
    • added a muon to the event, and computing its isolation.

    • +
    • added print operator for ParticleHandle in utilities

    • +
    • Merge pull request #15 from cbernet/more_utility

    • +
    • bug fix in Collections. particle overlap checking based on handles

    • +
    +
  • +
  • 2014-10-01 Colin

    +
      +
    • write and read on 100000 events. solved rare problems by setting an eta cut in the generator.

    • +
    +
  • +
  • 2014-10-01 Colin Bernet

    +
      +
    • Merge pull request #14 from cbernet/dummy_generator

    • +
    • Dummy generator generates two jets

    • +
    • on-demand reading tested in read example

    • +
    • now using only the jets and the particles from the DummyGenerator

    • +
    • Merge pull request #13 from cbernet/coll_in_registry

    • +
    • CollectionBase pointers now registered in Registry. Changed writer interface

    • +
    • added first version of a dummy multijet event generator

    • +
    +
  • +
  • 2014-09-30 Colin

    +
      +
    • new utility functions. < operator for handles.

    • +
    +
  • +
  • 2014-09-29 Colin

    +
      +
    • Jet and vector utility functions used in write and read

    • +
    • print functions for Collections, and first utility functions

    • +
    +
  • +
  • 2014-09-28 Benedikt Hegner

    +
      +
    • take last element and increment by one for end iterator

    • +
    • fix bug of invalid references in user land

    • +
    +
  • +
  • 2014-09-27 Benedikt Hegner

    +
      +
    • next step towards one-to-many-relations; collection has proper members now

    • +
    • update and clean templates

    • +
    • add first part of one-to-many capabilities to POD and Handle

    • +
    +
  • +
  • 2014-09-25 Colin

    +
      +
    • using the new datamodel in read and write. Reading problem at first event!

    • +
    • developed data model

    • +
    +
  • +
  • 2014-09-25 Colin Bernet

    +
      +
    • Merge pull request #12 from cbernet/few_easy_mods

    • +
    • macos X initialization script

    • +
    • Merge branch ‘master’ into merge_attempt

    • +
    +
  • +
  • 2014-09-24 Benedikt Hegner

    +
      +
    • change syntax for data generation; part 1

    • +
    +
  • +
  • 2014-09-24 Colin

    +
      +
    • a bit of clean up

    • +
    +
  • +
  • 2014-09-23 Benedikt Hegner

    +
      +
    • simplify the structure of the PODs; now really look like structs

    • +
    • add functionality of defining components; simplify datamodel example and writer code

    • +
    • fix pedantic compilation warning

    • +
    +
  • +
  • 2014-09-23 Colin Bernet

    +
      +
    • Merge pull request #11 from cbernet/event_loop

    • +
    +
  • +
  • 2014-09-23 Colin

    +
      +
    • event loop in reader working, but messy ! overall design to be clarified

    • +
    • bug fix: not writing to TFile anymore just after filling the tree

    • +
    • Merge pull request #10 from cbernet/event_loop

    • +
    • implemented event loop in writer. big performance issue

    • +
    • Merge pull request #9 from cbernet/simple_edm

    • +
    +
  • +
  • 2014-09-22 Colin

    +
      +
    • example mains adapted to new EDM

    • +
    • bug fix for multiple includes

    • +
    • realistic data model

    • +
    +
  • +
  • 2014-09-22 Colin Bernet

    +
      +
    • Merge pull request #8 from cbernet/auto_handle_ptr

    • +
    • buffer address in embedded handles set in prepareAfterRead automatically

    • +
    • initialed collectionID to 0, and improved const-correctness

    • +
    • collection id is now unsigned

    • +
    • Merge pull request #7 from cbernet/macos_build_merge

    • +
    • Merge branch ‘macos_build’ into macos_build_merge

    • +
    • Merge branch ‘master’ of github.com:HEP-FCC/albers

    • +
    • conditional for mac os x

    • +
    • able to build on macos, need to test lxplus6

    • +
    +
  • +
  • 2014-09-21 Colin Bernet

    +
      +
    • reformatted README properly

    • +
    +
  • +
  • 2014-09-21 Colin

    +
      +
    • commented the code: Reader, Handle

    • +
    +
  • +
  • 2014-09-19 Colin

    +
      +
    • Merge branch ‘documentation’ of github.com:cbernet/albers into documentation

    • +
    +
  • +
  • 2014-09-18 Colin

    +
      +
    • documentation and questions: EventStore, Collection, Registry, Writer

    • +
    • documentation and questions: EventStore, Collection, Registry

    • +
    • added an environment setup script

    • +
    +
  • +
  • 2014-09-17 Colin

    +
      +
    • more specific installation instructions

    • +
    • added a particle class, aiming for a Z boson example

    • +
    +
  • +
  • 2014-09-17 Benedikt Hegner

    +
      +
    • fix for the fact that yaml parsing doesn’t preserve ordering

    • +
    +
  • +
  • 2014-09-16 Benedikt Hegner

    +
      +
    • rearrange the example

    • +
    +
  • +
  • 2014-09-15 Benedikt Hegner

    +
      +
    • fix md

    • +
    • Merge branch ‘master’ of https://github.com/hegner/albers

    • +
    • add initial descriptions

    • +
    • make it so

    • +
    +
  • +
  • 2014-09-15 hegner

    +
      +
    • Initial commit

    • +
    +
  • +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/_static/_sphinx_javascript_frameworks_compat.js b/v99-99-99/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/v99-99-99/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v99-99-99/_static/basic.css b/v99-99-99/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/v99-99-99/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v99-99-99/_static/check-solid.svg b/v99-99-99/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/v99-99-99/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/v99-99-99/_static/clipboard.min.js b/v99-99-99/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/v99-99-99/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/v99-99-99/_static/copybutton.css b/v99-99-99/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/v99-99-99/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/v99-99-99/_static/copybutton.js b/v99-99-99/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/v99-99-99/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/v99-99-99/_static/copybutton_funcs.js b/v99-99-99/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/v99-99-99/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/v99-99-99/_static/css/badge_only.css b/v99-99-99/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/v99-99-99/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v99-99-99/_static/css/fonts/Roboto-Slab-Bold.woff b/v99-99-99/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/v99-99-99/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v99-99-99/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v99-99-99/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/v99-99-99/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v99-99-99/_static/css/fonts/Roboto-Slab-Regular.woff b/v99-99-99/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/v99-99-99/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v99-99-99/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v99-99-99/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/v99-99-99/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v99-99-99/_static/css/fonts/fontawesome-webfont.eot b/v99-99-99/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/v99-99-99/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v99-99-99/_static/css/fonts/fontawesome-webfont.svg b/v99-99-99/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/v99-99-99/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v99-99-99/_static/css/fonts/fontawesome-webfont.ttf b/v99-99-99/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/v99-99-99/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v99-99-99/_static/css/fonts/fontawesome-webfont.woff b/v99-99-99/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/v99-99-99/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v99-99-99/_static/css/fonts/fontawesome-webfont.woff2 b/v99-99-99/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/v99-99-99/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v99-99-99/_static/css/fonts/lato-bold-italic.woff b/v99-99-99/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v99-99-99/_static/css/fonts/lato-bold-italic.woff2 b/v99-99-99/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v99-99-99/_static/css/fonts/lato-bold.woff b/v99-99-99/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-bold.woff differ diff --git a/v99-99-99/_static/css/fonts/lato-bold.woff2 b/v99-99-99/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-bold.woff2 differ diff --git a/v99-99-99/_static/css/fonts/lato-normal-italic.woff b/v99-99-99/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v99-99-99/_static/css/fonts/lato-normal-italic.woff2 b/v99-99-99/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v99-99-99/_static/css/fonts/lato-normal.woff b/v99-99-99/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-normal.woff differ diff --git a/v99-99-99/_static/css/fonts/lato-normal.woff2 b/v99-99-99/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/v99-99-99/_static/css/fonts/lato-normal.woff2 differ diff --git a/v99-99-99/_static/css/theme.css b/v99-99-99/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/v99-99-99/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/v99-99-99/_static/doctools.js b/v99-99-99/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/v99-99-99/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v99-99-99/_static/documentation_options.js b/v99-99-99/_static/documentation_options.js new file mode 100644 index 000000000..1823c1bde --- /dev/null +++ b/v99-99-99/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: false, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v99-99-99/_static/file.png b/v99-99-99/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/v99-99-99/_static/file.png differ diff --git a/v99-99-99/_static/jquery.js b/v99-99-99/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/v99-99-99/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v99-99-99/_static/js/html5shiv.min.js b/v99-99-99/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/v99-99-99/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v99-99-99/_static/js/theme.js b/v99-99-99/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/v99-99-99/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v99-99-99/_static/minus.png b/v99-99-99/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/v99-99-99/_static/minus.png differ diff --git a/v99-99-99/_static/plus.png b/v99-99-99/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/v99-99-99/_static/plus.png differ diff --git a/v99-99-99/_static/pygments.css b/v99-99-99/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/v99-99-99/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v99-99-99/_static/searchtools.js b/v99-99-99/_static/searchtools.js new file mode 100644 index 000000000..7918c3fab --- /dev/null +++ b/v99-99-99/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v99-99-99/_static/sphinx_highlight.js b/v99-99-99/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/v99-99-99/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v99-99-99/advanced_topics.html b/v99-99-99/advanced_topics.html new file mode 100644 index 000000000..4d50b84ee --- /dev/null +++ b/v99-99-99/advanced_topics.html @@ -0,0 +1,452 @@ + + + + + + + Advanced Topics — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Advanced Topics

+
+

Writing extra data outside the EDM

+

See here

+
+
+

Changing / creating new templates

+

See here

+
+
+

Persistency

+

The library is build such that it can support multiple storage backends. However, the tested storage system being used is ROOT. +The following explains the requirements for a user-provided storage back-end.

+
+

Writing Back-End

+

There is no interface a writing class has to fulfill. It only needs to take advantage of the interfaces provided in PODIO. To persistify a collection, three pieces of information have to be stored:

+
    +
  1. the ID of the collection,

  2. +
  3. the vector of PODs in the collection, and

  4. +
  5. the relation information in the collection

  6. +
+

Before writing out a collection, the data need to be put into the proper structure. For this, the method prepareForWrite needs to be invoked. In the case of trivial POD members this results in a no-op. In case, the collection contains references to other collections, the pointers are being translated into collID:objIndex pairs. A serialization solution would - in principle - then look like this:

+
     collection->prepareForWrite();
+     void* buffer = collection->getBufferAddress();
+     auto refCollections = collection->referenceCollections();
+     // ...
+     //   write buffer, collection ID, and refCollections
+     // ...
+
+
+
+
+

Reading Back-End

+

The main requirement for a reading backend is its capability of reading back all +the necessary data from which a collection can be constructed in the form of +podio::CollectionReadBuffers. From these buffers collections can then be +constructed. Each instance has to contain the (type erased) POD buffers (as a +std::vector), the (possibly empty) vectors of podio::ObjectIDs that contain +the relation information as well the (possibly empty) vectors for the vector +member buffers, which are currently stored as pairs of the type (as a +std::string) and (type erased) data buffers in the form of std::vectors.

+
+
+

Dumping JSON

+

It is possible to turn on an automatic conversion to JSON for podio generated datamodels using the nlohmann/json library. +To enable this feature the core datamodel library has to be compiled with the PODIO_JSON_OUTPUT and linked against the nlohmann/json library (needs at least version 3.10). +In cmake the necessary steps are (assuming that datamodel is the datamodel core library)

+
find_library(nlohmann_json 3.10 REQUIRED)
+target_link_library(datamodel PUBLIC nlohmann_json::nlohmann_json)
+target_compile_definitions(datamodel PUBLIC PODIO_JSON_OUTPUT)
+
+
+

With JSON support enabled it is possible to convert collections (or single objects) to JSON simply via

+
#include "nlohmann/json.hpp"
+
+auto collection = // get collection from somewhere
+
+nlohmann::json json{
+   {"collectionName", collection}
+};
+
+
+

Each element of the collection will be converted to a JSON object, where the keys are the same as in the datamodel definiton. +Components contained in the objects will similarly be similarly converted.

+

JSON is not foreseen as a mode for persistency, i.e. there is no plan to add the conversion from JSON to the in memory representation of the datamodel.

+
+
+
+

Thread-safety

+

PODIO was written with thread-safety in mind and avoids the usage of globals and statics. +However, a few assumptions about user code and use-patterns were made. +The following lists the caveats of the library when it comes to parallelization.

+
+

Changing user data

+

As explained in the section about mutability of data, thread-safety is only guaranteed if data are considered read-only after creation.

+
+
+

Serialization

+

During the calls of prepareForWriting and prepareAfterReading on collections other operations like object creation or addition will lead to an inconsistent state.

+
+
+

Not-thread-safe components

+

The Readers and Writers that ship with podio are assumed to run on a single +thread only (more precisely we assume that each Reader or Writer doesn’t have to +synchronize with any other for file operations).

+
+
+
+

Running pre-commit

+
    +
  • Install pre-commit

    +

    $ pip install pre-commit

    +
  • +
  • Run pre-commit manually

    +

    $ pre-commit run --all-files

    +
  • +
+
+
+

Retrieving the EDM definition from a data file

+

It is possible to get the EDM definition(s) that was used to generate the +datatypes that are stored in a data file. This makes it possible to re-generate +the necessary code and build all libraries again in case they are not easily +available otherwise. To see which EDM definitions are available in a data file +use the podio-dump utility

+
podio-dump <data-file>
+
+
+

which will give an (exemplary) output like this

+
input file: <data-file>
+
+EDM model definitions stored in this file: edm4hep
+
+[...]
+
+
+

To actually dump the model definition to stdout use the --dump-edm option +and the name of the datamodel you want to dump:

+
podio-dump --dump-edm edm4hep <data-file> > dumped_edm4hep.yaml
+
+
+

Here we directly redirected the output to a yaml file that can then again be +used by the podio_class_generator.py to generate the corresponding c++ code +(or be passed to the cmake macros).

+

Note that the dumped EDM definition is equivalent but not necessarily exactly +the same as the original EDM definition. E.g. all the datatypes will have all +their fields (Members, OneToOneRelations, OneToManyRelations, +VectorMembers) defined, and defaulted to empty lists in case they were not +present in the original EDM definition. The reason for this is that the embedded +EDM definition is the pre-processed and validated one as described +below

+
+

Accessing the EDM definition programmatically

+

The EDM definition can also be accessed programmatically via the +[ROOT|SIO]FrameReader::getEDMDefinition method. It takes an EDM name as its +single argument and returns the EDM definition as a JSON string. Most likely +this has to be decoded into an actual JSON structure in order to be usable (e.g. +via json.loads in python to get a dict).

+
+
+

Technical details on EDM definition embedding

+

The EDM definition is embedded into the core EDM library as a raw string literal +in JSON format. This string is generated into the DatamodelDefinition.h file as

+
namespace <package_name>::meta {
+static constexpr auto <package_name>__JSONDefinition = R"EDMDEFINITION(<json encoded definition>)EDMDEFINITION";
+}
+
+
+

where <package_name> is the name of the EDM as passed to the +podio_class_generator.py (or the cmake macro). The <json encoded definition> +is obtained from the pre-processed EDM definition that is read from the yaml +file. During this pre-processing the EDM definition is validated, and optional +fields are filled with empty defaults. Additionally, the includeSubfolder +option will be populated with the actual include subfolder, in case it has been +set to True in the yaml file. Since the json encoded definition is generated +right before the pre-processed model is passed to the class generator, this +definition is equivalent, but not necessarily equal to the original definition.

+
+

The DatamodelRegistry

+

To make access to information about currently loaded and available datamodels a +bit easier the DatamodelRegistry (singleton) keeps a map of all loaded +datamodels and provides access to this information possible. In this context we +refer to an EDM as the shared library (and the corresponding public headers) +that have been compiled from code that has been generated from a datamodel +definition in the original YAML file. In general whenever we refer to a +datamodel in this context we mean the enitity as a whole, i.e. its definition +in a YAML file, the concrete implementation as an EDM, as well as other related +information that is related to it.

+

Currently the DatamodelRegistry provides mainly access to the original +definition of available datamodels via two methods:

+
const std::string_view getDatamodelDefinition(const std::string& edmName) const;
+
+const std::string_view getDatamodelDefinition(size_t index) const;
+
+
+

where index can be obtained from each collection via +getDatamodelRegistryIndex. That in turn simply calls +<package_name>::meta::DatamodelRegistryIndex::value(), another singleton like object +that takes care of registering an EDM definition to the DatamodelRegistry +during its static initialization. It is also defined in the +DatamodelDefinition.h header.

+

Since the datamodel definition is embedded as a raw string literal into the core +EDM shared library, it is in principle also relatively straight forward to +retrieve it from this library by inspecting the binary, e.g. via

+
readelf -p .rodata libedm4hep.so | grep options
+
+
+

which will result in something like

+
  [   300]  {"options": {"getSyntax": true, "exposePODMembers": false, "includeSubfolder": "edm4hep/"}, "components": {<...>}, "datatypes": {<...>}}
+
+
+
+
+

I/O helpers for EDM definition storing

+

The podio/utilities/DatamodelRegistryIOHelpers.h header defines two utility +classes, that help with instrumenting readers and writers with functionality to +read and write all the necessary EDM definitions.

+
    +
  • The DatamodelDefinitionCollector is intended for usage in writers. It +essentially collects the datamodel definitions of all the collections it encounters. +The registerDatamodelDefinition method it provides should be called with every collection +that is written. The getDatamodelDefinitionsToWrite method returns a vector of all +datamodel names and their definition that were encountered during writing. It is +then the writers responsibility to actually store this information into the +file.

  • +
  • The DatamodelDefinitionHolder is intended to be used by readers. It +provides the getDatamodelDefinition and getAvailableDatamodels methods. +It is again the readers property to correctly populate it with the data it +has read from file. Currently the SIOFrameReader and the ROOTFrameReader +use it and also offer the same functionality as public methods with the help +of it.

  • +
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/contributing.html b/v99-99-99/contributing.html new file mode 100644 index 000000000..a12675f98 --- /dev/null +++ b/v99-99-99/contributing.html @@ -0,0 +1,298 @@ + + + + + + + Contributing to PODIO — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Contributing to PODIO

+

Please read these guidelines if you want to contribute to the PODIO project.

+
+

Git workflow

+

For PODIO we would like to follow a so called “No Switch Yard” (NoSY) workflow.

+

In essence this means that you develop your (small) new feature in a dedicated +feature branch that is kept up to date with the master branch until you create +a PR, as we only allow rebase merges for PRs.

+
+

Example workflow

+
    +
  • checkout a copy of PODIO from the origin at AIDASoft:

    +

    git clone https://github.com/AIDASoft/podio.git +cd podio

    +
  • +
  • create a fork of the repository on the Github web page

    +
      +
    • if you have not yet done so earlier

    • +
    +
  • +
  • add your fork as remote downstream using your Github username

    +
    git remote add downstream  https://<yourUserName>@github.com/<yourUserName>/podio.git
    +
    +
    +
  • +
  • create a new feature branch; choose a meaningful name

    +
    git checkout -b <myNewBranch>
    +
    +
    +
  • +
  • make the changes to existing files (or add new ones) and frequently keep up to date with the master:

    +
    git fetch origin; git rebase origin/master
    +
    +
    +
  • +
  • after having committed everything to your new branch, push it to your fork of PODIO:

    +
    git push downstream <myNewBranch>
    +
    +
    +
  • +
  • reload your own github website (https://github.com//podio)

    +
      +
    • you should see your commit

    • +
    • now you can create a pull request on the web site

    • +
    +
  • +
+
+
+

Release Notes

+

Please make sure you fill in meaningful release notes in the comment field that is +provided at the Github web page when creating the PR, e.g.

+
BEGINRELEASENOTES
+- updated documentation
+    - add guidelines for contributing
+- reverted some name changes in tests/examples
+    - `read-one` now again called `read`
+
+ENDRELEASENOTES
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/datamodel_syntax.html b/v99-99-99/datamodel_syntax.html new file mode 100644 index 000000000..8776ffe62 --- /dev/null +++ b/v99-99-99/datamodel_syntax.html @@ -0,0 +1,395 @@ + + + + + + + Data Models and Data Model Definitions — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Models and Data Model Definitions

+

To describe a data model PODIO provides a data model definition syntax. +This is to ease the creation of optimised data formats, which may take advantage of a so-called struct-of-array data layout. +From the user-provided data model description PODIO creates all the files necessary to use this data model.

+
+

Basic Concepts and Supported Features

+

PODIO encourages the usage of composition, rather than inheritance. +One of the reasons for doing so is the focus on efficiency friendly plain-old-data. +For this reason, PODIO does not support inheritance within the defined data model. +Instead, users can combine multiple components to build a to be used datatype.

+

To allow the datatypes to be real PODs, the data stored within the data model are constrained to be +POD-compatible data. Those are

+
    +
  1. basic types like int, double, etc as well as a limited set of fixed width +integers from <cstdint> (the _leastN or _fastN types as well as all +8 bit types are not allowed).

  2. +
  3. components built up from basic types or other components

  4. +
  5. Fixed sized arrays of those types

  6. +
+

In addition, PODIO supports the storage of one-to-one and one-to-many relations between objects. +In the following the syntax for defining a given data model is explained. +A later section contains more details about the code being created from this.

+
+
+

Definition of custom components

+

A component is just a flat struct containing data. it can be defined via:

+
    components:
+      # My example component
+      MyComponent:
+        Members:
+          - float x
+          - float y
+          - float z
+          - AnotherComponent a
+
+
+
+
+

Definition of custom data classes

+

Here an excerpt from “datamodel.yaml” for a simple class, just containing one member of the type int.

+
    datatypes :
+      EventInfo :
+        Description : "My first data type"
+        Author : "It's me"
+        Members :
+        - int Number // event number
+
+
+

Using this definition, three classes will be created: EventInfo, EventInfoData and EventInfoCollection. These have the following signature:

+
    class EventInfoData {
+      public:
+        int Number;
+    }
+
+    class EventInfo {
+      public:
+      ...
+        int Number() const;
+        void Number(int);
+      ...
+    }
+
+
+
+

Defining members

+

The definition of a member is done in the Members section in the form:

+
    Members:
+      <type> <name> // <comment>
+
+
+

where type can be any builtin-type or a component.

+

It is also possible to specify default values for members via

+
    Members:
+      <type> <name>{<default-value>} // <comment>
+
+
+

Note that in this case it is extremely expensive to check whether the provided default-value results in valid c++. +Hence, there is only a very basic syntax check, but no actual type check, and wrong default values will be caught only when trying to compile the datamodel.

+

For describing physics quantities it is important to know their units. Thus it is possible to add the units to the member definition:

+
    Members:
+      <type> <name>{<default-value>} [<unit>] // <comment>
+
+
+
+
+

Definition of references between objects:

+

There can be one-to-one-relations and one-to-many relations being stored in a particular class. This happens either in the OneToOneRelations or OneToManyRelations section of the data definition. The definition has again the form:

+
    OneToOneRelations:
+      <type> <name> // <comment>
+    OneToManyRelations:
+      <type> <name> // <comment>
+
+
+
+
+

Explicit definition of methods

+

In a few cases, it makes sense to add some more functionality to the created classes. Thus this library provides two ways of defining additional methods and code. Either by defining them inline or in external files. Extra code has to be provided separately for immutable and mutable additions. +Note that the immutable (ExtraCode) will also be placed into the mutable classes, so that there is no need for duplicating the code. +Only if some additions should only be available for the mutable classes it is necessary to fill the MutableExtraCode section. +The includes will be add to the header files of the generated classes.

+
    ExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+    MutableExtraCode:
+      includes: <newline separated list of strings (optional)>
+      declaration: <string>
+      implementation : <string>
+      declarationFile: <string> (to be implemented!)
+      implementationFile: <string> (to be implemented!)
+
+
+

The code being provided has to use the macro {name} in place of the concrete name of the class.

+
+
+
+

Global options

+

Some customization of the generated code is possible through flags. These flags are listed in the section options:

+
    options:
+      getSyntax: False
+      exposePODMembers: True
+    components:
+      # My simple component
+      ExampleComponent:
+        Members:
+          - int x
+    datatypes:
+      ExampleType:
+        Description: "My datatype with a component member"
+        Author: "Mr me"
+        Members:
+         - ExampleComponent comp // component from above
+
+
+
    +
  • getSyntax: steers the naming of get and set methods. If set to true, methods are prefixed with get and set following the capitalized member name, otherwise the member name is used for both.

  • +
  • exposePODMembers: whether get and set methods are also generated for members of a member-component. In the example corresponding methods would be generated to directly set / get x through ExampleType.

  • +
+
+
+

Extending a datamodel / using types from an upstream datamodel

+

It is possible to extend another datamodel with your own types, resp. use some datatypes or components from an upstream datamodel in your own datamodel. +This can be useful for prototyping new datatypes or for accomodating special requirements without having to reimplement / copy a complete datamodel.

+

To pass an upstream datamodel to the class generator use the --upstream-edm option that takes the package name as well as the yaml definition file of the upstream datamodel separated by a colon (‘:’). +This will effectively make all components and datatypes of the upstream datamodel available to the current definition for validation and generation of the necessary includes. +Nevertheless, only the code for the datatypes and components defined in the current yaml file will be generated. +The podio PODIO_GENERATE_DATAMODEL cmake macro has gained an additional parameter UPSTREAM_EDM to pass the arguments to the generator via the cmake macros.

+
+

Potential pitfalls

+
    +
  • The cmake macros do not handle linking against an upstream datamodel automatically. It is the users responsibility to explicitly link against the upstream datamodel.

  • +
  • When generating two datamodels side-by-side and into the same output directory and using the ROOT backend, the generated selection.xml file might be overwritten if both datamodels are generated into the same output directory.

  • +
+

Limiting this functionality to one upstream datamodel is a conscious choice to limit the potential for abuse of this feature.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/design.html b/v99-99-99/design.html new file mode 100644 index 000000000..b958eafb5 --- /dev/null +++ b/v99-99-99/design.html @@ -0,0 +1,298 @@ + + + + + + + Design and Implementation Details — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Design and Implementation Details

+

The driving considerations for the PODIO design are:

+
    +
  1. the concrete data are contained within plain-old-data structures (PODs)

  2. +
  3. user-exposed data types are concrete and do not use inheritance

  4. +
  5. The C++ and Python interface should look as close as possible

  6. +
  7. The user does not do any explicit memory management

  8. +
  9. Classes are generated using a higher-level abstraction and code generators

  10. +
+

The following sections give some more technical details and explanations for the design choices. +More concrete implementation details can be found in the doxygen documentation.

+
+

Layout of Objects

+

The data model is based on four different kind of objects and layers, namely

+
    +
  1. user visible (physics) classes (e.g. Hit). These act as transparent references to the underlying data,

  2. +
  3. a transient object knowing about all data for a certain physics object, including inter-object relations (e.g. HitObject),

  4. +
  5. a plain-old-data (POD) type holding the persistent object information (e.g. HitData), and

  6. +
  7. a user-visible collection containing the physics objects (e.g. HitCollection).

  8. +
+

These layers are described in the following.

+
+

The User Layer

+

The user visible objects (e.g. Hit) act as light-weight references to the underlying data, and provide the necessary user interface. They come in two flavors, mutable and immutable, where the mutable classes are easily recognizable by their name (e.g. MutableHit). +Mutable classes are implicitly converted to immutable ones if necessary, so that interfaces that require only reading access to the data should always use the immutable classes. Only in cases where explicit mutability of the objects is required should mutable classes appear in interface definitions.

+

For each of the data-members and OneToOneRelations declared in the data model definition, corresponding getters (and setters for the mutable classes) are generated. +For each of the OneToManyRelations and VectorMembers a vector-like interface is provided.

+

With the chosen interface, the code written in C++ and Python looks almost identical, if taking proper advantage of the auto keyword.

+
+
+

The Internal Data Layer

+

The internal objects give access to the object data, i.e. the POD, and the references to other objects. +These objects inherit from podio::ObjBase, which takes care of object identification (podio::ObjectID), and object-ownership. The ObjectID consists of the index of the object and an ID of the collection it belongs to. If the object does not belong to a collection yet, the data object owns the POD containing the real data, otherwise the POD is owned by the respective collection. For details about the inter-object references and their handling within the data objects please see below.

+
+
+

The POD Layer

+

The plain-old-data (POD) contain just the data declared in the Members section of the datamodel definition as well as some bookkeeping data for data types with OneToManyRelations or VectorMembers. Ownership and lifetime of the PODs is managed by the other parts of the infrastructure, namely the data objects and the data collections.

+
+
+

The Collections

+

The collections created serve three purposes:

+
    +
  1. giving access to or creating the data items

  2. +
  3. preparing objects for writing into PODs or preparing them after reading

  4. +
  5. support for the so-called notebook pattern

  6. +
+

When used via the so called factory pattern (i.e. using the create function to create new objects) a collection will return mutable objects. +It is important to note that objects that are “owned” by a collection (i.e. they are either created via create or they are added to the collection via push_back) become invalid and can no longer be used once a collection is cleared.

+
+
+

Vectorization support / notebook pattern

+

As an end-user oriented library, PODIO provides only a limited support for struct-of-arrays (SoA) memory layouts. In the vision, that the data used for heavy calculations is best copied locally, the library provides convenience methods for extracting the necessary information from the collections. More details can be found in the examples section of this document.

+
+
+
+

Handling mutability

+

Depending on the policy of the client of PODIO, data collections may be read-only after creation, or may be altered still. +While the base assumption of PODIO is that once-created collections are immutable once leaving the scope of its creator, +it still allows for explicit unfreezing collections afterwards. +This feature has to handled with care, as it heavily impacts thread-safety.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/doc.html b/v99-99-99/doc.html new file mode 100644 index 000000000..cdd2c25f4 --- /dev/null +++ b/v99-99-99/doc.html @@ -0,0 +1,247 @@ + + + + + + + Introduction — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Introduction

+

PODIO, or plain-old-data I/O, is a C++ library to support the creation and handling of data models in particle physics. It is based on the idea of employing plain-old-data (POD) data structures wherever possible, while avoiding deep-object hierarchies and virtual inheritance. This is to both improve runtime performance and simplify the implementation of persistency services.

+

At the same time it provides the necessary high-level functionality to the physicist, such as support for inter-object relations, and automatic memory-management. In addition, it provides a (ROOT assisted) Python interface. To simplify the creation of efficient data models, PODIO employs code generation from a simple yaml-based markup syntax.

+

To support the usage of modern software technologies, PODIO was written with concurrency in mind and gives basic support for vectorization technologies.

+

This document describes first how to define and create a specific data model, then how to use the created data. Afterwards it will explain the overall design and a few of the technical details of the implementation.

+

Many of the design choices are inspired by previous experience of the LCIO package used for the studies of the international linear collider, and the Gaudi Object Description applied in the LHCb collaboration at the LHC.

+
+
+

Quick-start

+

An up-to-date installation and quick start guide for the impatient user can be found on the PODIO github page.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/doc_title.html b/v99-99-99/doc_title.html new file mode 100644 index 000000000..0f763c0c7 --- /dev/null +++ b/v99-99-99/doc_title.html @@ -0,0 +1,247 @@ + + + + + + + <no title> — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

\begin{titlepage} +\begin{center}

+

\vspace*{2.5cm}

+

\huge +PODIO - the POD I/O Library\ +Design Document v1.0

+

\vspace{0.5cm}

+

\normalsize +30.6.2016

+

\vspace{1cm}

+

Benedikt Hegner (CERN)\ +Frank Gaede (DESY)

+

\end{center} +\end{titlepage}

+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/examples.html b/v99-99-99/examples.html new file mode 100644 index 000000000..affcc4765 --- /dev/null +++ b/v99-99-99/examples.html @@ -0,0 +1,370 @@ + + + + + + + Examples for Supported Interface — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Examples for Supported Interface

+

The following snippets show the support of PODIO for the different use cases as +well as some potential pitfalls. These examples are mainly concerned with how +collections of objects and the objects themselve interact. As such they are +framework agnostic.

+
+

Object Ownership

+

Every data created is either explicitly owned by collections or automatically garbage-collected. There is no need for any new or delete call on user side. +As a general rule: If an object has been added to a collection, the collection +assumes ownership and if the collection goes out of scope all handles that point +to objects in this collection are invalidated as well.

+
+
+

Object Creation and Storage

+

Objects and collections can be created via factories, which ensure proper object ownership:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create(1.4,2.4,3.7,4.2);  // init with values
+    auto hit2 = hits.create(); // default-construct object
+    hit2.energy(42.23);
+
+
+

In addition, individual objects can be created in the free. If they aren’t attached to a collection, they are automatically garbage-collected:

+
    auto hit1 = Hit();
+    auto hit2 = Hit();
+    ...
+    hits.push_back(hit1);
+    ...
+    <automatic deletion of hit2>
+
+
+

In this respect all objects behave like objects in Python.

+
+
+

Object References

+

The library supports the creation of one-to-many relations:

+
    auto hits = HitCollection{};
+    auto hit1 = hits.create();
+    auto hit2 = hits.create();
+    auto clusters = ClusterCollection{};
+    auto cluster = clusters.create();
+    cluster.addHit(hit1);
+    cluster.addHit(hit2);
+
+
+

The references can be accessed via iterators on the referencing objects

+
    for (auto i = cluster.Hits_begin(), \
+         end = cluster.Hits_end(); i!=end; ++i){
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

or via direct accessors

+
    auto size = cluster.Hits_size();
+    auto hit  = cluster.Hits(<aNumber>);
+
+
+

If asking for an entry outside bounds, a std::out_of_range exception is thrown.

+
+
+

Looping through Collections

+

Looping through collections is supported in two ways. Via iterators:

+
    for(auto i = hits.begin(), end = hits.end(); i != end; ++i) {
+      std::cout << i->energy() << std::endl;
+    }
+
+
+

and via direct object access:

+
    for(int i = 0, end = hits.size(), i != end, ++i){
+      std::cout << hit[i].energy() << std::endl;
+    }
+
+
+
+
+

Support for Notebook-Pattern

+

The notebook pattern uses the assumption that it is better to create a small +copy of only the data that are needed for a particular calculation. This +pattern is supported by providing access like

+
    auto x_array = hits.x();   // returning all values
+    auto y_array = hits.y(10); // or only the first 10 elements
+
+
+

The resulting std::vector can then be used in (auto-)vectorizable code. +Passing in a size argument is optional; If no argument is passed all elements will be returned, +if an argument is passed only as many elements as requested will be returned. +If the collection holds less elements than are requested, only as elements as are available will be returned.

+
+
+

podio::Frame container

+

The podio::Frame is the main container for containing and grouping collections +together. It has two main methods:

+
    /// Store a collection
+    template<typename T>
+    const T& put(T&& coll, const std::string& name);
+
+    /// access a collection
+    template<typename T>
+    const& T get(const std::string& name);
+
+
+

Note that for putting collections into the Frame an explicit std::move is +necessary to highlight the change of ownership that happens in this case.

+
+
+

Object Retrieval

+

Collections can be retrieved explicitly:

+
    auto& hits = frame.get<HitCollection>("hits");
+    if (hits.isValid()) { ... }
+
+
+

Or implicitly when following an object reference. In both cases the access to data that has been retrieved is const.

+
+
+

User defined Meta Data

+

Sometimes it is necessary or useful to store additional data that is not directly foreseen in the EDM. +This could be configuration parameters of simulation jobs, or parameter descriptions like cell-ID encoding etc. PODIO currently allows to store such meta data in terms of a GenericParameters class that +holds an arbitrary number of named parameters of type int, float, string or vectors if these. +Meta data can be stored and retrieved from the Frame via the templated putParameter and getParameter methods.

+
+

Python Interface

+

The Reader and Writer classes in the root_io and sio_io submodules +provide all the necessary functionality to read and write event files. An +example of reading files looks like this:

+
    from podio.root_io import Reader
+    reader = Reader("one or many input files")
+    for event in reader.get("events"):
+      hits = store.get("hits")
+      for hit in hits:
+        # ...
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/frame.html b/v99-99-99/frame.html new file mode 100644 index 000000000..958373113 --- /dev/null +++ b/v99-99-99/frame.html @@ -0,0 +1,402 @@ + + + + + + + The Frame concept — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

The Frame concept

+

The podio::Frame is a general data container for collection data of podio generated EDMs. +Additionally, it offers the functionality to store some (limited) data outside of an EDM. +The basic idea of the Frame is to give users of podio the possibility to organize EDM data into logical units and to potentially build a hierarchy of different Frames. +Common examples would be the organisation of data into Events and Runs. +However, it is important to note that podio does really not impose any meaning on any Frame and each Frame is essentially defined by its contents.

+
+

Basic functionality of a Frame

+

The main functionality of a Frame is to store and aggregate EDM collection data and it also offers the possibility to store some generic data alongside. +To ensure thread safety and const-correctness a Frame takes ownership of any data that is put into it and only gives read access to immutable data. +This is mandated by the interface for collection data (simplified here for better readability):

+
struct Frame {
+template<typename CollT>
+const CollT& put(CollT&& coll, const std::string& name);
+
+void put(std::unique_ptr<podio::CollectionBase> coll, const std::string& name);
+
+template<typename CollT>
+const CollT& get(const std::string& name) const;
+
+template<typename T>
+void putParameter(const std::string& name, T value);
+
+template<typename T>
+const T& getParameter(const std::string);
+};
+
+
+

In this case there are two ways to get collection data into the Frame

+
    +
  1. By passing a concrete collection (of type CollT) into the Frame as an rvalue. There are two ways to achieve this, either by passing the return value of a function directly into Frame::put or by explicitly moving it in the call via std::move if you are using a named variable.

  2. +
  3. By passing a std::unique_ptr to a collection. Similar to the first case, this can either be the return value of a function call, or has to be done via std::move (as mandated by the std::unique_ptr interface).

  4. +
+

In both cases, if you passed in a named variable, the user is left with a moved-from object, which has to be in a valid but indefinite state, and cannot be used afterwards. +Some compilers and static code analysis tools are able to detect the accidental usage of moved-from objects.

+

For putting in parameters the basic principle is very similar, with the major difference being, that for trivial types getParameter will actually return by value.

+

For all use cases there is some enable_if machinery in place to ensure that only valid collections and valid parameter types can actually be used. +These checks also make sure that it is impossible to put in collections without handing over ownership to the Frame.

+
+

Usage examples for collection data

+

These are a few very basic usage examples that highlight the main functionality (and potential pitfalls).

+
+

Putting collection data into the Frame

+

In all of the following examples, the following basic setup is assumed:

+
#include "podio/Frame.h"
+
+#include "edm4hep/MCParticleCollection.h" // just to have a concrete example
+
+// create an empty Frame
+auto frame = podio::Frame();
+
+
+

Assuming there is a function that creates an MCParticleCollection putting the return value into the Frame is very simple

+
edm4hep::MCParticleCollection createMCParticles(); // implemented somewhere else
+
+// put the return value of a function into the Frame
+frame.put(createMCParticles(), "particles");
+
+// put the return value into the Frame but keep the const reference
+auto& particles = frame.put(createMCParticles(), "moreParticles");
+
+
+

If working with named variables it is necessary to use std::move to put collections into the Frame. +The Frame will refuse to compile in case a named variable is not moved. +Assuming the same createMCParticles function as above, this looks like the following

+
auto coll = createMCParticles();
+// potentially still modify the collection
+
+// Need to use std::move now that the collection has a name
+frame.put(std::move(coll), "particles");
+
+// Keeping a const reference is also possible
+// NOTE: We are explicitly using a new variable name here
+auto coll2 = createMCParticles();
+auto& particles = frame.put(std::move(coll2), "MCParticles");
+
+
+

At this point only particles is in a valid and defined state.

+
+
+

Getting collection (references) from the Frame

+

Obtaining immutable (const) references to collections stored in the Frame is trivial. +Here we are assuming that the collections are actually present in the Frame.

+
auto& particles = frame.get<edm4hep::MCParticleCollection>("particles");
+
+
+
+
+
+

Usage for Parameters

+

Parameters are using the podio::GenericParameters class behind the scene. +Hence, the types that can be used are int, float, and std::string as well as as std::vectors of those. +For better usability, some overloads for putParameter exist to allow for an in-place construction, like, e.g.

+
// Passing in a const char* for a std::string
+frame.putParameter("aString", "a string value");
+
+// Creating a vector of ints on the fly
+frame.putParameter("ints", {1, 2, 3, 4});
+
+
+
+
+
+

I/O basics and philosophy

+

podio offers all the necessary functionality to read and write Frames. +However, it is not in the scope of podio to organize them into a hierarchy, nor +to maintain such a hierarchy. When writing data to file Frames are written to +the file in the order they are passed to the writer. For reading them back podio +offers random access to stored Frames, which should make it possible to +restore any hierarchy again. The Writers and Readers of podio are supposed to be +run on and accessed by only one single thread.

+
+

Writing a Frame

+

For writing a Frame the writers can ask each Frame for CollectionWriteBuffers for each collection that should be written. +In these buffers the underlying data is still owned by the collection, and by extension the Frame. +This makes it possible to write the same collection with several different writers. +Writers can access a Frame from several different threads, even though each writer is assumed to be on only one thread. +For writing the GenericParameters that are stored in the Frame and for other necessary data, similar access functionality is offered by the Frame.

+
+
+

Reading a Frame

+

When reading a Frame readers do not have to return a complete Frame. +Instead they return a more or less arbitrary type of FrameData that simply has to provide the following public interface.

+
struct FrameData {
+  /// Get a (copy) of the internal collection id table
+  podio::CollectionIDTable getIDTable() const;
+
+  /// Get the buffers to construct the collection with the given name
+  std::optional<podio::CollectionReadBuffers> getCollectionBuffers(const std::string& name);
+
+  /// Get the still available, i.e. yet unpacked, collections from the raw data
+  std::vector<std::string> getAvailableCollections() const;
+
+  /// Get the parameters that are stored in the raw data
+  std::unique_ptr<podio::GenericParameters> getParameters();
+};
+
+
+

A Frame is constructed with a (unique_ptr of such) FrameData and handles everything from there. +Note that the FrameData type of any I/O backend is a free type without inheritance as the Frame constructor is templated on this. +This splitting of reading data from file and constructing a Frame from it later has some advantages:

+
    +
  • Since podio assumes that reading is done single threaded the amount of time that is actually spent in a reader is minimized, as only the file operations need to be done on a single thread. All further processing (potential decompression, unpacking, etc.) can be done on a different thread where the Frame is actually constructed.

  • +
  • It gives different backends the necessary freedom to exploit different optimization strategies and does not force them to conform to an implementation that is potentially detrimental to performance.

  • +
  • It also makes it possible to pass around data from which a Frame can be constructed without having to actually construct one.

  • +
  • Readers do not have to know how to construct collections from the buffers, as they are only required to provide the buffers themselves.

  • +
+
+
+

Schema evolution

+

Schema evolution happens on the CollectionReadBuffers when they are requested from the FrameData inside the Frame. +It is possible for the I/O backend to handle schema evolution before the Frame sees the buffers for the first time. +In that case podio schema evolution becomes a simple check.

+
+
+
+
+

Frame implementation and design

+

One of the main concerns of the Frame is to offer one common, non-templated, interface while still supporting different I/O backends and potentially different policies. +The “classic” approach would be to have an abstract IFrame interface with several implementations that offer the desired functionality (and their small differences). +One problem with that approach is that a purely abstract interface cannot have templated member functions. Hence, the desired type-safe behavior of get and put would be very hard to implement. +Additionally, policies ideally affect orthogonal aspects of the Frame behavior. +Implementing all possible combinations of behaviors through implementations of an abstract interface would lead to quite a bit of code duplication and cannot take advantage of the factorization of the problem. +To solve these problems, we chose to implement the Frame via Type Erasure. +This also has the advantage that the Frame also has value semantics in line with the design of podio.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/genindex.html b/v99-99-99/genindex.html new file mode 100644 index 000000000..3365b3d5c --- /dev/null +++ b/v99-99-99/genindex.html @@ -0,0 +1,238 @@ + + + + + + Index — PODIO documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/index.html b/v99-99-99/index.html new file mode 100644 index 000000000..7199b5c4b --- /dev/null +++ b/v99-99-99/index.html @@ -0,0 +1,294 @@ + + + + + + + Welcome to PODIO’s documentation! — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/objects.inv b/v99-99-99/objects.inv new file mode 100644 index 000000000..35f908624 Binary files /dev/null and b/v99-99-99/objects.inv differ diff --git a/v99-99-99/search.html b/v99-99-99/search.html new file mode 100644 index 000000000..110c8ce72 --- /dev/null +++ b/v99-99-99/search.html @@ -0,0 +1,253 @@ + + + + + + Search — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/v99-99-99/searchindex.js b/v99-99-99/searchindex.js new file mode 100644 index 000000000..ac2a8470f --- /dev/null +++ b/v99-99-99/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["ReleaseNotes", "advanced_topics", "contributing", "datamodel_syntax", "design", "doc", "doc_title", "examples", "frame", "index", "templates", "userdata"], "filenames": ["ReleaseNotes.md", "advanced_topics.md", "contributing.md", "datamodel_syntax.md", "design.md", "doc.md", "doc_title.md", "examples.md", "frame.md", "index.rst", "templates.md", "userdata.md"], "titles": ["v00-17-04", "Advanced Topics", "Contributing to PODIO", "Data Models and Data Model Definitions", "Design and Implementation Details", "Introduction", "<no title>", "Examples for Supported Interface", "The Frame concept", "Welcome to PODIO\u2019s documentation!", "Changing / creating new templates", "Writing extra data outside an EDM"], "terms": {"2023": 0, "tmadlen": 0, "pr": [0, 2], "527": 0, "split": [0, 8, 10], "classgener": 0, "base": [0, 4, 5, 11], "class": [0, 1, 4, 7, 8, 9, 10, 11], "mixin": 0, "two": [0, 1, 3, 4, 7, 8, 10], "specif": [0, 5, 10], "c": [0, 1, 3, 4, 5, 10], "julia": 0, "code": [0, 1, 3, 4, 5, 7, 8], "gener": [0, 1, 3, 4, 5, 7, 8, 11], "onli": [0, 1, 2, 3, 4, 7, 8, 10], "deal": 0, "languag": [0, 10], "need": [0, 1, 3, 7, 8, 10], "instanti": [0, 10], "configur": [0, 7, 10], "correct": [0, 8, 10], "reader": [0, 1, 7, 8], "podio_class_gener": [0, 1, 10], "py": [0, 1, 10], "main": [0, 1, 7, 8, 10], "script": 0, "depend": [0, 4, 10], "desir": [0, 8], "slightli": [0, 10], "cleanup": 0, "membervari": 0, "declutt": 0, "its": [0, 1, 4, 8], "__init__": 0, "method": [0, 1, 4, 7, 10, 11], "bit": [0, 1, 3, 8], "530": 0, "remov": 0, "read": [0, 2, 4, 7, 10], "deprec": 0, "old": [0, 3, 4, 5], "style": 0, "format": [0, 1, 3, 10], "compon": [0, 9], "definit": [0, 4, 9, 10], "yaml": [0, 1, 3, 5, 9], "file": [0, 2, 3, 7, 8, 9], "485": 0, "eventstor": 0, "function": [0, 1, 3, 4, 5, 7, 9, 10, 11], "announc": 0, "429": 0, "529": 0, "switch": [0, 2], "relat": [0, 1, 3, 4, 5, 7, 10], "rang": [0, 11], "test": [0, 1, 2], "us": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11], "frame": [0, 9, 11], "i": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11], "o": [0, 5, 6, 9], "06": 0, "526": 0, "edm4hep": [0, 1, 8], "workflow": 0, "an": [0, 1, 4, 5, 7, 8, 9, 10], "lcg": 0, "stack": 0, "recent": 0, "enough": [0, 10, 11], "version": [0, 1, 10, 11], "cmake": [0, 1, 3, 10], "necessari": [0, 1, 3, 4, 5, 7, 8, 10, 11], "after": [0, 1, 2, 4, 10], "key4hep": 0, "235": 0, "jmcarcel": 0, "523": 0, "comment": [0, 2, 3], "name": [0, 1, 2, 3, 4, 7, 8, 10], "line": [0, 8], "number": [0, 3, 7, 11], "It": [0, 1, 3, 4, 5, 7, 8, 10, 11], "": [0, 1, 3, 8, 10], "veri": [0, 3, 8], "unlik": 0, "remain": 0, "up": [0, 2, 3, 5, 10], "date": [0, 2, 5], "when": [0, 1, 2, 3, 4, 7, 8, 10], "either": [0, 3, 4, 7, 8, 10], "content": [0, 8, 10], "chang": [0, 2, 7, 9], "521": 0, "do": [0, 3, 4, 8], "import": [0, 3, 4, 7, 8, 10], "root": [0, 1, 3, 5, 10], "podio": [0, 1, 3, 4, 5, 6, 8, 10, 11], "dump": 0, "help": [0, 1], "otherwis": [0, 1, 3, 4], "can": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "take": [0, 1, 3, 4, 8, 10], "while": [0, 4, 5, 8], "system": [0, 1], "print": 0, "514": 0, "introduc": 0, "maybesharedptr": 0, "manag": [0, 4, 5, 10], "obj": [0, 10], "user": [0, 3, 5, 8, 9, 10, 11], "face": [0, 10], "handl": [0, 3, 5, 7, 8, 9], "thi": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "control": [0, 10], "block": [0, 10], "object": [0, 1, 5, 8, 9, 10, 11], "distinct": 0, "entiti": 0, "potenti": [0, 7, 8, 10], "differ": [0, 4, 7, 8, 10, 11], "lifetim": [0, 4], "which": [0, 1, 3, 4, 7, 8, 10, 11], "allow": [0, 2, 3, 4, 7, 8, 10], "fix": [0, 3, 11], "174": 0, "492": 0, "increas": 0, "size": [0, 3, 7, 10, 11], "factor": [0, 8], "sinc": [0, 1, 8, 11], "thei": [0, 1, 4, 7, 8, 10], "ar": [0, 1, 3, 4, 5, 7, 8, 10, 11], "now": [0, 2, 8, 10], "effect": [0, 3], "pointer": [0, 1], "instead": [0, 3, 8, 10], "one": [0, 1, 2, 3, 7, 8, 10], "even": [0, 8], "initi": [0, 1, 10], "case": [0, 1, 3, 4, 7, 8, 11], "obtain": [0, 1, 8], "from": [0, 2, 4, 5, 7, 9, 10], "collect": [0, 1, 9, 10], "objbas": [0, 4], "make": [0, 1, 2, 3, 8, 10, 11], "objectid": [0, 1, 4], "member": [0, 1, 4, 8, 10], "constructor": [0, 8, 10], "privat": 0, "have": [0, 1, 2, 3, 8, 10, 11], "access": [0, 4, 7, 8, 10, 11], "raw": [0, 1, 8], "ani": [0, 1, 3, 4, 7, 8, 11], "static": [0, 1, 8], "makeempti": 0, "order": [0, 1, 8], "creat": [0, 2, 3, 4, 5, 7, 8, 9, 11], "empti": [0, 1, 8, 10], "also": [0, 1, 3, 8, 10, 11], "intern": [0, 5, 8], "unpersist": 0, "enabl": [0, 1], "more": [0, 1, 3, 4, 8], "exist": [0, 2, 8, 9], "sanit": 0, "ha": [0, 1, 3, 4, 7, 8], "becom": [0, 4, 8, 10], "possibl": [0, 1, 3, 4, 5, 8, 10, 11], "so": [0, 1, 2, 3, 4, 10], "ananya": 0, "gupta": 0, "473": 0, "ad": [0, 4, 7, 9, 11], "support": [0, 1, 5, 8, 9, 10], "python": [0, 1, 4, 5, 10], "interfac": [0, 1, 4, 5, 8, 9, 10, 11], "implement": [0, 1, 3, 5, 9, 10], "new": [0, 2, 3, 4, 7, 8, 9], "design": [0, 5, 6, 9, 10], "structur": [0, 1, 4, 5], "default": [0, 1, 3, 7, 10], "paramet": [0, 3, 7], "abstract": [0, 4, 8], "type": [0, 1, 4, 7, 8, 9, 10], "builtin": [0, 3, 10], "_sort_components_and_datatyp": 0, "perform": [0, 5, 8], "topolog": 0, "sort": 0, "datatyp": [0, 1, 3], "_has_static_arrays_import": 0, "check": [0, 3, 8], "arrai": [0, 3, 4, 10], "lang": 0, "l": 0, "program": 0, "argument": [0, 1, 3, 7, 10], "specifi": [0, 3], "current": [0, 1, 3, 7, 10, 11], "choic": [0, 3, 4, 5], "cpp": [0, 10], "upstream": [0, 9], "edm": [0, 3, 7, 8, 9, 10], "unit": [0, 3, 8], "suit": 0, "cover": 0, "exampl": [0, 3, 4, 9], "data": [0, 5, 9, 10], "model": [0, 1, 4, 5, 9, 10], "document": [0, 2, 4, 5, 6, 10], "enable_julia": 0, "toggl": 0, "option": [0, 1, 7, 8, 9, 10], "By": [0, 8, 10], "off": 0, "520": 0, "add": [0, 1, 2, 3, 10, 11], "error": [0, 11], "messag": 0, "std": [0, 1, 7, 8, 10, 11], "bad_function_cal": 0, "show": [0, 7], "stacktrac": 0, "quit": [0, 8], "uninform": 0, "519": 0, "getter": [0, 4, 10], "return": [0, 1, 4, 7, 8, 10], "valu": [0, 1, 3, 7, 8, 10, 11], "keep": [0, 1, 2, 8, 11], "const": [0, 1, 3, 7, 8, 11], "refer": [0, 1, 4, 9, 10, 11], "all": [0, 1, 3, 4, 7, 8, 10], "other": [0, 1, 3, 4, 8, 10], "518": 0, "488": 0, "bind": 0, "rntupl": 0, "writer": [0, 1, 7, 8], "understand": 0, "miss": 0, "storag": [0, 1, 3, 9, 10], "datamodel": [0, 1, 4, 9, 10], "513": 0, "rootframewrit": 0, "writefram": 0, "rootntuplewrit": 0, "ensur": [0, 7, 8], "consist": [0, 4], "given": [0, 3, 8], "categori": 0, "If": [0, 3, 4, 7, 8, 10], "inconsist": [0, 1], "found": [0, 4, 5], "except": [0, 7], "thrown": [0, 7], "befor": [0, 1, 8, 10], "might": [0, 3, 11], "lead": [0, 1, 8, 11], "crash": 0, "unread": 0, "382": 0, "refactor": 0, "map": [0, 1, 10], "track": 0, "set": [0, 1, 3, 11], "kept": [0, 2, 11], "511": 0, "decoupl": 0, "tool": [0, 8], "rest": 0, "folder": 0, "call": [0, 1, 2, 3, 4, 7, 8, 10], "podio_gen": [0, 10], "transpar": [0, 4], "time": [0, 5, 8], "neglig": 0, "again": [0, 1, 2, 3, 8], "becaus": 0, "we": [0, 1, 2, 8, 10, 11], "don": [0, 10], "t": [0, 1, 7, 8, 10], "load": [0, 1, 10], "librari": [0, 1, 3, 4, 5, 6, 7], "unnecessarili": 0, "longer": [0, 4], "simplifi": [0, 5, 8], "test_util": 0, "move": [0, 7, 8, 11], "write": [0, 4, 7, 9, 10], "where": [0, 1, 3, 4, 8, 10, 11], "belong": [0, 4], "sio": [0, 1, 10], "510": 0, "legaci": 0, "extra": [0, 3, 9, 10], "wa": [0, 1, 5], "being": [0, 1, 3, 8, 10], "pass": [0, 1, 3, 7, 8, 10], "example_fram": 0, "almost": [0, 4, 11], "alwai": [0, 4, 10], "anoth": [0, 1, 3], "hard": [0, 8], "notic": 0, "509": 0, "clang": [0, 10], "significantli": 0, "slower": 0, "run": [0, 8, 9, 10], "508": 0, "externaldata": 0, "modul": [0, 10], "let": 0, "care": [0, 1, 4, 10], "download": 0, "hash": 0, "In": [0, 1, 2, 3, 4, 5, 7, 8, 10, 11], "addit": [0, 1, 3, 5, 7, 10, 11], "local": [0, 4], "store": [0, 3, 7, 8, 10, 11], "dexternaldata_object_stor": 0, "path": 0, "them": [0, 3, 4, 8, 10], "build": [0, 1, 3, 8], "scratch": 0, "won": 0, "507": 0, "copi": [0, 2, 3, 4, 7, 8], "dumpmodel": 0, "directori": [0, 3, 10], "some": [0, 2, 3, 4, 7, 8, 9, 10], "subdirectori": [0, 10], "try": [0, 3, 11], "find": 0, "look": [0, 1, 4, 7, 8, 10], "abov": [0, 3, 8, 10, 11], "doesn": [0, 1], "fail": 0, "505": 0, "bump": 0, "pylint": 0, "ci": 0, "2": [0, 6, 7, 8], "7": [0, 7], "502": 0, "deletebuff": 0, "popul": [0, 1], "collectionreadbuff": [0, 1, 8], "dispos": 0, "unconsum": 0, "buffer": [0, 1, 8], "leak": 0, "describ": [0, 1, 3, 4, 5], "500": 0, "rootframedata": 0, "clean": 0, "desctruct": 0, "sure": [0, 2, 8, 10], "delet": [0, 7], "collectiondata": [0, 10], "wouter": 0, "deconinck": 0, "503": 0, "instal": [0, 1, 5], "vi": 0, "497": 0, "podio_python_dir": 0, "top": [0, 10], "level": [0, 4, 5, 10], "cmakelist": 0, "build_test": 0, "496": 0, "oper": [0, 1, 8], "neg": 0, "comparison": 0, "http": [0, 2], "github": [0, 2, 5], "com": [0, 2], "aidasoft": [0, 2], "pull": [0, 2], "493": 0, "id": [0, 1, 4, 7, 8], "podioobjectid": 0, "29": 0, "mutabl": [0, 1, 3, 9, 10], "unsign": [0, 10, 11], "latter": 0, "useless": 0, "412": 0, "438": 0, "ostream": 0, "22": 0, "juraj": 0, "smiesko": 0, "491": 0, "warn": 0, "request": [0, 2, 7, 8], "entri": [0, 7, 10], "present": [0, 1, 8, 10, 11], "490": 0, "bug": 0, "built": [0, 3], "without": [0, 3, 8, 10], "489": 0, "486": 0, "untrack": 0, "properli": 0, "whether": [0, 3, 10], "been": [0, 1, 7], "collectionidt": [0, 8], "collectionid": 0, "signal": 0, "known": [0, 10], "tabl": [0, 8], "break": 0, "you": [0, 1, 2, 8, 11], "avoid": [0, 1, 5], "lookup": 0, "twice": 0, "subsequ": 0, "retriev": [0, 9], "overli": 0, "share": [0, 1], "rootntupleread": 0, "uncov": 0, "resolv": 0, "18": 0, "484": 0, "feel": 0, "benedikt": [0, 6], "hegner": [0, 6], "483": 0, "clarifi": 0, "schema": 0, "482": 0, "renam": 0, "macro": [0, 1, 3, 10], "createbuff": 0, "create_buff": 0, "481": 0, "execut": 0, "target": 0, "unittest": 0, "unittest_podio": 0, "collis": 0, "rel": [0, 1], "common": [0, 8, 10], "480": 0, "thoma": 0, "madlen": 0, "472": 0, "schemata": 0, "across": 0, "provid": [0, 1, 2, 3, 4, 5, 7, 8, 10], "syntax": [0, 3, 5], "intent": 0, "evolut": 0, "backend": [0, 1, 3, 8, 10], "includ": [0, 1, 3, 4, 8, 10, 11], "infrastructur": [0, 4], "futur": 0, "477": 0, "nlohmann": [0, 1], "json_fwd": 0, "hpp": [0, 1], "header": [0, 1, 3, 10], "reduc": 0, "unnecessari": 0, "templat": [0, 7, 8, 9], "475": 0, "478": 0, "collectionbas": [0, 8], "iter": [0, 7], "dmitri": 0, "kalinkin": 0, "465": 0, "typedef": 0, "referenc": [0, 7], "collection_typ": 0, "convers": [0, 1], "reachabl": 0, "objectcollect": 0, "value_typ": 0, "The": [0, 3, 7, 9, 10, 11], "reach": 0, "via": [0, 1, 3, 4, 7, 8, 11], "mutable_typ": 0, "30": [0, 6], "471": 0, "branch": [0, 2], "index": [0, 1, 4, 11], "e": [0, 1, 2, 4, 8, 10, 11], "behavior": [0, 8], "releas": 0, "seri": 0, "andr": 0, "sailer": 0, "469": 0, "updat": [0, 2], "requir": [0, 1, 3, 4, 8, 10], "catch2": 0, "3": [0, 1, 7, 8, 11], "4": [0, 7, 8], "20": 0, "clang16": 0, "el9": 0, "alma9": 0, "clang12": 0, "cs7": 0, "disabl": 0, "tabul": 0, "avail": [0, 1, 3, 7, 8, 9], "445": 0, "part": [0, 4, 10], "07": 0, "26": 0, "463": 0, "vector": [0, 1, 5, 7, 8, 10, 11], "vectormemb": [0, 1, 4, 10], "actual": [0, 1, 3, 8, 10], "subset": [0, 11], "work": [0, 8, 11], "462": 0, "reproduc": 0, "origin": [0, 1, 2], "issu": 0, "25": 0, "461": 0, "rootframeread": [0, 1], "master": [0, 2], "447": 0, "wrapper": 0, "around": [0, 8], "put": [0, 1, 7, 10, 11], "explicitli": [0, 3, 7, 8], "cppyi": 0, "gbl": 0, "432": 0, "457": 0, "setup": [0, 8], "explicit": [0, 4, 7], "enable_sio": 0, "rather": [0, 3, 10], "than": [0, 3, 7, 10], "presenc": [0, 10], "456": 0, "cach": 0, "455": 0, "cmake_binary_dir": 0, "project_binary_dir": 0, "439": 0, "framecategori": 0, "h": [0, 1, 8, 10, 11], "few": [0, 1, 3, 5, 8], "convent": 0, "hardcod": 0, "string": [0, 1, 3, 7, 8, 10], "variabl": [0, 8, 10], "454": 0, "cmake_": 0, "sourc": 0, "bin": 0, "_dir": 0, "project_": 0, "452": 0, "extend": [0, 9], "pre": [0, 9, 10], "processor": 0, "condit": 0, "to_json": 0, "visibl": [0, 4], "rootcl": 0, "interpret": 0, "435": 0, "450": 0, "descript": [0, 3, 5, 7, 10], "author": [0, 3], "field": [0, 1, 2, 10, 11], "449": 0, "commit": [0, 2, 9], "nightli": 0, "come": [0, 1, 4], "abl": [0, 8, 11], "395": 0, "minor": 0, "complaint": 0, "newer": 0, "tidi": 0, "anyth": 0, "essenti": [0, 1, 8, 10], "448": 0, "lcio": [0, 5], "datalayout": 0, "untouch": 0, "unbuilt": 0, "year": 0, "446": 0, "finish": 0, "sioframewrit": 0, "non": [0, 8], "mandatori": 0, "see": [0, 1, 2, 4, 8, 10], "442": 0, "437": 0, "modifi": [0, 8], "pars": [0, 10], "incorpor": 0, "436": 0, "27": 0, "413": 0, "schemaevolut": 0, "hold": [0, 4, 7], "offer": [0, 1, 8, 11], "evolvebuff": 0, "doe": [0, 3, 4, 8], "hook": 0, "framedata": [0, 8], "23": [0, 7], "434": 0, "433": 0, "rootlegacyread": 0, "428": 0, "sever": [0, 8], "less": [0, 7, 8], "topic": [0, 9], "sub": 0, "txt": 0, "commonli": 0, "podiotest": 0, "g": [0, 1, 2, 4, 8, 10, 11], "environ": 0, "config": 0, "427": 0, "delai": 0, "long": [0, 10, 11], "mainli": [0, 1, 7, 10], "quicker": 0, "respons": [0, 1, 3, 11], "flag": [0, 3, 10], "displai": 0, "alphabet": 0, "automat": [0, 1, 3, 5, 7], "adjust": 0, "column": 0, "width": [0, 3, 11], "fit": 0, "packag": [0, 3, 5, 10], "402": 0, "public": [0, 1, 3, 8], "constexpr": [0, 1], "char": [0, 8, 10], "getxxxnam": 0, "string_view": [0, 1], "reli": 0, "typenam": [0, 7, 8], "full": [0, 10], "gettypenam": 0, "valuetypenam": 0, "immut": [0, 3, 4, 8, 10], "getvaluetypenam": 0, "datatypenam": 0, "pod": [0, 1, 3, 5, 6, 10], "getdatatypenam": 0, "podio_sioblock_path": 0, "use_external_catch2": 0, "auto": [0, 1, 4, 7, 8, 11], "suitabl": 0, "fall": 0, "back": [0, 8], "fetch": [0, 2], "own": [0, 2, 3, 4, 7, 8], "426": 0, "ld_library_path": 0, "robust": 0, "incompat": 0, "425": 0, "skip_catch_discoveri": 0, "skip": 0, "discoveri": 0, "catch": 0, "unsuit": 0, "too": 0, "much": 0, "underli": [0, 4, 8, 11], "murmurhash": 0, "423": 0, "easier": [0, 1], "restructur": 0, "produc": [0, 10], "prior": 0, "421": 0, "appear": [0, 4], "insensit": 0, "written": [0, 1, 4, 5, 8, 11], "405": 0, "legibl": 0, "valid": [0, 1, 3, 8, 10], "improv": [0, 5], "interoper": 0, "rdatafram": 0, "169": 0, "follow": [0, 1, 2, 3, 4, 7, 8, 10, 11], "_": 0, "resp": [0, 3], "taken": 0, "singl": [0, 1, 8, 10], "_objidx": 0, "disambigu": 0, "normal": 0, "directli": [0, 1, 3, 7, 8, 10], "everyth": [0, 2, 8], "should": [0, 1, 2, 3, 4, 8, 10], "422": 0, "small": [0, 2, 7, 8], "could": [0, 7], "element": [0, 1, 7, 11], "420": 0, "insid": [0, 8], "rootread": 0, "segment": 0, "violat": 0, "417": 0, "multipl": [0, 1, 3], "411": 0, "api": 0, "open": 0, "418": 0, "bring": 0, "getmap": 0, "genericparamet": [0, 7, 8], "alreadi": [0, 10], "dd4hep": 0, "1112": 0, "mark": 0, "getxyzmap": 0, "brief": 0, "transit": 0, "period": 0, "These": [0, 3, 4, 7, 8, 10], "415": 0, "19": 0, "416": 0, "select": [0, 3, 10], "rule": [0, 7], "anymor": 0, "setter": [0, 4, 10], "410": 0, "squar": 0, "414": 0, "userdatacollect": [0, 11], "caus": 0, "first": [0, 3, 5, 7, 8], "394": 0, "collectionbufferfactori": 0, "factori": [0, 4, 7], "throughout": 0, "createschemaevolvablebuff": 0, "minimum": 0, "schema_vers": 0, "1": [0, 7, 8], "schemavers": 0, "datamodeldefinit": [0, 1], "package_nam": [0, 1, 10], "meta": [0, 1, 9], "propag": 0, "inform": [0, 1, 4, 9, 11], "place": [0, 3, 8, 10], "sioblock": [0, 10], "appropri": [0, 10], "christoph": 0, "dilk": 0, "408": 0, "between": 0, "accessor": [0, 7], "21": 0, "387": 0, "round": 0, "trip": 0, "extens": [0, 8], "400": 0, "sioframedata": 0, "getavailablecollect": [0, 8], "seg": 0, "fault": 0, "previous": 0, "399": 0, "podio_enable_sio": 0, "target_compile_definit": [0, 1], "podiosioio": 0, "get": [0, 1, 3, 7, 11], "well": [0, 1, 3, 4, 7, 8, 10], "featur": [0, 1, 2, 4, 9, 10], "scope": [0, 4, 7, 8], "target_link_librari": [0, 1], "paul": 0, "gessing": 0, "befurt": 0, "398": 0, "reject": 0, "397": 0, "properti": [0, 1], "396": 0, "341": 0, "metadata": 0, "w": 0, "simpl": [0, 3, 5, 8], "heurist": 0, "identifi": 0, "omiss": 0, "mistak": 0, "limit": [0, 3, 4, 8, 9], "backward": 0, "compat": [0, 3], "info": 0, "391": 0, "390": 0, "later": [0, 3, 8], "389": 0, "gitignor": 0, "358": 0, "emb": 0, "json": 0, "core": [0, 1], "contain": [0, 1, 3, 4, 8, 9, 10], "liter": [0, 1], "encod": [0, 1, 7], "regist": [0, 1], "newli": 0, "datamodelregistri": 0, "awar": [0, 10], "result": [0, 1, 3, 7], "done": [0, 2, 3, 8], "framewrit": 0, "give": [0, 1, 4, 5, 8, 10, 11], "roundtrip": 0, "compar": 0, "intend": [0, 1], "advanc": [0, 9], "detail": [0, 3, 5, 9, 10], "384": 0, "378": 0, "favor": 0, "372": 0, "doubl": [0, 3, 10, 11], "A": [0, 1, 3, 8, 10], "similar": [0, 8, 10, 11], "thing": 0, "ilcsoft": 0, "143": 0, "event": [0, 3, 7, 8, 11], "weight": [0, 4], "precis": [0, 1], "380": 0, "getparamet": [0, 7, 8], "getgenericparametersforwrit": 0, "exact": 0, "same": [0, 1, 3, 5, 8, 11], "easili": [0, 1, 4, 10], "offici": 0, "channel": 0, "replac": 0, "usag": [0, 1, 3, 5, 9], "getparameterkei": 0, "kei": [0, 1, 10], "377": 0, "visual": 0, "convert": [0, 1, 4], "graph": 0, "376": 0, "375": 0, "podio_vers": 0, "preprocessor": 0, "usabl": [0, 1, 8], "context": [0, 1], "374": 0, "constant": 0, "someth": [0, 1], "podio_build_vers": 0, "373": 0, "short": [0, 10], "output": [0, 1, 3, 10], "nathan": 0, "brei": 0, "369": 0, "putparamet": [0, 7, 8], "inlin": [0, 3], "linker": 0, "364": 0, "trigger": 0, "push": [0, 2], "368": 0, "podio_relax_pyv": 0, "relax": 0, "match": 0, "major": [0, 8, 10], "363": 0, "util": [0, 1], "defin": [0, 1, 5, 8, 9, 10], "cc": [0, 10], "sioutil": 0, "siowrit": 0, "343": 0, "defaultdict": 0, "hand": [0, 8], "roll": 0, "361": 0, "basic": [0, 5, 9, 10, 11], "319": 0, "355": 0, "365": 0, "2022": 0, "362": 0, "keyword": [0, 4], "onward": 0, "360": 0, "log": 0, "absolut": 0, "333": 0, "unique_ptr": [0, 8], "mutex": 0, "list": [0, 1, 3, 10, 11], "declar": [0, 3, 4, 10], "like": [0, 1, 2, 3, 4, 7, 8], "nvcc": 0, "mayb": 0, "yet": [0, 2, 4, 8, 11], "k4clue": 0, "34": 0, "dtag": 0, "podio_set_rpath": 0, "rpath": 0, "runpath": 0, "binari": [0, 1], "pin": 0, "ubuntu": 0, "runner": 0, "accident": [0, 8], "go": [0, 10], "out": [0, 1, 7], "sync": [0, 11], "359": 0, "356": 0, "readm": 0, "argpars": 0, "choos": [0, 2], "346": 0, "tp": 0, "apach": 0, "0": [0, 6, 7, 11], "licens": 0, "facilit": 0, "integr": 0, "experi": [0, 5], "357": 0, "prefix": [0, 3, 10], "onto": 0, "env": 0, "sh": 0, "354": 0, "posix": 0, "compliant": 0, "shell": 0, "bash": 0, "tab": 0, "space": 0, "mix": 0, "indent": 0, "root_include_path": 0, "351": 0, "were": [0, 1], "consid": [0, 1, 11], "implicit": 0, "boolean": 0, "caught": [0, 3], "against": [0, 1, 3], "nullptr": 0, "guard": 0, "correspond": [0, 1, 3, 4, 10], "344": 0, "339": 0, "intact": 0, "345": 0, "siolegacyread": 0, "287": 0, "349": 0, "nest": [0, 10], "348": 0, "adapt": 0, "went": 0, "unnot": 0, "previou": [0, 5], "root_io": [0, 7], "sio_io": [0, 7], "each": [0, 1, 4, 8, 10, 11], "somewher": [0, 1, 8], "untyp": 0, "framedatat": 0, "inspect": [0, 1], "reorgan": 0, "usual": [0, 11], "close": [0, 4], "addition": [0, 1, 8], "dictionari": [0, 10], "342": 0, "migrat": 0, "action": 0, "checkout": [0, 2], "v3": 0, "advis": 0, "clone": [0, 2], "bodi": 0, "327": 0, "typo": 0, "24": 0, "340": 0, "335": 0, "cvmf": 0, "view": 0, "latest": 0, "pick": [0, 10], "group": [0, 7], "lcg_102": 0, "337": 0, "notebook": [0, 9], "pattern": [0, 1, 9], "332": 0, "signatur": [0, 3, 10], "336": 0, "podioconfig": 0, "silenc": 0, "about": [0, 1, 3, 4], "polici": [0, 4, 8], "cmp00012": 0, "compil": [0, 1, 3, 8, 11], "step": [0, 1], "334": 0, "attempt": 0, "stream": [0, 10], "transient": [0, 4], "323": 0, "stdout": [0, 1], "overview": [0, 10], "over": [0, 8, 11], "d": 0, "To": [0, 1, 3, 5, 8, 11], "pythoneventstor": 0, "separ": [0, 3], "podiopythonstor": 0, "side": [0, 3, 7], "gotoev": 0, "iread": 0, "correctli": [0, 1], "sioread": 0, "thread": [0, 4, 8, 9], "safe": [0, 8], "final": 0, "plan": [0, 1], "stabl": 0, "still": [0, 4, 8, 10], "turn": [0, 1], "better": [0, 7, 8], "wai": [0, 3, 7, 8], "For": [0, 1, 2, 3, 4, 8, 11], "consider": [0, 4], "pleas": [0, 2, 4, 10], "consult": 0, "start": [0, 9], "unchang": 0, "distant": 0, "312": 0, "podio_json_output": [0, 1], "link": [0, 1, 3], "318": 0, "podio_add_root_io_dict": 0, "bugfix": 0, "output_fold": 0, "equal": [0, 1], "dir": 0, "selection_xml": 0, "317": 0, "unrel": 0, "prototyp": [0, 3, 10], "aim": 0, "eventu": 0, "redefin": 0, "memori": [0, 1, 4, 5], "316": 0, "maco": 0, "host": 0, "fuse": 0, "consequ": 0, "315": 0, "is_trivial_typ": [0, 10], "engin": [0, 10], "behav": [0, 7], "expect": 0, "exactli": [0, 1], "opposit": 0, "what": [0, 10, 11], "would": [0, 1, 2, 3, 8], "intuit": 0, "288": 0, "283": 0, "init": [0, 7], "apart": 0, "mean": [0, 1, 2, 8, 10, 11], "python2": 0, "276": 0, "seem": 0, "valentin": 0, "volkl": 0, "307": 0, "hotfix": 0, "290": 0, "revert": [0, 2], "unknown": 0, "symbol": 0, "podiodict": 0, "282": 0, "podio_use_clang_format": 0, "autodiscoveri": 0, "downstream": [0, 2], "discov": 0, "accordingli": 0, "ON": 0, "stage": 0, "305": 0, "upcom": 0, "294": 0, "siocollectionidtableblock": 0, "build_vers": 0, "sioversionblock": 0, "304": 0, "unreleas": 0, "303": 0, "soumil": 0, "296": 0, "instruct": 0, "how": [0, 5, 7, 8, 10], "295": 0, "prepareforwrit": [0, 1], "286": 0, "point": [0, 7, 8, 10], "reset": 0, "kalina": 0, "stoimenova": 0, "301": 0, "text": 0, "300": [0, 1], "python3": 0, "299": 0, "unset": 0, "detect": [0, 8], "293": 0, "obsolet": 0, "285": 0, "291": 0, "obj_needs_destructor": 0, "274": 0, "jinja2": [0, 10], "process": [0, 1, 8, 10], "262": 0, "untempl": 0, "ones": [0, 2, 4, 10], "supportedgenericdatatyp": 0, "tupl": 0, "those": [0, 3, 8], "typehelp": 0, "helper": 0, "277": 0, "remot": [0, 2], "input": [0, 1, 7], "everi": [0, 1, 7], "284": 0, "per": 0, "280": 0, "color": 0, "diff": 0, "diffutil": 0, "254": 0, "guidelin": [0, 2], "podio_generate_datamodel": [0, 3], "both": [0, 3, 5, 7, 8], "279": 0, "newest": 0, "clash": 0, "31": 0, "253": 0, "lint": 0, "end": [0, 4, 6, 7, 10], "trail": 0, "whitespac": 0, "flake8": 0, "ilcdirac": 0, "270": 0, "duplic": [0, 3, 8], "overload": [0, 8, 10], "269": 0, "broke": 0, "265": 0, "gcc11": 0, "dev": 0, "261": 0, "accept": 0, "integ": [0, 3, 11], "placido": 0, "fernandez": 0, "declara": 0, "259": 0, "filter": 0, "regex": 0, "complet": [0, 3, 8], "238": 0, "podiovers": 0, "three": [0, 1, 3, 4], "uint16_t": [0, 11], "patch": 0, "plu": 0, "expr": 0, "last": 0, "tag": 0, "64": [0, 11], "podio_": 0, "_version": 0, "extract": [0, 4], "reorder": 0, "section": [0, 1, 3, 4], "230": 0, "28": 0, "256": 0, "ignor": 0, "happen": [0, 3, 7, 8], "persist": [0, 4, 5, 9], "onc": [0, 4], "tri": 0, "isavail": 0, "observ": 0, "somewhat": 0, "setrefer": 0, "mistakenli": 0, "op": [0, 1], "mechan": 0, "restor": [0, 8], "obvious": 0, "252": 0, "wherev": [0, 5], "assign": 0, "thank": 0, "ownership": [0, 4, 8, 9], "ed": [0, 4], "251": 0, "had": 0, "onetoonerel": [0, 1, 3, 4, 10], "onetomanyrel": [0, 1, 3, 4, 10], "249": 0, "use_sanit": 0, "curent": 0, "address": 0, "withorigin": 0, "undefin": 0, "mutual": 0, "exlus": 0, "label": 0, "failur": 0, "force_run_all_test": 0, "overrid": 0, "develop": [0, 2], "209": 0, "mention": [0, 10, 11], "2021": 0, "245": 0, "render": 0, "241": 0, "prepar": [0, 4], "205": 0, "explictli": 0, "hit": [0, 4, 7, 11], "mutablehit": [0, 4], "discuss": 0, "204": 0, "reason": [0, 1, 3], "obviou": 0, "mutat": 0, "239": 0, "237": 0, "drop": 0, "colon": [0, 3], "236": 0, "problem": [0, 8], "spack": 0, "234": 0, "cstdint": [0, 3], "232": 0, "197": 0, "merg": [0, 2], "reconstruct": 0, "collectioninfotyp": 0, "simpli": [0, 1, 8], "assum": [0, 1, 7, 8], "proper": [0, 1, 4, 7], "didn": 0, "231": 0, "regress": 0, "223": 0, "213": 0, "224": 0, "219": 0, "214": 0, "frank": [0, 6], "gaed": [0, 6], "fundament": [0, 11], "basic_typ": 0, "bool": [0, 10], "usrint": 0, "uint64_t": [0, 11], "userint": 0, "usrdoubl": 0, "userdoubl": 0, "int": [0, 3, 7, 8, 10], "resiz": [0, 11], "myint": 0, "iu": 0, "nd": 0, "100": 0, "42": [0, 7], "114": 0, "effici": [0, 3, 5], "podio_generated_fil": 0, "glob": 0, "217": 0, "destructor": 0, "swap": 0, "idiom": 0, "namespac": [0, 1, 10], "216": 0, "211": 0, "parallel": [0, 1, 11], "ctest": 0, "jn": 0, "210": 0, "just": [0, 3, 4, 8, 10, 11], "earlier": [0, 2], "restrict": 0, "dict": [0, 1, 10], "exit": 0, "backtrac": 0, "collectionbuff": 0, "expos": [0, 4], "206": 0, "extern": [0, 3], "ship": [0, 1], "201": 0, "count": 0, "heap": 0, "free": [0, 7, 8], "200": 0, "195": 0, "circular": 0, "self": 0, "194": 0, "relationrang": 0, "akin": 0, "193": 0, "192": 0, "191": 0, "treat": 0, "186": 0, "int16_t": 0, "int32_t": 0, "int64_t": 0, "uint32_t": 0, "realli": [0, 8, 11], "189": 0, "read_and_writ": 0, "concurr": [0, 5], "spuriou": 0, "180": 0, "logic": [0, 8], "rootwrit": 0, "degrad": 0, "v6": 0, "our": 0, "affect": [0, 8], "badli": 0, "profit": 0, "182": 0, "statu": 0, "185": 0, "184": 0, "asciiwrit": 0, "183": 0, "export": 0, "marko": 0, "petric": 0, "181": 0, "scan": 0, "175": 0, "fulli": [0, 10], "qualifi": [0, 10], "168": 0, "issuecom": 0, "770751871": 0, "romanov": 0, "173": 0, "io": 0, "handler": 0, "171": 0, "153": 0, "170": 0, "enforc": 0, "werror": 0, "joseph": 0, "wang": 0, "156": 0, "noncopy": 0, "154": 0, "maintain": [0, 8], "111": 0, "172": 0, "brew": 0, "command": 0, "mac": 0, "2020": 0, "165": 0, "conveni": [0, 4], "emtpi": 0, "162": 0, "161": 0, "155": 0, "benchmark": 0, "timedread": 0, "timedwrit": 0, "decor": 0, "wrap": 0, "conform": [0, 8], "record": 0, "construct": [0, 1, 7, 8], "writeev": 0, "readcollect": 0, "benchmarkrecord": 0, "principl": [0, 1, 8, 10], "outsid": [0, 7, 8, 9], "search": 0, "152": 0, "copyabl": 0, "144": 0, "149": 0, "find_package_handle_standard_arg": 0, "147": 0, "130": 0, "second": 0, "altern": 0, "serial": 0, "runtim": [0, 5], "whole": [0, 1], "podio_add_datamodel_core_librari": 0, "condition": 0, "podio_add_sio_io_block": 0, "podio_io_handl": 0, "reflect": 0, "133": 0, "141": 0, "96": 0, "97": 0, "98": 0, "centos7": 0, "ubuntu1804": 0, "6": [0, 6], "least": [0, 1], "134": 0, "139": 0, "128": 0, "registerforwrit": 0, "site": [0, 2], "127": 0, "126": 0, "No": [0, 2], "125": 0, "recursive_mutex": 0, "made": [0, 1], "whatev": 0, "distanc": 0, "calcul": [0, 4, 7], "129": 0, "footprint": 0, "clear": [0, 4], "intermedi": 0, "124": 0, "sstream": 0, "123": 0, "122": 0, "121": 0, "pip": [0, 1], "120": 0, "cleanli": 0, "117": 0, "readabl": [0, 8], "focus": 0, "grasp": 0, "stricter": 0, "extracod": [0, 3, 10], "constextracod": 0, "accord": 0, "diverg": 0, "equival": [0, 1, 10, 11], "emit": 0, "charact": 0, "capabl": [0, 1, 11], "exhaust": 0, "serv": [0, 4], "purpos": [0, 4], "moment": [0, 10], "107": 0, "loop": [0, 9, 11], "106": 0, "infinit": 0, "cyclic": 0, "102": 0, "101": 0, "constobject": 0, "invalid": [0, 4, 7], "99": 0, "libpodiodict": 0, "libpodio": 0, "rootmap": 0, "92": 0, "float": [0, 3, 7, 8, 10, 11], "lcparamet": 0, "evtmd": 0, "geteventmetadata": 0, "setvalu": 0, "usereventweight": 0, "evtweight": 0, "getfloatv": 0, "49": 0, "91": 0, "podiorootio": 0, "90": 0, "89": 0, "88": 0, "addxxxx": 0, "addtoxxxx": 0, "87": 0, "8": [0, 3, 11], "jenkinsfil": 0, "cpack": 0, "enable_cpack": 0, "83": 0, "82": 0, "81": 0, "wl": 0, "dynamic_lookup": 0, "appleclang": 0, "linux": 0, "shlib": 0, "testdatamodel": 0, "80": 0, "75": 0, "74": 0, "q": 0, "quiet": 0, "printout": 0, "verbos": 0, "mode": [0, 1], "73": 0, "right": [0, 1], "podiomacro": 0, "72": 0, "travi": 0, "70": 0, "includesubfold": [0, 1, 10], "packagenam": 0, "etc": [0, 3, 7, 8], "true": [0, 1, 3], "uniqu": 0, "occur": 0, "occas": 0, "package_name_": 0, "69": 0, "68": 0, "podio_generate_dictionari": 0, "67": 0, "loader": 0, "preserv": 0, "65": 0, "2019": 0, "pere": 0, "mato": 0, "63": 0, "stl": [0, 10], "60": 0, "multi": 0, "word": 0, "examplehit": 0, "cellid": 0, "ben": 0, "morgan": 0, "59": 0, "58": 0, "57": 0, "56": 0, "55": 0, "fast": 0, "getfast": 0, "speed": 0, "xxcollect": 0, "54": 0, "cmakepackageconfighelp": 0, "associ": 0, "podiotarget": 0, "refind": 0, "standard": 0, "client": [0, 4], "find_packag": 0, "add_execut": 0, "foo": 0, "javier": 0, "cervant": 0, "villanueva": 0, "51": 0, "phase": 0, "report": 0, "mai": [0, 3, 4], "45": 0, "contribut": 0, "44": 0, "enambl": 0, "dryrun": 0, "43": 0, "suggest": 0, "graem": 0, "stewart": 0, "41": 0, "fcc": 0, "factoris": 0, "md": 0, "40": 0, "tchain": 0, "xrootd": 0, "eospubl": 0, "cern": [0, 6], "ch": 0, "eo": 0, "stick": 0, "hsf": 0, "2018": 0, "39": 0, "forward": [0, 1, 10], "treatment": 0, "statement": 0, "know": [0, 3, 4, 8], "concret": [0, 1, 3, 4, 8], "38": 0, "analog": 0, "larg": 0, "37": 0, "36": 0, "releaas": 0, "note": [0, 1, 3, 4, 7, 8, 10, 11], "releasenot": 0, "far": 0, "2017": 0, "32": [0, 11], "hep": 0, "colin": 0, "bernet": 0, "cbernet": 0, "nofile_fix": 0, "segv": 0, "interact": [0, 7], "pyeventstore_filenam": 0, "jlingema": 0, "clangf": 0, "joschka": 0, "lingemann": 0, "gen": 0, "53": 0, "fixwarn": 0, "regener": 0, "hint": 0, "highlight": [0, 7, 8], "doc": 0, "applic": 0, "struct": [0, 3, 4, 8, 10], "parser": 0, "temporarili": 0, "outputstream": 0, "add_ascii_io": 0, "zaborowska": 0, "52": 0, "50": 0, "findroot": 0, "lcg_88": 0, "unus": 0, "pyunittest": 0, "2016": [0, 6], "47": 0, "lcg_87": 0, "46": 0, "debug": 0, "asciwrit": 0, "write_ascii": 0, "const_rel": 0, "getsyntax": [0, 1, 3, 10], "creation": [0, 1, 3, 4, 5, 9], "fix_cpy_rel": 0, "project": [0, 2], "custom": [0, 9], "doxygen": [0, 4], "cli": 0, "titl": 0, "page": [0, 2, 5], "dry": 0, "paragraph": 0, "direct": [0, 7, 10], "exposur": 0, "deep": [0, 5], "initialis": 0, "chach": 0, "fccsw": 0, "mileston": 0, "steinweg": 0, "eike_operators_new": 0, "eik": 0, "printinfo": 0, "tabular": 0, "wrong": [0, 3], "reference_bug_test": 0, "pyinterfac": 0, "2000": 0, "lcg_83": 0, "af": 0, "improve_doc": 0, "ink": 0, "dde": 0, "documen": 0, "relation_bug": 0, "examplemc": 0, "ref": 0, "_end": 0, "add_getters_sett": 0, "associativecontain": 0, "incorrect": 0, "fix_extracod": 0, "acc": 0, "memleak": 0, "extracode_in_compon": 0, "tracker": 0, "real": [0, 3, 4], "gtest": 0, "cross": 0, "snippet": [0, 7, 10], "pointerless": 0, "mani": [0, 3, 5, 7, 10], "cluster": [0, 7], "recurs": 0, "build_typ": 0, "unneed": 0, "processev": 0, "big": 0, "collcect": 0, "podio_librari": 0, "crear": 0, "clementhelsen": 0, "fix_eo": 0, "9": 0, "tfile": 0, "re": [0, 1], "tutorial_2": 0, "chain": 0, "neater": 0, "fwd": 0, "fact": 0, "alber": 0, "tree": 0, "35": 0, "33": 0, "fix_includ": 0, "unified_env": 0, "5": 0, "filezombi": 0, "beautifi": 0, "soft": 0, "unifi": 0, "anna": 0, "conflict": 0, "destin": 0, "pcm": 0, "cosmet": 0, "me": [0, 3], "appl": 0, "pytool": 0, "pyyaml": 0, "datamemb": 0, "2015": 0, "b": [0, 2], "uniti": 0, "fill": [0, 1, 2, 3, 10, 11], "markdown": 0, "mem": 0, "refurbish": 0, "next": 0, "toward": 0, "xyzhandl": 0, "upgrad": 0, "layout": [0, 3, 9], "buildin": 0, "garbag": [0, 7], "streamlin": 0, "wrongli": 0, "cope": 0, "xcode": 0, "push_back": [0, 4, 7, 11], "trivial": [0, 1, 8, 10, 11], "acquir": 0, "behaviour": 0, "xxxobj": 0, "themselv": [0, 7, 8], "align": 0, "gcc": 0, "reserv": 0, "rootconfig": 0, "registri": 0, "fooentri": 0, "fooobj": 0, "simplif": 0, "improp": 0, "draft": 0, "newlin": [0, 3], "2014": 0, "edm_1": 0, "v1": [0, 6], "uniform": 0, "review": 0, "scheme": 0, "incomplet": 0, "friend": 0, "confirm": 0, "genreflex": 0, "head": 0, "n": [0, 11], "stuff": 0, "navig": 0, "readi": 0, "lepton": 0, "muon": 0, "comput": 0, "isol": 0, "particlehandl": 0, "more_util": 0, "particl": [0, 5, 8], "overlap": 0, "100000": 0, "solv": [0, 8], "rare": 0, "eta": 0, "cut": 0, "dummy_gener": 0, "dummi": 0, "jet": 0, "demand": 0, "dummygener": 0, "coll_in_registri": 0, "multijet": 0, "increment": 0, "land": 0, "few_easy_mod": 0, "x": [0, 3, 7], "merge_attempt": 0, "pedant": 0, "event_loop": 0, "messi": 0, "overal": [0, 5], "simple_edm": 0, "realist": 0, "auto_handle_ptr": 0, "embed": 0, "prepareafterread": [0, 1], "macos_build_merg": 0, "macos_build": 0, "lxplus6": 0, "reformat": 0, "question": 0, "z": [0, 3], "boson": 0, "rearrang": 0, "here": [1, 3, 8, 10, 11], "howev": [1, 8, 10, 11], "explain": [1, 3, 5], "There": [1, 3, 7, 8], "fulfil": 1, "advantag": [1, 3, 4, 8], "persistifi": 1, "piec": 1, "invok": 1, "translat": 1, "collid": [1, 5], "objindex": 1, "pair": 1, "solut": 1, "void": [1, 3, 8], "getbufferaddress": 1, "refcollect": 1, "referencecollect": 1, "form": [1, 3, 11], "instanc": 1, "eras": 1, "possibli": 1, "10": [1, 7, 11], "find_librari": 1, "nlohmann_json": 1, "With": [1, 4, 10], "collectionnam": 1, "definiton": 1, "similarli": 1, "foreseen": [1, 7], "represent": [1, 10], "mind": [1, 5], "global": [1, 9], "assumpt": [1, 4, 7], "caveat": 1, "As": [1, 4, 7, 11], "guarante": 1, "dure": 1, "state": [1, 8], "synchron": 1, "manual": [1, 11], "exemplari": 1, "want": [1, 2], "dumped_edm4hep": 1, "redirect": 1, "necessarili": 1, "below": [1, 4, 10], "frameread": 1, "getedmdefinit": 1, "most": [1, 10], "decod": 1, "__jsondefinit": 1, "r": 1, "edmdefinit": 1, "subfold": [1, 10], "singleton": 1, "whenev": 1, "enit": 1, "getdatamodeldefinit": 1, "edmnam": 1, "size_t": [1, 11], "getdatamodelregistryindex": 1, "That": 1, "datamodelregistryindex": 1, "straight": 1, "readelf": 1, "p": 1, "rodata": 1, "libedm4hep": 1, "grep": 1, "exposepodmemb": [1, 3], "fals": [1, 3], "datamodelregistryiohelp": 1, "instrument": 1, "datamodeldefinitioncollector": 1, "encount": 1, "registerdatamodeldefinit": 1, "getdatamodeldefinitionstowrit": 1, "datamodeldefinitionhold": 1, "getavailabledatamodel": 1, "sioframeread": 1, "yard": 2, "nosi": 2, "essenc": 2, "your": [2, 3], "dedic": 2, "until": 2, "rebas": 2, "cd": 2, "fork": 2, "repositori": 2, "web": 2, "usernam": 2, "yourusernam": 2, "meaning": 2, "mynewbranch": 2, "frequent": 2, "reload": 2, "websit": 2, "beginreleasenot": 2, "endreleasenot": 2, "eas": 3, "optimis": 3, "encourag": 3, "composit": 3, "inherit": [3, 4, 5, 8, 10], "One": [3, 8], "focu": 3, "friendli": 3, "plain": [3, 4, 5], "within": [3, 4, 10], "combin": [3, 8], "constrain": 3, "_leastn": 3, "_fastn": 3, "flat": 3, "my": 3, "mycompon": 3, "y": [3, 7], "anothercompon": 3, "excerpt": 3, "eventinfo": 3, "eventinfodata": 3, "eventinfocollect": 3, "extrem": 3, "expens": 3, "henc": [3, 8], "physic": [3, 4, 5], "quantiti": 3, "thu": 3, "particular": [3, 7], "sens": 3, "mutableextracod": 3, "declarationfil": 3, "implementationfil": 3, "through": [3, 8, 9, 10], "examplecompon": 3, "exampletyp": 3, "mr": 3, "comp": 3, "steer": 3, "capit": 3, "accomod": 3, "special": 3, "reimplement": 3, "nevertheless": 3, "gain": 3, "upstream_edm": 3, "xml": [3, 10], "overwritten": 3, "consciou": 3, "abus": 3, "drive": 4, "higher": 4, "technic": [4, 5], "explan": 4, "four": 4, "kind": 4, "act": 4, "certain": 4, "inter": [4, 5], "hitobject": 4, "hitdata": 4, "hitcollect": [4, 7, 11], "light": 4, "flavor": 4, "recogniz": 4, "implicitli": [4, 7], "chosen": 4, "ident": 4, "identif": 4, "respect": [4, 7], "bookkeep": 4, "item": 4, "orient": 4, "soa": 4, "vision": 4, "heavi": 4, "best": 4, "alter": 4, "leav": 4, "creator": 4, "unfreez": 4, "afterward": [4, 5, 8], "heavili": 4, "impact": 4, "safeti": [4, 8, 9], "idea": [5, 8], "emploi": 5, "hierarchi": [5, 8], "virtual": 5, "servic": 5, "At": [5, 8, 10], "high": 5, "physicist": 5, "assist": 5, "markup": 5, "modern": 5, "softwar": 5, "technologi": 5, "inspir": 5, "studi": 5, "linear": 5, "gaudi": 5, "appli": [5, 10], "lhcb": 5, "collabor": 5, "lhc": 5, "guid": 5, "impati": 5, "begin": [6, 7], "titlepag": 6, "center": 6, "vspace": 6, "5cm": 6, "huge": 6, "normals": 6, "1cm": 6, "desi": 6, "pitfal": [7, 8], "concern": [7, 8], "framework": 7, "agnost": 7, "goe": 7, "hit1": 7, "hit2": 7, "energi": 7, "individu": [7, 10], "aren": 7, "attach": 7, "clustercollect": 7, "addhit": 7, "hits_begin": 7, "hits_end": 7, "cout": 7, "endl": 7, "hits_siz": 7, "anumb": 7, "ask": [7, 8], "bound": 7, "out_of_rang": 7, "x_arrai": 7, "y_arrai": 7, "vectoriz": 7, "togeth": 7, "coll": [7, 8], "ting": 7, "isvalid": 7, "Or": 7, "sometim": 7, "simul": 7, "job": 7, "cell": 7, "term": 7, "arbitrari": [7, 8], "submodul": 7, "organ": 8, "organis": 8, "impos": 8, "aggreg": 8, "alongsid": [8, 11], "mandat": 8, "collt": 8, "rvalu": 8, "achiev": 8, "left": 8, "indefinit": 8, "cannot": 8, "analysi": 8, "enable_if": 8, "machineri": 8, "imposs": 8, "mcparticlecollect": 8, "createmcparticl": 8, "els": 8, "moreparticl": 8, "refus": 8, "coll2": 8, "mcparticl": 8, "behind": 8, "scene": 8, "astr": 8, "fly": 8, "nor": 8, "random": 8, "suppos": 8, "collectionwritebuff": 8, "though": 8, "getidt": 8, "getcollectionbuff": 8, "unpack": 8, "amount": 8, "spent": 8, "minim": 8, "further": [8, 10], "decompress": 8, "freedom": 8, "exploit": 8, "optim": 8, "strategi": 8, "forc": 8, "detriment": 8, "classic": 8, "approach": 8, "ifram": 8, "pure": 8, "ideal": 8, "orthogon": 8, "aspect": 8, "chose": 8, "erasur": 8, "semant": 8, "introduct": 9, "quick": 9, "concept": 9, "philosophi": 9, "preprocess": 9, "podio_config_read": 10, "generator_util": 10, "classgeneratorbasemixin": 10, "langaug": 10, "itself": 10, "digest": 10, "disk": 10, "consumpt": 10, "cppclassgener": 10, "juliaclassgener": 10, "broadli": 10, "along": 10, "live": 10, "layer": 10, "linv": 10, "resourc": 10, "src": 10, "mutablestruct": 10, "jl": 10, "parentmodul": 10, "jinja": 10, "immedi": 10, "activ": 10, "_get_filenames_templ": 10, "postfix": 10, "filenam": 10, "overridden": 10, "neccessari": 10, "_fill_templ": 10, "deleg": 10, "endfor": 10, "Be": 10, "mostli": 10, "use_get_syntax": 10, "incfold": 10, "includes_cc": 10, "implemen": 10, "includes_data": 10, "includes_obj": 10, "includes_cc_obj": 10, "includes_coll_cc": 10, "include_coll_data": 10, "forward_declar": 10, "leaf": 10, "forward_declarations_obj": 10, "is_pod": 10, "indic": 10, "ostream_collection_set": 10, "header_cont": 10, "bare_typ": 10, "full_typ": 10, "is_builtin": 10, "is_arrai": 10, "array_typ": 10, "array_s": 10, "getter_nam": 10, "setter_nam": 10, "jl_import": 10, "staticarrai": 10, "mvector": 10, "julia_typ": 10, "essenit": 10, "strip": 10, "down": 10, "experiment": 10, "int16": 10, "int32": 10, "uint32": 10, "float32": 10, "float64": 10, "int64": 10, "uint64": 10, "userfloat": 11, "userdata": 11, "14f": 11, "vec": 11, "deliber": 11, "biggest": 11, "hittag": 11, "intn_t": 11, "uintn_t": 11, "16": 11, "platform": 11, "static_assert": 11, "is_same_v": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"v00": 0, "17": 0, "04": 0, "03": 0, "02": 0, "01": 0, "16": 0, "05": 0, "15": 0, "14": 0, "00": 0, "13": 0, "12": 0, "11": 0, "10": 0, "09": 0, "08": 0, "advanc": 1, "topic": 1, "write": [1, 8, 11], "extra": [1, 11], "data": [1, 3, 4, 7, 8, 11], "outsid": [1, 11], "edm": [1, 11], "chang": [1, 10], "creat": [1, 10], "new": [1, 10], "templat": [1, 10], "persist": 1, "back": 1, "end": 1, "read": [1, 8], "dump": 1, "json": 1, "thread": 1, "safeti": 1, "user": [1, 4, 7], "serial": 1, "Not": 1, "safe": 1, "compon": [1, 3, 10], "run": 1, "pre": 1, "commit": 1, "retriev": [1, 7], "definit": [1, 3], "from": [1, 3, 8], "file": [1, 10], "access": 1, "programmat": 1, "technic": 1, "detail": [1, 4], "embed": 1, "The": [1, 4, 8], "datamodelregistri": 1, "i": [1, 8], "o": [1, 8], "helper": 1, "store": 1, "contribut": 2, "podio": [2, 7, 9], "git": 2, "workflow": 2, "exampl": [2, 7, 8, 11], "releas": 2, "note": 2, "model": 3, "basic": [3, 8], "concept": [3, 8], "support": [3, 4, 7, 11], "featur": 3, "custom": 3, "class": 3, "defin": [3, 7], "member": 3, "refer": [3, 7, 8], "between": 3, "object": [3, 4, 7], "explicit": 3, "method": 3, "global": 3, "option": 3, "extend": 3, "datamodel": 3, "us": 3, "type": [3, 11], "an": [3, 11], "upstream": 3, "potenti": 3, "pitfal": 3, "design": [4, 8], "implement": [4, 8], "layout": 4, "layer": 4, "intern": 4, "pod": 4, "collect": [4, 7, 8, 11], "vector": 4, "notebook": [4, 7], "pattern": [4, 7], "handl": 4, "mutabl": 4, "introduct": 5, "quick": 5, "start": 5, "interfac": 7, "ownership": 7, "creation": 7, "storag": 7, "loop": 7, "through": 7, "frame": [7, 8], "contain": 7, "meta": 7, "python": 7, "function": 8, "usag": [8, 11], "put": 8, "get": 8, "paramet": 8, "philosophi": 8, "schema": 8, "evolut": 8, "welcom": 9, "": 9, "document": 9, "preprocess": 10, "yaml": 10, "exist": 10, "ad": 10, "avail": 10, "inform": 10, "gener": 10, "datatyp": 10, "membervari": 10, "julia": 10, "code": 10, "some": 11, "limit": 11, "No": 11, "relat": 11, "other": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"v00-17-04": [[0, "v00-17-04"]], "v00-17-03": [[0, "v00-17-03"]], "v00-17-02": [[0, "v00-17-02"]], "v00-17-01": [[0, "v00-17-01"]], "v00-17": [[0, "v00-17"]], "v00-16-05": [[0, "v00-16-05"]], "v00-16-04": [[0, "v00-16-04"]], "v00-16-03": [[0, "v00-16-03"]], "v00-16-02": [[0, "v00-16-02"]], "v00-16-01": [[0, "v00-16-01"]], "v00-16": [[0, "v00-16"]], "v00-15": [[0, "v00-15"]], "v00-14-02": [[0, "v00-14-02"]], "v00-14-01": [[0, "v00-14-01"], [0, "id1"]], "v00-14": [[0, "v00-14"]], "v00-14-00": [[0, "v00-14-00"]], "v00-13-02": [[0, "v00-13-02"]], "v00-13-01": [[0, "v00-13-01"]], "v00-13": [[0, "v00-13"]], "v00-12": [[0, "v00-12"]], "v00-11": [[0, "v00-11"]], "v00-10": [[0, "v00-10"]], "v00-09-02": [[0, "v00-09-02"]], "v00-09": [[0, "v00-09"]], "v00-08": [[0, "v00-08"]], "Advanced Topics": [[1, "advanced-topics"]], "Writing extra data outside the EDM": [[1, "writing-extra-data-outside-the-edm"]], "Changing / creating new templates": [[1, "changing-creating-new-templates"], [10, "changing-creating-new-templates"]], "Persistency": [[1, "persistency"]], "Writing Back-End": [[1, "writing-back-end"]], "Reading Back-End": [[1, "reading-back-end"]], "Dumping JSON": [[1, "dumping-json"]], "Thread-safety": [[1, "thread-safety"]], "Changing user data": [[1, "changing-user-data"]], "Serialization": [[1, "serialization"]], "Not-thread-safe components": [[1, "not-thread-safe-components"]], "Running pre-commit": [[1, "running-pre-commit"]], "Retrieving the EDM definition from a data file": [[1, "retrieving-the-edm-definition-from-a-data-file"]], "Accessing the EDM definition programmatically": [[1, "accessing-the-edm-definition-programmatically"]], "Technical details on EDM definition embedding": [[1, "technical-details-on-edm-definition-embedding"]], "The DatamodelRegistry": [[1, "the-datamodelregistry"]], "I/O helpers for EDM definition storing": [[1, "i-o-helpers-for-edm-definition-storing"]], "Contributing to PODIO": [[2, "contributing-to-podio"]], "Git workflow": [[2, "git-workflow"]], "Example workflow": [[2, "example-workflow"]], "Release Notes": [[2, "release-notes"]], "Data Models and Data Model Definitions": [[3, "data-models-and-data-model-definitions"]], "Basic Concepts and Supported Features": [[3, "basic-concepts-and-supported-features"]], "Definition of custom components": [[3, "definition-of-custom-components"]], "Definition of custom data classes": [[3, "definition-of-custom-data-classes"]], "Defining members": [[3, "defining-members"]], "Definition of references between objects:": [[3, "definition-of-references-between-objects"]], "Explicit definition of methods": [[3, "explicit-definition-of-methods"]], "Global options": [[3, "global-options"]], "Extending a datamodel / using types from an upstream datamodel": [[3, "extending-a-datamodel-using-types-from-an-upstream-datamodel"]], "Potential pitfalls": [[3, "potential-pitfalls"]], "Design and Implementation Details": [[4, "design-and-implementation-details"]], "Layout of Objects": [[4, "layout-of-objects"]], "The User Layer": [[4, "the-user-layer"]], "The Internal Data Layer": [[4, "the-internal-data-layer"]], "The POD Layer": [[4, "the-pod-layer"]], "The Collections": [[4, "the-collections"]], "Vectorization support / notebook pattern": [[4, "vectorization-support-notebook-pattern"]], "Handling mutability": [[4, "handling-mutability"]], "Introduction": [[5, "introduction"]], "Quick-start": [[5, "quick-start"]], "Examples for Supported Interface": [[7, "examples-for-supported-interface"]], "Object Ownership": [[7, "object-ownership"]], "Object Creation and Storage": [[7, "object-creation-and-storage"]], "Object References": [[7, "object-references"]], "Looping through Collections": [[7, "looping-through-collections"]], "Support for Notebook-Pattern": [[7, "support-for-notebook-pattern"]], "podio::Frame container": [[7, "podio-frame-container"]], "Object Retrieval": [[7, "object-retrieval"]], "User defined Meta Data": [[7, "user-defined-meta-data"]], "Python Interface": [[7, "python-interface"]], "The Frame concept": [[8, "the-frame-concept"]], "Basic functionality of a Frame": [[8, "basic-functionality-of-a-frame"]], "Usage examples for collection data": [[8, "usage-examples-for-collection-data"]], "Putting collection data into the Frame": [[8, "putting-collection-data-into-the-frame"]], "Getting collection (references) from the Frame": [[8, "getting-collection-references-from-the-frame"]], "Usage for Parameters": [[8, "usage-for-parameters"]], "I/O basics and philosophy": [[8, "i-o-basics-and-philosophy"]], "Writing a Frame": [[8, "writing-a-frame"]], "Reading a Frame": [[8, "reading-a-frame"]], "Schema evolution": [[8, "schema-evolution"]], "Frame implementation and design": [[8, "frame-implementation-and-design"]], "Welcome to PODIO\u2019s documentation!": [[9, "welcome-to-podio-s-documentation"]], "Preprocessing of yaml file": [[10, "preprocessing-of-yaml-file"]], "Existing templates": [[10, "existing-templates"]], "Adding a new template": [[10, "adding-a-new-template"]], "Available information in the templates": [[10, "available-information-in-the-templates"]], "General information": [[10, "general-information"]], "Components": [[10, "components"]], "Datatypes": [[10, "datatypes"]], "MemberVariable": [[10, "membervariable"]], "DataType": [[10, "datatype"]], "Julia code generation": [[10, "julia-code-generation"]], "Writing extra data outside an EDM": [[11, "writing-extra-data-outside-an-edm"]], "Example usage": [[11, "example-usage"]], "Some limitations": [[11, "some-limitations"]], "No relations to other collections": [[11, "no-relations-to-other-collections"]], "Limited supported types": [[11, "limited-supported-types"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/v99-99-99/templates.html b/v99-99-99/templates.html new file mode 100644 index 000000000..24b94c7dc --- /dev/null +++ b/v99-99-99/templates.html @@ -0,0 +1,584 @@ + + + + + + + Changing / creating new templates — PODIO documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Changing / creating new templates

+

PODIO uses the Jinja2 template engine to generate the c++ code from the yaml description. +This document here gives an overview of how PODIO uses the Jinja2 engine and how the yaml file is processed before it is passed to it. +We don’t go into many details of Jinja2 templates here, please refer to the Template Designer Document of Jinja2. +PODIO only makes use of rather basic Jinja2 templates, so it should in principle be possible to pick up the basics just by looking at some existing templates.

+
+

Preprocessing of yaml file

+

The entry point for reading yaml files is the python/podio_gen/podio_config_reader.py. +When reading the yaml file a basic validation is run and the data members, relations and vector members of components and datatypes are parsed into MemberVariable objects (defined in python/podio_gen/generator_utils.py). +The main entry point to the code generation is the python/podio_class_generator.py which takes care of instantiating the language specific code generator (either C++ or a prototype version for Julia at this point). +The language specific generators inherit from the ClassGeneratorBaseMixin which takes care of some common initialization and provides some common functionality for code generation. +In the end each langauge specific generator will take care of (either by itself or through the common functionality in ClassGeneratorBaseMixin):

+
    +
  • Configuring the Jinja2 template engine. At the moment this is mainly making the templates known to the engine.

  • +
  • The necessary preprocessing of all the datatypes and components. This includes collecting necessary include directories and forward declaration, as well as digesting ExtraCode snippets.

  • +
  • Putting all the necessary information into a dict that can be easily used in the Jinja2 templates. See below for what is available in the templates

  • +
  • Calling the template engine to fill the necessary templates for each datatype or component and making sure to only write to disk if the filled template actually changed. Optionally run clang-format on them before writing.

  • +
  • Producing a list of generated c++ files for consumption by the cmake macros of PODIO.

  • +
+

Currently two language specific generators are available: CPPClassGenerator and JuliaClassGenerator. +Note that some of the information below will only apply to either of these generators as they provide the template engine with slightly different content.

+
+
+

Existing templates

+

Currently PODIO loads templates that are placed in <prefix>/python/templates. +They are broadly split along the classes that are generated for each datatype or component from the EDM definition:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

template file(s)

content

generated file(s)

Component.h.jinja2

Definition for each component

[<package>/]<component-name>.h

Data.h.jinja2

POD struct of each datatype (living in the POD layer)

[<package>/]<datatype-name>Data.h

Obj.{h,cc}.jinja2

Obj class for each datatype (linving in the object layer) and managing resources

[<package>/]<datatype-name>Obj.h, src/<datatype-name>Obj.cc

[Mutable]Object.{h,cc}.jinja2

The user facing interfaces for each datatype (living in the user layer)

[<package>/][Mutable]<datatype-name>.h, src/[Mutable]<datatype-name>.cc

Collection.{h,cc}.jinja2

The user facing collection interface (living in the user layer)

[<package>/]<datatype-name>Collection.h, src/<datatype-name>Collection.cc

CollectionData.{h,cc}.jinja2

The classes managing the collection storage (not user facing!)

[<package>/]<datatype-name>CollectionData.h, src/<datatype-name>CollectionData.cc

selection.xml.jinja2

The selection.xml file that is necessary for generating a root dictionary for the generated datamodel

src/selection.xml

SIOBlock.{h,cc}.jinja2

The SIO blocks that are necessary for the SIO backend

[<package>/]<datatype-name>SIOBlock.h, src/<datatype-name>SIOBlock.cc

MutableStruct.jl.jinja2

The mutable struct definitions of components and datatypes for julia

[<package>/]<datatype-name>Struct.jl, [<package>/]<component-name>Struct.jl

ParentModule.jl.jinja2

The constructor and collection definitions of components and datatypes in the data model are contained within a single module named after the package-name

[<package>/]<package-name>.jl

+

The presence of a [<package>] subdirectory for the header files is controlled by the includeSubfolder option in the yaml definition file.

+

Jinja allows the definition of additional macros and supports importing them similar to python modules. +These are stored in the macros subfolder and are imported directly by the main templates where necessary.

+
+
+

Adding a new template

+

All templates that are placed in the templates directory mentioned above become immediately available to the template engine if it ends on .jinja2 +However, it is still necessary to actively fill them from the class generator. +If the available information for the new templates is already enough and no further pre-processing is necessary, than they need to be added to _get_filenames_templates function in the ClassGeneratorBaseMixin. +The prefix and postfix dictionaries define how the template filename will be mapped to the generated files: <prefix><template-filename><postfix>. +By default a .h and a .cc file will be generated, but this can be overridden by adding the template to the endings dictionary. +With that in place it is now only neccessary to call _fill_templates with the appropriate template name and the pre processed data. +Note that for most templates this means that they have to be filled for each datatype or component individually.

+

If additional preprocessing is necessary, it will be necessary to also add that to the the language specific generators. +The main entry point to the generation is the process method which essentially just delegates to other methods.

+
+
+

Available information in the templates

+

The following gives an overview of the information that is available from the dictionary that is passed to the templates from the different +Each (top level) key in this dict is directly available as a variable in the Jinja2 templates, e.g.

+
component['includes'] = # list of includes
+
+
+

will become available as

+
{% for include in includes %}
+{{ include }}
+{% endfor %}
+
+
+

Be aware that some of the information is only available for the language +specific generators. The following information mostly applies to the c++ code +generation!

+
+

General information

+

The following keys / variables are always available

+ + + + + + + + + + + + + + + + + +

key / variable name

content

package_name

The package name of the datamodel (passed to the generator as argument)

use_get_syntax

The value of the getSyntax option from the yaml definition file

incfolder

The [<package>/] part of the generated header files (See above)

+
+
+

Components

+

The following keys are filled for each component

+ + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The class of the component as DataType (see below)

Members

The members of the component as MemberVariables

includes

All the necessary includes for this component

ExtraCode

Optionally present extra code

+
+
+

Datatypes

+

The following keys / variables are filled for each datatype

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key / variable

content

class

The (immutable, user-facing) class as DataType (see below)

Members

The members of the datatype as a list of MemberVariables (see below)

OneToOneRelations

The one-to-one relation members of the datatype as a list of MemberVariables

OneToManyRelations

The one-to-many relation members of the datatype as a list of MemberVariables

VectorMembers

The vector members of the datatype as a list of MemberVariables

includes

The include directives for the the user facing classes header files

includes_cc

The include directives for the implemenations of the user facing classes

includes_data

The necessary include directives for the Data POD types

includes_obj

The include directives for the Obj classes headers.

includes_cc_obj

The include directives for the implementation files of the Obj classes.

includes_coll_cc

The include directives for the implementation of the Collection classes

include_coll_data

The include directives for the header CollectionData header file

forward_declarations

The forward declarations for the user facing classes header files. This is a nested dict, where the keys are namespaces and the leaf values are classes.

forward_declarations_obj

The forward declarations for the Obj classes header files.

is_pod

Flag value indicating whether the Data class of this datatype is a POD or if it contains an STL member

is_trivial_type

Flag that indicates that this is a trivial data type, i.e. one without relations or vector members.

ostream_collection_settings

A dict with a single header_contents key that is necessary for the output stream overload implementation of collections

+
+
+

MemberVariable

+

Defined in python/generator_utils.py. +The string representation gives the definition of the member, including a potentially present description string. +In principle all members are accessible in the templates, however, the most important ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

description

name

The name of the member

namespace

The (potentially empty) namespace of the member

bare_type

The type of the member without namespace

full_type

The full, namespace qualified, type of the member, essentially {{ namespace }}::{{ bare_type }}

description

The (optional) description string of the member

is_builtin

Flag for indicating that a member is a builtin type

is_array

Flag for indicating that a member is a std::array

array_type

The type of the array if the member is a std::array

array_size

The size of the array if the member is a std::array

getter_name

Method for generating the correct name for getter functions, depending on the getSyntax option in the yaml definition file.

setter_name

Method for generating the correct name for setter functions, depending on the getSyntax option in the yaml definition file and on whether the member is a relation or not

signature

The signature of a data member that can be used in function signatures, corresponds to {{ full_type }} {{ name }}

jl_imports

Import required for StaticArrays: MVector

julia_type

Equivalent julia type for the c++ type

+
+
+

DataType

+

Defined in python/generator_utils.py. +This is essenitally a stripped down version of the MemberVariable with the major difference being that the string representation returns the fully qualified type instead. +The available fields are

+ + + + + + + + + + + + + + + + + +

field

description

bare_type

The type without the namespace

namespace

The (potentially empty) namespace

full_type

The fully qualified type, corresponding to {{ namespace }}::{{ bare_type }}.

+
+
+

Julia code generation

+

It is an experimental feature. +Builtin types mapping in Julia

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cpp

julia

bool

Bool

char

Char

short

Int16

int

Int32

unsigned int

UInt32

float

Float32

double

Float64

long

Int64

unsigned long

UInt64

long long

Int64

unsigned long long

UInt64

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file diff --git a/v99-99-99/userdata.html b/v99-99-99/userdata.html new file mode 100644 index 000000000..cf79aa1a7 --- /dev/null +++ b/v99-99-99/userdata.html @@ -0,0 +1,319 @@ + + + + + + + Writing extra data outside an EDM — PODIO documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Writing extra data outside an EDM

+

In some cases it can be necessary to write some additional data that can not +(yet) be stored in the EDM. PODIO offers a possibility to store such extra user +data via the podio::UserDataCollection. It gives the user access to a +std::vector of a set of limited fundamental types, which is written alongside +the data stored in the EDM classes for each event.

+
+

Example usage

+

Creating or getting a UserDataCollection via the Frame works the same +as with any other collection of the EDM via the put or get functions:

+
#include "podio/UserDataCollection.h"
+
+// Create a collection and put it into a Frame
+userFloats = podio::UserDataCollection<float>();
+frame.put(std::move(userFloats), "userFloats");
+
+// get a collection
+const auto& userData = frame.get<podio::UserDataCollection<float>>("userFloats");
+
+
+

The interface of the UserDataCollection is similar to a basic version of the +std::vector, i.e. push_back, resize and the basic functions for accessing +elements are present:

+
userFloats.push_back(3.14f); // add elements
+userFloats.resize(10);       // make the collection have 10 elements
+auto value = userFloats[0];  // access elements by index
+
+for (auto&& value : userFloats) {
+    // necessary functionality for range-based for-loops
+}
+
+for (size_t i = 0; i < userFloats.size(); ++i) {i
+    // but also for index based loops
+}
+
+
+

For cases where this subset interface is not enough it is also possible to get a +reference to the underlying std::vector via the UserDataCollection::vec() +method.

+
+
+

Some limitations

+

Since adding additional fields to an EDM type is almost trivial for PODIO +generated EDMs the UserDataCollection capabilities are deliberately kept +limited. Here we list what we consider to be the biggest limitations:

+
+

No relations to other collections

+

Since a UserDataCollection is really just a list of numbers it is not possible +to form relations to other objects. This also means that users are responsible +for keeping a UserDataCollection in sync with an EDM collection if is used to +store additional information, e.g.

+
auto& hits = store.create<HitCollection>("hits");
+auto& hitTags = store.create<podio::UserDataCollection<uint16_t>>("hitTags");
+
+for (/* some loop */) {
+    auto hit = hits.create();
+    // To be able to loop over these in parallel, you have to fill the user data manually
+    uint16_t hitTag;
+    hitTags.push_back(hitTag);
+}
+
+
+
+
+

Limited supported types

+

As mentioned above the possible types that can be stored in a +UserDataCollection is currently (deliberately) limited to the following +fundamental types

+
    +
  • fixed width integers: intN_t and uintN_t, with N={8, 16, 32, 64}

  • +
  • float and double

  • +
+

Trying to store different types in a UserDataCollection will lead to a +compilation error. Note that the usual integer types might be the same as the +fixed width version on some platforms. However, the equivalences of different +types might be different on different platforms. E.g.

+
static_assert(std::is_same_v<unsigned long, uint64_t>);
+
+
+

might work on some platforms, but might not work on others.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Key4hep authors.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: v99-99-99 + + + +
+ + + + \ No newline at end of file