diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..f366e55 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,13 @@ +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) + +html: + @$(SPHINXBUILD) -b html "$(SOURCEDIR)" "$(BUILDDIR)/html" $(SPHINXOPTS) + +clean: + rm -rf "$(BUILDDIR)" diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 0000000..1ef80df --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 10c9fd9df181d489619580d50a87f81e +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/.doctrees/admin/configuration.doctree b/docs/_build/html/.doctrees/admin/configuration.doctree new file mode 100644 index 0000000..4712c45 Binary files /dev/null and b/docs/_build/html/.doctrees/admin/configuration.doctree differ diff --git a/docs/_build/html/.doctrees/admin/installation_serveur.doctree b/docs/_build/html/.doctrees/admin/installation_serveur.doctree new file mode 100644 index 0000000..914d99e Binary files /dev/null and b/docs/_build/html/.doctrees/admin/installation_serveur.doctree differ diff --git a/docs/_build/html/.doctrees/admin/maintenance.doctree b/docs/_build/html/.doctrees/admin/maintenance.doctree new file mode 100644 index 0000000..ba9341e Binary files /dev/null and b/docs/_build/html/.doctrees/admin/maintenance.doctree differ diff --git a/docs/_build/html/.doctrees/changelog.doctree b/docs/_build/html/.doctrees/changelog.doctree new file mode 100644 index 0000000..055ca74 Binary files /dev/null and b/docs/_build/html/.doctrees/changelog.doctree differ diff --git a/docs/_build/html/.doctrees/credits.doctree b/docs/_build/html/.doctrees/credits.doctree new file mode 100644 index 0000000..3fd569f Binary files /dev/null and b/docs/_build/html/.doctrees/credits.doctree differ diff --git a/docs/_build/html/.doctrees/dev/architecture.doctree b/docs/_build/html/.doctrees/dev/architecture.doctree new file mode 100644 index 0000000..37e61e9 Binary files /dev/null and b/docs/_build/html/.doctrees/dev/architecture.doctree differ diff --git a/docs/_build/html/.doctrees/dev/contribuer.doctree b/docs/_build/html/.doctrees/dev/contribuer.doctree new file mode 100644 index 0000000..b8351f1 Binary files /dev/null and b/docs/_build/html/.doctrees/dev/contribuer.doctree differ diff --git a/docs/_build/html/.doctrees/dev/modules.doctree b/docs/_build/html/.doctrees/dev/modules.doctree new file mode 100644 index 0000000..bf31a23 Binary files /dev/null and b/docs/_build/html/.doctrees/dev/modules.doctree differ diff --git a/docs/_build/html/.doctrees/environment.pickle b/docs/_build/html/.doctrees/environment.pickle new file mode 100644 index 0000000..db2c521 Binary files /dev/null and b/docs/_build/html/.doctrees/environment.pickle differ diff --git a/docs/_build/html/.doctrees/index.doctree b/docs/_build/html/.doctrees/index.doctree new file mode 100644 index 0000000..1ea0b34 Binary files /dev/null and b/docs/_build/html/.doctrees/index.doctree differ diff --git a/docs/_build/html/.doctrees/joueur/controles.doctree b/docs/_build/html/.doctrees/joueur/controles.doctree new file mode 100644 index 0000000..c464021 Binary files /dev/null and b/docs/_build/html/.doctrees/joueur/controles.doctree differ diff --git a/docs/_build/html/.doctrees/joueur/craft.doctree b/docs/_build/html/.doctrees/joueur/craft.doctree new file mode 100644 index 0000000..ed524d2 Binary files /dev/null and b/docs/_build/html/.doctrees/joueur/craft.doctree differ diff --git a/docs/_build/html/.doctrees/joueur/installation.doctree b/docs/_build/html/.doctrees/joueur/installation.doctree new file mode 100644 index 0000000..a9e36eb Binary files /dev/null and b/docs/_build/html/.doctrees/joueur/installation.doctree differ diff --git a/docs/_build/html/.doctrees/joueur/mecaniques.doctree b/docs/_build/html/.doctrees/joueur/mecaniques.doctree new file mode 100644 index 0000000..582fae3 Binary files /dev/null and b/docs/_build/html/.doctrees/joueur/mecaniques.doctree differ diff --git a/docs/_build/html/.doctrees/joueur/multijoueur.doctree b/docs/_build/html/.doctrees/joueur/multijoueur.doctree new file mode 100644 index 0000000..63f6f82 Binary files /dev/null and b/docs/_build/html/.doctrees/joueur/multijoueur.doctree differ diff --git a/docs/_build/html/_sources/admin/configuration.rst.txt b/docs/_build/html/_sources/admin/configuration.rst.txt new file mode 100644 index 0000000..b37f025 --- /dev/null +++ b/docs/_build/html/_sources/admin/configuration.rst.txt @@ -0,0 +1,79 @@ +Configuration du serveur +======================== + +Fichier de service systemd +--------------------------- + +Le service est défini dans : + +.. code-block:: text + + /etc/systemd/system/dauphincraft.service + +Contenu type : + +.. code-block:: ini + + [Unit] + Description=DauphinCraft Game Server + After=network.target + + [Service] + User=dauphincraft + WorkingDirectory=/opt/dauphincraft + ExecStart=/opt/dauphincraft/DauphinCraft.x86_64 --headless --port 7777 + Restart=on-failure + RestartSec=5s + StandardOutput=append:/var/log/dauphincraft.log + StandardError=append:/var/log/dauphincraft.log + + [Install] + WantedBy=multi-user.target + +Modifier le port d'écoute +-------------------------- + +1. Éditez le fichier service : + + .. code-block:: bash + + sudo nano /etc/systemd/system/dauphincraft.service + +2. Modifiez la ligne ``ExecStart`` pour changer le port : + + .. code-block:: text + + ExecStart=/opt/dauphincraft/DauphinCraft.x86_64 --headless --port 9999 + +3. Rechargez la configuration et redémarrez le service : + + .. code-block:: bash + + sudo systemctl daemon-reload + sudo systemctl restart dauphincraft + +4. N'oubliez pas d'ouvrir le nouveau port dans le pare-feu (voir :doc:`installation_serveur`). + +Nombre maximum de joueurs +-------------------------- + +La limite de joueurs est définie à **16** par défaut dans le code source +(``scripts/net/NetworkManager.gd``). Cette valeur sera exposée en paramètre +de ligne de commande dans une version future. + +Pour modifier temporairement la limite, il est actuellement nécessaire de recompiler +le projet avec la valeur souhaitée. + +.. note:: + + Une option ``--max-players `` sera ajoutée dans la version 0.2.0. + +Sauvegarde du monde +------------------- + +.. warning:: + + La sauvegarde persistante du monde n'est pas encore implémentée dans la version 0.1.0. + Le monde est régénéré à chaque redémarrage du serveur. + +Cette fonctionnalité est prévue pour une version future. diff --git a/docs/_build/html/_sources/admin/installation_serveur.rst.txt b/docs/_build/html/_sources/admin/installation_serveur.rst.txt new file mode 100644 index 0000000..bd75ba5 --- /dev/null +++ b/docs/_build/html/_sources/admin/installation_serveur.rst.txt @@ -0,0 +1,96 @@ +Installation du serveur +======================= + +Ce guide décrit l'installation du serveur dédié DauphinCraft sur une machine Linux. + +Prérequis +--------- + ++--------------------+-----------------------------------------------+ +| Composant | Requis | ++====================+===============================================+ +| Système | Debian 11+ ou Ubuntu 22.04 LTS (64 bits) | ++--------------------+-----------------------------------------------+ +| RAM | 1 Go minimum | ++--------------------+-----------------------------------------------+ +| Stockage | 500 Mo libres | ++--------------------+-----------------------------------------------+ +| Réseau | IP publique ou réseau local avec NAT | ++--------------------+-----------------------------------------------+ +| Port | UDP 7777 ouvert en entrée | ++--------------------+-----------------------------------------------+ +| Droits | Accès root ou sudo | ++--------------------+-----------------------------------------------+ + +Extraction de l'archive +----------------------- + +Téléchargez l'archive serveur depuis le dépôt officiel : + +.. code-block:: bash + + wget http:///dauphincraft/releases/download/v0.1.0/DauphinCraft-Server-v0.1.tar.gz + +Extrayez-la dans ``/opt`` : + +.. code-block:: bash + + sudo tar -xzf DauphinCraft-Server-v0.1.tar.gz -C /opt/ + sudo mv /opt/DauphinCraft-Server /opt/dauphincraft + +Installation +------------ + +Lancez le script d'installation fourni en tant que root : + +.. code-block:: bash + + cd /opt/dauphincraft + sudo bash install.sh + +Ce script : + +1. Crée un utilisateur système ``dauphincraft``. +2. Installe le fichier de service systemd dans ``/etc/systemd/system/dauphincraft.service``. +3. Active et démarre le service automatiquement. + +Vérification du service +----------------------- + +.. code-block:: bash + + systemctl status dauphincraft + +Une sortie de type ``Active: active (running)`` confirme que le serveur tourne correctement. + +Ouverture du port pare-feu +--------------------------- + +Avec **ufw** (Ubuntu) : + +.. code-block:: bash + + sudo ufw allow 7777/udp + sudo ufw reload + +Avec **iptables** : + +.. code-block:: bash + + sudo iptables -A INPUT -p udp --dport 7777 -j ACCEPT + sudo iptables-save > /etc/iptables/rules.v4 + +Consultation des logs +--------------------- + +Via **journalctl** (en temps réel) : + +.. code-block:: bash + + journalctl -u dauphincraft -f + +Via le fichier de log : + +.. code-block:: bash + + tail -f /var/log/dauphincraft.log diff --git a/docs/_build/html/_sources/admin/maintenance.rst.txt b/docs/_build/html/_sources/admin/maintenance.rst.txt new file mode 100644 index 0000000..5a8fa47 --- /dev/null +++ b/docs/_build/html/_sources/admin/maintenance.rst.txt @@ -0,0 +1,96 @@ +Maintenance du serveur +====================== + +Mise à jour du serveur +---------------------- + +Pour mettre à jour DauphinCraft vers une nouvelle version : + +1. Téléchargez le nouveau tarball depuis le dépôt officiel : + + .. code-block:: bash + + wget http:///dauphincraft/releases/download/vX.Y.Z/DauphinCraft-Server-vX.Y.Z.tar.gz + +2. Arrêtez le service : + + .. code-block:: bash + + sudo systemctl stop dauphincraft + +3. Sauvegardez l'ancienne version (optionnel mais recommandé) : + + .. code-block:: bash + + sudo cp -r /opt/dauphincraft /opt/dauphincraft.bak + +4. Extrayez la nouvelle version : + + .. code-block:: bash + + sudo tar -xzf DauphinCraft-Server-vX.Y.Z.tar.gz -C /opt/ + sudo rsync -a --exclude='logs' /opt/DauphinCraft-Server/ /opt/dauphincraft/ + +5. Relancez le service : + + .. code-block:: bash + + sudo systemctl start dauphincraft + systemctl status dauphincraft + +Surveillance et logs +--------------------- + +**Consultation des logs en direct :** + +.. code-block:: bash + + journalctl -u dauphincraft -f + +**Consultation des dernières lignes :** + +.. code-block:: bash + + tail -n 100 /var/log/dauphincraft.log + +**Rotation des logs :** le service redirige stdout/stderr vers ``/var/log/dauphincraft.log``. +Pour éviter que ce fichier grossisse indéfiniment, configurez ``logrotate`` : + +.. code-block:: bash + + sudo nano /etc/logrotate.d/dauphincraft + +Contenu suggéré : + +.. code-block:: text + + /var/log/dauphincraft.log { + daily + rotate 7 + compress + missingok + notifempty + } + +Vérification de l'état du serveur +----------------------------------- + +.. code-block:: bash + + systemctl is-active dauphincraft + +Retourne ``active`` si le serveur est opérationnel, ``failed`` sinon. + +Redémarrage automatique +------------------------ + +Le fichier de service inclut ``Restart=on-failure`` avec un délai de 5 secondes. +Le serveur redémarre donc automatiquement en cas de crash. + +Gestion des joueurs (Kick / Ban) +---------------------------------- + +.. note:: + + Les commandes d'administration en jeu (kick, ban) sont prévues pour la version 0.2.0. + Aucune interface d'administration n'est disponible dans la version actuelle. diff --git a/docs/_build/html/_sources/changelog.rst.txt b/docs/_build/html/_sources/changelog.rst.txt new file mode 100644 index 0000000..c3531fe --- /dev/null +++ b/docs/_build/html/_sources/changelog.rst.txt @@ -0,0 +1,60 @@ +Historique des versions +======================= + +Version 0.1.0 — Sortie initiale +--------------------------------- + +*Avril 2026* + +Première version publique de DauphinCraft. Cette version pose les bases du jeu : +monde voxel procédural, gameplay dauphin, inventaire, mobs et multijoueur. + +Nouvelles fonctionnalités +~~~~~~~~~~~~~~~~~~~~~~~~~ + +- **Monde voxel procédural sous-marin** + + - Génération par bruit de Perlin multi-octave. + - Quatre biomes : récif corallien, forêt de kelp, abysses, épaves. + - Chunks 16×16×16 chargés dynamiquement autour du joueur. + - Six types de blocs : Corail Bleu, Corail Rouge, Kelp, Roche, Épave, Glace. + +- **Dauphin contrôleur et HUD** + + - Déplacement 6DOF (haut/bas/avant/arrière/strafes). + - Jauges : oxygène, vie, faim. + - Boost de nage et écholocation (révèle l'environnement dans un rayon de 20 unités). + - Hotbar de 9 slots. + +- **Inventaire et crafting** + + - Inventaire de 27 slots. + - 5 recettes de craft : Lampe bio, Harpon, Bulle d'air, Algue cuisinée, Armure écailles. + +- **Mobs (3 types)** + + - Bancs de poissons (boids, neutres). + - Méduses (dégâts de contact passifs). + - Requin (hostile, réagit à l'écholocation). + - Spawner par biome avec limite de population. + +- **Multijoueur ENet 16 joueurs** + + - Architecture autorité serveur. + - Synchronisation position, blocs, inventaire. + - Chat textuel en jeu. + - Serveur dédié headless pour Linux. + +- **Ambiance visuelle et audio** + + - Shaders sous-marins : fog volumétrique, diffusion lumineuse. + - Particules de plancton lumineux. + - Musique : *Underwater Theme* (Cleyton RX, CC-BY 3.0). + - Effets sonores : ambiance, bulles, chant de baleine (CC0). + +Limitations connues +~~~~~~~~~~~~~~~~~~~ + +- La sauvegarde du monde n'est pas persistante (monde régénéré à chaque redémarrage). +- Pas de commandes d'administration en jeu (kick/ban prévu en 0.2.0). +- La limite de joueurs (16) n'est pas configurable en ligne de commande. diff --git a/docs/_build/html/_sources/credits.rst.txt b/docs/_build/html/_sources/credits.rst.txt new file mode 100644 index 0000000..78cccc1 --- /dev/null +++ b/docs/_build/html/_sources/credits.rst.txt @@ -0,0 +1,50 @@ +Crédits +======= + +Moteur +------ + +- **Godot Engine 4.6.2** — Licence MIT — https://godotengine.org + +Assets +------ + +Tous les assets sont listés ci-dessous avec leur source et licence. + ++-----------------------------------+-------------------------------------------------------+-------------+ +| Asset | Source | Licence | ++===================================+=======================================================+=============+ +| ``icon.svg`` | Créé manuellement | CC0 | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/music/underwater_theme`` | Cleyton RX — https://opengameart.org/content/ | CC-BY 3.0 | +| | underwater-theme | | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/sfx/underwater_ambient`` | Zozzy — https://freesound.org/people/Zozzy/ | CC0 | +| | sounds/56678/ | | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/sfx/bubbles`` | ristooooo1 — https://freesound.org/people/ | CC0 | +| | ristooooo1/sounds/539823/ | | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/sfx/whale_call`` | taure — https://freesound.org/people/taure/ | CC0 | +| | sounds/361423/ | | ++-----------------------------------+-------------------------------------------------------+-------------+ + +Attribution requise +------------------- + +Conformément à la licence CC-BY 3.0, la musique de fond doit être créditée ainsi : + + *"Underwater Theme" par Cleyton RX,* + *https://opengameart.org/content/underwater-theme,* + *sous licence Creative Commons Attribution 3.0.* + +Auteur du jeu +------------- + +- **Baptiste Moulin** — Conception, développement, direction artistique + +Remerciements +------------- + +- La communauté Godot Engine pour ses ressources et son support. +- Les créateurs d'assets CC0 et CC-BY qui rendent les projets open source possibles. diff --git a/docs/_build/html/_sources/dev/architecture.rst.txt b/docs/_build/html/_sources/dev/architecture.rst.txt new file mode 100644 index 0000000..27e4d9f --- /dev/null +++ b/docs/_build/html/_sources/dev/architecture.rst.txt @@ -0,0 +1,81 @@ +Architecture technique +======================= + +Moteur et langage +----------------- + ++------------------+-----------------------------------------------+ +| Composant | Valeur | ++==================+===============================================+ +| Moteur | Godot Engine 4.6.2 (Forward+) | ++------------------+-----------------------------------------------+ +| Langage | GDScript (typage strict) | ++------------------+-----------------------------------------------+ +| Rendu | Vulkan (Forward+) / Compatibility (fallback) | ++------------------+-----------------------------------------------+ +| Réseau | ENet UDP, autorité serveur | ++------------------+-----------------------------------------------+ + +Architecture réseau +------------------- + +DauphinCraft utilise un modèle **autorité serveur** : + +- Le serveur est la source de vérité pour les positions, les blocs et les inventaires. +- Les clients envoient leurs intentions (déplacement, action) et reçoivent l'état du monde. +- La synchronisation est assurée par ``PlayerSyncComponent`` et ``WorldSyncComponent``. +- Le protocole de transport est **ENet (UDP)** via la couche haut niveau Godot (``MultiplayerAPI``). +- Port par défaut : **UDP 7777**. + +Structure du projet +------------------- + +.. code-block:: text + + DauphinCraft/ + ├── project.godot # Fichier de projet Godot + ├── icon.svg # Icône du jeu + ├── export_presets.cfg # Présets d'export (Windows, Linux serveur) + ├── assets/ # Ressources visuelles (textures, modèles) + ├── audio/ # Fichiers audio + │ ├── music/ # Musiques de fond + │ └── sfx/ # Effets sonores + ├── builds/ # Sorties d'export + ├── scenes/ # Scènes Godot (.tscn) + │ ├── Main.tscn + │ ├── MainMenu.tscn + │ ├── LobbyMenu.tscn + │ ├── World.tscn + │ ├── Dolphin.tscn + │ ├── InventoryUI.tscn + │ ├── PauseMenu.tscn + │ └── mobs/ + ├── scripts/ # Scripts GDScript (.gd) + │ ├── Main.gd + │ ├── PauseMenu.gd + │ ├── world/ # Gestion du monde voxel + │ ├── dolphin/ # Contrôleur joueur + HUD + │ ├── ambience/ # Environnement visuel et audio + │ ├── inventory/ # Inventaire et crafting + │ ├── mobs/ # Intelligence artificielle des mobs + │ └── net/ # Réseau multijoueur + ├── shaders/ # Shaders GLSL/Godot + └── docs/ # Documentation Sphinx (ce manuel) + +Flux de démarrage +----------------- + +1. ``Main.tscn`` est la scène principale. Elle instancie ``MainMenu.tscn``. +2. Le joueur choisit Solo / Héberger / Rejoindre dans ``LobbyMenu.tscn``. +3. ``NetworkManager`` initialise ENet (serveur ou client). +4. ``World.tscn`` est chargée : ``ChunkManager`` génère les premiers chunks. +5. ``Dolphin.tscn`` est instanciée pour chaque joueur connecté. +6. La boucle de jeu tourne : physique, synchronisation réseau, rendu. + +Présets d'export +---------------- + +Deux présets sont configurés dans ``export_presets.cfg`` : + +- **Windows (64 bits)** : exécutable joueur pour Windows. +- **Linux Server (64 bits)** : exécutable headless pour serveur dédié Linux. diff --git a/docs/_build/html/_sources/dev/contribuer.rst.txt b/docs/_build/html/_sources/dev/contribuer.rst.txt new file mode 100644 index 0000000..8add6fe --- /dev/null +++ b/docs/_build/html/_sources/dev/contribuer.rst.txt @@ -0,0 +1,110 @@ +Contribuer au projet +==================== + +Outils nécessaires +------------------ + +- **Godot Engine 4.6.2** : téléchargez depuis https://godotengine.org/download +- **Git** : version 2.x ou supérieure +- Accès au dépôt Gitea de DauphinCraft + +Cloner le dépôt +--------------- + +.. code-block:: bash + + git clone http:///dauphincraft/dauphincraft.git + cd dauphincraft + +.. note:: + + Remplacez ```` par l'adresse du serveur Gitea communautaire. + +Ouvrir le projet dans Godot +----------------------------- + +1. Lancez Godot Engine 4.6.2. +2. Dans le gestionnaire de projets, cliquez sur **Import**. +3. Naviguez jusqu'au dossier cloné et sélectionnez ``project.godot``. +4. Cliquez sur **Import & Edit**. + +Le projet s'ouvre directement dans l'éditeur. Appuyez sur **F5** pour lancer le jeu en mode éditeur. + +Build et export +--------------- + +Les présets d'export sont configurés dans ``export_presets.cfg``. + +**Exporter pour Windows :** + +1. Menu **Projet → Exporter**. +2. Sélectionnez le préset **Windows Desktop**. +3. Cliquez sur **Exporter le projet** et choisissez un dossier de sortie. + +**Exporter le serveur Linux :** + +1. Menu **Projet → Exporter**. +2. Sélectionnez le préset **Linux Server**. +3. Cliquez sur **Exporter le projet**. + +.. note:: + + Pour exporter vers Linux, vous devez avoir installé le template d'export Linux dans Godot + (**Éditeur → Gérer les modèles d'exportation**). + +Style de code +------------- + +- **Typage strict** : déclarez toujours les types explicitement (``var x: int = 0``). +- **Pas de TODO** laissé dans le code soumis — ouvrez une issue à la place. +- **Nommage** : ``snake_case`` pour les variables et fonctions, ``PascalCase`` pour les classes. +- **Commentaires** : en français, concis. +- **Signals** : préfixez les signaux avec le nom du composant (``dolphin_died``, ``chunk_loaded``). + +Exemple de code conforme : + +.. code-block:: gdscript + + class_name DolphinController + extends CharacterBody3D + + @export var speed: float = 5.0 + var _oxygen: float = 1.0 + + func take_damage(amount: int) -> void: + # Réduit les PV et déclenche le signal si mort + health -= amount + if health <= 0: + emit_signal("dolphin_died") + +Soumettre une contribution +--------------------------- + +1. Créez une branche depuis ``main`` : + + .. code-block:: bash + + git checkout -b feat/ma-fonctionnalite + +2. Faites vos modifications et committez : + + .. code-block:: bash + + git add . + git commit -m "feat: description courte" + +3. Poussez votre branche : + + .. code-block:: bash + + git push origin feat/ma-fonctionnalite + +4. Ouvrez une **Pull Request** sur le Gitea de DauphinCraft. + +5. Un mainteneur relit et fusionne après validation. + +Discussion et support +---------------------- + +Rejoignez le serveur Discord communautaire et consultez le canal **#dauphincraft-dev** +pour poser vos questions, proposer des idées ou signaler des bugs. diff --git a/docs/_build/html/_sources/dev/modules.rst.txt b/docs/_build/html/_sources/dev/modules.rst.txt new file mode 100644 index 0000000..51a7024 --- /dev/null +++ b/docs/_build/html/_sources/dev/modules.rst.txt @@ -0,0 +1,129 @@ +Modules du jeu +============== + +Le code source est organisé en six modules dans ``scripts/``. + +Module Monde (``world/``) +-------------------------- + +Responsable de la génération et de la gestion du monde voxel sous-marin. + +**BlockDatabase.gd** + Registre central de tous les types de blocs (id, nom, texture, propriétés physiques). + API publique : ``get_block(id: int) -> BlockData``, ``get_id_by_name(name: String) -> int``. + +**Chunk.gd** + Représente un chunk 16×16×16 blocs. Gère son maillage 3D et son état de chargement. + API publique : ``set_block(x, y, z, id)``, ``get_block(x, y, z) -> int``, ``rebuild_mesh()``. + +**ChunkManager.gd** + Orchestre le chargement/déchargement des chunks autour du joueur (rayon configurable). + API publique : ``get_chunk(cx, cy, cz) -> Chunk``, ``request_chunk(pos: Vector3i)``. + +**WorldGenerator.gd** + Génère le contenu des chunks de façon procédurale (bruit de Perlin, biomes, structures). + API publique : ``generate_chunk(cx, cy, cz) -> Array`` (tableau de 4096 block ids). + +Module Dauphin (``dolphin/``) +------------------------------ + +Contrôle du personnage joueur et interface utilisateur associée. + +**DolphinController.gd** + Gère les entrées clavier/souris, applique la physique de nage, envoie les actions au serveur. + API publique : ``apply_input(input: Dictionary)``, ``take_damage(amount: int)``. + +**HUD.gd** + Affiche les jauges (oxygène, vie, faim), la hotbar et les notifications. + API publique : ``update_oxygen(value: float)``, ``update_health(value: float)``, + ``update_hunger(value: float)``. + +**EcholocationPulse.gd** + Crée et anime l'impulsion sphérique d'écholocation. Détecte les mobs et blocs dans le rayon. + API publique : ``emit_pulse(origin: Vector3, radius: float)``. + +Module Ambiance (``ambience/``) +-------------------------------- + +Environnement visuel et sonore sous-marin. + +**UnderwaterEnvironment.gd** + Configure le fog volumétrique, la lumière directionnelle atténuée et les effets de post-process + selon la profondeur du joueur. API publique : ``set_depth(depth: float)``. + +**AudioManager.gd** + Singleton audio. Gère les pistes de musique et les effets sonores avec transitions douces. + API publique : ``play_sfx(name: String)``, ``play_music(name: String)``, ``stop_music()``. + +**PlanktonParticles.gd** + Système de particules generant le plancton lumineux ambiant. + API publique : ``set_density(density: float)``. + +**MainMenu.gd** + Logique du menu principal (navigation, transitions de scène). + +Module Inventaire (``inventory/``) +----------------------------------- + +Gestion des ressources, recettes et interface d'inventaire. + +**Inventory.gd** + Stockage des items du joueur (tableau de slots). Synchronisé avec le serveur en multijoueur. + API publique : ``add_item(id: int, qty: int) -> bool``, ``remove_item(id: int, qty: int) -> bool``, + ``has_item(id: int, qty: int) -> bool``. + +**ItemDatabase.gd** + Registre de tous les items (id, nom, icône, stack max). + API publique : ``get_item(id: int) -> ItemData``. + +**CraftingRecipes.gd** + Définit les 5 recettes de craft et expose la logique de fabrication. + API publique : ``get_available_recipes(inventory: Inventory) -> Array``, + ``craft(recipe_id: int, inventory: Inventory) -> bool``. + +**InventoryUI.gd** + Interface graphique de l'inventaire et du panneau de crafting. + API publique : ``open()``, ``close()``, ``refresh()``. + +Module Mobs (``mobs/``) +------------------------ + +Intelligence artificielle des créatures marines. + +**FishSchool.gd** + Comportement de banc de poissons (alignment, cohesion, separation — boids simplifié). + Fuit le joueur à proximité. API publique : ``set_school_size(n: int)``. + +**Jellyfish.gd** + Déplacement oscillant aléatoire. Inflige des dégâts de contact au joueur. + API publique : ``get_damage() -> int``. + +**Shark.gd** + IA hostile : détection du joueur, poursuite, attaque, réaction à l'écholocation (fuite). + API publique : ``stun(duration: float)``. + +**MobSpawner.gd** + Gère l'apparition des mobs selon le biome et la profondeur, avec limite de population. + API publique : ``spawn_in_chunk(chunk_pos: Vector3i)``. + +Module Réseau (``net/``) +------------------------- + +Infrastructure multijoueur ENet. + +**NetworkManager.gd** + Singleton réseau. Initialise ENet, gère les connexions/déconnexions joueurs, expose les RPCs. + API publique : ``host_game(port: int)``, ``join_game(ip: String, port: int)``, + ``disconnect()``. + +**PlayerSyncComponent.gd** + Attaché à chaque ``Dolphin``. Synchronise position, rotation et état sur le réseau. + API publique : ``sync_state(state: Dictionary)``. + +**WorldSyncComponent.gd** + Synchronise les modifications de blocs entre serveur et clients. + API publique : ``broadcast_block_change(pos: Vector3i, block_id: int)``. + +**ChatManager.gd** + Gère l'envoi et la réception des messages de chat en multijoueur. + API publique : ``send_message(text: String)``, ``on_message_received(sender: String, text: String)``. diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 0000000..d86c077 --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,40 @@ +DauphinCraft — Documentation +============================ + +Bienvenue dans **DauphinCraft**, un jeu voxel sous-marin multijoueur où vous incarnez un dauphin. + +Explorez les fonds marins, construisez des structures, craftez des outils et jouez avec vos amis +jusqu'à 16 joueurs simultanés. + +.. toctree:: + :maxdepth: 2 + :caption: Joueur + + joueur/installation + joueur/controles + joueur/mecaniques + joueur/craft + joueur/multijoueur + +.. toctree:: + :maxdepth: 2 + :caption: Administrateur serveur + + admin/installation_serveur + admin/configuration + admin/maintenance + +.. toctree:: + :maxdepth: 2 + :caption: Développement + + dev/architecture + dev/modules + dev/contribuer + +.. toctree:: + :maxdepth: 1 + :caption: Annexes + + credits + changelog diff --git a/docs/_build/html/_sources/joueur/controles.rst.txt b/docs/_build/html/_sources/joueur/controles.rst.txt new file mode 100644 index 0000000..371dccd --- /dev/null +++ b/docs/_build/html/_sources/joueur/controles.rst.txt @@ -0,0 +1,86 @@ +Contrôles +========= + +Toutes les touches sont configurables dans les paramètres du jeu (**Échap → Paramètres → Touches**). +Voici la configuration par défaut. + +Déplacement +----------- + ++---------------------+------------------+ +| Action | Touche par défaut| ++=====================+==================+ +| Nager en avant | W | ++---------------------+------------------+ +| Reculer | S | ++---------------------+------------------+ +| Strafe gauche | A | ++---------------------+------------------+ +| Strafe droit | D | ++---------------------+------------------+ +| Monter | Espace | ++---------------------+------------------+ +| Descendre | Shift | ++---------------------+------------------+ +| Boost de nage | Ctrl | ++---------------------+------------------+ + +.. note:: + + Le **boost** consomme de l'énergie (jauge bleue en bas à droite du HUD). Il se recharge + automatiquement au repos. + +Capacités spéciales +------------------- + ++-----------------------------+------------------+ +| Action | Touche par défaut| ++=============================+==================+ +| Écholocation | E | ++-----------------------------+------------------+ +| Activer / Désactiver la HUD | H | ++-----------------------------+------------------+ + +L'**écholocation** envoie une impulsion sonore qui révèle les blocs et mobs environnants +dans un rayon de 20 unités, même dans les zones sombres. + +Interaction avec le monde +-------------------------- + ++----------------------------+------------------+ +| Action | Touche par défaut| ++============================+==================+ +| Casser un bloc | Clic gauche | ++----------------------------+------------------+ +| Poser un bloc | Clic droit | ++----------------------------+------------------+ +| Changer de slot (hotbar) | Molette souris | ++----------------------------+------------------+ +| Ouvrir l'inventaire | Tab | ++----------------------------+------------------+ + +Interface +--------- + ++----------------------------+------------------+ +| Action | Touche par défaut| ++============================+==================+ +| Ouvrir le chat | F2 | ++----------------------------+------------------+ +| Menu pause | Échap | ++----------------------------+------------------+ + +Chat +---- + +En multijoueur, appuyez sur **F2** pour ouvrir la fenêtre de chat. Tapez votre message et +validez avec **Entrée**. Appuyez sur **Échap** pour fermer le chat sans envoyer. + +Menu pause +---------- + +Appuyez sur **Échap** pour mettre le jeu en pause. Le menu propose : + +- **Reprendre** : retour au jeu. +- **Paramètres** : audio, vidéo, contrôles. +- **Quitter** : retour au menu principal. diff --git a/docs/_build/html/_sources/joueur/craft.rst.txt b/docs/_build/html/_sources/joueur/craft.rst.txt new file mode 100644 index 0000000..bdca7fc --- /dev/null +++ b/docs/_build/html/_sources/joueur/craft.rst.txt @@ -0,0 +1,112 @@ +Crafting — Recettes +=================== + +Le système de crafting permet de transformer des ressources collectées en objets utiles. +Ouvrez l'inventaire (**Tab**), puis accédez à l'onglet **Crafting** pour voir les recettes disponibles. + +Comment crafter +--------------- + +1. Ouvrez l'inventaire avec **Tab**. +2. Sélectionnez l'onglet **Crafting**. +3. Les recettes disponibles (ingrédients présents en inventaire) s'affichent en surbrillance. +4. Cliquez sur la recette souhaitée pour fabriquer l'objet. + +Recettes disponibles +-------------------- + +Lampe bio +~~~~~~~~~ + +Éclaire une zone de 10 blocs de rayon. Indispensable dans les abysses. + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Corail Bleu | 2 | Lampe bio × 1 | ++------------------+----------+ | +| Kelp | 1 | | ++------------------+----------+----------------------+ + +Harpon +~~~~~~ + +Arme à distance. Permet d'attaquer les mobs de loin (portée 12 unités, dégâts −4 PV). + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Roche | 2 | Harpon × 1 | ++------------------+----------+ | +| Épave | 2 | | ++------------------+----------+----------------------+ + +Bulle d'air +~~~~~~~~~~~ + +Consommable d'urgence. Recharge instantanément 50 % de la jauge d'oxygène. + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Kelp | 3 | Bulle d'air × 1 | ++------------------+----------+ | +| Glace | 1 | | ++------------------+----------+----------------------+ + +.. note:: + + La **Glace** se trouve uniquement dans les zones profondes (abysses, 80 m+). + +Algue cuisinée +~~~~~~~~~~~~~~ + +Nourriture. Restaure 30 % de la jauge de faim. + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Kelp | 2 | Algue cuisinée × 2 | ++------------------+----------+----------------------+ + +.. tip:: + + Recette très accessible dès le début. La forêt de kelp est le meilleur endroit pour + farmer le Kelp. + +Armure écailles +~~~~~~~~~~~~~~~ + +Protection passive. Réduit les dégâts reçus de 25 % (toutes sources). + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Corail Rouge | 4 | Armure écailles × 1 | ++------------------+----------+ | +| Épave | 2 | | ++------------------+----------+----------------------+ + +.. warning:: + + L'armure se casse après 50 impacts. Craftez-en une de rechange avant de partir + explorer les épaves ou les abysses. + +Ressources et où les trouver +---------------------------- + ++-------------------+---------------------------+ +| Ressource | Biome / Source | ++===================+===========================+ +| Corail Bleu | Récif corallien | ++-------------------+---------------------------+ +| Corail Rouge | Récif corallien | ++-------------------+---------------------------+ +| Kelp | Forêt de kelp | ++-------------------+---------------------------+ +| Roche | Épaves, fond marin | ++-------------------+---------------------------+ +| Épave | Zones d'épaves | ++-------------------+---------------------------+ +| Glace | Abysses (80 m+) | ++-------------------+---------------------------+ diff --git a/docs/_build/html/_sources/joueur/installation.rst.txt b/docs/_build/html/_sources/joueur/installation.rst.txt new file mode 100644 index 0000000..d4382b2 --- /dev/null +++ b/docs/_build/html/_sources/joueur/installation.rst.txt @@ -0,0 +1,74 @@ +Installation — Guide joueur +=========================== + +Configuration minimale requise +------------------------------- + ++--------------------+-----------------------------------------------+ +| Composant | Minimum requis | ++====================+===============================================+ +| Système | Windows 10 / Windows 11 (64 bits) | ++--------------------+-----------------------------------------------+ +| RAM | 4 Go | ++--------------------+-----------------------------------------------+ +| GPU | Compatible Vulkan 1.0 ou DirectX 12 | ++--------------------+-----------------------------------------------+ +| Stockage | 500 Mo d'espace libre | ++--------------------+-----------------------------------------------+ +| Réseau | Connexion Internet (multijoueur uniquement) | ++--------------------+-----------------------------------------------+ + +Téléchargement +-------------- + +La dernière version de DauphinCraft est disponible sur le dépôt officiel : + +.. code-block:: text + + http:///dauphincraft/releases + +Téléchargez l'archive ``DauphinCraft-v0.1.0-windows.zip`` correspondant à votre système. + +.. note:: + + Remplacez ```` par l'adresse fournie par votre administrateur ou la communauté. + +Procédure d'installation +------------------------ + +1. Décompressez l'archive ``DauphinCraft-v0.1.0-windows.zip`` dans le dossier de votre choix. +2. Ouvrez le dossier extrait. +3. Double-cliquez sur ``DauphinCraft.exe`` pour lancer le jeu. + +Aucune installation supplémentaire n'est nécessaire. Le jeu est autonome (portable). + +Dépannage antivirus +------------------- + +Windows Defender ou votre antivirus peut bloquer le lancement car l'exécutable n'est pas signé. + +**Solution :** + +1. Clic droit sur ``DauphinCraft.exe`` → **Propriétés**. +2. En bas de l'onglet *Général*, cochez **Débloquer** si la case est présente. +3. Cliquez sur **Appliquer**, puis **OK**. +4. Relancez ``DauphinCraft.exe``. + +Si votre antivirus met en quarantaine le fichier, ajoutez une exception pour le dossier +d'installation de DauphinCraft. + +.. warning:: + + Téléchargez toujours DauphinCraft depuis le dépôt officiel. Ne faites pas confiance à des + sources tierces inconnues. + +Première connexion +------------------ + +Au premier lancement, le jeu vous propose trois modes : + +- **Solo** : jouer seul en monde local. +- **Héberger** : créer une partie multijoueur sur votre machine. +- **Rejoindre** : rejoindre une partie existante avec une IP et un port. + +Voir :doc:`multijoueur` pour les détails réseau. diff --git a/docs/_build/html/_sources/joueur/mecaniques.rst.txt b/docs/_build/html/_sources/joueur/mecaniques.rst.txt new file mode 100644 index 0000000..08951c4 --- /dev/null +++ b/docs/_build/html/_sources/joueur/mecaniques.rst.txt @@ -0,0 +1,86 @@ +Mécaniques de jeu +================= + +Jauges du joueur +---------------- + +Trois jauges sont visibles en permanence dans le HUD (en bas de l'écran) : + +**Oxygène (jauge bleue)** + Représente l'air restant dans les poumons du dauphin. Elle diminue lorsque vous évoluez + sous l'eau sans remonter à la surface. À zéro, vous perdez de la vie rapidement. + Remontez à la surface pour la recharger instantanément. + +**Vie (jauge rouge)** + Points de vie du dauphin. Diminue en cas d'attaque par un mob hostile ou de manque + d'oxygène prolongé. Se régénère lentement en nageant sans contrainte, ou plus vite + en consommant de la nourriture. + +**Faim (jauge orange)** + Représente la satiété. Diminue au fil du temps et lors d'actions intenses (boost, écholocation). + Si la jauge de faim atteint zéro, la régénération de vie s'arrête. + +Gestion de l'oxygène +-------------------- + +Votre dauphin a besoin de respirer. La surface de l'eau correspond à la limite supérieure +du monde. Remontez régulièrement pour éviter de vous noyer. + +- Sous **50 % d'oxygène** : la jauge clignote doucement. +- Sous **20 % d'oxygène** : la jauge clignote rapidement et un son d'alerte retentit. +- À **0 %** : vous perdez 1 PV par seconde jusqu'à la remontée. + +.. tip:: + + Craftez une **Bulle d'air** (voir :doc:`craft`) pour obtenir une réserve d'oxygène + supplémentaire d'urgence. + +Biomes sous-marins +------------------ + +Le monde est généré de façon procédurale et comporte quatre biomes principaux : + +**Récif corallien** + Zone peu profonde (0–30 m), lumineuse, riche en coraux et poissons. Idéal pour débuter. + On y trouve du **Corail Bleu** et du **Corail Rouge**. + +**Forêt de kelp** + Zone intermédiaire (20–60 m). Grandes algues offrant une visibilité réduite. + Source principale de **Kelp** et de **Kelp_Food**. + +**Abysses** + Zone profonde (80 m et plus). Obscurité totale sans lampe bio. Ressources rares + mais mobs dangereux (Requins). + +**Épaves** + Zones ponctuelles à toutes profondeurs. Recèlent de la **Roche** et de l'**Épave** + (matériaux pour recettes avancées). Attention aux Requins patrouillant les épaves. + +Mobs +---- + +Trois types de créatures peuplent les océans de DauphinCraft : + +**Bancs de poissons (FishSchool)** + Neutres. Nagent en groupe de manière aléatoire. Source de nourriture si attaqués. + Comportement de fuite à l'approche du joueur. + +**Méduses (Jellyfish)** + Passives mais infligent des dégâts de contact si on les touche (−1 PV par contact). + Lumineuses, elles sont utiles comme repères dans les abysses. + +**Requin (Shark)** + Hostile. Attaque le joueur à vue dans un rayon de 15 unités. Inflige −3 PV par morsure. + Peut être repoussé avec une **impulsion d'écholocation** (touche E). + +Mort et respawn +--------------- + +Quand vos points de vie atteignent zéro, vous mourez. Un écran de mort s'affiche. + +- Vos blocs posés dans le monde restent en place. +- Votre inventaire est conservé. +- Vous réapparaissez au point de spawn initial (centre du monde, en surface). + +En multijoueur, les autres joueurs continuent de jouer pendant votre respawn. Le délai +de respawn est de **3 secondes**. diff --git a/docs/_build/html/_sources/joueur/multijoueur.rst.txt b/docs/_build/html/_sources/joueur/multijoueur.rst.txt new file mode 100644 index 0000000..4958618 --- /dev/null +++ b/docs/_build/html/_sources/joueur/multijoueur.rst.txt @@ -0,0 +1,78 @@ +Multijoueur +=========== + +DauphinCraft supporte jusqu'à **16 joueurs simultanés** via une architecture réseau ENet UDP. + +Modes de jeu +------------ + +**Solo** + Jouer seul en monde local. Aucune connexion réseau requise. La partie n'est pas accessible + aux autres joueurs. + +**Héberger une partie** + Lancez un serveur depuis votre propre machine. Les joueurs de votre réseau local (ou Internet + si vous configurez votre routeur) peuvent vous rejoindre. + +**Rejoindre une partie** + Entrez l'adresse IP et le port d'une partie existante pour la rejoindre. + +Port réseau +----------- + +DauphinCraft utilise le port **UDP 7777** par défaut. + +Pour héberger une partie accessible depuis Internet : + +1. Ouvrez les paramètres de votre box/routeur. +2. Créez une règle de redirection de port (NAT/PAT) : + - **Port externe** : 7777 (UDP) + - **Port interne** : 7777 (UDP) + - **IP locale cible** : l'adresse IP locale de votre machine (ex. 192.168.1.10) +3. Communiquez votre **IP publique** et le port **7777** à vos amis. + +.. tip:: + + Pour trouver votre IP publique, allez sur ``https://ifconfig.me`` dans un navigateur. + +Rejoindre une partie +-------------------- + +Dans le menu principal, choisissez **Rejoindre**, puis entrez : + +- **Adresse IP** : l'IP fournie par l'hôte (ex. ``203.0.113.42``). +- **Port** : ``7777`` (ou le port personnalisé communiqué par l'hôte). + +Cliquez sur **Connexion**. Si le serveur est disponible, vous rejoindrez la partie en quelques +secondes. + +Héberger depuis le jeu +----------------------- + +Choisissez **Héberger** dans le menu principal. Le jeu démarre un serveur intégré (écoute sur +le port 7777 UDP) tout en vous permettant de jouer simultanément. + +.. note:: + + L'hébergement intégré est pratique pour des sessions entre amis. Pour un serveur permanent + 24h/24, consultez :doc:`../admin/installation_serveur`. + +Serveur public officiel +------------------------ + +Un serveur public de démonstration est disponible à l'adresse : + +.. code-block:: text + + http://example.invalid (à remplacer lors du déploiement) + +.. warning:: + + Ce serveur est fourni à titre de démonstration. Il peut être indisponible ou réinitialisé + sans préavis. + +Limite de joueurs +----------------- + +La limite par défaut est **16 joueurs** par session. Elle peut être modifiée par l'administrateur +du serveur (voir :doc:`../admin/configuration`). diff --git a/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8141580 --- /dev/null +++ b/docs/_build/html/_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/_build/html/_static/base-stemmer.js b/docs/_build/html/_static/base-stemmer.js new file mode 100644 index 0000000..ca6cca1 --- /dev/null +++ b/docs/_build/html/_static/base-stemmer.js @@ -0,0 +1,294 @@ +/**@constructor*/ +BaseStemmer = function() { + this.setCurrent = function(value) { + this.current = value; + this.cursor = 0; + this.limit = this.current.length; + this.limit_backward = 0; + this.bra = this.cursor; + this.ket = this.limit; + }; + + this.getCurrent = function() { + return this.current; + }; + + this.copy_from = function(other) { + this.current = other.current; + this.cursor = other.cursor; + this.limit = other.limit; + this.limit_backward = other.limit_backward; + this.bra = other.bra; + this.ket = other.ket; + }; + + this.in_grouping = function(s, min, max) { + if (this.cursor >= this.limit) return false; + var ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) return false; + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false; + this.cursor++; + return true; + }; + + this.in_grouping_b = function(s, min, max) { + if (this.cursor <= this.limit_backward) return false; + var ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) return false; + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false; + this.cursor--; + return true; + }; + + this.out_grouping = function(s, min, max) { + if (this.cursor >= this.limit) return false; + var ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + this.cursor++; + return true; + } + ch -= min; + if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) { + this.cursor++; + return true; + } + return false; + }; + + this.out_grouping_b = function(s, min, max) { + if (this.cursor <= this.limit_backward) return false; + var ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + this.cursor--; + return true; + } + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) { + this.cursor--; + return true; + } + return false; + }; + + this.eq_s = function(s) + { + if (this.limit - this.cursor < s.length) return false; + if (this.current.slice(this.cursor, this.cursor + s.length) != s) + { + return false; + } + this.cursor += s.length; + return true; + }; + + this.eq_s_b = function(s) + { + if (this.cursor - this.limit_backward < s.length) return false; + if (this.current.slice(this.cursor - s.length, this.cursor) != s) + { + return false; + } + this.cursor -= s.length; + return true; + }; + + /** @return {number} */ this.find_among = function(v) + { + var i = 0; + var j = v.length; + + var c = this.cursor; + var l = this.limit; + + var common_i = 0; + var common_j = 0; + + var first_key_inspected = false; + + while (true) + { + var k = i + ((j - i) >>> 1); + var diff = 0; + var common = common_i < common_j ? common_i : common_j; // smaller + // w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional) + var w = v[k]; + var i2; + for (i2 = common; i2 < w[0].length; i2++) + { + if (c + common == l) + { + diff = -1; + break; + } + diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2); + if (diff != 0) break; + common++; + } + if (diff < 0) + { + j = k; + common_j = common; + } + else + { + i = k; + common_i = common; + } + if (j - i <= 1) + { + if (i > 0) break; // v->s has been inspected + if (j == i) break; // only one item in v + + // - but now we need to go round once more to get + // v->s inspected. This looks messy, but is actually + // the optimal approach. + + if (first_key_inspected) break; + first_key_inspected = true; + } + } + do { + var w = v[i]; + if (common_i >= w[0].length) + { + this.cursor = c + w[0].length; + if (w.length < 4) return w[2]; + var res = w[3](this); + this.cursor = c + w[0].length; + if (res) return w[2]; + } + i = w[1]; + } while (i >= 0); + return 0; + }; + + // find_among_b is for backwards processing. Same comments apply + this.find_among_b = function(v) + { + var i = 0; + var j = v.length + + var c = this.cursor; + var lb = this.limit_backward; + + var common_i = 0; + var common_j = 0; + + var first_key_inspected = false; + + while (true) + { + var k = i + ((j - i) >> 1); + var diff = 0; + var common = common_i < common_j ? common_i : common_j; + var w = v[k]; + var i2; + for (i2 = w[0].length - 1 - common; i2 >= 0; i2--) + { + if (c - common == lb) + { + diff = -1; + break; + } + diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2); + if (diff != 0) break; + common++; + } + if (diff < 0) + { + j = k; + common_j = common; + } + else + { + i = k; + common_i = common; + } + if (j - i <= 1) + { + if (i > 0) break; + if (j == i) break; + if (first_key_inspected) break; + first_key_inspected = true; + } + } + do { + var w = v[i]; + if (common_i >= w[0].length) + { + this.cursor = c - w[0].length; + if (w.length < 4) return w[2]; + var res = w[3](this); + this.cursor = c - w[0].length; + if (res) return w[2]; + } + i = w[1]; + } while (i >= 0); + return 0; + }; + + /* to replace chars between c_bra and c_ket in this.current by the + * chars in s. + */ + this.replace_s = function(c_bra, c_ket, s) + { + var adjustment = s.length - (c_ket - c_bra); + this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket); + this.limit += adjustment; + if (this.cursor >= c_ket) this.cursor += adjustment; + else if (this.cursor > c_bra) this.cursor = c_bra; + return adjustment; + }; + + this.slice_check = function() + { + if (this.bra < 0 || + this.bra > this.ket || + this.ket > this.limit || + this.limit > this.current.length) + { + return false; + } + return true; + }; + + this.slice_from = function(s) + { + var result = false; + if (this.slice_check()) + { + this.replace_s(this.bra, this.ket, s); + result = true; + } + return result; + }; + + this.slice_del = function() + { + return this.slice_from(""); + }; + + this.insert = function(c_bra, c_ket, s) + { + var adjustment = this.replace_s(c_bra, c_ket, s); + if (c_bra <= this.bra) this.bra += adjustment; + if (c_bra <= this.ket) this.ket += adjustment; + }; + + this.slice_to = function() + { + var result = ''; + if (this.slice_check()) + { + result = this.current.slice(this.bra, this.ket); + } + return result; + }; + + this.assign_to = function() + { + return this.current.slice(0, this.limit); + }; +}; diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 0000000..7ebbd6d --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css new file mode 100644 index 0000000..88ba55b --- /dev/null +++ b/docs/_build/html/_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-other-versions .rtd-current-item{font-weight:700}.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}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000..6cb6000 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000..7059e23 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000..f815f63 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000..f2c76e5 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/docs/_build/html/_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/_build/html/_static/css/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000..88ad05b Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000..c4e3d80 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold.woff b/docs/_build/html/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000..c6dff51 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold.woff2 b/docs/_build/html/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000..bb19504 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000..76114bc Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000..3404f37 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal.woff b/docs/_build/html/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000..ae1307f Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal.woff2 b/docs/_build/html/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000..3bf9843 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css new file mode 100644 index 0000000..a88467c --- /dev/null +++ b/docs/_build/html/_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 .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{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,.wy-side-nav-search>a.icon{display:block}.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.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.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-other-versions .rtd-current-item{font-weight:700}.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}}#flyout-search-form{padding:6px}.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%;float:none;margin-left:0}}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/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 0000000..0398ebb --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"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/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js new file mode 100644 index 0000000..34692a2 --- /dev/null +++ b/docs/_build/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1.0', + LANGUAGE: 'fr', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + 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/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/docs/_build/html/_static/file.png differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.eot b/docs/_build/html/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 0000000..3361183 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 0000000..29f691d Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff b/docs/_build/html/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 0000000..c6dff51 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 0000000..bb19504 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 0000000..3d41549 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 0000000..f402040 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 0000000..88ad05b Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 0000000..c4e3d80 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.eot b/docs/_build/html/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 0000000..3f82642 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 0000000..b4bfc9b Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff b/docs/_build/html/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 0000000..76114bc Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 0000000..3404f37 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.eot b/docs/_build/html/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 0000000..11e3f2a Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 0000000..74decd9 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff b/docs/_build/html/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 0000000..ae1307f Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 0000000..3bf9843 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 0000000..79dc8ef Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 0000000..df5d1df Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 0000000..6cb6000 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 0000000..7059e23 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 0000000..2f7ca78 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 0000000..eb52a79 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 0000000..f815f63 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 0000000..f2c76e5 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/_build/html/_static/french-stemmer.js b/docs/_build/html/_static/french-stemmer.js new file mode 100644 index 0000000..c970831 --- /dev/null +++ b/docs/_build/html/_static/french-stemmer.js @@ -0,0 +1,1325 @@ +// Generated by Snowball 2.1.0 - https://snowballstem.org/ + +/**@constructor*/ +FrenchStemmer = function() { + var base = new BaseStemmer(); + /** @const */ var a_0 = [ + ["col", -1, -1], + ["par", -1, -1], + ["tap", -1, -1] + ]; + + /** @const */ var a_1 = [ + ["", -1, 7], + ["H", 0, 6], + ["He", 1, 4], + ["Hi", 1, 5], + ["I", 0, 1], + ["U", 0, 2], + ["Y", 0, 3] + ]; + + /** @const */ var a_2 = [ + ["iqU", -1, 3], + ["abl", -1, 3], + ["I\u00E8r", -1, 4], + ["i\u00E8r", -1, 4], + ["eus", -1, 2], + ["iv", -1, 1] + ]; + + /** @const */ var a_3 = [ + ["ic", -1, 2], + ["abil", -1, 1], + ["iv", -1, 3] + ]; + + /** @const */ var a_4 = [ + ["iqUe", -1, 1], + ["atrice", -1, 2], + ["ance", -1, 1], + ["ence", -1, 5], + ["logie", -1, 3], + ["able", -1, 1], + ["isme", -1, 1], + ["euse", -1, 11], + ["iste", -1, 1], + ["ive", -1, 8], + ["if", -1, 8], + ["usion", -1, 4], + ["ation", -1, 2], + ["ution", -1, 4], + ["ateur", -1, 2], + ["iqUes", -1, 1], + ["atrices", -1, 2], + ["ances", -1, 1], + ["ences", -1, 5], + ["logies", -1, 3], + ["ables", -1, 1], + ["ismes", -1, 1], + ["euses", -1, 11], + ["istes", -1, 1], + ["ives", -1, 8], + ["ifs", -1, 8], + ["usions", -1, 4], + ["ations", -1, 2], + ["utions", -1, 4], + ["ateurs", -1, 2], + ["ments", -1, 15], + ["ements", 30, 6], + ["issements", 31, 12], + ["it\u00E9s", -1, 7], + ["ment", -1, 15], + ["ement", 34, 6], + ["issement", 35, 12], + ["amment", 34, 13], + ["emment", 34, 14], + ["aux", -1, 10], + ["eaux", 39, 9], + ["eux", -1, 1], + ["it\u00E9", -1, 7] + ]; + + /** @const */ var a_5 = [ + ["ira", -1, 1], + ["ie", -1, 1], + ["isse", -1, 1], + ["issante", -1, 1], + ["i", -1, 1], + ["irai", 4, 1], + ["ir", -1, 1], + ["iras", -1, 1], + ["ies", -1, 1], + ["\u00EEmes", -1, 1], + ["isses", -1, 1], + ["issantes", -1, 1], + ["\u00EEtes", -1, 1], + ["is", -1, 1], + ["irais", 13, 1], + ["issais", 13, 1], + ["irions", -1, 1], + ["issions", -1, 1], + ["irons", -1, 1], + ["issons", -1, 1], + ["issants", -1, 1], + ["it", -1, 1], + ["irait", 21, 1], + ["issait", 21, 1], + ["issant", -1, 1], + ["iraIent", -1, 1], + ["issaIent", -1, 1], + ["irent", -1, 1], + ["issent", -1, 1], + ["iront", -1, 1], + ["\u00EEt", -1, 1], + ["iriez", -1, 1], + ["issiez", -1, 1], + ["irez", -1, 1], + ["issez", -1, 1] + ]; + + /** @const */ var a_6 = [ + ["a", -1, 3], + ["era", 0, 2], + ["asse", -1, 3], + ["ante", -1, 3], + ["\u00E9e", -1, 2], + ["ai", -1, 3], + ["erai", 5, 2], + ["er", -1, 2], + ["as", -1, 3], + ["eras", 8, 2], + ["\u00E2mes", -1, 3], + ["asses", -1, 3], + ["antes", -1, 3], + ["\u00E2tes", -1, 3], + ["\u00E9es", -1, 2], + ["ais", -1, 3], + ["erais", 15, 2], + ["ions", -1, 1], + ["erions", 17, 2], + ["assions", 17, 3], + ["erons", -1, 2], + ["ants", -1, 3], + ["\u00E9s", -1, 2], + ["ait", -1, 3], + ["erait", 23, 2], + ["ant", -1, 3], + ["aIent", -1, 3], + ["eraIent", 26, 2], + ["\u00E8rent", -1, 2], + ["assent", -1, 3], + ["eront", -1, 2], + ["\u00E2t", -1, 3], + ["ez", -1, 2], + ["iez", 32, 2], + ["eriez", 33, 2], + ["assiez", 33, 3], + ["erez", 32, 2], + ["\u00E9", -1, 2] + ]; + + /** @const */ var a_7 = [ + ["e", -1, 3], + ["I\u00E8re", 0, 2], + ["i\u00E8re", 0, 2], + ["ion", -1, 1], + ["Ier", -1, 2], + ["ier", -1, 2] + ]; + + /** @const */ var a_8 = [ + ["ell", -1, -1], + ["eill", -1, -1], + ["enn", -1, -1], + ["onn", -1, -1], + ["ett", -1, -1] + ]; + + /** @const */ var /** Array */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 130, 103, 8, 5]; + + /** @const */ var /** Array */ g_keep_with_s = [1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128]; + + var /** number */ I_p2 = 0; + var /** number */ I_p1 = 0; + var /** number */ I_pV = 0; + + + /** @return {boolean} */ + function r_prelude() { + while(true) + { + var /** number */ v_1 = base.cursor; + lab0: { + golab1: while(true) + { + var /** number */ v_2 = base.cursor; + lab2: { + lab3: { + var /** number */ v_3 = base.cursor; + lab4: { + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab4; + } + base.bra = base.cursor; + lab5: { + var /** number */ v_4 = base.cursor; + lab6: { + if (!(base.eq_s("u"))) + { + break lab6; + } + base.ket = base.cursor; + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab6; + } + if (!base.slice_from("U")) + { + return false; + } + break lab5; + } + base.cursor = v_4; + lab7: { + if (!(base.eq_s("i"))) + { + break lab7; + } + base.ket = base.cursor; + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab7; + } + if (!base.slice_from("I")) + { + return false; + } + break lab5; + } + base.cursor = v_4; + if (!(base.eq_s("y"))) + { + break lab4; + } + base.ket = base.cursor; + if (!base.slice_from("Y")) + { + return false; + } + } + break lab3; + } + base.cursor = v_3; + lab8: { + base.bra = base.cursor; + if (!(base.eq_s("\u00EB"))) + { + break lab8; + } + base.ket = base.cursor; + if (!base.slice_from("He")) + { + return false; + } + break lab3; + } + base.cursor = v_3; + lab9: { + base.bra = base.cursor; + if (!(base.eq_s("\u00EF"))) + { + break lab9; + } + base.ket = base.cursor; + if (!base.slice_from("Hi")) + { + return false; + } + break lab3; + } + base.cursor = v_3; + lab10: { + base.bra = base.cursor; + if (!(base.eq_s("y"))) + { + break lab10; + } + base.ket = base.cursor; + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab10; + } + if (!base.slice_from("Y")) + { + return false; + } + break lab3; + } + base.cursor = v_3; + if (!(base.eq_s("q"))) + { + break lab2; + } + base.bra = base.cursor; + if (!(base.eq_s("u"))) + { + break lab2; + } + base.ket = base.cursor; + if (!base.slice_from("U")) + { + return false; + } + } + base.cursor = v_2; + break golab1; + } + base.cursor = v_2; + if (base.cursor >= base.limit) + { + break lab0; + } + base.cursor++; + } + continue; + } + base.cursor = v_1; + break; + } + return true; + }; + + /** @return {boolean} */ + function r_mark_regions() { + I_pV = base.limit; + I_p1 = base.limit; + I_p2 = base.limit; + var /** number */ v_1 = base.cursor; + lab0: { + lab1: { + var /** number */ v_2 = base.cursor; + lab2: { + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab2; + } + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab2; + } + if (base.cursor >= base.limit) + { + break lab2; + } + base.cursor++; + break lab1; + } + base.cursor = v_2; + lab3: { + if (base.find_among(a_0) == 0) + { + break lab3; + } + break lab1; + } + base.cursor = v_2; + if (base.cursor >= base.limit) + { + break lab0; + } + base.cursor++; + golab4: while(true) + { + lab5: { + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab5; + } + break golab4; + } + if (base.cursor >= base.limit) + { + break lab0; + } + base.cursor++; + } + } + I_pV = base.cursor; + } + base.cursor = v_1; + var /** number */ v_4 = base.cursor; + lab6: { + golab7: while(true) + { + lab8: { + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab8; + } + break golab7; + } + if (base.cursor >= base.limit) + { + break lab6; + } + base.cursor++; + } + golab9: while(true) + { + lab10: { + if (!(base.out_grouping(g_v, 97, 251))) + { + break lab10; + } + break golab9; + } + if (base.cursor >= base.limit) + { + break lab6; + } + base.cursor++; + } + I_p1 = base.cursor; + golab11: while(true) + { + lab12: { + if (!(base.in_grouping(g_v, 97, 251))) + { + break lab12; + } + break golab11; + } + if (base.cursor >= base.limit) + { + break lab6; + } + base.cursor++; + } + golab13: while(true) + { + lab14: { + if (!(base.out_grouping(g_v, 97, 251))) + { + break lab14; + } + break golab13; + } + if (base.cursor >= base.limit) + { + break lab6; + } + base.cursor++; + } + I_p2 = base.cursor; + } + base.cursor = v_4; + return true; + }; + + /** @return {boolean} */ + function r_postlude() { + var /** number */ among_var; + while(true) + { + var /** number */ v_1 = base.cursor; + lab0: { + base.bra = base.cursor; + among_var = base.find_among(a_1); + if (among_var == 0) + { + break lab0; + } + base.ket = base.cursor; + switch (among_var) { + case 1: + if (!base.slice_from("i")) + { + return false; + } + break; + case 2: + if (!base.slice_from("u")) + { + return false; + } + break; + case 3: + if (!base.slice_from("y")) + { + return false; + } + break; + case 4: + if (!base.slice_from("\u00EB")) + { + return false; + } + break; + case 5: + if (!base.slice_from("\u00EF")) + { + return false; + } + break; + case 6: + if (!base.slice_del()) + { + return false; + } + break; + case 7: + if (base.cursor >= base.limit) + { + break lab0; + } + base.cursor++; + break; + } + continue; + } + base.cursor = v_1; + break; + } + return true; + }; + + /** @return {boolean} */ + function r_RV() { + if (!(I_pV <= base.cursor)) + { + return false; + } + return true; + }; + + /** @return {boolean} */ + function r_R1() { + if (!(I_p1 <= base.cursor)) + { + return false; + } + return true; + }; + + /** @return {boolean} */ + function r_R2() { + if (!(I_p2 <= base.cursor)) + { + return false; + } + return true; + }; + + /** @return {boolean} */ + function r_standard_suffix() { + var /** number */ among_var; + base.ket = base.cursor; + among_var = base.find_among_b(a_4); + if (among_var == 0) + { + return false; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + break; + case 2: + if (!r_R2()) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + var /** number */ v_1 = base.limit - base.cursor; + lab0: { + base.ket = base.cursor; + if (!(base.eq_s_b("ic"))) + { + base.cursor = base.limit - v_1; + break lab0; + } + base.bra = base.cursor; + lab1: { + var /** number */ v_2 = base.limit - base.cursor; + lab2: { + if (!r_R2()) + { + break lab2; + } + if (!base.slice_del()) + { + return false; + } + break lab1; + } + base.cursor = base.limit - v_2; + if (!base.slice_from("iqU")) + { + return false; + } + } + } + break; + case 3: + if (!r_R2()) + { + return false; + } + if (!base.slice_from("log")) + { + return false; + } + break; + case 4: + if (!r_R2()) + { + return false; + } + if (!base.slice_from("u")) + { + return false; + } + break; + case 5: + if (!r_R2()) + { + return false; + } + if (!base.slice_from("ent")) + { + return false; + } + break; + case 6: + if (!r_RV()) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + var /** number */ v_3 = base.limit - base.cursor; + lab3: { + base.ket = base.cursor; + among_var = base.find_among_b(a_2); + if (among_var == 0) + { + base.cursor = base.limit - v_3; + break lab3; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + { + base.cursor = base.limit - v_3; + break lab3; + } + if (!base.slice_del()) + { + return false; + } + base.ket = base.cursor; + if (!(base.eq_s_b("at"))) + { + base.cursor = base.limit - v_3; + break lab3; + } + base.bra = base.cursor; + if (!r_R2()) + { + base.cursor = base.limit - v_3; + break lab3; + } + if (!base.slice_del()) + { + return false; + } + break; + case 2: + lab4: { + var /** number */ v_4 = base.limit - base.cursor; + lab5: { + if (!r_R2()) + { + break lab5; + } + if (!base.slice_del()) + { + return false; + } + break lab4; + } + base.cursor = base.limit - v_4; + if (!r_R1()) + { + base.cursor = base.limit - v_3; + break lab3; + } + if (!base.slice_from("eux")) + { + return false; + } + } + break; + case 3: + if (!r_R2()) + { + base.cursor = base.limit - v_3; + break lab3; + } + if (!base.slice_del()) + { + return false; + } + break; + case 4: + if (!r_RV()) + { + base.cursor = base.limit - v_3; + break lab3; + } + if (!base.slice_from("i")) + { + return false; + } + break; + } + } + break; + case 7: + if (!r_R2()) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + var /** number */ v_5 = base.limit - base.cursor; + lab6: { + base.ket = base.cursor; + among_var = base.find_among_b(a_3); + if (among_var == 0) + { + base.cursor = base.limit - v_5; + break lab6; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + lab7: { + var /** number */ v_6 = base.limit - base.cursor; + lab8: { + if (!r_R2()) + { + break lab8; + } + if (!base.slice_del()) + { + return false; + } + break lab7; + } + base.cursor = base.limit - v_6; + if (!base.slice_from("abl")) + { + return false; + } + } + break; + case 2: + lab9: { + var /** number */ v_7 = base.limit - base.cursor; + lab10: { + if (!r_R2()) + { + break lab10; + } + if (!base.slice_del()) + { + return false; + } + break lab9; + } + base.cursor = base.limit - v_7; + if (!base.slice_from("iqU")) + { + return false; + } + } + break; + case 3: + if (!r_R2()) + { + base.cursor = base.limit - v_5; + break lab6; + } + if (!base.slice_del()) + { + return false; + } + break; + } + } + break; + case 8: + if (!r_R2()) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + var /** number */ v_8 = base.limit - base.cursor; + lab11: { + base.ket = base.cursor; + if (!(base.eq_s_b("at"))) + { + base.cursor = base.limit - v_8; + break lab11; + } + base.bra = base.cursor; + if (!r_R2()) + { + base.cursor = base.limit - v_8; + break lab11; + } + if (!base.slice_del()) + { + return false; + } + base.ket = base.cursor; + if (!(base.eq_s_b("ic"))) + { + base.cursor = base.limit - v_8; + break lab11; + } + base.bra = base.cursor; + lab12: { + var /** number */ v_9 = base.limit - base.cursor; + lab13: { + if (!r_R2()) + { + break lab13; + } + if (!base.slice_del()) + { + return false; + } + break lab12; + } + base.cursor = base.limit - v_9; + if (!base.slice_from("iqU")) + { + return false; + } + } + } + break; + case 9: + if (!base.slice_from("eau")) + { + return false; + } + break; + case 10: + if (!r_R1()) + { + return false; + } + if (!base.slice_from("al")) + { + return false; + } + break; + case 11: + lab14: { + var /** number */ v_10 = base.limit - base.cursor; + lab15: { + if (!r_R2()) + { + break lab15; + } + if (!base.slice_del()) + { + return false; + } + break lab14; + } + base.cursor = base.limit - v_10; + if (!r_R1()) + { + return false; + } + if (!base.slice_from("eux")) + { + return false; + } + } + break; + case 12: + if (!r_R1()) + { + return false; + } + if (!(base.out_grouping_b(g_v, 97, 251))) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + break; + case 13: + if (!r_RV()) + { + return false; + } + if (!base.slice_from("ant")) + { + return false; + } + return false; + case 14: + if (!r_RV()) + { + return false; + } + if (!base.slice_from("ent")) + { + return false; + } + return false; + case 15: + var /** number */ v_11 = base.limit - base.cursor; + if (!(base.in_grouping_b(g_v, 97, 251))) + { + return false; + } + if (!r_RV()) + { + return false; + } + base.cursor = base.limit - v_11; + if (!base.slice_del()) + { + return false; + } + return false; + } + return true; + }; + + /** @return {boolean} */ + function r_i_verb_suffix() { + if (base.cursor < I_pV) + { + return false; + } + var /** number */ v_2 = base.limit_backward; + base.limit_backward = I_pV; + base.ket = base.cursor; + if (base.find_among_b(a_5) == 0) + { + base.limit_backward = v_2; + return false; + } + base.bra = base.cursor; + { + var /** number */ v_3 = base.limit - base.cursor; + lab0: { + if (!(base.eq_s_b("H"))) + { + break lab0; + } + base.limit_backward = v_2; + return false; + } + base.cursor = base.limit - v_3; + } + if (!(base.out_grouping_b(g_v, 97, 251))) + { + base.limit_backward = v_2; + return false; + } + if (!base.slice_del()) + { + return false; + } + base.limit_backward = v_2; + return true; + }; + + /** @return {boolean} */ + function r_verb_suffix() { + var /** number */ among_var; + if (base.cursor < I_pV) + { + return false; + } + var /** number */ v_2 = base.limit_backward; + base.limit_backward = I_pV; + base.ket = base.cursor; + among_var = base.find_among_b(a_6); + if (among_var == 0) + { + base.limit_backward = v_2; + return false; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + { + base.limit_backward = v_2; + return false; + } + if (!base.slice_del()) + { + return false; + } + break; + case 2: + if (!base.slice_del()) + { + return false; + } + break; + case 3: + if (!base.slice_del()) + { + return false; + } + var /** number */ v_3 = base.limit - base.cursor; + lab0: { + base.ket = base.cursor; + if (!(base.eq_s_b("e"))) + { + base.cursor = base.limit - v_3; + break lab0; + } + base.bra = base.cursor; + if (!base.slice_del()) + { + return false; + } + } + break; + } + base.limit_backward = v_2; + return true; + }; + + /** @return {boolean} */ + function r_residual_suffix() { + var /** number */ among_var; + var /** number */ v_1 = base.limit - base.cursor; + lab0: { + base.ket = base.cursor; + if (!(base.eq_s_b("s"))) + { + base.cursor = base.limit - v_1; + break lab0; + } + base.bra = base.cursor; + var /** number */ v_2 = base.limit - base.cursor; + lab1: { + var /** number */ v_3 = base.limit - base.cursor; + lab2: { + if (!(base.eq_s_b("Hi"))) + { + break lab2; + } + break lab1; + } + base.cursor = base.limit - v_3; + if (!(base.out_grouping_b(g_keep_with_s, 97, 232))) + { + base.cursor = base.limit - v_1; + break lab0; + } + } + base.cursor = base.limit - v_2; + if (!base.slice_del()) + { + return false; + } + } + if (base.cursor < I_pV) + { + return false; + } + var /** number */ v_5 = base.limit_backward; + base.limit_backward = I_pV; + base.ket = base.cursor; + among_var = base.find_among_b(a_7); + if (among_var == 0) + { + base.limit_backward = v_5; + return false; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + { + base.limit_backward = v_5; + return false; + } + lab3: { + var /** number */ v_6 = base.limit - base.cursor; + lab4: { + if (!(base.eq_s_b("s"))) + { + break lab4; + } + break lab3; + } + base.cursor = base.limit - v_6; + if (!(base.eq_s_b("t"))) + { + base.limit_backward = v_5; + return false; + } + } + if (!base.slice_del()) + { + return false; + } + break; + case 2: + if (!base.slice_from("i")) + { + return false; + } + break; + case 3: + if (!base.slice_del()) + { + return false; + } + break; + } + base.limit_backward = v_5; + return true; + }; + + /** @return {boolean} */ + function r_un_double() { + var /** number */ v_1 = base.limit - base.cursor; + if (base.find_among_b(a_8) == 0) + { + return false; + } + base.cursor = base.limit - v_1; + base.ket = base.cursor; + if (base.cursor <= base.limit_backward) + { + return false; + } + base.cursor--; + base.bra = base.cursor; + if (!base.slice_del()) + { + return false; + } + return true; + }; + + /** @return {boolean} */ + function r_un_accent() { + { + var v_1 = 1; + while(true) + { + lab0: { + if (!(base.out_grouping_b(g_v, 97, 251))) + { + break lab0; + } + v_1--; + continue; + } + break; + } + if (v_1 > 0) + { + return false; + } + } + base.ket = base.cursor; + lab1: { + var /** number */ v_3 = base.limit - base.cursor; + lab2: { + if (!(base.eq_s_b("\u00E9"))) + { + break lab2; + } + break lab1; + } + base.cursor = base.limit - v_3; + if (!(base.eq_s_b("\u00E8"))) + { + return false; + } + } + base.bra = base.cursor; + if (!base.slice_from("e")) + { + return false; + } + return true; + }; + + this.stem = /** @return {boolean} */ function() { + var /** number */ v_1 = base.cursor; + r_prelude(); + base.cursor = v_1; + r_mark_regions(); + base.limit_backward = base.cursor; base.cursor = base.limit; + var /** number */ v_3 = base.limit - base.cursor; + lab0: { + lab1: { + var /** number */ v_4 = base.limit - base.cursor; + lab2: { + var /** number */ v_5 = base.limit - base.cursor; + lab3: { + var /** number */ v_6 = base.limit - base.cursor; + lab4: { + if (!r_standard_suffix()) + { + break lab4; + } + break lab3; + } + base.cursor = base.limit - v_6; + lab5: { + if (!r_i_verb_suffix()) + { + break lab5; + } + break lab3; + } + base.cursor = base.limit - v_6; + if (!r_verb_suffix()) + { + break lab2; + } + } + base.cursor = base.limit - v_5; + var /** number */ v_7 = base.limit - base.cursor; + lab6: { + base.ket = base.cursor; + lab7: { + var /** number */ v_8 = base.limit - base.cursor; + lab8: { + if (!(base.eq_s_b("Y"))) + { + break lab8; + } + base.bra = base.cursor; + if (!base.slice_from("i")) + { + return false; + } + break lab7; + } + base.cursor = base.limit - v_8; + if (!(base.eq_s_b("\u00E7"))) + { + base.cursor = base.limit - v_7; + break lab6; + } + base.bra = base.cursor; + if (!base.slice_from("c")) + { + return false; + } + } + } + break lab1; + } + base.cursor = base.limit - v_4; + if (!r_residual_suffix()) + { + break lab0; + } + } + } + base.cursor = base.limit - v_3; + var /** number */ v_9 = base.limit - base.cursor; + r_un_double(); + base.cursor = base.limit - v_9; + var /** number */ v_10 = base.limit - base.cursor; + r_un_accent(); + base.cursor = base.limit - v_10; + base.cursor = base.limit_backward; + var /** number */ v_11 = base.cursor; + r_postlude(); + base.cursor = v_11; + return true; + }; + + /**@return{string}*/ + this['stemWord'] = function(/**string*/word) { + base.setCurrent(word); + this.stem(); + return base.getCurrent(); + }; +}; diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/_build/html/_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"),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;t a.language.name.localeCompare(b.language.name)); + + const languagesHTML = ` +
+
Languages
+ ${languages + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} +
+ `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Téléchargements
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
À propos de Read the Docs
+
+ Accueil du projet +
+
+ Compilations +
+
+ Téléchargements +
+
+
+
Recherche
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js new file mode 100644 index 0000000..de1c0f1 --- /dev/null +++ b/docs/_build/html/_static/language_data.js @@ -0,0 +1,12 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["ai", "aie", "aient", "aies", "ait", "as", "au", "aura", "aurai", "auraient", "aurais", "aurait", "auras", "aurez", "auriez", "aurions", "aurons", "auront", "aux", "avaient", "avais", "avait", "avec", "avez", "aviez", "avions", "avons", "ayant", "ayez", "ayons", "c", "ce", "ceci", "cela", "cel\u00e0", "ces", "cet", "cette", "d", "dans", "de", "des", "du", "elle", "en", "es", "est", "et", "eu", "eue", "eues", "eurent", "eus", "eusse", "eussent", "eusses", "eussiez", "eussions", "eut", "eux", "e\u00fbmes", "e\u00fbt", "e\u00fbtes", "furent", "fus", "fusse", "fussent", "fusses", "fussiez", "fussions", "fut", "f\u00fbmes", "f\u00fbt", "f\u00fbtes", "ici", "il", "ils", "j", "je", "l", "la", "le", "les", "leur", "leurs", "lui", "m", "ma", "mais", "me", "mes", "moi", "mon", "m\u00eame", "n", "ne", "nos", "notre", "nous", "on", "ont", "ou", "par", "pas", "pour", "qu", "que", "quel", "quelle", "quelles", "quels", "qui", "s", "sa", "sans", "se", "sera", "serai", "seraient", "serais", "serait", "seras", "serez", "seriez", "serions", "serons", "seront", "ses", "soi", "soient", "sois", "soit", "sommes", "son", "sont", "soyez", "soyons", "suis", "sur", "t", "ta", "te", "tes", "toi", "ton", "tu", "un", "une", "vos", "votre", "vous", "y", "\u00e0", "\u00e9taient", "\u00e9tais", "\u00e9tait", "\u00e9tant", "\u00e9tiez", "\u00e9tions", "\u00e9t\u00e9", "\u00e9t\u00e9e", "\u00e9t\u00e9es", "\u00e9t\u00e9s", "\u00eates"]; + + +/* Non-minified version is copied as a separate JS file, if available */ +BaseStemmer=function(){this.setCurrent=function(r){this.current=r;this.cursor=0;this.limit=this.current.length;this.limit_backward=0;this.bra=this.cursor;this.ket=this.limit};this.getCurrent=function(){return this.current};this.copy_from=function(r){this.current=r.current;this.cursor=r.cursor;this.limit=r.limit;this.limit_backward=r.limit_backward;this.bra=r.bra;this.ket=r.ket};this.in_grouping=function(r,t,i){if(this.cursor>=this.limit)return false;var s=this.current.charCodeAt(this.cursor);if(s>i||s>>3]&1<<(s&7))==0)return false;this.cursor++;return true};this.in_grouping_b=function(r,t,i){if(this.cursor<=this.limit_backward)return false;var s=this.current.charCodeAt(this.cursor-1);if(s>i||s>>3]&1<<(s&7))==0)return false;this.cursor--;return true};this.out_grouping=function(r,t,i){if(this.cursor>=this.limit)return false;var s=this.current.charCodeAt(this.cursor);if(s>i||s>>3]&1<<(s&7))==0){this.cursor++;return true}return false};this.out_grouping_b=function(r,t,i){if(this.cursor<=this.limit_backward)return false;var s=this.current.charCodeAt(this.cursor-1);if(s>i||s>>3]&1<<(s&7))==0){this.cursor--;return true}return false};this.eq_s=function(r){if(this.limit-this.cursor>>1);var a=0;var f=h0)break;if(i==t)break;if(n)break;n=true}}do{var l=r[t];if(h>=l[0].length){this.cursor=s+l[0].length;if(l.length<4)return l[2];var v=l[3](this);this.cursor=s+l[0].length;if(v)return l[2]}t=l[1]}while(t>=0);return 0};this.find_among_b=function(r){var t=0;var i=r.length;var s=this.cursor;var e=this.limit_backward;var h=0;var u=0;var n=false;while(true){var c=t+(i-t>>1);var a=0;var f=h=0;o--){if(s-f==e){a=-1;break}a=this.current.charCodeAt(s-1-f)-l[0].charCodeAt(o);if(a!=0)break;f++}if(a<0){i=c;u=f}else{t=c;h=f}if(i-t<=1){if(t>0)break;if(i==t)break;if(n)break;n=true}}do{var l=r[t];if(h>=l[0].length){this.cursor=s-l[0].length;if(l.length<4)return l[2];var v=l[3](this);this.cursor=s-l[0].length;if(v)return l[2]}t=l[1]}while(t>=0);return 0};this.replace_s=function(r,t,i){var s=i.length-(t-r);this.current=this.current.slice(0,r)+i+this.current.slice(t);this.limit+=s;if(this.cursor>=t)this.cursor+=s;else if(this.cursor>r)this.cursor=r;return s};this.slice_check=function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>this.current.length){return false}return true};this.slice_from=function(r){var t=false;if(this.slice_check()){this.replace_s(this.bra,this.ket,r);t=true}return t};this.slice_del=function(){return this.slice_from("")};this.insert=function(r,t,i){var s=this.replace_s(r,t,i);if(r<=this.bra)this.bra+=s;if(r<=this.ket)this.ket+=s};this.slice_to=function(){var r="";if(this.slice_check()){r=this.current.slice(this.bra,this.ket)}return r};this.assign_to=function(){return this.current.slice(0,this.limit)}}; +FrenchStemmer=function(){var r=new BaseStemmer;var e=[["col",-1,-1],["par",-1,-1],["tap",-1,-1]];var i=[["",-1,7],["H",0,6],["He",1,4],["Hi",1,5],["I",0,1],["U",0,2],["Y",0,3]];var s=[["iqU",-1,3],["abl",-1,3],["Ièr",-1,4],["ièr",-1,4],["eus",-1,2],["iv",-1,1]];var a=[["ic",-1,2],["abil",-1,1],["iv",-1,3]];var u=[["iqUe",-1,1],["atrice",-1,2],["ance",-1,1],["ence",-1,5],["logie",-1,3],["able",-1,1],["isme",-1,1],["euse",-1,11],["iste",-1,1],["ive",-1,8],["if",-1,8],["usion",-1,4],["ation",-1,2],["ution",-1,4],["ateur",-1,2],["iqUes",-1,1],["atrices",-1,2],["ances",-1,1],["ences",-1,5],["logies",-1,3],["ables",-1,1],["ismes",-1,1],["euses",-1,11],["istes",-1,1],["ives",-1,8],["ifs",-1,8],["usions",-1,4],["ations",-1,2],["utions",-1,4],["ateurs",-1,2],["ments",-1,15],["ements",30,6],["issements",31,12],["ités",-1,7],["ment",-1,15],["ement",34,6],["issement",35,12],["amment",34,13],["emment",34,14],["aux",-1,10],["eaux",39,9],["eux",-1,1],["ité",-1,7]];var t=[["ira",-1,1],["ie",-1,1],["isse",-1,1],["issante",-1,1],["i",-1,1],["irai",4,1],["ir",-1,1],["iras",-1,1],["ies",-1,1],["îmes",-1,1],["isses",-1,1],["issantes",-1,1],["îtes",-1,1],["is",-1,1],["irais",13,1],["issais",13,1],["irions",-1,1],["issions",-1,1],["irons",-1,1],["issons",-1,1],["issants",-1,1],["it",-1,1],["irait",21,1],["issait",21,1],["issant",-1,1],["iraIent",-1,1],["issaIent",-1,1],["irent",-1,1],["issent",-1,1],["iront",-1,1],["ît",-1,1],["iriez",-1,1],["issiez",-1,1],["irez",-1,1],["issez",-1,1]];var c=[["a",-1,3],["era",0,2],["asse",-1,3],["ante",-1,3],["ée",-1,2],["ai",-1,3],["erai",5,2],["er",-1,2],["as",-1,3],["eras",8,2],["âmes",-1,3],["asses",-1,3],["antes",-1,3],["âtes",-1,3],["ées",-1,2],["ais",-1,3],["erais",15,2],["ions",-1,1],["erions",17,2],["assions",17,3],["erons",-1,2],["ants",-1,3],["és",-1,2],["ait",-1,3],["erait",23,2],["ant",-1,3],["aIent",-1,3],["eraIent",26,2],["èrent",-1,2],["assent",-1,3],["eront",-1,2],["ât",-1,3],["ez",-1,2],["iez",32,2],["eriez",33,2],["assiez",33,3],["erez",32,2],["é",-1,2]];var f=[["e",-1,3],["Ière",0,2],["ière",0,2],["ion",-1,1],["Ier",-1,2],["ier",-1,2]];var l=[["ell",-1,-1],["eill",-1,-1],["enn",-1,-1],["onn",-1,-1],["ett",-1,-1]];var o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5];var n=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128];var b=0;var k=0;var m=0;function _(){while(true){var e=r.cursor;r:{e:while(true){var i=r.cursor;i:{s:{var s=r.cursor;a:{if(!r.in_grouping(o,97,251)){break a}r.bra=r.cursor;u:{var a=r.cursor;t:{if(!r.eq_s("u")){break t}r.ket=r.cursor;if(!r.in_grouping(o,97,251)){break t}if(!r.slice_from("U")){return false}break u}r.cursor=a;t:{if(!r.eq_s("i")){break t}r.ket=r.cursor;if(!r.in_grouping(o,97,251)){break t}if(!r.slice_from("I")){return false}break u}r.cursor=a;if(!r.eq_s("y")){break a}r.ket=r.cursor;if(!r.slice_from("Y")){return false}}break s}r.cursor=s;a:{r.bra=r.cursor;if(!r.eq_s("ë")){break a}r.ket=r.cursor;if(!r.slice_from("He")){return false}break s}r.cursor=s;a:{r.bra=r.cursor;if(!r.eq_s("ï")){break a}r.ket=r.cursor;if(!r.slice_from("Hi")){return false}break s}r.cursor=s;a:{r.bra=r.cursor;if(!r.eq_s("y")){break a}r.ket=r.cursor;if(!r.in_grouping(o,97,251)){break a}if(!r.slice_from("Y")){return false}break s}r.cursor=s;if(!r.eq_s("q")){break i}r.bra=r.cursor;if(!r.eq_s("u")){break i}r.ket=r.cursor;if(!r.slice_from("U")){return false}}r.cursor=i;break e}r.cursor=i;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=e;break}return true}function v(){m=r.limit;k=r.limit;b=r.limit;var i=r.cursor;r:{e:{var s=r.cursor;i:{if(!r.in_grouping(o,97,251)){break i}if(!r.in_grouping(o,97,251)){break i}if(r.cursor>=r.limit){break i}r.cursor++;break e}r.cursor=s;i:{if(r.find_among(e)==0){break i}break e}r.cursor=s;if(r.cursor>=r.limit){break r}r.cursor++;i:while(true){s:{if(!r.in_grouping(o,97,251)){break s}break i}if(r.cursor>=r.limit){break r}r.cursor++}}m=r.cursor}r.cursor=i;var a=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}k=r.cursor;e:while(true){i:{if(!r.in_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}b=r.cursor}r.cursor=a;return true}function d(){var e;while(true){var s=r.cursor;r:{r.bra=r.cursor;e=r.find_among(i);if(e==0){break r}r.ket=r.cursor;switch(e){case 1:if(!r.slice_from("i")){return false}break;case 2:if(!r.slice_from("u")){return false}break;case 3:if(!r.slice_from("y")){return false}break;case 4:if(!r.slice_from("ë")){return false}break;case 5:if(!r.slice_from("ï")){return false}break;case 6:if(!r.slice_del()){return false}break;case 7:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}return true}function g(){if(!(m<=r.cursor)){return false}return true}function w(){if(!(k<=r.cursor)){return false}return true}function q(){if(!(b<=r.cursor)){return false}return true}function h(){var e;r.ket=r.cursor;e=r.find_among_b(u);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!q()){return false}if(!r.slice_del()){return false}break;case 2:if(!q()){return false}if(!r.slice_del()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-i;break r}r.bra=r.cursor;e:{var t=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-t;if(!r.slice_from("iqU")){return false}}}break;case 3:if(!q()){return false}if(!r.slice_from("log")){return false}break;case 4:if(!q()){return false}if(!r.slice_from("u")){return false}break;case 5:if(!q()){return false}if(!r.slice_from("ent")){return false}break;case 6:if(!g()){return false}if(!r.slice_del()){return false}var c=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(s);if(e==0){r.cursor=r.limit-c;break r}r.bra=r.cursor;switch(e){case 1:if(!q()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-c;break r}r.bra=r.cursor;if(!q()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}break;case 2:e:{var f=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-f;if(!w()){r.cursor=r.limit-c;break r}if(!r.slice_from("eux")){return false}}break;case 3:if(!q()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}break;case 4:if(!g()){r.cursor=r.limit-c;break r}if(!r.slice_from("i")){return false}break}}break;case 7:if(!q()){return false}if(!r.slice_del()){return false}var l=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(a);if(e==0){r.cursor=r.limit-l;break r}r.bra=r.cursor;switch(e){case 1:e:{var n=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-n;if(!r.slice_from("abl")){return false}}break;case 2:e:{var b=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-b;if(!r.slice_from("iqU")){return false}}break;case 3:if(!q()){r.cursor=r.limit-l;break r}if(!r.slice_del()){return false}break}}break;case 8:if(!q()){return false}if(!r.slice_del()){return false}var k=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-k;break r}r.bra=r.cursor;if(!q()){r.cursor=r.limit-k;break r}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-k;break r}r.bra=r.cursor;e:{var m=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-m;if(!r.slice_from("iqU")){return false}}}break;case 9:if(!r.slice_from("eau")){return false}break;case 10:if(!w()){return false}if(!r.slice_from("al")){return false}break;case 11:r:{var _=r.limit-r.cursor;e:{if(!q()){break e}if(!r.slice_del()){return false}break r}r.cursor=r.limit-_;if(!w()){return false}if(!r.slice_from("eux")){return false}}break;case 12:if(!w()){return false}if(!r.out_grouping_b(o,97,251)){return false}if(!r.slice_del()){return false}break;case 13:if(!g()){return false}if(!r.slice_from("ant")){return false}return false;case 14:if(!g()){return false}if(!r.slice_from("ent")){return false}return false;case 15:var v=r.limit-r.cursor;if(!r.in_grouping_b(o,97,251)){return false}if(!g()){return false}r.cursor=r.limit-v;if(!r.slice_del()){return false}return false}return true}function p(){if(r.cursor0){return false}}r.ket=r.cursor;r:{var i=r.limit-r.cursor;e:{if(!r.eq_s_b("é")){break e}break r}r.cursor=r.limit-i;if(!r.eq_s_b("è")){return false}}r.bra=r.cursor;if(!r.slice_from("e")){return false}return true}this.stem=function(){var e=r.cursor;_();r.cursor=e;v();r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;r:{e:{var s=r.limit-r.cursor;i:{var a=r.limit-r.cursor;s:{var u=r.limit-r.cursor;a:{if(!h()){break a}break s}r.cursor=r.limit-u;a:{if(!p()){break a}break s}r.cursor=r.limit-u;if(!z()){break i}}r.cursor=r.limit-a;var t=r.limit-r.cursor;s:{r.ket=r.cursor;a:{var c=r.limit-r.cursor;u:{if(!r.eq_s_b("Y")){break u}r.bra=r.cursor;if(!r.slice_from("i")){return false}break a}r.cursor=r.limit-c;if(!r.eq_s_b("ç")){r.cursor=r.limit-t;break s}r.bra=r.cursor;if(!r.slice_from("c")){return false}}}break e}r.cursor=r.limit-s;if(!I()){break r}}}r.cursor=r.limit-i;var f=r.limit-r.cursor;U();r.cursor=r.limit-f;var l=r.limit-r.cursor;H();r.cursor=r.limit-l;r.cursor=r.limit_backward;var o=r.cursor;d();r.cursor=o;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; +Stemmer = FrenchStemmer; diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/docs/_build/html/_static/minus.png differ diff --git a/docs/_build/html/_static/plus.png b/docs/_build/html/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/docs/_build/html/_static/plus.png differ diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css new file mode 100644 index 0000000..6f8b210 --- /dev/null +++ b/docs/_build/html/_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 #F00 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666 } /* 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: #04D } /* 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: #666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */ +.highlight .no { color: #800 } /* Name.Constant */ +.highlight .nd { color: #A2F } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #00F } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #BBB } /* Text.Whitespace */ +.highlight .mb { color: #666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666 } /* Literal.Number.Float */ +.highlight .mh { color: #666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666 } /* 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: #00F } /* 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: #666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/screenshot_menu.png b/docs/_build/html/_static/screenshot_menu.png new file mode 100644 index 0000000..29b4498 Binary files /dev/null and b/docs/_build/html/_static/screenshot_menu.png differ diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js new file mode 100644 index 0000000..2c774d1 --- /dev/null +++ b/docs/_build/html/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"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, kind] = 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, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +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, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + 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, anchor) + ); + // 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 = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +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); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (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; +}; + +/** + * 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, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. 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.setAttribute("role", "list"); + 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); + }, + + _parseQuery: (query) => { + // 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]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + 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; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // 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, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // 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; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // 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]], + SearchResultKind.object, + ]); + }; + 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); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], 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.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(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], + SearchResultKind.text, + ]); + } + 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, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + 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/_build/html/_static/sphinx_highlight.js b/docs/_build/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/docs/_build/html/_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/_build/html/_static/translations.js b/docs/_build/html/_static/translations.js new file mode 100644 index 0000000..003c832 --- /dev/null +++ b/docs/_build/html/_static/translations.js @@ -0,0 +1,64 @@ +Documentation.addTranslations({ + "locale": "fr", + "messages": { + "%(filename)s — %(docstitle)s": "%(filename)s — %(docstitle)s", + "© %(copyright_prefix)s %(copyright)s.": "© %(copyright_prefix)s %(copyright)s.", + ", in ": ", dans ", + "About these documents": "\u00c0 propos de ces documents", + "Automatically generated list of changes in version %(version)s": "Liste auto-g\u00e9n\u00e9r\u00e9e des modifications dans la version %(version)s", + "C API changes": "Modifications de l'API C", + "Changes in Version %(version)s — %(docstitle)s": "Changements dans la version %(version)s — %(docstitle)s", + "Collapse sidebar": "R\u00e9duire la barre lat\u00e9rale", + "Complete Table of Contents": "Table des mati\u00e8res compl\u00e8te", + "Contents": "Contenu", + "Copyright": "Copyright", + "Created using Sphinx %(sphinx_version)s.": "Cr\u00e9\u00e9 en utilisant Sphinx %(sphinx_version)s.", + "Expand sidebar": "Agrandir la barre lat\u00e9rale", + "Full index on one page": "Index complet sur une seule page", + "General Index": "Index g\u00e9n\u00e9ral", + "Global Module Index": "Index g\u00e9n\u00e9ral des modules", + "Go": "Go", + "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche", + "Index": "Index", + "Index – %(key)s": "Index – %(key)s", + "Index pages by letter": "Indexer les pages par lettre", + "Indices and tables:": "Index et tables :", + "Last updated on %(last_updated)s.": "Mis \u00e0 jour le %(last_updated)s.", + "Library changes": "Modifications de la biblioth\u00e8que", + "Navigation": "Navigation", + "Next topic": "Sujet suivant", + "Other changes": "Autres modifications", + "Overview": "R\u00e9sum\u00e9", + "Please activate JavaScript to enable the search\n functionality.": "Veuillez activer le JavaScript pour que la recherche fonctionne.", + "Preparing search...": "Pr\u00e9paration de la recherche...", + "Previous topic": "Sujet pr\u00e9c\u00e9dent", + "Quick search": "Recherche rapide", + "Search": "Recherche", + "Search Page": "Page de recherche", + "Search Results": "R\u00e9sultats de la recherche", + "Search finished, found one page matching the search query.": [ + "La recherche est termin\u00e9e, une page correspondant \u00e0 la requ\u00eate a \u00e9t\u00e9 trouv\u00e9e.", + "Recherche termin\u00e9e, ${resultCount} pages trouv\u00e9es correspondant \u00e0 la requ\u00eate.", + "Recherche termin\u00e9e, ${resultCount} pages trouv\u00e9es correspondant \u00e0 la requ\u00eate." + ], + "Search within %(docstitle)s": "Recherchez dans %(docstitle)s", + "Searching": "Recherche en cours", + "Searching for multiple words only shows matches that contain\n all words.": "Une recherche sur plusieurs mots ne retourne que les r\u00e9sultats contenant tous les mots.", + "Show Source": "Montrer le code source", + "Table of Contents": "Table des mati\u00e8res", + "This Page": "Cette page", + "Welcome! This is": "Bienvenue ! Ceci est", + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Votre recherche ne correspond \u00e0 aucun document. Veuillez v\u00e9rifier que les mots sont correctement orthographi\u00e9s et que vous avez s\u00e9lectionn\u00e9 assez de cat\u00e9gories.", + "all functions, classes, terms": "toutes les fonctions, classes, termes", + "can be huge": "peut \u00eatre \u00e9norme", + "last updated": "derni\u00e8re modification", + "lists all sections and subsections": "lister l'ensemble des sections et sous-sections", + "next chapter": "Chapitre suivant", + "previous chapter": "Chapitre pr\u00e9c\u00e9dent", + "quick access to all modules": "acc\u00e8s rapide \u00e0 l'ensemble des modules", + "search": "rechercher", + "search this documentation": "rechercher dans cette documentation", + "the documentation for": "la documentation pour" + }, + "plural_expr": "(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2" +}); \ No newline at end of file diff --git a/docs/_build/html/admin/configuration.html b/docs/_build/html/admin/configuration.html new file mode 100644 index 0000000..1c3ea3d --- /dev/null +++ b/docs/_build/html/admin/configuration.html @@ -0,0 +1,300 @@ + + + + + + + + + Configuration du serveur — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Configuration du serveur

+
+

Fichier de service systemd

+

Le service est défini dans :

+
/etc/systemd/system/dauphincraft.service
+
+
+

Contenu type :

+
[Unit]
+Description=DauphinCraft Game Server
+After=network.target
+
+[Service]
+User=dauphincraft
+WorkingDirectory=/opt/dauphincraft
+ExecStart=/opt/dauphincraft/DauphinCraft.x86_64 --headless --port 7777
+Restart=on-failure
+RestartSec=5s
+StandardOutput=append:/var/log/dauphincraft.log
+StandardError=append:/var/log/dauphincraft.log
+
+[Install]
+WantedBy=multi-user.target
+
+
+
+
+

Modifier le port d’écoute

+
    +
  1. Éditez le fichier service :

    +
    sudo nano /etc/systemd/system/dauphincraft.service
    +
    +
    +
  2. +
  3. Modifiez la ligne ExecStart pour changer le port :

    +
    ExecStart=/opt/dauphincraft/DauphinCraft.x86_64 --headless --port 9999
    +
    +
    +
  4. +
  5. Rechargez la configuration et redémarrez le service :

    +
    sudo systemctl daemon-reload
    +sudo systemctl restart dauphincraft
    +
    +
    +
  6. +
  7. N’oubliez pas d’ouvrir le nouveau port dans le pare-feu (voir Installation du serveur).

  8. +
+
+
+

Nombre maximum de joueurs

+

La limite de joueurs est définie à 16 par défaut dans le code source +(scripts/net/NetworkManager.gd). Cette valeur sera exposée en paramètre +de ligne de commande dans une version future.

+

Pour modifier temporairement la limite, il est actuellement nécessaire de recompiler +le projet avec la valeur souhaitée.

+
+

Note

+

Une option --max-players <N> sera ajoutée dans la version 0.2.0.

+
+
+
+

Sauvegarde du monde

+
+

Avertissement

+

La sauvegarde persistante du monde n’est pas encore implémentée dans la version 0.1.0. +Le monde est régénéré à chaque redémarrage du serveur.

+
+

Cette fonctionnalité est prévue pour une version future.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/admin/installation_serveur.html b/docs/_build/html/admin/installation_serveur.html new file mode 100644 index 0000000..5f4ca5a --- /dev/null +++ b/docs/_build/html/admin/installation_serveur.html @@ -0,0 +1,320 @@ + + + + + + + + + Installation du serveur — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation du serveur

+

Ce guide décrit l’installation du serveur dédié DauphinCraft sur une machine Linux.

+
+

Prérequis

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

Composant

Requis

Système

Debian 11+ ou Ubuntu 22.04 LTS (64 bits)

RAM

1 Go minimum

Stockage

500 Mo libres

Réseau

IP publique ou réseau local avec NAT

Port

UDP 7777 ouvert en entrée

Droits

Accès root ou sudo

+
+
+

Extraction de l’archive

+

Téléchargez l’archive serveur depuis le dépôt officiel :

+
wget http://<gitea-host>/dauphincraft/releases/download/v0.1.0/DauphinCraft-Server-v0.1.tar.gz
+
+
+

Extrayez-la dans /opt :

+
sudo tar -xzf DauphinCraft-Server-v0.1.tar.gz -C /opt/
+sudo mv /opt/DauphinCraft-Server /opt/dauphincraft
+
+
+
+
+

Installation

+

Lancez le script d’installation fourni en tant que root :

+
cd /opt/dauphincraft
+sudo bash install.sh
+
+
+

Ce script :

+
    +
  1. Crée un utilisateur système dauphincraft.

  2. +
  3. Installe le fichier de service systemd dans /etc/systemd/system/dauphincraft.service.

  4. +
  5. Active et démarre le service automatiquement.

  6. +
+
+
+

Vérification du service

+
systemctl status dauphincraft
+
+
+

Une sortie de type Active: active (running) confirme que le serveur tourne correctement.

+
+
+

Ouverture du port pare-feu

+

Avec ufw (Ubuntu) :

+
sudo ufw allow 7777/udp
+sudo ufw reload
+
+
+

Avec iptables :

+
sudo iptables -A INPUT -p udp --dport 7777 -j ACCEPT
+sudo iptables-save > /etc/iptables/rules.v4
+
+
+
+
+

Consultation des logs

+

Via journalctl (en temps réel) :

+
journalctl -u dauphincraft -f
+
+
+

Via le fichier de log :

+
tail -f /var/log/dauphincraft.log
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/admin/maintenance.html b/docs/_build/html/admin/maintenance.html new file mode 100644 index 0000000..494d8c7 --- /dev/null +++ b/docs/_build/html/admin/maintenance.html @@ -0,0 +1,311 @@ + + + + + + + + + Maintenance du serveur — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Maintenance du serveur

+
+

Mise à jour du serveur

+

Pour mettre à jour DauphinCraft vers une nouvelle version :

+
    +
  1. Téléchargez le nouveau tarball depuis le dépôt officiel :

    +
    wget http://<gitea-host>/dauphincraft/releases/download/vX.Y.Z/DauphinCraft-Server-vX.Y.Z.tar.gz
    +
    +
    +
  2. +
  3. Arrêtez le service :

    +
    sudo systemctl stop dauphincraft
    +
    +
    +
  4. +
  5. Sauvegardez l’ancienne version (optionnel mais recommandé) :

    +
    sudo cp -r /opt/dauphincraft /opt/dauphincraft.bak
    +
    +
    +
  6. +
  7. Extrayez la nouvelle version :

    +
    sudo tar -xzf DauphinCraft-Server-vX.Y.Z.tar.gz -C /opt/
    +sudo rsync -a --exclude='logs' /opt/DauphinCraft-Server/ /opt/dauphincraft/
    +
    +
    +
  8. +
  9. Relancez le service :

    +
    sudo systemctl start dauphincraft
    +systemctl status dauphincraft
    +
    +
    +
  10. +
+
+
+

Surveillance et logs

+

Consultation des logs en direct :

+
journalctl -u dauphincraft -f
+
+
+

Consultation des dernières lignes :

+
tail -n 100 /var/log/dauphincraft.log
+
+
+

Rotation des logs : le service redirige stdout/stderr vers /var/log/dauphincraft.log. +Pour éviter que ce fichier grossisse indéfiniment, configurez logrotate :

+
sudo nano /etc/logrotate.d/dauphincraft
+
+
+

Contenu suggéré :

+
/var/log/dauphincraft.log {
+    daily
+    rotate 7
+    compress
+    missingok
+    notifempty
+}
+
+
+
+
+

Vérification de l’état du serveur

+
systemctl is-active dauphincraft
+
+
+

Retourne active si le serveur est opérationnel, failed sinon.

+
+
+

Redémarrage automatique

+

Le fichier de service inclut Restart=on-failure avec un délai de 5 secondes. +Le serveur redémarre donc automatiquement en cas de crash.

+
+
+

Gestion des joueurs (Kick / Ban)

+
+

Note

+

Les commandes d’administration en jeu (kick, ban) sont prévues pour la version 0.2.0. +Aucune interface d’administration n’est disponible dans la version actuelle.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/changelog.html b/docs/_build/html/changelog.html new file mode 100644 index 0000000..0f3d266 --- /dev/null +++ b/docs/_build/html/changelog.html @@ -0,0 +1,295 @@ + + + + + + + + + Historique des versions — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Historique des versions

+
+

Version 0.1.0 — Sortie initiale

+

Avril 2026

+

Première version publique de DauphinCraft. Cette version pose les bases du jeu : +monde voxel procédural, gameplay dauphin, inventaire, mobs et multijoueur.

+
+

Nouvelles fonctionnalités

+
    +
  • Monde voxel procédural sous-marin

    +
      +
    • Génération par bruit de Perlin multi-octave.

    • +
    • Quatre biomes : récif corallien, forêt de kelp, abysses, épaves.

    • +
    • Chunks 16×16×16 chargés dynamiquement autour du joueur.

    • +
    • Six types de blocs : Corail Bleu, Corail Rouge, Kelp, Roche, Épave, Glace.

    • +
    +
  • +
  • Dauphin contrôleur et HUD

    +
      +
    • Déplacement 6DOF (haut/bas/avant/arrière/strafes).

    • +
    • Jauges : oxygène, vie, faim.

    • +
    • Boost de nage et écholocation (révèle l’environnement dans un rayon de 20 unités).

    • +
    • Hotbar de 9 slots.

    • +
    +
  • +
  • Inventaire et crafting

    +
      +
    • Inventaire de 27 slots.

    • +
    • 5 recettes de craft : Lampe bio, Harpon, Bulle d’air, Algue cuisinée, Armure écailles.

    • +
    +
  • +
  • Mobs (3 types)

    +
      +
    • Bancs de poissons (boids, neutres).

    • +
    • Méduses (dégâts de contact passifs).

    • +
    • Requin (hostile, réagit à l’écholocation).

    • +
    • Spawner par biome avec limite de population.

    • +
    +
  • +
  • Multijoueur ENet 16 joueurs

    +
      +
    • Architecture autorité serveur.

    • +
    • Synchronisation position, blocs, inventaire.

    • +
    • Chat textuel en jeu.

    • +
    • Serveur dédié headless pour Linux.

    • +
    +
  • +
  • Ambiance visuelle et audio

    +
      +
    • Shaders sous-marins : fog volumétrique, diffusion lumineuse.

    • +
    • Particules de plancton lumineux.

    • +
    • Musique : Underwater Theme (Cleyton RX, CC-BY 3.0).

    • +
    • Effets sonores : ambiance, bulles, chant de baleine (CC0).

    • +
    +
  • +
+
+
+

Limitations connues

+
    +
  • La sauvegarde du monde n’est pas persistante (monde régénéré à chaque redémarrage).

  • +
  • Pas de commandes d’administration en jeu (kick/ban prévu en 0.2.0).

  • +
  • La limite de joueurs (16) n’est pas configurable en ligne de commande.

  • +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/credits.html b/docs/_build/html/credits.html new file mode 100644 index 0000000..8ffae14 --- /dev/null +++ b/docs/_build/html/credits.html @@ -0,0 +1,298 @@ + + + + + + + + + Crédits — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Crédits

+
+

Moteur

+ +
+
+

Assets

+

Tous les assets sont listés ci-dessous avec leur source et licence.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Asset

Source

Licence

icon.svg

Créé manuellement

CC0

audio/music/underwater_theme

Cleyton RX — https://opengameart.org/content/ +underwater-theme

CC-BY 3.0

audio/sfx/underwater_ambient

Zozzy — https://freesound.org/people/Zozzy/ +sounds/56678/

CC0

audio/sfx/bubbles

ristooooo1 — https://freesound.org/people/ +ristooooo1/sounds/539823/

CC0

audio/sfx/whale_call

taure — https://freesound.org/people/taure/ +sounds/361423/

CC0

+
+
+

Attribution requise

+

Conformément à la licence CC-BY 3.0, la musique de fond doit être créditée ainsi :

+
+

« Underwater Theme » par Cleyton RX, +https://opengameart.org/content/underwater-theme, +sous licence Creative Commons Attribution 3.0.

+
+
+
+

Auteur du jeu

+
    +
  • Baptiste Moulin — Conception, développement, direction artistique

  • +
+
+
+

Remerciements

+
    +
  • La communauté Godot Engine pour ses ressources et son support.

  • +
  • Les créateurs d’assets CC0 et CC-BY qui rendent les projets open source possibles.

  • +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/dev/architecture.html b/docs/_build/html/dev/architecture.html new file mode 100644 index 0000000..6294bb2 --- /dev/null +++ b/docs/_build/html/dev/architecture.html @@ -0,0 +1,320 @@ + + + + + + + + + Architecture technique — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Architecture technique

+
+

Moteur et langage

+ + + + + + + + + + + + + + + + + + + + +

Composant

Valeur

Moteur

Godot Engine 4.6.2 (Forward+)

Langage

GDScript (typage strict)

Rendu

Vulkan (Forward+) / Compatibility (fallback)

Réseau

ENet UDP, autorité serveur

+
+
+

Architecture réseau

+

DauphinCraft utilise un modèle autorité serveur :

+
    +
  • Le serveur est la source de vérité pour les positions, les blocs et les inventaires.

  • +
  • Les clients envoient leurs intentions (déplacement, action) et reçoivent l’état du monde.

  • +
  • La synchronisation est assurée par PlayerSyncComponent et WorldSyncComponent.

  • +
  • Le protocole de transport est ENet (UDP) via la couche haut niveau Godot (MultiplayerAPI).

  • +
  • Port par défaut : UDP 7777.

  • +
+
+
+

Structure du projet

+
DauphinCraft/
+├── project.godot          # Fichier de projet Godot
+├── icon.svg               # Icône du jeu
+├── export_presets.cfg     # Présets d'export (Windows, Linux serveur)
+├── assets/                # Ressources visuelles (textures, modèles)
+├── audio/                 # Fichiers audio
+│   ├── music/             # Musiques de fond
+│   └── sfx/               # Effets sonores
+├── builds/                # Sorties d'export
+├── scenes/                # Scènes Godot (.tscn)
+│   ├── Main.tscn
+│   ├── MainMenu.tscn
+│   ├── LobbyMenu.tscn
+│   ├── World.tscn
+│   ├── Dolphin.tscn
+│   ├── InventoryUI.tscn
+│   ├── PauseMenu.tscn
+│   └── mobs/
+├── scripts/               # Scripts GDScript (.gd)
+│   ├── Main.gd
+│   ├── PauseMenu.gd
+│   ├── world/             # Gestion du monde voxel
+│   ├── dolphin/           # Contrôleur joueur + HUD
+│   ├── ambience/          # Environnement visuel et audio
+│   ├── inventory/         # Inventaire et crafting
+│   ├── mobs/              # Intelligence artificielle des mobs
+│   └── net/               # Réseau multijoueur
+├── shaders/               # Shaders GLSL/Godot
+└── docs/                  # Documentation Sphinx (ce manuel)
+
+
+
+
+

Flux de démarrage

+
    +
  1. Main.tscn est la scène principale. Elle instancie MainMenu.tscn.

  2. +
  3. Le joueur choisit Solo / Héberger / Rejoindre dans LobbyMenu.tscn.

  4. +
  5. NetworkManager initialise ENet (serveur ou client).

  6. +
  7. World.tscn est chargée : ChunkManager génère les premiers chunks.

  8. +
  9. Dolphin.tscn est instanciée pour chaque joueur connecté.

  10. +
  11. La boucle de jeu tourne : physique, synchronisation réseau, rendu.

  12. +
+
+
+

Présets d’export

+

Deux présets sont configurés dans export_presets.cfg :

+
    +
  • Windows (64 bits) : exécutable joueur pour Windows.

  • +
  • Linux Server (64 bits) : exécutable headless pour serveur dédié Linux.

  • +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/dev/contribuer.html b/docs/_build/html/dev/contribuer.html new file mode 100644 index 0000000..3231d74 --- /dev/null +++ b/docs/_build/html/dev/contribuer.html @@ -0,0 +1,334 @@ + + + + + + + + + Contribuer au projet — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Contribuer au projet

+
+

Outils nécessaires

+ +
+
+

Cloner le dépôt

+
git clone http://<gitea-host>/dauphincraft/dauphincraft.git
+cd dauphincraft
+
+
+
+

Note

+

Remplacez <gitea-host> par l’adresse du serveur Gitea communautaire.

+
+
+
+

Ouvrir le projet dans Godot

+
    +
  1. Lancez Godot Engine 4.6.2.

  2. +
  3. Dans le gestionnaire de projets, cliquez sur Import.

  4. +
  5. Naviguez jusqu’au dossier cloné et sélectionnez project.godot.

  6. +
  7. Cliquez sur Import & Edit.

  8. +
+

Le projet s’ouvre directement dans l’éditeur. Appuyez sur F5 pour lancer le jeu en mode éditeur.

+
+
+

Build et export

+

Les présets d’export sont configurés dans export_presets.cfg.

+

Exporter pour Windows :

+
    +
  1. Menu Projet → Exporter.

  2. +
  3. Sélectionnez le préset Windows Desktop.

  4. +
  5. Cliquez sur Exporter le projet et choisissez un dossier de sortie.

  6. +
+

Exporter le serveur Linux :

+
    +
  1. Menu Projet → Exporter.

  2. +
  3. Sélectionnez le préset Linux Server.

  4. +
  5. Cliquez sur Exporter le projet.

  6. +
+
+

Note

+

Pour exporter vers Linux, vous devez avoir installé le template d’export Linux dans Godot +(Éditeur → Gérer les modèles d’exportation).

+
+
+
+

Style de code

+
    +
  • Typage strict : déclarez toujours les types explicitement (var x: int = 0).

  • +
  • Pas de TODO laissé dans le code soumis — ouvrez une issue à la place.

  • +
  • Nommage : snake_case pour les variables et fonctions, PascalCase pour les classes.

  • +
  • Commentaires : en français, concis.

  • +
  • Signals : préfixez les signaux avec le nom du composant (dolphin_died, chunk_loaded).

  • +
+

Exemple de code conforme :

+
class_name DolphinController
+extends CharacterBody3D
+
+@export var speed: float = 5.0
+var _oxygen: float = 1.0
+
+func take_damage(amount: int) -> void:
+    # Réduit les PV et déclenche le signal si mort
+    health -= amount
+    if health <= 0:
+        emit_signal("dolphin_died")
+
+
+
+
+

Soumettre une contribution

+
    +
  1. Créez une branche depuis main :

    +
    git checkout -b feat/ma-fonctionnalite
    +
    +
    +
  2. +
  3. Faites vos modifications et committez :

    +
    git add .
    +git commit -m "feat: description courte"
    +
    +
    +
  4. +
  5. Poussez votre branche :

    +
    git push origin feat/ma-fonctionnalite
    +
    +
    +
  6. +
  7. Ouvrez une Pull Request sur le Gitea de DauphinCraft.

  8. +
  9. Un mainteneur relit et fusionne après validation.

  10. +
+
+
+

Discussion et support

+

Rejoignez le serveur Discord communautaire et consultez le canal #dauphincraft-dev +pour poser vos questions, proposer des idées ou signaler des bugs.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/dev/modules.html b/docs/_build/html/dev/modules.html new file mode 100644 index 0000000..542b777 --- /dev/null +++ b/docs/_build/html/dev/modules.html @@ -0,0 +1,341 @@ + + + + + + + + + Modules du jeu — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Modules du jeu

+

Le code source est organisé en six modules dans scripts/.

+
+

Module Monde (world/)

+

Responsable de la génération et de la gestion du monde voxel sous-marin.

+
+
BlockDatabase.gd

Registre central de tous les types de blocs (id, nom, texture, propriétés physiques). +API publique : get_block(id: int) -> BlockData, get_id_by_name(name: String) -> int.

+
+
Chunk.gd

Représente un chunk 16×16×16 blocs. Gère son maillage 3D et son état de chargement. +API publique : set_block(x, y, z, id), get_block(x, y, z) -> int, rebuild_mesh().

+
+
ChunkManager.gd

Orchestre le chargement/déchargement des chunks autour du joueur (rayon configurable). +API publique : get_chunk(cx, cy, cz) -> Chunk, request_chunk(pos: Vector3i).

+
+
WorldGenerator.gd

Génère le contenu des chunks de façon procédurale (bruit de Perlin, biomes, structures). +API publique : generate_chunk(cx, cy, cz) -> Array (tableau de 4096 block ids).

+
+
+
+
+

Module Dauphin (dolphin/)

+

Contrôle du personnage joueur et interface utilisateur associée.

+
+
DolphinController.gd

Gère les entrées clavier/souris, applique la physique de nage, envoie les actions au serveur. +API publique : apply_input(input: Dictionary), take_damage(amount: int).

+
+
HUD.gd

Affiche les jauges (oxygène, vie, faim), la hotbar et les notifications. +API publique : update_oxygen(value: float), update_health(value: float), +update_hunger(value: float).

+
+
EcholocationPulse.gd

Crée et anime l’impulsion sphérique d’écholocation. Détecte les mobs et blocs dans le rayon. +API publique : emit_pulse(origin: Vector3, radius: float).

+
+
+
+
+

Module Ambiance (ambience/)

+

Environnement visuel et sonore sous-marin.

+
+
UnderwaterEnvironment.gd

Configure le fog volumétrique, la lumière directionnelle atténuée et les effets de post-process +selon la profondeur du joueur. API publique : set_depth(depth: float).

+
+
AudioManager.gd

Singleton audio. Gère les pistes de musique et les effets sonores avec transitions douces. +API publique : play_sfx(name: String), play_music(name: String), stop_music().

+
+
PlanktonParticles.gd

Système de particules generant le plancton lumineux ambiant. +API publique : set_density(density: float).

+
+
MainMenu.gd

Logique du menu principal (navigation, transitions de scène).

+
+
+
+
+

Module Inventaire (inventory/)

+

Gestion des ressources, recettes et interface d’inventaire.

+
+
Inventory.gd

Stockage des items du joueur (tableau de slots). Synchronisé avec le serveur en multijoueur. +API publique : add_item(id: int, qty: int) -> bool, remove_item(id: int, qty: int) -> bool, +has_item(id: int, qty: int) -> bool.

+
+
ItemDatabase.gd

Registre de tous les items (id, nom, icône, stack max). +API publique : get_item(id: int) -> ItemData.

+
+
CraftingRecipes.gd

Définit les 5 recettes de craft et expose la logique de fabrication. +API publique : get_available_recipes(inventory: Inventory) -> Array, +craft(recipe_id: int, inventory: Inventory) -> bool.

+
+
InventoryUI.gd

Interface graphique de l’inventaire et du panneau de crafting. +API publique : open(), close(), refresh().

+
+
+
+
+

Module Mobs (mobs/)

+

Intelligence artificielle des créatures marines.

+
+
FishSchool.gd

Comportement de banc de poissons (alignment, cohesion, separation — boids simplifié). +Fuit le joueur à proximité. API publique : set_school_size(n: int).

+
+
Jellyfish.gd

Déplacement oscillant aléatoire. Inflige des dégâts de contact au joueur. +API publique : get_damage() -> int.

+
+
Shark.gd

IA hostile : détection du joueur, poursuite, attaque, réaction à l’écholocation (fuite). +API publique : stun(duration: float).

+
+
MobSpawner.gd

Gère l’apparition des mobs selon le biome et la profondeur, avec limite de population. +API publique : spawn_in_chunk(chunk_pos: Vector3i).

+
+
+
+
+

Module Réseau (net/)

+

Infrastructure multijoueur ENet.

+
+
NetworkManager.gd

Singleton réseau. Initialise ENet, gère les connexions/déconnexions joueurs, expose les RPCs. +API publique : host_game(port: int), join_game(ip: String, port: int), +disconnect().

+
+
PlayerSyncComponent.gd

Attaché à chaque Dolphin. Synchronise position, rotation et état sur le réseau. +API publique : sync_state(state: Dictionary).

+
+
WorldSyncComponent.gd

Synchronise les modifications de blocs entre serveur et clients. +API publique : broadcast_block_change(pos: Vector3i, block_id: int).

+
+
ChatManager.gd

Gère l’envoi et la réception des messages de chat en multijoueur. +API publique : send_message(text: String), on_message_received(sender: String, text: String).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 0000000..01e42a4 --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,228 @@ + + + + + + + + Index — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Droits d'auteur 2026, Baptiste Moulin.

+
+ + Compilé avec Sphinx en utilisant un + thème + fourni par Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 0000000..f5941b4 --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,346 @@ + + + + + + + + + DauphinCraft — Documentation — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

DauphinCraft — Documentation

+

Bienvenue dans DauphinCraft, un jeu voxel sous-marin multijoueur où vous incarnez un dauphin.

+

Explorez les fonds marins, construisez des structures, craftez des outils et jouez avec vos amis +jusqu’à 16 joueurs simultanés.

+ + + + +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/joueur/controles.html b/docs/_build/html/joueur/controles.html new file mode 100644 index 0000000..c0768d3 --- /dev/null +++ b/docs/_build/html/joueur/controles.html @@ -0,0 +1,348 @@ + + + + + + + + + Contrôles — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Contrôles

+

Toutes les touches sont configurables dans les paramètres du jeu (Échap → Paramètres → Touches). +Voici la configuration par défaut.

+
+

Déplacement

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Action

Touche par défaut

Nager en avant

W

Reculer

S

Strafe gauche

A

Strafe droit

D

Monter

Espace

Descendre

Shift

Boost de nage

Ctrl

+
+

Note

+

Le boost consomme de l’énergie (jauge bleue en bas à droite du HUD). Il se recharge +automatiquement au repos.

+
+
+
+

Capacités spéciales

+ + + + + + + + + + + + + + +

Action

Touche par défaut

Écholocation

E

Activer / Désactiver la HUD

H

+

L”écholocation envoie une impulsion sonore qui révèle les blocs et mobs environnants +dans un rayon de 20 unités, même dans les zones sombres.

+
+
+

Interaction avec le monde

+ + + + + + + + + + + + + + + + + + + + +

Action

Touche par défaut

Casser un bloc

Clic gauche

Poser un bloc

Clic droit

Changer de slot (hotbar)

Molette souris

Ouvrir l’inventaire

Tab

+
+
+

Interface

+ + + + + + + + + + + + + + +

Action

Touche par défaut

Ouvrir le chat

F2

Menu pause

Échap

+
+
+

Chat

+

En multijoueur, appuyez sur F2 pour ouvrir la fenêtre de chat. Tapez votre message et +validez avec Entrée. Appuyez sur Échap pour fermer le chat sans envoyer.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/joueur/craft.html b/docs/_build/html/joueur/craft.html new file mode 100644 index 0000000..6b01072 --- /dev/null +++ b/docs/_build/html/joueur/craft.html @@ -0,0 +1,392 @@ + + + + + + + + + Crafting — Recettes — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Crafting — Recettes

+

Le système de crafting permet de transformer des ressources collectées en objets utiles. +Ouvrez l’inventaire (Tab), puis accédez à l’onglet Crafting pour voir les recettes disponibles.

+
+

Comment crafter

+
    +
  1. Ouvrez l’inventaire avec Tab.

  2. +
  3. Sélectionnez l’onglet Crafting.

  4. +
  5. Les recettes disponibles (ingrédients présents en inventaire) s’affichent en surbrillance.

  6. +
  7. Cliquez sur la recette souhaitée pour fabriquer l’objet.

  8. +
+
+
+

Recettes disponibles

+
+

Lampe bio

+

Éclaire une zone de 10 blocs de rayon. Indispensable dans les abysses.

+ + + + + + + + + + + + + + + + +

Ingrédient

Quantité

Résultat

Corail Bleu

2

Lampe bio × 1

Kelp

1

+
+
+

Harpon

+

Arme à distance. Permet d’attaquer les mobs de loin (portée 12 unités, dégâts −4 PV).

+ + + + + + + + + + + + + + + + +

Ingrédient

Quantité

Résultat

Roche

2

Harpon × 1

Épave

2

+
+
+

Bulle d’air

+

Consommable d’urgence. Recharge instantanément 50 % de la jauge d’oxygène.

+ + + + + + + + + + + + + + + + +

Ingrédient

Quantité

Résultat

Kelp

3

Bulle d’air × 1

Glace

1

+
+

Note

+

La Glace se trouve uniquement dans les zones profondes (abysses, 80 m+).

+
+
+
+

Algue cuisinée

+

Nourriture. Restaure 30 % de la jauge de faim.

+ + + + + + + + + + + + + +

Ingrédient

Quantité

Résultat

Kelp

2

Algue cuisinée × 2

+
+

Astuce

+

Recette très accessible dès le début. La forêt de kelp est le meilleur endroit pour +farmer le Kelp.

+
+
+
+

Armure écailles

+

Protection passive. Réduit les dégâts reçus de 25 % (toutes sources).

+ + + + + + + + + + + + + + + + +

Ingrédient

Quantité

Résultat

Corail Rouge

4

Armure écailles × 1

Épave

2

+
+

Avertissement

+

L’armure se casse après 50 impacts. Craftez-en une de rechange avant de partir +explorer les épaves ou les abysses.

+
+
+
+
+

Ressources et où les trouver

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

Ressource

Biome / Source

Corail Bleu

Récif corallien

Corail Rouge

Récif corallien

Kelp

Forêt de kelp

Roche

Épaves, fond marin

Épave

Zones d’épaves

Glace

Abysses (80 m+)

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/joueur/installation.html b/docs/_build/html/joueur/installation.html new file mode 100644 index 0000000..ae0baa3 --- /dev/null +++ b/docs/_build/html/joueur/installation.html @@ -0,0 +1,308 @@ + + + + + + + + + Installation — Guide joueur — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation — Guide joueur

+
+

Configuration minimale requise

+ + + + + + + + + + + + + + + + + + + + + + + +

Composant

Minimum requis

Système

Windows 10 / Windows 11 (64 bits)

RAM

4 Go

GPU

Compatible Vulkan 1.0 ou DirectX 12

Stockage

500 Mo d’espace libre

Réseau

Connexion Internet (multijoueur uniquement)

+
+
+

Téléchargement

+

La dernière version de DauphinCraft est disponible sur le dépôt officiel :

+
http://<gitea-host>/dauphincraft/releases
+
+
+

Téléchargez l’archive DauphinCraft-v0.1.0-windows.zip correspondant à votre système.

+
+

Note

+

Remplacez <gitea-host> par l’adresse fournie par votre administrateur ou la communauté.

+
+
+
+

Procédure d’installation

+
    +
  1. Décompressez l’archive DauphinCraft-v0.1.0-windows.zip dans le dossier de votre choix.

  2. +
  3. Ouvrez le dossier extrait.

  4. +
  5. Double-cliquez sur DauphinCraft.exe pour lancer le jeu.

  6. +
+

Aucune installation supplémentaire n’est nécessaire. Le jeu est autonome (portable).

+
+
+

Dépannage antivirus

+

Windows Defender ou votre antivirus peut bloquer le lancement car l’exécutable n’est pas signé.

+

Solution :

+
    +
  1. Clic droit sur DauphinCraft.exePropriétés.

  2. +
  3. En bas de l’onglet Général, cochez Débloquer si la case est présente.

  4. +
  5. Cliquez sur Appliquer, puis OK.

  6. +
  7. Relancez DauphinCraft.exe.

  8. +
+

Si votre antivirus met en quarantaine le fichier, ajoutez une exception pour le dossier +d’installation de DauphinCraft.

+
+

Avertissement

+

Téléchargez toujours DauphinCraft depuis le dépôt officiel. Ne faites pas confiance à des +sources tierces inconnues.

+
+
+
+

Première connexion

+

Au premier lancement, le jeu vous propose trois modes :

+
    +
  • Solo : jouer seul en monde local.

  • +
  • Héberger : créer une partie multijoueur sur votre machine.

  • +
  • Rejoindre : rejoindre une partie existante avec une IP et un port.

  • +
+

Voir Multijoueur pour les détails réseau.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/joueur/mecaniques.html b/docs/_build/html/joueur/mecaniques.html new file mode 100644 index 0000000..df4ba60 --- /dev/null +++ b/docs/_build/html/joueur/mecaniques.html @@ -0,0 +1,308 @@ + + + + + + + + + Mécaniques de jeu — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Mécaniques de jeu

+
+

Jauges du joueur

+

Trois jauges sont visibles en permanence dans le HUD (en bas de l’écran) :

+
+
Oxygène (jauge bleue)

Représente l’air restant dans les poumons du dauphin. Elle diminue lorsque vous évoluez +sous l’eau sans remonter à la surface. À zéro, vous perdez de la vie rapidement. +Remontez à la surface pour la recharger instantanément.

+
+
Vie (jauge rouge)

Points de vie du dauphin. Diminue en cas d’attaque par un mob hostile ou de manque +d’oxygène prolongé. Se régénère lentement en nageant sans contrainte, ou plus vite +en consommant de la nourriture.

+
+
Faim (jauge orange)

Représente la satiété. Diminue au fil du temps et lors d’actions intenses (boost, écholocation). +Si la jauge de faim atteint zéro, la régénération de vie s’arrête.

+
+
+
+
+

Gestion de l’oxygène

+

Votre dauphin a besoin de respirer. La surface de l’eau correspond à la limite supérieure +du monde. Remontez régulièrement pour éviter de vous noyer.

+
    +
  • Sous 50 % d’oxygène : la jauge clignote doucement.

  • +
  • Sous 20 % d’oxygène : la jauge clignote rapidement et un son d’alerte retentit.

  • +
  • À 0 % : vous perdez 1 PV par seconde jusqu’à la remontée.

  • +
+
+

Astuce

+

Craftez une Bulle d’air (voir Crafting — Recettes) pour obtenir une réserve d’oxygène +supplémentaire d’urgence.

+
+
+
+

Biomes sous-marins

+

Le monde est généré de façon procédurale et comporte quatre biomes principaux :

+
+
Récif corallien

Zone peu profonde (0–30 m), lumineuse, riche en coraux et poissons. Idéal pour débuter. +On y trouve du Corail Bleu et du Corail Rouge.

+
+
Forêt de kelp

Zone intermédiaire (20–60 m). Grandes algues offrant une visibilité réduite. +Source principale de Kelp et de Kelp_Food.

+
+
Abysses

Zone profonde (80 m et plus). Obscurité totale sans lampe bio. Ressources rares +mais mobs dangereux (Requins).

+
+
Épaves

Zones ponctuelles à toutes profondeurs. Recèlent de la Roche et de l”Épave +(matériaux pour recettes avancées). Attention aux Requins patrouillant les épaves.

+
+
+
+
+

Mobs

+

Trois types de créatures peuplent les océans de DauphinCraft :

+
+
Bancs de poissons (FishSchool)

Neutres. Nagent en groupe de manière aléatoire. Source de nourriture si attaqués. +Comportement de fuite à l’approche du joueur.

+
+
Méduses (Jellyfish)

Passives mais infligent des dégâts de contact si on les touche (−1 PV par contact). +Lumineuses, elles sont utiles comme repères dans les abysses.

+
+
Requin (Shark)

Hostile. Attaque le joueur à vue dans un rayon de 15 unités. Inflige −3 PV par morsure. +Peut être repoussé avec une impulsion d’écholocation (touche E).

+
+
+
+
+

Mort et respawn

+

Quand vos points de vie atteignent zéro, vous mourez. Un écran de mort s’affiche.

+
    +
  • Vos blocs posés dans le monde restent en place.

  • +
  • Votre inventaire est conservé.

  • +
  • Vous réapparaissez au point de spawn initial (centre du monde, en surface).

  • +
+

En multijoueur, les autres joueurs continuent de jouer pendant votre respawn. Le délai +de respawn est de 3 secondes.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/joueur/multijoueur.html b/docs/_build/html/joueur/multijoueur.html new file mode 100644 index 0000000..d67f27e --- /dev/null +++ b/docs/_build/html/joueur/multijoueur.html @@ -0,0 +1,300 @@ + + + + + + + + + Multijoueur — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Multijoueur

+

DauphinCraft supporte jusqu’à 16 joueurs simultanés via une architecture réseau ENet UDP.

+
+

Modes de jeu

+
+
Solo

Jouer seul en monde local. Aucune connexion réseau requise. La partie n’est pas accessible +aux autres joueurs.

+
+
Héberger une partie

Lancez un serveur depuis votre propre machine. Les joueurs de votre réseau local (ou Internet +si vous configurez votre routeur) peuvent vous rejoindre.

+
+
Rejoindre une partie

Entrez l’adresse IP et le port d’une partie existante pour la rejoindre.

+
+
+
+
+

Port réseau

+

DauphinCraft utilise le port UDP 7777 par défaut.

+

Pour héberger une partie accessible depuis Internet :

+
    +
  1. Ouvrez les paramètres de votre box/routeur.

  2. +
  3. Créez une règle de redirection de port (NAT/PAT) : +- Port externe : 7777 (UDP) +- Port interne : 7777 (UDP) +- IP locale cible : l’adresse IP locale de votre machine (ex. 192.168.1.10)

  4. +
  5. Communiquez votre IP publique et le port 7777 à vos amis.

  6. +
+
+

Astuce

+

Pour trouver votre IP publique, allez sur https://ifconfig.me dans un navigateur.

+
+
+
+

Rejoindre une partie

+

Dans le menu principal, choisissez Rejoindre, puis entrez :

+
    +
  • Adresse IP : l’IP fournie par l’hôte (ex. 203.0.113.42).

  • +
  • Port : 7777 (ou le port personnalisé communiqué par l’hôte).

  • +
+

Cliquez sur Connexion. Si le serveur est disponible, vous rejoindrez la partie en quelques +secondes.

+
+
+

Héberger depuis le jeu

+

Choisissez Héberger dans le menu principal. Le jeu démarre un serveur intégré (écoute sur +le port 7777 UDP) tout en vous permettant de jouer simultanément.

+
+

Note

+

L’hébergement intégré est pratique pour des sessions entre amis. Pour un serveur permanent +24h/24, consultez Installation du serveur.

+
+
+
+

Serveur public officiel

+

Un serveur public de démonstration est disponible à l’adresse :

+
http://example.invalid  (à remplacer lors du déploiement)
+
+
+
+

Avertissement

+

Ce serveur est fourni à titre de démonstration. Il peut être indisponible ou réinitialisé +sans préavis.

+
+
+
+

Limite de joueurs

+

La limite par défaut est 16 joueurs par session. Elle peut être modifiée par l’administrateur +du serveur (voir Configuration du serveur).

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 0000000..81cd205 Binary files /dev/null and b/docs/_build/html/objects.inv differ diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html new file mode 100644 index 0000000..943a17a --- /dev/null +++ b/docs/_build/html/search.html @@ -0,0 +1,243 @@ + + + + + + + + Recherche — DauphinCraft — Manuel joueur et serveur + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Droits d'auteur 2026, Baptiste Moulin.

+
+ + Compilé avec Sphinx en utilisant un + thème + fourni par Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 0000000..16d19c2 --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Administrateur serveur": [[8, null]], "Algue cuisin\u00e9e": [[10, "algue-cuisinee"]], "Annexes": [[8, null]], "Architecture r\u00e9seau": [[5, "architecture-reseau"]], "Architecture technique": [[5, null]], "Armure \u00e9cailles": [[10, "armure-ecailles"]], "Assets": [[4, "assets"]], "Attribution requise": [[4, "attribution-requise"]], "Auteur du jeu": [[4, "auteur-du-jeu"]], "Biomes sous-marins": [[12, "biomes-sous-marins"]], "Build et export": [[6, "build-et-export"]], "Bulle d\u2019air": [[10, "bulle-d-air"]], "Capacit\u00e9s sp\u00e9ciales": [[9, "capacites-speciales"]], "Chat": [[9, "chat"]], "Cloner le d\u00e9p\u00f4t": [[6, "cloner-le-depot"]], "Comment crafter": [[10, "comment-crafter"]], "Configuration du serveur": [[0, null]], "Configuration minimale requise": [[11, "configuration-minimale-requise"]], "Consultation des logs": [[1, "consultation-des-logs"]], "Contribuer au projet": [[6, null]], "Contr\u00f4les": [[9, null]], "Crafting \u2014 Recettes": [[10, null]], "Cr\u00e9dits": [[4, null]], "DauphinCraft \u2014 Documentation": [[8, null]], "Discussion et support": [[6, "discussion-et-support"]], "D\u00e9pannage antivirus": [[11, "depannage-antivirus"]], "D\u00e9placement": [[9, "deplacement"]], "D\u00e9veloppement": [[8, null]], "Extraction de l\u2019archive": [[1, "extraction-de-l-archive"]], "Fichier de service systemd": [[0, "fichier-de-service-systemd"]], "Flux de d\u00e9marrage": [[5, "flux-de-demarrage"]], "Gestion de l\u2019oxyg\u00e8ne": [[12, "gestion-de-l-oxygene"]], "Gestion des joueurs (Kick / Ban)": [[2, "gestion-des-joueurs-kick-ban"]], "Harpon": [[10, "harpon"]], "Historique des versions": [[3, null]], "H\u00e9berger depuis le jeu": [[13, "heberger-depuis-le-jeu"]], "Installation": [[1, "installation"]], "Installation du serveur": [[1, null]], "Installation \u2014 Guide joueur": [[11, null]], "Interaction avec le monde": [[9, "interaction-avec-le-monde"]], "Interface": [[9, "interface"]], "Jauges du joueur": [[12, "jauges-du-joueur"]], "Joueur": [[8, null]], "Lampe bio": [[10, "lampe-bio"]], "Limitations connues": [[3, "limitations-connues"]], "Limite de joueurs": [[13, "limite-de-joueurs"]], "Maintenance du serveur": [[2, null]], "Menu pause": [[9, "menu-pause"]], "Mise \u00e0 jour du serveur": [[2, "mise-a-jour-du-serveur"]], "Mobs": [[12, "mobs"]], "Modes de jeu": [[13, "modes-de-jeu"]], "Modifier le port d\u2019\u00e9coute": [[0, "modifier-le-port-d-ecoute"]], "Module Ambiance (ambience/)": [[7, "module-ambiance-ambience"]], "Module Dauphin (dolphin/)": [[7, "module-dauphin-dolphin"]], "Module Inventaire (inventory/)": [[7, "module-inventaire-inventory"]], "Module Mobs (mobs/)": [[7, "module-mobs-mobs"]], "Module Monde (world/)": [[7, "module-monde-world"]], "Module R\u00e9seau (net/)": [[7, "module-reseau-net"]], "Modules du jeu": [[7, null]], "Mort et respawn": [[12, "mort-et-respawn"]], "Moteur": [[4, "moteur"]], "Moteur et langage": [[5, "moteur-et-langage"]], "Multijoueur": [[13, null]], "M\u00e9caniques de jeu": [[12, null]], "Nombre maximum de joueurs": [[0, "nombre-maximum-de-joueurs"]], "Nouvelles fonctionnalit\u00e9s": [[3, "nouvelles-fonctionnalites"]], "Outils n\u00e9cessaires": [[6, "outils-necessaires"]], "Ouverture du port pare-feu": [[1, "ouverture-du-port-pare-feu"]], "Ouvrir le projet dans Godot": [[6, "ouvrir-le-projet-dans-godot"]], "Port r\u00e9seau": [[13, "port-reseau"]], "Premi\u00e8re connexion": [[11, "premiere-connexion"]], "Proc\u00e9dure d\u2019installation": [[11, "procedure-d-installation"]], "Pr\u00e9requis": [[1, "prerequis"]], "Pr\u00e9sets d\u2019export": [[5, "presets-d-export"]], "Recettes disponibles": [[10, "recettes-disponibles"]], "Red\u00e9marrage automatique": [[2, "redemarrage-automatique"]], "Rejoindre une partie": [[13, "rejoindre-une-partie"]], "Remerciements": [[4, "remerciements"]], "Ressources et o\u00f9 les trouver": [[10, "ressources-et-ou-les-trouver"]], "Sauvegarde du monde": [[0, "sauvegarde-du-monde"]], "Serveur public officiel": [[13, "serveur-public-officiel"]], "Soumettre une contribution": [[6, "soumettre-une-contribution"]], "Structure du projet": [[5, "structure-du-projet"]], "Style de code": [[6, "style-de-code"]], "Surveillance et logs": [[2, "surveillance-et-logs"]], "T\u00e9l\u00e9chargement": [[11, "telechargement"]], "Version 0.1.0 \u2014 Sortie initiale": [[3, "version-0-1-0-sortie-initiale"]], "V\u00e9rification de l\u2019\u00e9tat du serveur": [[2, "verification-de-l-etat-du-serveur"]], "V\u00e9rification du service": [[1, "verification-du-service"]]}, "docnames": ["admin/configuration", "admin/installation_serveur", "admin/maintenance", "changelog", "credits", "dev/architecture", "dev/contribuer", "dev/modules", "index", "joueur/controles", "joueur/craft", "joueur/installation", "joueur/mecaniques", "joueur/multijoueur"], "envversion": {"sphinx": 64, "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.ext.todo": 2}, "filenames": ["admin\\configuration.rst", "admin\\installation_serveur.rst", "admin\\maintenance.rst", "changelog.rst", "credits.rst", "dev\\architecture.rst", "dev\\contribuer.rst", "dev\\modules.rst", "index.rst", "joueur\\controles.rst", "joueur\\craft.rst", "joueur\\installation.rst", "joueur\\mecaniques.rst", "joueur\\multijoueur.rst"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"0": [0, 1, 2, 4, 6, 11, 12, 13], "04": 1, "1": [0, 1, 6, 10, 11, 12, 13], "10": [10, 11, 13], "100": 2, "11": [1, 11], "113": 13, "12": [10, 11], "15": 12, "16": [0, 3, 7, 8, 13], "168": 13, "192": 13, "2": [0, 2, 3, 4, 5, 6, 10], "20": [3, 9, 12], "2026": 3, "203": 13, "22": 1, "24": 13, "24h": 13, "25": 10, "27": 3, "3": [3, 4, 10, 12], "30": [10, 12], "361423": 4, "3d": 7, "4": [4, 5, 6, 10, 11], "4096": 7, "42": 13, "5": [0, 2, 3, 6, 7], "50": [10, 12], "500": [1, 11], "539823": 4, "56678": 4, "6": [4, 5, 6], "60": 12, "64": [1, 5, 11], "6dof": 3, "7": 2, "7777": [0, 1, 5, 13], "80": [10, 12], "9": 3, "9999": 0, "Au": 11, "Avec": 1, "C": [1, 2], "Ce": [1, 13], "Cette": [0, 3], "D": 9, "Elle": [5, 12, 13], "En": [9, 11, 12], "Il": [9, 13], "L": [9, 10, 13], "La": [0, 3, 4, 5, 10, 11, 12, 13], "Le": [0, 2, 5, 6, 7, 9, 10, 11, 12, 13], "Les": [2, 4, 5, 6, 10, 13], "N": 0, "Ne": 11, "On": 12, "Pas": [3, 6], "Pour": [0, 2, 6, 13], "S": 9, "Se": 12, "Un": [6, 12, 13], "Une": [0, 1], "Vos": 12, "Vous": 12, "Y": 2, "_oxygen": 6, "a": [1, 2, 9, 12], "abyss": [3, 10, 12], "acced": 10, "accept": 1, "acces": [1, 6], "accessibl": [10, 13], "action": [5, 7, 9, 12], "activ": [1, 2, 9], "actuel": [0, 2], "add": 6, "add_item": 7, "administr": [2, 3, 11, 13], "adress": [6, 11, 13], "affich": [7, 12], "affichent": 10, "after": 0, "ains": 4, "air": [3, 12], "ajout": [0, 11], "alert": 12, "algu": [3, 12], "alignment": 7, "allez": 13, "allow": 1, "al\u00e9atoir": [7, 12], "ambi": 7, "ambianc": [3, 8], "ambienc": [5, 8], "amis": [8, 13], "amount": [6, 7], "ancien": 2, "anim": 7, "antivirus": 8, "api": 7, "apparit": 7, "append": 0, "appliqu": [7, 11], "apply_input": 7, "approch": 12, "appui": [6, 9], "apres": [6, 10], "architectur": [3, 8, 13], "archiv": [8, 11], "arme": 10, "armur": 3, "array": 7, "arrier": 3, "arr\u00eat": [2, 12], "artificiel": [5, 7], "artist": 4, "asset": 5, "associ": 7, "assur": 5, "attach": 7, "attaqu": [7, 10, 12], "atteignent": 12, "atteint": 12, "attent": 12, "att\u00e9nu": 7, "aucun": [2, 11, 13], "audio": [3, 4, 5, 7, 9], "audiomanag": 7, "automat": [1, 8, 9], "autonom": 11, "autor": [3, 5], "autour": [3, 7], "autr": [12, 13], "avanc": 12, "avant": [3, 9, 10], "avoir": 6, "avril": 3, "b": 6, "bak": 2, "balein": 3, "ban": [3, 8], "banc": [3, 7, 12], "baptist": 4, "bas": [3, 9, 11, 12], "bash": 1, "besoin": 12, "bienvenu": 8, "bio": [3, 12], "biom": [3, 7, 8, 10], "bit": [1, 5, 11], "bleu": [3, 9, 10, 12], "bloc": [3, 5, 7, 9, 10, 12], "block": 7, "block_id": 7, "blockdat": 7, "blockdatabas": 7, "bloqu": 11, "boid": [3, 7], "bool": 7, "boost": [3, 9, 12], "boucl": 5, "box": 13, "branch": 6, "broadcast_block_chang": 7, "bruit": [3, 7], "bubbl": 4, "bug": 6, "build": [5, 8], "bull": [3, 12], "by": [3, 4], "canal": 6, "capac": 8, "car": 11, "cas": [2, 11, 12], "cass": [9, 10], "cc": [3, 4], "cc0": [3, 4], "cd": [1, 6], "centr": 12, "central": 7, "cfg": [5, 6], "chang": [0, 9], "chant": 3, "chaqu": [0, 3, 5, 7], "characterbody3d": 6, "charg": [3, 5, 7], "chat": [3, 7, 8], "chatmanag": 7, "checkout": 6, "chois": [5, 6, 13], "choix": 11, "chunk": [3, 5, 7], "chunk_loaded": 6, "chunk_pos": 7, "chunkmanag": [5, 7], "ci": 4, "cibl": 13, "class": 6, "class_nam": 6, "clavi": 7, "cleyton": [3, 4], "clic": [9, 11], "client": [5, 7], "clignot": 12, "cliqu": [6, 10, 11, 13], "clon": 8, "clos": 7, "coch": 11, "cod": [0, 7, 8], "cohes": 7, "collect": 10, "comm": [6, 12], "command": [0, 2, 3], "comment": 8, "commentair": 6, "committ": 6, "common": 4, "communaut": [4, 11], "communautair": 6, "communiqu": 13, "compatibility": 5, "compatibl": 11, "comport": [7, 12], "compos": [1, 5, 6, 11], "compress": 2, "conc": 6, "concept": 4, "confianc": 11, "configur": [2, 3, 5, 6, 7, 8, 9, 13], "confirm": 1, "conform": [4, 6], "connect": 5, "connex": 7, "connexion": [8, 13], "conserv": 12, "consomm": [9, 10, 12], "construis": 8, "consult": [2, 6, 8, 13], "contact": [3, 7, 12], "content": 4, "contenu": [0, 2, 7], "continuent": 12, "contraint": 12, "contribu": 8, "contr\u00f4l": [7, 8], "contr\u00f4leur": [3, 5], "corail": [3, 10, 12], "coral": 12, "corallien": [3, 10, 12], "correct": 1, "correspond": [11, 12], "couch": 5, "court": 6, "cp": 2, "craft": [3, 7, 8, 12], "crafting": [3, 5, 7, 8, 12], "craftingrecip": 7, "crash": 2, "creativ": 4, "cr\u00e9": [1, 4, 6, 7, 11, 13], "cr\u00e9ateur": 4, "cr\u00e9atur": [7, 12], "cr\u00e9dit": 8, "ctrl": 9, "cuisin": 3, "cx": 7, "cy": 7, "cz": 7, "daemon": 0, "daily": 2, "dan": [0, 1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13], "danger": 12, "dauphin": [3, 8, 12], "dauphincraft": [0, 1, 2, 3, 5, 6, 11, 12, 13], "debian": 1, "decr": 1, "defend": 11, "del": [2, 12], "density": 7, "depth": 7, "depuis": [1, 2, 6, 8, 11], "derni": [2, 11], "descendr": 9, "descript": [0, 6], "desktop": 6, "dessous": 4, "deux": 5, "dev": 6, "dictionary": 7, "diffus": 3, "diminu": 12, "direct": [2, 4, 6], "directionnel": 7, "directx": 11, "disconnect": 7, "discord": 6, "discuss": 8, "disponibl": [2, 8, 11, 13], "distanc": 10, "doc": 5, "document": 5, "doit": 4, "dolphin": [5, 8], "dolphin_died": 6, "dolphincontroll": [6, 7], "donc": 2, "dossi": [6, 11], "doubl": 11, "douc": [7, 12], "download": [1, 2, 6], "dport": 1, "droit": [1, 9, 11], "durat": 7, "dynam": 3, "d\u00e8s": 10, "d\u00e9bloqu": 11, "d\u00e9but": [10, 12], "d\u00e9charg": 7, "d\u00e9clar": 6, "d\u00e9clench": 6, "d\u00e9compress": 11, "d\u00e9connex": 7, "d\u00e9di": [1, 3, 5], "d\u00e9faut": [0, 5, 9, 13], "d\u00e9fin": [0, 7], "d\u00e9g\u00e2t": [3, 7, 10, 12], "d\u00e9marr": [1, 13], "d\u00e9marrag": 8, "d\u00e9monstr": 13, "d\u00e9pannag": 8, "d\u00e9plac": [3, 5, 7, 8], "d\u00e9ploi": 13, "d\u00e9p\u00f4t": [1, 2, 8, 11], "d\u00e9sactiv": 9, "d\u00e9tail": 11, "d\u00e9tect": 7, "d\u00e9velopp": 4, "e": [9, 12], "eau": 12, "echolocationpuls": 7, "edit": 6, "effet": [3, 5, 7], "elles": 12, "emit_puls": 7, "emit_signal": 6, "encor": 0, "endroit": 10, "enet": [3, 5, 7, 13], "engin": [4, 5, 6], "entre": [7, 13], "entrez": 13, "entr\u00e9": [1, 7, 9], "environ": [3, 5, 7, 9], "envoi": [7, 9], "envoient": 5, "espac": [9, 11], "etc": [0, 1, 2], "ex": 13, "exampl": 13, "except": 11, "exclud": 2, "exe": 11, "execstart": 0, "exempl": 6, "exist": [11, 13], "explicit": 6, "explor": [8, 10], "export": 8, "export_preset": [5, 6], "expos": [0, 7], "extend": 6, "extern": 13, "extract": 8, "extrai": [1, 2], "extrait": 11, "ex\u00e9cut": [5, 11], "f": [1, 2], "f2": 9, "f5": 6, "fabriqu": [7, 10], "failed": 2, "failur": [0, 2], "faim": [3, 7, 10, 12], "fait": [6, 11], "fallback": 5, "farm": 10, "fa\u00e7on": [7, 12], "feat": 6, "fen\u00eatr": 9, "ferm": 9, "feu": [0, 8], "fichi": [1, 2, 5, 8, 11], "fil": 12, "fishschool": [7, 12], "float": [6, 7], "flux": 8, "fog": [3, 7], "fonction": 6, "fonctionnal": 0, "fonctionnalit": 6, "fond": [4, 5, 8, 10], "forward": 5, "for\u00eat": [3, 10, 12], "fourn": [1, 11, 13], "franc": 6, "freesound": 4, "fuit": [7, 12], "func": 6, "fusion": 6, "futur": 0, "gam": 0, "gameplay": 3, "gauch": 9, "gd": [0, 5, 7], "gdscript": 5, "gener": 7, "generate_chunk": 7, "ger": [6, 7], "gestion": [5, 7, 8], "gestionnair": 6, "get_available_recip": 7, "get_block": 7, "get_chunk": 7, "get_damag": 7, "get_id_by_nam": 7, "get_item": 7, "git": [1, 2, 6, 11], "glac": [3, 10], "glsl": 5, "go": [1, 11], "godot": [4, 5, 8], "godotengin": [4, 6], "gpu": 11, "grand": 12, "graphiqu": 7, "gross": 2, "group": 12, "guid": [1, 8], "gz": [1, 2], "g\u00e9ner": [3, 5, 7, 12], "g\u00e9n\u00e9ral": 11, "h": 9, "harpon": 3, "has_item": 7, "haut": [3, 5], "headless": [0, 3, 5], "health": 6, "histor": 8, "host": [1, 2, 6, 11], "host_gam": 7, "hostil": [3, 7, 12], "hotbar": [3, 7, 9], "http": [1, 2, 4, 6, 11, 13], "hud": [3, 5, 7, 9, 12], "h\u00e9berg": [5, 8, 11], "h\u00f4t": 13, "ia": 7, "icon": [4, 5], "ic\u00f4n": [5, 7], "id": 7, "id\u00e9": 6, "id\u00e9al": 12, "if": 6, "ifconfig": 13, "impact": 10, "impl\u00e9ment": 0, "import": 6, "impuls": [7, 9, 12], "incarn": 8, "inclut": 2, "inconnu": 11, "indispens": 10, "indisponibl": 13, "ind\u00e9fin": 2, "inflig": [7, 12], "infligent": 12, "infrastructur": 7, "ingr\u00e9dient": 10, "initial": 12, "initialis": [5, 7], "input": [1, 7], "install": [0, 6, 8, 13], "instanc": 5, "instanci": 5, "instantan": [10, 12], "int": [6, 7], "integr": 13, "intelligent": [5, 7], "intens": 12, "intent": 5, "interact": 8, "interfac": [2, 7, 8], "interm\u00e9diair": 12, "intern": 13, "internet": [11, 13], "invalid": 13, "inventair": [3, 5, 8, 9, 10, 12], "inventory": [5, 8], "inventoryu": [5, 7], "ip": [1, 7, 11, 13], "iptabl": 1, "is": 2, "issu": 6, "item": 7, "itemdat": 7, "itemdatabas": 7, "jaug": [3, 7, 8, 9, 10], "jellyfish": [7, 12], "jeu": [2, 3, 5, 6, 8, 9, 11], "join_gam": 7, "jou": [8, 11, 12, 13], "joueur": [3, 5, 7], "jour": 8, "journalctl": [1, 2], "jusqu": [6, 8, 12, 13], "kelp": [3, 10, 12], "kelp_food": 12, "kick": [3, 8], "laiss": 6, "lamp": [3, 12], "lanc": [1, 6, 11, 13], "langag": 8, "lent": 12, "libr": [1, 11], "licenc": 4, "lign": [0, 2, 3], "limit": [0, 7, 8, 12], "linux": [1, 3, 5, 6], "list": 4, "lobbymenu": 5, "local": [1, 11, 13], "log": [0, 8], "logiqu": 7, "logrotat": 2, "loin": 10, "lor": [12, 13], "lorsqu": 12, "lt": 1, "lumi": 7, "lumin": [3, 7, 12], "machin": [1, 11, 13], "maillag": 7, "main": [5, 6], "mainmenu": [5, 7], "mainten": 8, "mainteneur": 6, "mani": 12, "manqu": 12, "manuel": [4, 5], "marin": [3, 7, 8, 10], "mat\u00e9rial": 12, "max": [0, 7], "maximum": 8, "meilleur": 10, "menu": [6, 7, 8, 13], "messag": [7, 9], "met": 11, "mettr": [2, 9], "minimal": 8, "minimum": [1, 11], "mis": 8, "missingok": 2, "mit": 4, "mo": [1, 11], "mob": [3, 5, 8, 9, 10], "mobspawn": 7, "mod": [6, 8, 11], "model": [5, 6], "modif": [0, 6, 7], "modifi": [8, 13], "modul": 8, "molet": 9, "mond": [3, 5, 8, 11, 12, 13], "mont": 9, "morsur": 12, "mort": [6, 8], "moteur": 8, "moulin": 4, "mour": 12, "mult": [0, 3], "multijoueur": [3, 5, 7, 8, 9, 11, 12], "multiplayerap": 5, "music": [4, 5], "musiqu": [3, 4, 5, 7], "mv": 1, "m\u00e9can": 8, "m\u00e9dus": [3, 12], "m\u00eam": 9, "nag": [3, 7, 9, 12], "nagent": 12, "nam": 7, "nano": [0, 2], "nat": [1, 13], "navig": [7, 13], "navigu": 6, "net": [0, 5, 8], "network": 0, "networkmanag": [0, 5, 7], "neutr": [3, 12], "niveau": 5, "noi": 12, "nom": [6, 7], "nombr": 8, "nommag": 6, "notif": 7, "notifempty": 2, "nourritur": [10, 12], "nouveau": [0, 2], "nouvel": 2, "n\u00e9cessair": [0, 8, 11], "objet": 10, "obscur": 12, "obten": 12, "octav": 3, "oc\u00e9an": 12, "officiel": [1, 2, 8, 11], "offrant": 12, "ok": 11, "on_message_received": 7, "onglet": [10, 11], "open": [4, 7], "opengameart": 4, "opt": [0, 1, 2], "option": 0, "optionnel": 2, "op\u00e9rationnel": 2, "orang": 12, "orchestr": 7, "org": [4, 6], "organis": 7, "origin": [6, 7], "oscill": 7, "oubl": 0, "outil": 8, "ouvert": 1, "ouvertur": 8, "ouvr": [0, 8, 9, 10, 11, 13], "oxygen": [3, 7, 8, 10], "o\u00f9": 8, "p": 1, "panneau": 7, "parametr": [0, 9, 13], "pare": [0, 8], "part": [8, 10, 11], "particul": [3, 7], "pascalcas": 6, "passif": 3, "passiv": [10, 12], "pat": 13, "patrouill": 12, "paus": 8, "pausemenu": 5, "pend": 12, "peopl": 4, "perd": 12, "perlin": [3, 7], "permanent": [12, 13], "permet": [10, 13], "persist": [0, 3], "personnag": 7, "personnalis": 13, "peu": 12, "peuplent": 12, "peut": [11, 12, 13], "peuvent": 13, "physiqu": [5, 7], "pist": 7, "plac": [6, 12], "plancton": [3, 7], "planktonparticl": 7, "play_music": 7, "play_sfx": 7, "player": 0, "playersynccomponent": [5, 7], "plus": 12, "point": 12, "poisson": [3, 7, 12], "ponctuel": 12, "popul": [3, 7], "port": [5, 7, 8, 10, 11], "portabl": 11, "pos": [3, 6, 7, 9, 12], "posit": [3, 5, 7], "possibl": 4, "post": 7, "poumon": 12, "poursuit": 7, "pouss": 6, "pratiqu": 13, "premi": [3, 5, 8], "principal": [5, 7, 9, 12, 13], "process": 7, "proc\u00e9dur": 8, "proc\u00e9dural": [3, 7, 12], "profond": [10, 12], "profondeur": [7, 12], "project": [5, 6], "projet": [0, 4, 8], "prolong": 12, "propos": [6, 9, 11], "propr": 13, "propriet": [7, 11], "protect": 10, "protocol": 5, "proxim": 7, "pr\u00e9av": 13, "pr\u00e9fix": 6, "pr\u00e9requ": 8, "pr\u00e9sent": [10, 11], "pr\u00e9set": [6, 8], "pr\u00e9vu": [0, 2, 3], "public": 8, "publiqu": [1, 3, 7, 13], "puis": [10, 11, 13], "pull": 6, "push": 6, "pv": [6, 10, 12], "qty": 7, "quand": 12, "quantit": 10, "quarantain": 11, "quatr": [3, 12], "quelqu": 13, "question": 6, "quitt": 9, "r": 2, "radius": 7, "ram": [1, 11], "rapid": 12, "rar": 12, "rayon": [3, 7, 9, 10, 12], "rebuild_mesh": 7, "recet": [3, 7, 8, 12], "rechang": 10, "recharg": [0, 9, 10, 12], "recipe_id": 7, "recommand": 2, "recompil": 0, "recul": 9, "rec\u00e8lent": 12, "redirect": 13, "redirig": 2, "red\u00e9marr": [0, 2], "red\u00e9marrag": [0, 3, 8], "refresh": 7, "registr": 7, "regl": 13, "rejoign": 6, "rejoindr": [5, 8, 11], "rel": 6, "relanc": [2, 11], "releas": [1, 2, 11], "reload": [0, 1], "remont": 12, "remove_item": 7, "remplac": [6, 11, 13], "rendent": 4, "rendu": 5, "reper": 12, "repos": 9, "repouss": 12, "reprendr": 9, "repr\u00e9sent": [7, 12], "requ": [1, 11], "request": 6, "request_chunk": 7, "requin": [3, 12], "requis": [8, 13], "respawn": 8, "respir": 12, "respons": 7, "ressourc": [4, 5, 7, 8, 12], "rest": 12, "restart": [0, 2], "restartsec": 0, "restaur": 10, "restent": 12, "retent": 12, "retour": 9, "retourn": 2, "re\u00e7oivent": 5, "re\u00e7us": 10, "rich": 12, "ristooooo1": 4, "roch": [3, 10, 12], "root": 1, "rotat": [2, 7], "roug": [3, 10, 12], "routeur": 13, "rpc": 7, "rsync": 2, "rul": 1, "running": 1, "rx": [3, 4], "r\u00e9action": 7, "r\u00e9ag": 3, "r\u00e9apparaiss": 12, "r\u00e9cept": 7, "r\u00e9cif": [3, 10, 12], "r\u00e9duit": [6, 10, 12], "r\u00e9el": 1, "r\u00e9guli": 12, "r\u00e9g\u00e9ner": [0, 3, 12], "r\u00e9initialis": 13, "r\u00e9seau": [1, 8, 11], "r\u00e9serv": 12, "r\u00e9sultat": 10, "r\u00e9vel": [3, 9], "san": [9, 12, 13], "satiet": 12, "sauvegard": [2, 3, 8], "sav": 1, "scen": [5, 7], "script": [0, 1, 5, 7], "second": [2, 12, 13], "selon": 7, "send": 7, "send_messag": 7, "separ": 7, "ser": 0, "serv": [0, 1, 2, 5, 6], "serveur": [3, 5, 6, 7], "servic": [2, 8], "session": 13, "set_block": 7, "set_density": 7, "set_depth": 7, "set_school_siz": 7, "seul": [11, 13], "sfx": [4, 5], "sh": 1, "shader": [3, 5], "shark": [7, 12], "shift": 9, "si": [2, 6, 11, 12, 13], "sign": 11, "signal": 6, "simplifi": 7, "simultan": [8, 13], "singleton": 7, "sinon": 2, "six": [3, 7], "slot": [3, 7, 9], "snake_cas": 6, "solo": [5, 11, 13], "solut": 11, "sombr": 9, "sonor": [3, 5, 7, 9], "sort": [1, 5, 6], "souhait": [0, 10], "soum": 6, "soumettr": 8, "sound": 4, "sour": [7, 9], "sourc": [0, 4, 5, 7, 10, 11, 12], "sous": [3, 4, 7, 8], "spawn": [3, 12], "spawn_in_chunk": 7, "speed": 6, "sphinx": 5, "sph\u00e9riqu": 7, "sp\u00e9cial": 8, "stack": 7, "standarderror": 0, "standardoutput": 0, "start": 2, "stat": 7, "status": [1, 2], "stderr": 2, "stdout": 2, "stockag": [1, 7, 11], "stop": 2, "stop_music": 7, "straf": [3, 9], "strict": [5, 6], "string": 7, "structur": [7, 8], "stun": 7, "styl": 8, "sudo": [0, 1, 2], "sugger": 2, "suppl\u00e9mentair": [11, 12], "support": [4, 8, 13], "sup\u00e9rieur": [6, 12], "surbrill": 10, "surfac": 12, "surveil": 8, "svg": [4, 5], "sync_stat": 7, "synchronis": [3, 5, 7], "system": [0, 1, 7, 10, 11], "systemctl": [0, 1, 2], "systemd": [1, 8], "s\u00e9lection": [6, 10], "tab": [9, 10], "tableau": 7, "tail": [1, 2], "take_damag": [6, 7], "tant": 1, "tap": 9, "tar": [1, 2], "tarball": 2, "target": 0, "taur": 4, "techniqu": 8, "temp": [1, 12], "templat": 6, "temporair": 0, "text": 7, "textuel": 3, "textur": [5, 7], "them": [3, 4], "tierc": 11, "titr": 13, "todo": 6, "total": 12, "touch": [9, 12], "toujour": [6, 11], "tourn": [1, 5], "tous": [4, 7], "tout": [9, 10, 12, 13], "transform": 10, "transit": 7, "transport": 5, "tres": 10, "trois": [11, 12], "trouv": [8, 12, 13], "tscn": 5, "typ": [0, 1, 3, 6, 7, 12], "typag": [5, 6], "t\u00e9l\u00e9charg": [1, 2, 6, 8], "u": [1, 2], "ubuntu": 1, "udp": [1, 5, 13], "ufw": 1, "underwat": [3, 4], "underwater_ambient": 4, "underwater_them": 4, "underwaterenvironment": 7, "uniqu": [10, 11], "unit": [0, 3, 9, 10, 12], "update_health": 7, "update_hung": 7, "update_oxygen": 7, "urgenc": [10, 12], "user": 0, "util": [10, 12], "utilis": [1, 5, 7, 13], "v0": [1, 11], "v4": 1, "valeur": [0, 5], "valid": [6, 9], "valu": 7, "var": [0, 1, 2, 6], "variabl": 6, "vector3": 7, "ver": [2, 6], "version": [0, 2, 6, 8, 11], "vi": [1, 3, 5, 7, 12, 13], "vid\u00e9o": 9, "visibil": 12, "visibl": 12, "visuel": [3, 5, 7], "vit": 12, "voic": 9, "void": 6, "voir": [0, 10, 11, 12, 13], "volumetr": [3, 7], "votr": [6, 9, 11, 12, 13], "voxel": [3, 5, 7, 8], "vu": 12, "vulkan": [5, 11], "vx": 2, "v\u00e9rif": 8, "v\u00e9rit": 5, "w": 9, "wantedby": 0, "wget": [1, 2], "whale_call": 4, "window": [5, 6, 11], "workingdirectory": 0, "world": [5, 8], "worldgenerator": 7, "worldsynccomponent": [5, 7], "x": [6, 7], "x86_64": 0, "xzf": [1, 2], "z": [2, 7], "zip": 11, "zon": [9, 10, 12], "zozzy": 4, "z\u00e9ro": 12, "\u00c0": 12, "\u00e9caill": 3, "\u00e9chap": 9, "\u00e9choloc": [3, 7, 9, 12], "\u00e9clair": 10, "\u00e9cout": [8, 13], "\u00e9cran": 12, "\u00e9dit": 0, "\u00e9diteur": 6, "\u00e9nerg": 9, "\u00e9pav": [3, 10, 12], "\u00e9tat": [5, 7, 8], "\u00e9vit": [2, 12], "\u00e9volu": 12, "\u00eatre": [4, 12, 13]}, "titles": ["Configuration du serveur", "Installation du serveur", "Maintenance du serveur", "Historique des versions", "Cr\u00e9dits", "Architecture technique", "Contribuer au projet", "Modules du jeu", "DauphinCraft \u2014 Documentation", "Contr\u00f4les", "Crafting \u2014 Recettes", "Installation \u2014 Guide joueur", "M\u00e9caniques de jeu", "Multijoueur"], "titleterms": {"0": 3, "1": 3, "administr": 8, "air": 10, "algu": 10, "ambianc": 7, "ambienc": 7, "annex": 8, "antivirus": 11, "architectur": 5, "archiv": 1, "armur": 10, "asset": 4, "attribu": 4, "auteur": 4, "automat": 2, "ban": 2, "bio": 10, "biom": 12, "build": 6, "bull": 10, "capac": 9, "chat": 9, "clon": 6, "cod": 6, "comment": 10, "configur": [0, 11], "connexion": 11, "connu": 3, "consult": 1, "contribu": 6, "contr\u00f4l": 9, "craft": 10, "crafting": 10, "cr\u00e9dit": 4, "cuisin": 10, "dan": 6, "dauphin": 7, "dauphincraft": 8, "depuis": 13, "discuss": 6, "disponibl": 10, "document": 8, "dolphin": 7, "d\u00e9marrag": 5, "d\u00e9pannag": 11, "d\u00e9plac": 9, "d\u00e9p\u00f4t": 6, "d\u00e9velopp": 8, "export": [5, 6], "extract": 1, "feu": 1, "fichi": 0, "flux": 5, "fonctionnal": 3, "gestion": [2, 12], "godot": 6, "guid": 11, "harpon": 10, "histor": 3, "h\u00e9berg": 13, "initial": 3, "install": [1, 11], "interact": 9, "interfac": 9, "inventair": 7, "inventory": 7, "jaug": 12, "jeu": [4, 7, 12, 13], "joueur": [0, 2, 8, 11, 12, 13], "jour": 2, "kick": 2, "lamp": 10, "langag": 5, "limit": [3, 13], "log": [1, 2], "mainten": 2, "marin": 12, "maximum": 0, "menu": 9, "minimal": 11, "mis": 2, "mob": [7, 12], "mod": 13, "modifi": 0, "modul": 7, "mond": [0, 7, 9], "mort": 12, "moteur": [4, 5], "multijoueur": 13, "m\u00e9can": 12, "net": 7, "nombr": 0, "nouvel": 3, "n\u00e9cessair": 6, "officiel": 13, "outil": 6, "ouvertur": 1, "ouvr": 6, "oxygen": 12, "o\u00f9": 10, "pare": 1, "part": 13, "paus": 9, "port": [0, 1, 13], "premi": 11, "proc\u00e9dur": 11, "projet": [5, 6], "pr\u00e9requ": 1, "pr\u00e9set": 5, "public": 13, "recet": 10, "red\u00e9marrag": 2, "rejoindr": 13, "remerci": 4, "requis": [4, 11], "respawn": 12, "ressourc": 10, "r\u00e9seau": [5, 7, 13], "sauvegard": 0, "serveur": [0, 1, 2, 8, 13], "servic": [0, 1], "sort": 3, "soumettr": 6, "sous": 12, "sp\u00e9cial": 9, "structur": 5, "styl": 6, "support": 6, "surveil": 2, "systemd": 0, "techniqu": 5, "trouv": 10, "t\u00e9l\u00e9charg": 11, "version": 3, "v\u00e9rif": [1, 2], "world": 7, "\u00e9caill": 10, "\u00e9cout": 0, "\u00e9tat": 2}}) \ No newline at end of file diff --git a/docs/_static/screenshot_menu.png b/docs/_static/screenshot_menu.png new file mode 100644 index 0000000..29b4498 Binary files /dev/null and b/docs/_static/screenshot_menu.png differ diff --git a/docs/admin/configuration.rst b/docs/admin/configuration.rst new file mode 100644 index 0000000..b37f025 --- /dev/null +++ b/docs/admin/configuration.rst @@ -0,0 +1,79 @@ +Configuration du serveur +======================== + +Fichier de service systemd +--------------------------- + +Le service est défini dans : + +.. code-block:: text + + /etc/systemd/system/dauphincraft.service + +Contenu type : + +.. code-block:: ini + + [Unit] + Description=DauphinCraft Game Server + After=network.target + + [Service] + User=dauphincraft + WorkingDirectory=/opt/dauphincraft + ExecStart=/opt/dauphincraft/DauphinCraft.x86_64 --headless --port 7777 + Restart=on-failure + RestartSec=5s + StandardOutput=append:/var/log/dauphincraft.log + StandardError=append:/var/log/dauphincraft.log + + [Install] + WantedBy=multi-user.target + +Modifier le port d'écoute +-------------------------- + +1. Éditez le fichier service : + + .. code-block:: bash + + sudo nano /etc/systemd/system/dauphincraft.service + +2. Modifiez la ligne ``ExecStart`` pour changer le port : + + .. code-block:: text + + ExecStart=/opt/dauphincraft/DauphinCraft.x86_64 --headless --port 9999 + +3. Rechargez la configuration et redémarrez le service : + + .. code-block:: bash + + sudo systemctl daemon-reload + sudo systemctl restart dauphincraft + +4. N'oubliez pas d'ouvrir le nouveau port dans le pare-feu (voir :doc:`installation_serveur`). + +Nombre maximum de joueurs +-------------------------- + +La limite de joueurs est définie à **16** par défaut dans le code source +(``scripts/net/NetworkManager.gd``). Cette valeur sera exposée en paramètre +de ligne de commande dans une version future. + +Pour modifier temporairement la limite, il est actuellement nécessaire de recompiler +le projet avec la valeur souhaitée. + +.. note:: + + Une option ``--max-players `` sera ajoutée dans la version 0.2.0. + +Sauvegarde du monde +------------------- + +.. warning:: + + La sauvegarde persistante du monde n'est pas encore implémentée dans la version 0.1.0. + Le monde est régénéré à chaque redémarrage du serveur. + +Cette fonctionnalité est prévue pour une version future. diff --git a/docs/admin/installation_serveur.rst b/docs/admin/installation_serveur.rst new file mode 100644 index 0000000..bd75ba5 --- /dev/null +++ b/docs/admin/installation_serveur.rst @@ -0,0 +1,96 @@ +Installation du serveur +======================= + +Ce guide décrit l'installation du serveur dédié DauphinCraft sur une machine Linux. + +Prérequis +--------- + ++--------------------+-----------------------------------------------+ +| Composant | Requis | ++====================+===============================================+ +| Système | Debian 11+ ou Ubuntu 22.04 LTS (64 bits) | ++--------------------+-----------------------------------------------+ +| RAM | 1 Go minimum | ++--------------------+-----------------------------------------------+ +| Stockage | 500 Mo libres | ++--------------------+-----------------------------------------------+ +| Réseau | IP publique ou réseau local avec NAT | ++--------------------+-----------------------------------------------+ +| Port | UDP 7777 ouvert en entrée | ++--------------------+-----------------------------------------------+ +| Droits | Accès root ou sudo | ++--------------------+-----------------------------------------------+ + +Extraction de l'archive +----------------------- + +Téléchargez l'archive serveur depuis le dépôt officiel : + +.. code-block:: bash + + wget http:///dauphincraft/releases/download/v0.1.0/DauphinCraft-Server-v0.1.tar.gz + +Extrayez-la dans ``/opt`` : + +.. code-block:: bash + + sudo tar -xzf DauphinCraft-Server-v0.1.tar.gz -C /opt/ + sudo mv /opt/DauphinCraft-Server /opt/dauphincraft + +Installation +------------ + +Lancez le script d'installation fourni en tant que root : + +.. code-block:: bash + + cd /opt/dauphincraft + sudo bash install.sh + +Ce script : + +1. Crée un utilisateur système ``dauphincraft``. +2. Installe le fichier de service systemd dans ``/etc/systemd/system/dauphincraft.service``. +3. Active et démarre le service automatiquement. + +Vérification du service +----------------------- + +.. code-block:: bash + + systemctl status dauphincraft + +Une sortie de type ``Active: active (running)`` confirme que le serveur tourne correctement. + +Ouverture du port pare-feu +--------------------------- + +Avec **ufw** (Ubuntu) : + +.. code-block:: bash + + sudo ufw allow 7777/udp + sudo ufw reload + +Avec **iptables** : + +.. code-block:: bash + + sudo iptables -A INPUT -p udp --dport 7777 -j ACCEPT + sudo iptables-save > /etc/iptables/rules.v4 + +Consultation des logs +--------------------- + +Via **journalctl** (en temps réel) : + +.. code-block:: bash + + journalctl -u dauphincraft -f + +Via le fichier de log : + +.. code-block:: bash + + tail -f /var/log/dauphincraft.log diff --git a/docs/admin/maintenance.rst b/docs/admin/maintenance.rst new file mode 100644 index 0000000..5a8fa47 --- /dev/null +++ b/docs/admin/maintenance.rst @@ -0,0 +1,96 @@ +Maintenance du serveur +====================== + +Mise à jour du serveur +---------------------- + +Pour mettre à jour DauphinCraft vers une nouvelle version : + +1. Téléchargez le nouveau tarball depuis le dépôt officiel : + + .. code-block:: bash + + wget http:///dauphincraft/releases/download/vX.Y.Z/DauphinCraft-Server-vX.Y.Z.tar.gz + +2. Arrêtez le service : + + .. code-block:: bash + + sudo systemctl stop dauphincraft + +3. Sauvegardez l'ancienne version (optionnel mais recommandé) : + + .. code-block:: bash + + sudo cp -r /opt/dauphincraft /opt/dauphincraft.bak + +4. Extrayez la nouvelle version : + + .. code-block:: bash + + sudo tar -xzf DauphinCraft-Server-vX.Y.Z.tar.gz -C /opt/ + sudo rsync -a --exclude='logs' /opt/DauphinCraft-Server/ /opt/dauphincraft/ + +5. Relancez le service : + + .. code-block:: bash + + sudo systemctl start dauphincraft + systemctl status dauphincraft + +Surveillance et logs +--------------------- + +**Consultation des logs en direct :** + +.. code-block:: bash + + journalctl -u dauphincraft -f + +**Consultation des dernières lignes :** + +.. code-block:: bash + + tail -n 100 /var/log/dauphincraft.log + +**Rotation des logs :** le service redirige stdout/stderr vers ``/var/log/dauphincraft.log``. +Pour éviter que ce fichier grossisse indéfiniment, configurez ``logrotate`` : + +.. code-block:: bash + + sudo nano /etc/logrotate.d/dauphincraft + +Contenu suggéré : + +.. code-block:: text + + /var/log/dauphincraft.log { + daily + rotate 7 + compress + missingok + notifempty + } + +Vérification de l'état du serveur +----------------------------------- + +.. code-block:: bash + + systemctl is-active dauphincraft + +Retourne ``active`` si le serveur est opérationnel, ``failed`` sinon. + +Redémarrage automatique +------------------------ + +Le fichier de service inclut ``Restart=on-failure`` avec un délai de 5 secondes. +Le serveur redémarre donc automatiquement en cas de crash. + +Gestion des joueurs (Kick / Ban) +---------------------------------- + +.. note:: + + Les commandes d'administration en jeu (kick, ban) sont prévues pour la version 0.2.0. + Aucune interface d'administration n'est disponible dans la version actuelle. diff --git a/docs/changelog.rst b/docs/changelog.rst new file mode 100644 index 0000000..c3531fe --- /dev/null +++ b/docs/changelog.rst @@ -0,0 +1,60 @@ +Historique des versions +======================= + +Version 0.1.0 — Sortie initiale +--------------------------------- + +*Avril 2026* + +Première version publique de DauphinCraft. Cette version pose les bases du jeu : +monde voxel procédural, gameplay dauphin, inventaire, mobs et multijoueur. + +Nouvelles fonctionnalités +~~~~~~~~~~~~~~~~~~~~~~~~~ + +- **Monde voxel procédural sous-marin** + + - Génération par bruit de Perlin multi-octave. + - Quatre biomes : récif corallien, forêt de kelp, abysses, épaves. + - Chunks 16×16×16 chargés dynamiquement autour du joueur. + - Six types de blocs : Corail Bleu, Corail Rouge, Kelp, Roche, Épave, Glace. + +- **Dauphin contrôleur et HUD** + + - Déplacement 6DOF (haut/bas/avant/arrière/strafes). + - Jauges : oxygène, vie, faim. + - Boost de nage et écholocation (révèle l'environnement dans un rayon de 20 unités). + - Hotbar de 9 slots. + +- **Inventaire et crafting** + + - Inventaire de 27 slots. + - 5 recettes de craft : Lampe bio, Harpon, Bulle d'air, Algue cuisinée, Armure écailles. + +- **Mobs (3 types)** + + - Bancs de poissons (boids, neutres). + - Méduses (dégâts de contact passifs). + - Requin (hostile, réagit à l'écholocation). + - Spawner par biome avec limite de population. + +- **Multijoueur ENet 16 joueurs** + + - Architecture autorité serveur. + - Synchronisation position, blocs, inventaire. + - Chat textuel en jeu. + - Serveur dédié headless pour Linux. + +- **Ambiance visuelle et audio** + + - Shaders sous-marins : fog volumétrique, diffusion lumineuse. + - Particules de plancton lumineux. + - Musique : *Underwater Theme* (Cleyton RX, CC-BY 3.0). + - Effets sonores : ambiance, bulles, chant de baleine (CC0). + +Limitations connues +~~~~~~~~~~~~~~~~~~~ + +- La sauvegarde du monde n'est pas persistante (monde régénéré à chaque redémarrage). +- Pas de commandes d'administration en jeu (kick/ban prévu en 0.2.0). +- La limite de joueurs (16) n'est pas configurable en ligne de commande. diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..fdce544 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,28 @@ +# -- Project information ----------------------------------------------------- +project = "DauphinCraft" +copyright = "2026, Baptiste Moulin" +author = "Baptiste Moulin" +release = "0.1.0" + +# -- General configuration --------------------------------------------------- +extensions = [ + "sphinx.ext.autosectionlabel", + "sphinx.ext.todo", + "myst_parser", +] +source_suffix = {".rst": "restructuredtext", ".md": "markdown"} +master_doc = "index" +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] +language = "fr" + +# -- HTML output ------------------------------------------------------------- +html_theme = "sphinx_rtd_theme" +html_theme_options = { + "navigation_depth": 4, + "collapse_navigation": False, + "sticky_navigation": True, + "style_nav_header_background": "#0b3d5c", +} +html_title = "DauphinCraft — Manuel joueur et serveur" +html_short_title = "DauphinCraft" +html_static_path = ["_static"] diff --git a/docs/credits.rst b/docs/credits.rst new file mode 100644 index 0000000..78cccc1 --- /dev/null +++ b/docs/credits.rst @@ -0,0 +1,50 @@ +Crédits +======= + +Moteur +------ + +- **Godot Engine 4.6.2** — Licence MIT — https://godotengine.org + +Assets +------ + +Tous les assets sont listés ci-dessous avec leur source et licence. + ++-----------------------------------+-------------------------------------------------------+-------------+ +| Asset | Source | Licence | ++===================================+=======================================================+=============+ +| ``icon.svg`` | Créé manuellement | CC0 | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/music/underwater_theme`` | Cleyton RX — https://opengameart.org/content/ | CC-BY 3.0 | +| | underwater-theme | | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/sfx/underwater_ambient`` | Zozzy — https://freesound.org/people/Zozzy/ | CC0 | +| | sounds/56678/ | | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/sfx/bubbles`` | ristooooo1 — https://freesound.org/people/ | CC0 | +| | ristooooo1/sounds/539823/ | | ++-----------------------------------+-------------------------------------------------------+-------------+ +| ``audio/sfx/whale_call`` | taure — https://freesound.org/people/taure/ | CC0 | +| | sounds/361423/ | | ++-----------------------------------+-------------------------------------------------------+-------------+ + +Attribution requise +------------------- + +Conformément à la licence CC-BY 3.0, la musique de fond doit être créditée ainsi : + + *"Underwater Theme" par Cleyton RX,* + *https://opengameart.org/content/underwater-theme,* + *sous licence Creative Commons Attribution 3.0.* + +Auteur du jeu +------------- + +- **Baptiste Moulin** — Conception, développement, direction artistique + +Remerciements +------------- + +- La communauté Godot Engine pour ses ressources et son support. +- Les créateurs d'assets CC0 et CC-BY qui rendent les projets open source possibles. diff --git a/docs/dev/architecture.rst b/docs/dev/architecture.rst new file mode 100644 index 0000000..27e4d9f --- /dev/null +++ b/docs/dev/architecture.rst @@ -0,0 +1,81 @@ +Architecture technique +======================= + +Moteur et langage +----------------- + ++------------------+-----------------------------------------------+ +| Composant | Valeur | ++==================+===============================================+ +| Moteur | Godot Engine 4.6.2 (Forward+) | ++------------------+-----------------------------------------------+ +| Langage | GDScript (typage strict) | ++------------------+-----------------------------------------------+ +| Rendu | Vulkan (Forward+) / Compatibility (fallback) | ++------------------+-----------------------------------------------+ +| Réseau | ENet UDP, autorité serveur | ++------------------+-----------------------------------------------+ + +Architecture réseau +------------------- + +DauphinCraft utilise un modèle **autorité serveur** : + +- Le serveur est la source de vérité pour les positions, les blocs et les inventaires. +- Les clients envoient leurs intentions (déplacement, action) et reçoivent l'état du monde. +- La synchronisation est assurée par ``PlayerSyncComponent`` et ``WorldSyncComponent``. +- Le protocole de transport est **ENet (UDP)** via la couche haut niveau Godot (``MultiplayerAPI``). +- Port par défaut : **UDP 7777**. + +Structure du projet +------------------- + +.. code-block:: text + + DauphinCraft/ + ├── project.godot # Fichier de projet Godot + ├── icon.svg # Icône du jeu + ├── export_presets.cfg # Présets d'export (Windows, Linux serveur) + ├── assets/ # Ressources visuelles (textures, modèles) + ├── audio/ # Fichiers audio + │ ├── music/ # Musiques de fond + │ └── sfx/ # Effets sonores + ├── builds/ # Sorties d'export + ├── scenes/ # Scènes Godot (.tscn) + │ ├── Main.tscn + │ ├── MainMenu.tscn + │ ├── LobbyMenu.tscn + │ ├── World.tscn + │ ├── Dolphin.tscn + │ ├── InventoryUI.tscn + │ ├── PauseMenu.tscn + │ └── mobs/ + ├── scripts/ # Scripts GDScript (.gd) + │ ├── Main.gd + │ ├── PauseMenu.gd + │ ├── world/ # Gestion du monde voxel + │ ├── dolphin/ # Contrôleur joueur + HUD + │ ├── ambience/ # Environnement visuel et audio + │ ├── inventory/ # Inventaire et crafting + │ ├── mobs/ # Intelligence artificielle des mobs + │ └── net/ # Réseau multijoueur + ├── shaders/ # Shaders GLSL/Godot + └── docs/ # Documentation Sphinx (ce manuel) + +Flux de démarrage +----------------- + +1. ``Main.tscn`` est la scène principale. Elle instancie ``MainMenu.tscn``. +2. Le joueur choisit Solo / Héberger / Rejoindre dans ``LobbyMenu.tscn``. +3. ``NetworkManager`` initialise ENet (serveur ou client). +4. ``World.tscn`` est chargée : ``ChunkManager`` génère les premiers chunks. +5. ``Dolphin.tscn`` est instanciée pour chaque joueur connecté. +6. La boucle de jeu tourne : physique, synchronisation réseau, rendu. + +Présets d'export +---------------- + +Deux présets sont configurés dans ``export_presets.cfg`` : + +- **Windows (64 bits)** : exécutable joueur pour Windows. +- **Linux Server (64 bits)** : exécutable headless pour serveur dédié Linux. diff --git a/docs/dev/contribuer.rst b/docs/dev/contribuer.rst new file mode 100644 index 0000000..8add6fe --- /dev/null +++ b/docs/dev/contribuer.rst @@ -0,0 +1,110 @@ +Contribuer au projet +==================== + +Outils nécessaires +------------------ + +- **Godot Engine 4.6.2** : téléchargez depuis https://godotengine.org/download +- **Git** : version 2.x ou supérieure +- Accès au dépôt Gitea de DauphinCraft + +Cloner le dépôt +--------------- + +.. code-block:: bash + + git clone http:///dauphincraft/dauphincraft.git + cd dauphincraft + +.. note:: + + Remplacez ```` par l'adresse du serveur Gitea communautaire. + +Ouvrir le projet dans Godot +----------------------------- + +1. Lancez Godot Engine 4.6.2. +2. Dans le gestionnaire de projets, cliquez sur **Import**. +3. Naviguez jusqu'au dossier cloné et sélectionnez ``project.godot``. +4. Cliquez sur **Import & Edit**. + +Le projet s'ouvre directement dans l'éditeur. Appuyez sur **F5** pour lancer le jeu en mode éditeur. + +Build et export +--------------- + +Les présets d'export sont configurés dans ``export_presets.cfg``. + +**Exporter pour Windows :** + +1. Menu **Projet → Exporter**. +2. Sélectionnez le préset **Windows Desktop**. +3. Cliquez sur **Exporter le projet** et choisissez un dossier de sortie. + +**Exporter le serveur Linux :** + +1. Menu **Projet → Exporter**. +2. Sélectionnez le préset **Linux Server**. +3. Cliquez sur **Exporter le projet**. + +.. note:: + + Pour exporter vers Linux, vous devez avoir installé le template d'export Linux dans Godot + (**Éditeur → Gérer les modèles d'exportation**). + +Style de code +------------- + +- **Typage strict** : déclarez toujours les types explicitement (``var x: int = 0``). +- **Pas de TODO** laissé dans le code soumis — ouvrez une issue à la place. +- **Nommage** : ``snake_case`` pour les variables et fonctions, ``PascalCase`` pour les classes. +- **Commentaires** : en français, concis. +- **Signals** : préfixez les signaux avec le nom du composant (``dolphin_died``, ``chunk_loaded``). + +Exemple de code conforme : + +.. code-block:: gdscript + + class_name DolphinController + extends CharacterBody3D + + @export var speed: float = 5.0 + var _oxygen: float = 1.0 + + func take_damage(amount: int) -> void: + # Réduit les PV et déclenche le signal si mort + health -= amount + if health <= 0: + emit_signal("dolphin_died") + +Soumettre une contribution +--------------------------- + +1. Créez une branche depuis ``main`` : + + .. code-block:: bash + + git checkout -b feat/ma-fonctionnalite + +2. Faites vos modifications et committez : + + .. code-block:: bash + + git add . + git commit -m "feat: description courte" + +3. Poussez votre branche : + + .. code-block:: bash + + git push origin feat/ma-fonctionnalite + +4. Ouvrez une **Pull Request** sur le Gitea de DauphinCraft. + +5. Un mainteneur relit et fusionne après validation. + +Discussion et support +---------------------- + +Rejoignez le serveur Discord communautaire et consultez le canal **#dauphincraft-dev** +pour poser vos questions, proposer des idées ou signaler des bugs. diff --git a/docs/dev/modules.rst b/docs/dev/modules.rst new file mode 100644 index 0000000..51a7024 --- /dev/null +++ b/docs/dev/modules.rst @@ -0,0 +1,129 @@ +Modules du jeu +============== + +Le code source est organisé en six modules dans ``scripts/``. + +Module Monde (``world/``) +-------------------------- + +Responsable de la génération et de la gestion du monde voxel sous-marin. + +**BlockDatabase.gd** + Registre central de tous les types de blocs (id, nom, texture, propriétés physiques). + API publique : ``get_block(id: int) -> BlockData``, ``get_id_by_name(name: String) -> int``. + +**Chunk.gd** + Représente un chunk 16×16×16 blocs. Gère son maillage 3D et son état de chargement. + API publique : ``set_block(x, y, z, id)``, ``get_block(x, y, z) -> int``, ``rebuild_mesh()``. + +**ChunkManager.gd** + Orchestre le chargement/déchargement des chunks autour du joueur (rayon configurable). + API publique : ``get_chunk(cx, cy, cz) -> Chunk``, ``request_chunk(pos: Vector3i)``. + +**WorldGenerator.gd** + Génère le contenu des chunks de façon procédurale (bruit de Perlin, biomes, structures). + API publique : ``generate_chunk(cx, cy, cz) -> Array`` (tableau de 4096 block ids). + +Module Dauphin (``dolphin/``) +------------------------------ + +Contrôle du personnage joueur et interface utilisateur associée. + +**DolphinController.gd** + Gère les entrées clavier/souris, applique la physique de nage, envoie les actions au serveur. + API publique : ``apply_input(input: Dictionary)``, ``take_damage(amount: int)``. + +**HUD.gd** + Affiche les jauges (oxygène, vie, faim), la hotbar et les notifications. + API publique : ``update_oxygen(value: float)``, ``update_health(value: float)``, + ``update_hunger(value: float)``. + +**EcholocationPulse.gd** + Crée et anime l'impulsion sphérique d'écholocation. Détecte les mobs et blocs dans le rayon. + API publique : ``emit_pulse(origin: Vector3, radius: float)``. + +Module Ambiance (``ambience/``) +-------------------------------- + +Environnement visuel et sonore sous-marin. + +**UnderwaterEnvironment.gd** + Configure le fog volumétrique, la lumière directionnelle atténuée et les effets de post-process + selon la profondeur du joueur. API publique : ``set_depth(depth: float)``. + +**AudioManager.gd** + Singleton audio. Gère les pistes de musique et les effets sonores avec transitions douces. + API publique : ``play_sfx(name: String)``, ``play_music(name: String)``, ``stop_music()``. + +**PlanktonParticles.gd** + Système de particules generant le plancton lumineux ambiant. + API publique : ``set_density(density: float)``. + +**MainMenu.gd** + Logique du menu principal (navigation, transitions de scène). + +Module Inventaire (``inventory/``) +----------------------------------- + +Gestion des ressources, recettes et interface d'inventaire. + +**Inventory.gd** + Stockage des items du joueur (tableau de slots). Synchronisé avec le serveur en multijoueur. + API publique : ``add_item(id: int, qty: int) -> bool``, ``remove_item(id: int, qty: int) -> bool``, + ``has_item(id: int, qty: int) -> bool``. + +**ItemDatabase.gd** + Registre de tous les items (id, nom, icône, stack max). + API publique : ``get_item(id: int) -> ItemData``. + +**CraftingRecipes.gd** + Définit les 5 recettes de craft et expose la logique de fabrication. + API publique : ``get_available_recipes(inventory: Inventory) -> Array``, + ``craft(recipe_id: int, inventory: Inventory) -> bool``. + +**InventoryUI.gd** + Interface graphique de l'inventaire et du panneau de crafting. + API publique : ``open()``, ``close()``, ``refresh()``. + +Module Mobs (``mobs/``) +------------------------ + +Intelligence artificielle des créatures marines. + +**FishSchool.gd** + Comportement de banc de poissons (alignment, cohesion, separation — boids simplifié). + Fuit le joueur à proximité. API publique : ``set_school_size(n: int)``. + +**Jellyfish.gd** + Déplacement oscillant aléatoire. Inflige des dégâts de contact au joueur. + API publique : ``get_damage() -> int``. + +**Shark.gd** + IA hostile : détection du joueur, poursuite, attaque, réaction à l'écholocation (fuite). + API publique : ``stun(duration: float)``. + +**MobSpawner.gd** + Gère l'apparition des mobs selon le biome et la profondeur, avec limite de population. + API publique : ``spawn_in_chunk(chunk_pos: Vector3i)``. + +Module Réseau (``net/``) +------------------------- + +Infrastructure multijoueur ENet. + +**NetworkManager.gd** + Singleton réseau. Initialise ENet, gère les connexions/déconnexions joueurs, expose les RPCs. + API publique : ``host_game(port: int)``, ``join_game(ip: String, port: int)``, + ``disconnect()``. + +**PlayerSyncComponent.gd** + Attaché à chaque ``Dolphin``. Synchronise position, rotation et état sur le réseau. + API publique : ``sync_state(state: Dictionary)``. + +**WorldSyncComponent.gd** + Synchronise les modifications de blocs entre serveur et clients. + API publique : ``broadcast_block_change(pos: Vector3i, block_id: int)``. + +**ChatManager.gd** + Gère l'envoi et la réception des messages de chat en multijoueur. + API publique : ``send_message(text: String)``, ``on_message_received(sender: String, text: String)``. diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..d86c077 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,40 @@ +DauphinCraft — Documentation +============================ + +Bienvenue dans **DauphinCraft**, un jeu voxel sous-marin multijoueur où vous incarnez un dauphin. + +Explorez les fonds marins, construisez des structures, craftez des outils et jouez avec vos amis +jusqu'à 16 joueurs simultanés. + +.. toctree:: + :maxdepth: 2 + :caption: Joueur + + joueur/installation + joueur/controles + joueur/mecaniques + joueur/craft + joueur/multijoueur + +.. toctree:: + :maxdepth: 2 + :caption: Administrateur serveur + + admin/installation_serveur + admin/configuration + admin/maintenance + +.. toctree:: + :maxdepth: 2 + :caption: Développement + + dev/architecture + dev/modules + dev/contribuer + +.. toctree:: + :maxdepth: 1 + :caption: Annexes + + credits + changelog diff --git a/docs/joueur/controles.rst b/docs/joueur/controles.rst new file mode 100644 index 0000000..371dccd --- /dev/null +++ b/docs/joueur/controles.rst @@ -0,0 +1,86 @@ +Contrôles +========= + +Toutes les touches sont configurables dans les paramètres du jeu (**Échap → Paramètres → Touches**). +Voici la configuration par défaut. + +Déplacement +----------- + ++---------------------+------------------+ +| Action | Touche par défaut| ++=====================+==================+ +| Nager en avant | W | ++---------------------+------------------+ +| Reculer | S | ++---------------------+------------------+ +| Strafe gauche | A | ++---------------------+------------------+ +| Strafe droit | D | ++---------------------+------------------+ +| Monter | Espace | ++---------------------+------------------+ +| Descendre | Shift | ++---------------------+------------------+ +| Boost de nage | Ctrl | ++---------------------+------------------+ + +.. note:: + + Le **boost** consomme de l'énergie (jauge bleue en bas à droite du HUD). Il se recharge + automatiquement au repos. + +Capacités spéciales +------------------- + ++-----------------------------+------------------+ +| Action | Touche par défaut| ++=============================+==================+ +| Écholocation | E | ++-----------------------------+------------------+ +| Activer / Désactiver la HUD | H | ++-----------------------------+------------------+ + +L'**écholocation** envoie une impulsion sonore qui révèle les blocs et mobs environnants +dans un rayon de 20 unités, même dans les zones sombres. + +Interaction avec le monde +-------------------------- + ++----------------------------+------------------+ +| Action | Touche par défaut| ++============================+==================+ +| Casser un bloc | Clic gauche | ++----------------------------+------------------+ +| Poser un bloc | Clic droit | ++----------------------------+------------------+ +| Changer de slot (hotbar) | Molette souris | ++----------------------------+------------------+ +| Ouvrir l'inventaire | Tab | ++----------------------------+------------------+ + +Interface +--------- + ++----------------------------+------------------+ +| Action | Touche par défaut| ++============================+==================+ +| Ouvrir le chat | F2 | ++----------------------------+------------------+ +| Menu pause | Échap | ++----------------------------+------------------+ + +Chat +---- + +En multijoueur, appuyez sur **F2** pour ouvrir la fenêtre de chat. Tapez votre message et +validez avec **Entrée**. Appuyez sur **Échap** pour fermer le chat sans envoyer. + +Menu pause +---------- + +Appuyez sur **Échap** pour mettre le jeu en pause. Le menu propose : + +- **Reprendre** : retour au jeu. +- **Paramètres** : audio, vidéo, contrôles. +- **Quitter** : retour au menu principal. diff --git a/docs/joueur/craft.rst b/docs/joueur/craft.rst new file mode 100644 index 0000000..bdca7fc --- /dev/null +++ b/docs/joueur/craft.rst @@ -0,0 +1,112 @@ +Crafting — Recettes +=================== + +Le système de crafting permet de transformer des ressources collectées en objets utiles. +Ouvrez l'inventaire (**Tab**), puis accédez à l'onglet **Crafting** pour voir les recettes disponibles. + +Comment crafter +--------------- + +1. Ouvrez l'inventaire avec **Tab**. +2. Sélectionnez l'onglet **Crafting**. +3. Les recettes disponibles (ingrédients présents en inventaire) s'affichent en surbrillance. +4. Cliquez sur la recette souhaitée pour fabriquer l'objet. + +Recettes disponibles +-------------------- + +Lampe bio +~~~~~~~~~ + +Éclaire une zone de 10 blocs de rayon. Indispensable dans les abysses. + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Corail Bleu | 2 | Lampe bio × 1 | ++------------------+----------+ | +| Kelp | 1 | | ++------------------+----------+----------------------+ + +Harpon +~~~~~~ + +Arme à distance. Permet d'attaquer les mobs de loin (portée 12 unités, dégâts −4 PV). + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Roche | 2 | Harpon × 1 | ++------------------+----------+ | +| Épave | 2 | | ++------------------+----------+----------------------+ + +Bulle d'air +~~~~~~~~~~~ + +Consommable d'urgence. Recharge instantanément 50 % de la jauge d'oxygène. + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Kelp | 3 | Bulle d'air × 1 | ++------------------+----------+ | +| Glace | 1 | | ++------------------+----------+----------------------+ + +.. note:: + + La **Glace** se trouve uniquement dans les zones profondes (abysses, 80 m+). + +Algue cuisinée +~~~~~~~~~~~~~~ + +Nourriture. Restaure 30 % de la jauge de faim. + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Kelp | 2 | Algue cuisinée × 2 | ++------------------+----------+----------------------+ + +.. tip:: + + Recette très accessible dès le début. La forêt de kelp est le meilleur endroit pour + farmer le Kelp. + +Armure écailles +~~~~~~~~~~~~~~~ + +Protection passive. Réduit les dégâts reçus de 25 % (toutes sources). + ++------------------+----------+----------------------+ +| Ingrédient | Quantité | Résultat | ++==================+==========+======================+ +| Corail Rouge | 4 | Armure écailles × 1 | ++------------------+----------+ | +| Épave | 2 | | ++------------------+----------+----------------------+ + +.. warning:: + + L'armure se casse après 50 impacts. Craftez-en une de rechange avant de partir + explorer les épaves ou les abysses. + +Ressources et où les trouver +---------------------------- + ++-------------------+---------------------------+ +| Ressource | Biome / Source | ++===================+===========================+ +| Corail Bleu | Récif corallien | ++-------------------+---------------------------+ +| Corail Rouge | Récif corallien | ++-------------------+---------------------------+ +| Kelp | Forêt de kelp | ++-------------------+---------------------------+ +| Roche | Épaves, fond marin | ++-------------------+---------------------------+ +| Épave | Zones d'épaves | ++-------------------+---------------------------+ +| Glace | Abysses (80 m+) | ++-------------------+---------------------------+ diff --git a/docs/joueur/installation.rst b/docs/joueur/installation.rst new file mode 100644 index 0000000..d4382b2 --- /dev/null +++ b/docs/joueur/installation.rst @@ -0,0 +1,74 @@ +Installation — Guide joueur +=========================== + +Configuration minimale requise +------------------------------- + ++--------------------+-----------------------------------------------+ +| Composant | Minimum requis | ++====================+===============================================+ +| Système | Windows 10 / Windows 11 (64 bits) | ++--------------------+-----------------------------------------------+ +| RAM | 4 Go | ++--------------------+-----------------------------------------------+ +| GPU | Compatible Vulkan 1.0 ou DirectX 12 | ++--------------------+-----------------------------------------------+ +| Stockage | 500 Mo d'espace libre | ++--------------------+-----------------------------------------------+ +| Réseau | Connexion Internet (multijoueur uniquement) | ++--------------------+-----------------------------------------------+ + +Téléchargement +-------------- + +La dernière version de DauphinCraft est disponible sur le dépôt officiel : + +.. code-block:: text + + http:///dauphincraft/releases + +Téléchargez l'archive ``DauphinCraft-v0.1.0-windows.zip`` correspondant à votre système. + +.. note:: + + Remplacez ```` par l'adresse fournie par votre administrateur ou la communauté. + +Procédure d'installation +------------------------ + +1. Décompressez l'archive ``DauphinCraft-v0.1.0-windows.zip`` dans le dossier de votre choix. +2. Ouvrez le dossier extrait. +3. Double-cliquez sur ``DauphinCraft.exe`` pour lancer le jeu. + +Aucune installation supplémentaire n'est nécessaire. Le jeu est autonome (portable). + +Dépannage antivirus +------------------- + +Windows Defender ou votre antivirus peut bloquer le lancement car l'exécutable n'est pas signé. + +**Solution :** + +1. Clic droit sur ``DauphinCraft.exe`` → **Propriétés**. +2. En bas de l'onglet *Général*, cochez **Débloquer** si la case est présente. +3. Cliquez sur **Appliquer**, puis **OK**. +4. Relancez ``DauphinCraft.exe``. + +Si votre antivirus met en quarantaine le fichier, ajoutez une exception pour le dossier +d'installation de DauphinCraft. + +.. warning:: + + Téléchargez toujours DauphinCraft depuis le dépôt officiel. Ne faites pas confiance à des + sources tierces inconnues. + +Première connexion +------------------ + +Au premier lancement, le jeu vous propose trois modes : + +- **Solo** : jouer seul en monde local. +- **Héberger** : créer une partie multijoueur sur votre machine. +- **Rejoindre** : rejoindre une partie existante avec une IP et un port. + +Voir :doc:`multijoueur` pour les détails réseau. diff --git a/docs/joueur/mecaniques.rst b/docs/joueur/mecaniques.rst new file mode 100644 index 0000000..08951c4 --- /dev/null +++ b/docs/joueur/mecaniques.rst @@ -0,0 +1,86 @@ +Mécaniques de jeu +================= + +Jauges du joueur +---------------- + +Trois jauges sont visibles en permanence dans le HUD (en bas de l'écran) : + +**Oxygène (jauge bleue)** + Représente l'air restant dans les poumons du dauphin. Elle diminue lorsque vous évoluez + sous l'eau sans remonter à la surface. À zéro, vous perdez de la vie rapidement. + Remontez à la surface pour la recharger instantanément. + +**Vie (jauge rouge)** + Points de vie du dauphin. Diminue en cas d'attaque par un mob hostile ou de manque + d'oxygène prolongé. Se régénère lentement en nageant sans contrainte, ou plus vite + en consommant de la nourriture. + +**Faim (jauge orange)** + Représente la satiété. Diminue au fil du temps et lors d'actions intenses (boost, écholocation). + Si la jauge de faim atteint zéro, la régénération de vie s'arrête. + +Gestion de l'oxygène +-------------------- + +Votre dauphin a besoin de respirer. La surface de l'eau correspond à la limite supérieure +du monde. Remontez régulièrement pour éviter de vous noyer. + +- Sous **50 % d'oxygène** : la jauge clignote doucement. +- Sous **20 % d'oxygène** : la jauge clignote rapidement et un son d'alerte retentit. +- À **0 %** : vous perdez 1 PV par seconde jusqu'à la remontée. + +.. tip:: + + Craftez une **Bulle d'air** (voir :doc:`craft`) pour obtenir une réserve d'oxygène + supplémentaire d'urgence. + +Biomes sous-marins +------------------ + +Le monde est généré de façon procédurale et comporte quatre biomes principaux : + +**Récif corallien** + Zone peu profonde (0–30 m), lumineuse, riche en coraux et poissons. Idéal pour débuter. + On y trouve du **Corail Bleu** et du **Corail Rouge**. + +**Forêt de kelp** + Zone intermédiaire (20–60 m). Grandes algues offrant une visibilité réduite. + Source principale de **Kelp** et de **Kelp_Food**. + +**Abysses** + Zone profonde (80 m et plus). Obscurité totale sans lampe bio. Ressources rares + mais mobs dangereux (Requins). + +**Épaves** + Zones ponctuelles à toutes profondeurs. Recèlent de la **Roche** et de l'**Épave** + (matériaux pour recettes avancées). Attention aux Requins patrouillant les épaves. + +Mobs +---- + +Trois types de créatures peuplent les océans de DauphinCraft : + +**Bancs de poissons (FishSchool)** + Neutres. Nagent en groupe de manière aléatoire. Source de nourriture si attaqués. + Comportement de fuite à l'approche du joueur. + +**Méduses (Jellyfish)** + Passives mais infligent des dégâts de contact si on les touche (−1 PV par contact). + Lumineuses, elles sont utiles comme repères dans les abysses. + +**Requin (Shark)** + Hostile. Attaque le joueur à vue dans un rayon de 15 unités. Inflige −3 PV par morsure. + Peut être repoussé avec une **impulsion d'écholocation** (touche E). + +Mort et respawn +--------------- + +Quand vos points de vie atteignent zéro, vous mourez. Un écran de mort s'affiche. + +- Vos blocs posés dans le monde restent en place. +- Votre inventaire est conservé. +- Vous réapparaissez au point de spawn initial (centre du monde, en surface). + +En multijoueur, les autres joueurs continuent de jouer pendant votre respawn. Le délai +de respawn est de **3 secondes**. diff --git a/docs/joueur/multijoueur.rst b/docs/joueur/multijoueur.rst new file mode 100644 index 0000000..4958618 --- /dev/null +++ b/docs/joueur/multijoueur.rst @@ -0,0 +1,78 @@ +Multijoueur +=========== + +DauphinCraft supporte jusqu'à **16 joueurs simultanés** via une architecture réseau ENet UDP. + +Modes de jeu +------------ + +**Solo** + Jouer seul en monde local. Aucune connexion réseau requise. La partie n'est pas accessible + aux autres joueurs. + +**Héberger une partie** + Lancez un serveur depuis votre propre machine. Les joueurs de votre réseau local (ou Internet + si vous configurez votre routeur) peuvent vous rejoindre. + +**Rejoindre une partie** + Entrez l'adresse IP et le port d'une partie existante pour la rejoindre. + +Port réseau +----------- + +DauphinCraft utilise le port **UDP 7777** par défaut. + +Pour héberger une partie accessible depuis Internet : + +1. Ouvrez les paramètres de votre box/routeur. +2. Créez une règle de redirection de port (NAT/PAT) : + - **Port externe** : 7777 (UDP) + - **Port interne** : 7777 (UDP) + - **IP locale cible** : l'adresse IP locale de votre machine (ex. 192.168.1.10) +3. Communiquez votre **IP publique** et le port **7777** à vos amis. + +.. tip:: + + Pour trouver votre IP publique, allez sur ``https://ifconfig.me`` dans un navigateur. + +Rejoindre une partie +-------------------- + +Dans le menu principal, choisissez **Rejoindre**, puis entrez : + +- **Adresse IP** : l'IP fournie par l'hôte (ex. ``203.0.113.42``). +- **Port** : ``7777`` (ou le port personnalisé communiqué par l'hôte). + +Cliquez sur **Connexion**. Si le serveur est disponible, vous rejoindrez la partie en quelques +secondes. + +Héberger depuis le jeu +----------------------- + +Choisissez **Héberger** dans le menu principal. Le jeu démarre un serveur intégré (écoute sur +le port 7777 UDP) tout en vous permettant de jouer simultanément. + +.. note:: + + L'hébergement intégré est pratique pour des sessions entre amis. Pour un serveur permanent + 24h/24, consultez :doc:`../admin/installation_serveur`. + +Serveur public officiel +------------------------ + +Un serveur public de démonstration est disponible à l'adresse : + +.. code-block:: text + + http://example.invalid (à remplacer lors du déploiement) + +.. warning:: + + Ce serveur est fourni à titre de démonstration. Il peut être indisponible ou réinitialisé + sans préavis. + +Limite de joueurs +----------------- + +La limite par défaut est **16 joueurs** par session. Elle peut être modifiée par l'administrateur +du serveur (voir :doc:`../admin/configuration`). diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..6596774 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,38 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %SOURCEDIR% %BUILDDIR%/html %SPHINXOPTS% + goto end +) + +if "%1" == "clean" ( + rmdir /s /q %BUILDDIR% + goto end +) + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd