From 8f7a235c93ee9c90666373c3ceadaddc1a7ff36e Mon Sep 17 00:00:00 2001 From: Siphonight Date: Sat, 5 Sep 2026 16:32:44 +0200 Subject: [PATCH] =?UTF-8?q?v1.1.0=20:=20suivi=20THS=20avec=20courbes=20E2/?= =?UTF-8?q?T,=20mod=C3=A8les=20Estrannaise=20&=20Transfem=20Science,=20cal?= =?UTF-8?q?ibration=20labs,=20rappels=20(GT=203),=20backup=20JSON,=20FR/EN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Moteur PK par tables horaires (8001 h) extraites de Estrogen.ods + Bateman fallback - Lookup profils insensible à la casse (fix courbes EEn plates) - Conversion unités T (ng/dL, ng/L, nmol/L -> ng/mL) - Édition des doses + override d'ester par injection - 30 tests unitaires dont régression sur données réelles - UI Compose Material 3, i18n FR/EN, sauvegarde JSON SAF --- .gitignore | 30 + README.md | 123 + app/build.gradle.kts | 101 + app/proguard-rules.pro | 2 + app/src/main/AndroidManifest.xml | 43 + app/src/main/assets/pk_profiles.json | 48048 ++++++++++++++++ .../java/com/hormonetrack/HormoneTrackApp.kt | 32 + .../java/com/hormonetrack/MainActivity.kt | 65 + .../java/com/hormonetrack/data/AppDatabase.kt | 42 + .../hormonetrack/data/backup/BackupManager.kt | 71 + .../com/hormonetrack/data/dao/DoseLogDao.kt | 35 + .../com/hormonetrack/data/dao/LabResultDao.kt | 29 + .../com/hormonetrack/data/dao/TreatmentDao.kt | 35 + .../com/hormonetrack/data/model/DoseLog.kt | 29 + .../com/hormonetrack/data/model/LabResult.kt | 14 + .../com/hormonetrack/data/model/PKPresets.kt | 134 + .../com/hormonetrack/data/model/Treatment.kt | 69 + .../data/repository/HormoneRepository.kt | 47 + .../com/hormonetrack/pk/PKProfileStore.kt | 106 + .../hormonetrack/pk/PharmacokineticEngine.kt | 296 + .../reminder/DoseActionReceiver.kt | 46 + .../hormonetrack/reminder/ReminderManager.kt | 222 + .../com/hormonetrack/settings/AppSettings.kt | 50 + .../com/hormonetrack/ui/HormoneTrackRoot.kt | 115 + .../hormonetrack/ui/components/CurveChart.kt | 231 + .../ui/components/DateTimeField.kt | 103 + .../hormonetrack/ui/components/DoseDialog.kt | 182 + .../hormonetrack/ui/components/LabDialog.kt | 104 + .../hormonetrack/ui/screens/ChartScreen.kt | 158 + .../hormonetrack/ui/screens/DosesScreen.kt | 181 + .../com/hormonetrack/ui/screens/HomeScreen.kt | 321 + .../com/hormonetrack/ui/screens/LabsScreen.kt | 150 + .../hormonetrack/ui/screens/SettingsScreen.kt | 347 + .../ui/screens/TreatmentEditorScreen.kt | 477 + .../ui/screens/TreatmentsScreen.kt | 158 + .../java/com/hormonetrack/ui/theme/Color.kt | 18 + .../java/com/hormonetrack/ui/theme/Theme.kt | 48 + .../java/com/hormonetrack/ui/theme/Type.kt | 15 + .../res/drawable/ic_launcher_foreground.xml | 16 + app/src/main/res/drawable/ic_notification.xml | 10 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + app/src/main/res/values-fr/strings.xml | 147 + app/src/main/res/values/colors.xml | 4 + app/src/main/res/values/strings.xml | 147 + app/src/main/res/values/themes.xml | 7 + .../data/backup/BackupGsonTest.kt | 95 + .../com/hormonetrack/pk/PKProfileStoreTest.kt | 108 + .../pk/PharmacokineticEngineTest.kt | 235 + .../hormonetrack/pk/RegressionUserCaseTest.kt | 136 + build.gradle.kts | 6 + docs/CHANGELOG.md | 45 + docs/DEVELOPPEMENT.md | 529 + docs/GUIDE_INSTALLATION.md | 109 + docs/MONTRE-GADGETBRIDGE.md | 94 + gradle.properties | 4 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 252 + gradlew.bat | 94 + settings.gradle.kts | 18 + 60 files changed, 54345 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/pk_profiles.json create mode 100644 app/src/main/java/com/hormonetrack/HormoneTrackApp.kt create mode 100644 app/src/main/java/com/hormonetrack/MainActivity.kt create mode 100644 app/src/main/java/com/hormonetrack/data/AppDatabase.kt create mode 100644 app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt create mode 100644 app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt create mode 100644 app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt create mode 100644 app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt create mode 100644 app/src/main/java/com/hormonetrack/data/model/DoseLog.kt create mode 100644 app/src/main/java/com/hormonetrack/data/model/LabResult.kt create mode 100644 app/src/main/java/com/hormonetrack/data/model/PKPresets.kt create mode 100644 app/src/main/java/com/hormonetrack/data/model/Treatment.kt create mode 100644 app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt create mode 100644 app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt create mode 100644 app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt create mode 100644 app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt create mode 100644 app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt create mode 100644 app/src/main/java/com/hormonetrack/settings/AppSettings.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/theme/Color.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/theme/Theme.kt create mode 100644 app/src/main/java/com/hormonetrack/ui/theme/Type.kt create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_notification.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/values-fr/strings.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt create mode 100644 app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt create mode 100644 app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt create mode 100644 app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt create mode 100644 build.gradle.kts create mode 100644 docs/CHANGELOG.md create mode 100644 docs/DEVELOPPEMENT.md create mode 100644 docs/GUIDE_INSTALLATION.md create mode 100644 docs/MONTRE-GADGETBRIDGE.md create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a045cac --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Gradle +.gradle/ +build/ + +# Local configuration (machine-specific, never commit) +local.properties + +# IntelliJ / Android Studio +.idea/ +*.iml +*.ipr +*.iws + +# Build outputs +app/build/ +captures/ +.externalNativeBuild/ +.cxx/ +*.apk.idsig +*.hprof + +# Kotlin / Java +.kotlin/ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..f83420a --- /dev/null +++ b/README.md @@ -0,0 +1,123 @@ +# HormoneTrack + +Suivi de thérapie hormonale (THS) sur Android, avec courbes estimées **heure par heure** +d'estradiol (E2) et de testostérone (T), calibration sur les prises de sang, rappels +affichés sur smartwatch (Huawei Watch GT 3 via Gadgetbridge ou Huawei Health) et +sauvegarde JSON. **100 % local, aucun compte, aucun serveur.** + +> **⚠️ Avertissement médical** : les courbes sont des **estimations pharmacocinétiques** +> à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes analyses de +> sang et aux consignes de ton endocrinologue. + +- **Statut** : v1.1.0 — build Android ✅, 30 tests unitaires ✅ (dont régression sur données réelles), intégration montre = notifications ✅ +- **Journal des versions** : [docs/CHANGELOG.md](docs/CHANGELOG.md) +- **Guide utilisateur** : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md) +- **Doc de développement** (architecture, maths, décisions, bugs) : [docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md) +- **Montre / Gadgetbridge** : [docs/MONTRE-GADGETBRIDGE.md](docs/MONTRE-GADGETBRIDGE.md) + +## Fonctionnalités + +- **Courbes estimées heure par heure** : E2 (pg/mL) et T (ng/mL), vue 24 h / 7 j / 30 j +- **Deux modèles PK au choix** (issus de la feuille `Estrogen.ods` de l'autrice) : + **Estrannaise (EstraNase)** et **Transfem Science**, pour les injections EV / EU / EEn +- **Modèle Bateman** paramétrable (temps au pic, demi-vie, biodisponibilité) pour gel, + patch et voie orale +- **Log des doses** avec date/heure exacte, dose en mg, **ester par injection** + (switch EV↔EU↔EEn comme dans le tableur), **éditable** (tap sur une ligne dans Doses) +- **Analyses de sang** (E2, T, PRL…) tracées sur les courbes comme points de calibration +- **Calibration** : facteur d'échelle par traitement = médiane(lab ÷ prédiction du modèle), + calculé automatiquement (« Scale factor » du `.ods`, automatisé) +- **Estimation T** empirique `T = plancher + (base − plancher) ÷ (1 + k·E2)`, calibrable + avec tes résultats T +- **Rappels quotidiens** avec actions **« Pris » / « Reporter 1 h »** dans la notification ; + les notifications remontent sur la Watch GT 3 (Gadgetbridge ou Huawei Health) +- **Sauvegarde/Restauration JSON** complète (traitements + doses + analyses + réglages T) +- **FR + EN** (langue par app, indépendante du système) + +## Démarrage rapide (build depuis les sources) + +Prérequis : JDK 17+ (Java 21 OK), Android SDK (API 34). Le wrapper télécharge Gradle 8.9. + +```bash +git clone && cd HormoneTrack +echo "sdk.dir=/chemin/vers/android-sdk" > local.properties # ou ANDROID_HOME +./gradlew assembleDebug # APK : app/build/outputs/apk/debug/app-debug.apk +./gradlew testDebugUnitTest # 24 tests (moteur PK, profils, backup) +``` + +Installation sur un téléphone : mode développeur + Débogage USB, puis Android Studio +(**Run ▶️**) ou `adb install -r app/build/outputs/apk/debug/app-debug.apk`. +Pas de Play Store : l'app est sideloadée. Détails pas-à-pas : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md). + +## Les modèles en bref + +Chaque injection contribue `dose_mg × profil(dt)` où `profil` est la réponse normalisée +(pg/mL par mg) issue des tables horaires d'Estrannaise / Transfem Science (8001 h) ; +les contributions se superposent. Pics de référence : + +| Profil | Modèle | Pic (pg/mL/mg) | Tmax | +|----------|------------------|----------------|--------| +| EV | Estrannaise | 61,1 | ~45 h | +| EU | Estrannaise | 3,4 | ~55 h (plateau long) | +| EEn | Estrannaise | 31,4 | ~152 h | +| EV | Transfem Science | 59,0 | ~51 h | +| EU | Transfem Science | 10,1 | ~198 h | +| EEn | Transfem Science | 32,0 | ~156 h | + +La calibration (facteur d'échelle par traitement, calibré par tes labs) ajuste le modèle +à ton corps, exactement comme la colonne « Scale factor » de la feuille d'origine. + +## Vie privée + +- Base de données **Room locale** sur le téléphone ; **aucune** télémétrie, aucun réseau +- Sauvegarde = fichier JSON que tu stockes où tu veux (Owncloud, etc.) +- `allowBackup=false` (données sensibles) ; verrou biométrique prévu en Phase 2 +- Compat **Gadgetbridge** (FOSS) : aucune dépendance à Huawei Health ni aux services Huawei + +## Structure du dépôt + +``` +HormoneTrack/ +├── README.md ← ce fichier +├── docs/ +│ ├── GUIDE_INSTALLATION.md guide utilisateur (téléphone + montre) +│ ├── DEVELOPPEMENT.md doc de dev complète (architecture, maths, bugs, tests) +│ └── MONTRE-GADGETBRIDGE.md montre Huawei GT 3 : options + limites +├── build.gradle.kts config Gradle racine (AGP/Kotlin/KSP épinglés) +├── settings.gradle.kts +├── gradle.properties +├── gradle/wrapper/ wrapper Gradle 8.9 (jar + properties) +├── gradlew / gradlew.bat +└── app/ + ├── build.gradle.kts dépendances (Compose, Room, DataStore, Gson…) + ├── proguard-rules.pro + └── src/ + ├── main/ + │ ├── AndroidManifest.xml + │ ├── assets/pk_profiles.json ← tables horaires (Estrannaise/TFS) + │ ├── java/com/hormonetrack/ + │ │ ├── data/ (Room : models, DAOs, repository, backup) + │ │ ├── pk/ (moteur pharmacocinétique + profils) + │ │ ├── reminder/ (alarmes exactes, notifs + actions, boot) + │ │ ├── settings/ (DataStore : TConfig, langue) + │ │ ├── ui/ (Compose : screens, components, theme) + │ │ ├── HormoneTrackApp.kt + │ │ └── MainActivity.kt + │ └── res/ (strings FR/EN, thème, icônes) + └── test/java/com/hormonetrack/ ← tests unitaires JVM + ├── pk/ (moteur + profils) + └── data/backup/ (round-trip Gson) +``` + +## Feuille de route + +- [x] v1 : courbes E2/T, log doses, labs + calibration, rappels, backup JSON, FR/EN +- [ ] Tests UI Compose + compilation release signée +- [ ] Verrou biométrique, widget, export CSV +- [ ] Phase 2 montre : watchface personnalisée et/ou mini-app Lite Wearable (voir [docs/MONTRE-GADGETBRIDGE.md](docs/MONTRE-GADGETBRIDGE.md)) + +## Licence + +À définir avant le premier push public (suggestion : GPL-3.0, cohérent avec l'écosystème +Gadgetbridge). Les modèles PK appartiennent à leurs autrices respectives +([Estrannaise](https://estrannaise.github.io/), [Transfem Science](https://transfemscience.org)). diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..c2af913 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,101 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") + id("com.google.devtools.ksp") +} + +android { + namespace = "com.hormonetrack" + compileSdk = 34 + + defaultConfig { + applicationId = "com.hormonetrack" + minSdk = 26 + targetSdk = 34 + versionCode = 2 + versionName = "1.1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + buildFeatures { + compose = true + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + // Compose BOM + val composeBom = platform("androidx.compose:compose-bom:2024.06.00") + implementation(composeBom) + + // Core + implementation("androidx.core:core-ktx:1.13.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.3") + implementation("androidx.activity:activity-compose:1.9.0") + + // Compose UI + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + implementation("androidx.compose.material:material-icons-extended") + + // Navigation + implementation("androidx.navigation:navigation-compose:2.7.7") + + // AppCompat (per-app language on API < 33) + implementation("androidx.appcompat:appcompat:1.7.0") + + // Room + implementation("androidx.room:room-runtime:2.6.1") + implementation("androidx.room:room-ktx:2.6.1") + ksp("androidx.room:room-compiler:2.6.1") + + // DataStore (preferences) + implementation("androidx.datastore:datastore-preferences:1.1.1") + + // Work Manager (for periodic tasks) + implementation("androidx.work:work-runtime-ktx:2.9.1") + + // Coroutines + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") + + // Gson for export + implementation("com.google.code.gson:gson:2.11.0") + + // Debug + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + + // Unit tests (JVM) + testImplementation("junit:junit:4.13.2") +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..3f566de --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,2 @@ +# Keep Room entities' enum fields (auto-converters use enum names via reflection in Gson backup) +-keepclassmembers enum com.hormonetrack.data.model.** { *; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ce81ee2 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/pk_profiles.json b/app/src/main/assets/pk_profiles.json new file mode 100644 index 0000000..92f2622 --- /dev/null +++ b/app/src/main/assets/pk_profiles.json @@ -0,0 +1,48048 @@ +{ + "params": { + "EV_ese_D": 478.0, + "EU_ese_D": 471.5, + "EEn_ese_D": 191.4, + "EV_tfs_D": 519.211912, + "EU_tfs_D": 13.18986748, + "EEn_tfs_D": 66.7748362, + "EV_ese_k1": 0.236, + "EU_ese_k1": 0.01729, + "EEn_ese_k1": 0.119, + "EV_tfs_k1": 2.38229125, + "EU_tfs_k1": 0.29634323, + "EEn_tfs_k1": 0.42412968, + "EV_ese_k2": 4.85, + "EU_ese_k2": 6.528, + "EEn_ese_k2": 0.601, + "EV_tfs_k2": 0.23345814, + "EU_tfs_k2": 4799337.57, + "EEn_tfs_k2": 0.4345298, + "EV_ese_k3": 1.24, + "EU_ese_k3": 2.285, + "EEn_ese_k3": 0.402, + "EV_tfs_k3": 1.37642769, + "EU_tfs_k3": 0.03141554, + "EEn_tfs_k3": 0.15291485 + }, + "profiles": { + "EV_ese": [ + 0.0, + 0.44, + 1.6, + 3.31, + 5.42, + 7.81, + 10.39, + 13.09, + 15.85, + 18.61, + 21.35, + 24.04, + 26.66, + 29.19, + 31.62, + 33.95, + 36.16, + 38.27, + 40.25, + 42.12, + 43.88, + 45.53, + 47.08, + 48.51, + 49.85, + 51.09, + 52.24, + 53.3, + 54.27, + 55.16, + 55.97, + 56.71, + 57.38, + 57.98, + 58.52, + 59.0, + 59.42, + 59.79, + 60.1, + 60.37, + 60.6, + 60.78, + 60.92, + 61.02, + 61.09, + 61.12, + 61.12, + 61.09, + 61.03, + 60.94, + 60.84, + 60.7, + 60.55, + 60.37, + 60.18, + 59.96, + 59.73, + 59.49, + 59.23, + 58.96, + 58.67, + 58.37, + 58.06, + 57.74, + 57.41, + 57.08, + 56.73, + 56.38, + 56.02, + 55.65, + 55.28, + 54.9, + 54.52, + 54.14, + 53.75, + 53.36, + 52.96, + 52.57, + 52.17, + 51.76, + 51.36, + 50.96, + 50.55, + 50.14, + 49.74, + 49.33, + 48.92, + 48.52, + 48.11, + 47.71, + 47.3, + 46.9, + 46.49, + 46.09, + 45.69, + 45.29, + 44.89, + 44.5, + 44.1, + 43.71, + 43.32, + 42.93, + 42.54, + 42.16, + 41.77, + 41.39, + 41.02, + 40.64, + 40.27, + 39.9, + 39.53, + 39.16, + 38.8, + 38.44, + 38.08, + 37.72, + 37.37, + 37.02, + 36.67, + 36.33, + 35.98, + 35.65, + 35.31, + 34.97, + 34.64, + 34.31, + 33.99, + 33.66, + 33.34, + 33.03, + 32.71, + 32.4, + 32.09, + 31.78, + 31.48, + 31.17, + 30.87, + 30.58, + 30.28, + 29.99, + 29.7, + 29.42, + 29.13, + 28.85, + 28.57, + 28.3, + 28.02, + 27.75, + 27.48, + 27.22, + 26.96, + 26.69, + 26.44, + 26.18, + 25.92, + 25.67, + 25.42, + 25.18, + 24.93, + 24.69, + 24.45, + 24.21, + 23.98, + 23.74, + 23.51, + 23.28, + 23.06, + 22.83, + 22.61, + 22.39, + 22.17, + 21.96, + 21.74, + 21.53, + 21.32, + 21.11, + 20.91, + 20.7, + 20.5, + 20.3, + 20.1, + 19.91, + 19.71, + 19.52, + 19.33, + 19.14, + 18.95, + 18.77, + 18.59, + 18.4, + 18.22, + 18.05, + 17.87, + 17.7, + 17.52, + 17.35, + 17.18, + 17.01, + 16.85, + 16.68, + 16.52, + 16.36, + 16.2, + 16.04, + 15.88, + 15.73, + 15.58, + 15.42, + 15.27, + 15.12, + 14.98, + 14.83, + 14.68, + 14.54, + 14.4, + 14.26, + 14.12, + 13.98, + 13.84, + 13.71, + 13.57, + 13.44, + 13.31, + 13.18, + 13.05, + 12.92, + 12.8, + 12.67, + 12.55, + 12.42, + 12.3, + 12.18, + 12.06, + 11.95, + 11.83, + 11.71, + 11.6, + 11.48, + 11.37, + 11.26, + 11.15, + 11.04, + 10.93, + 10.83, + 10.72, + 10.62, + 10.51, + 10.41, + 10.31, + 10.21, + 10.11, + 10.01, + 9.91, + 9.81, + 9.72, + 9.62, + 9.53, + 9.43, + 9.34, + 9.25, + 9.16, + 9.07, + 8.98, + 8.89, + 8.81, + 8.72, + 8.64, + 8.55, + 8.47, + 8.38, + 8.3, + 8.22, + 8.14, + 8.06, + 7.98, + 7.9, + 7.83, + 7.75, + 7.67, + 7.6, + 7.53, + 7.45, + 7.38, + 7.31, + 7.23, + 7.16, + 7.09, + 7.02, + 6.96, + 6.89, + 6.82, + 6.75, + 6.69, + 6.62, + 6.56, + 6.49, + 6.43, + 6.37, + 6.3, + 6.24, + 6.18, + 6.12, + 6.06, + 6.0, + 5.94, + 5.89, + 5.83, + 5.77, + 5.71, + 5.66, + 5.6, + 5.55, + 5.49, + 5.44, + 5.39, + 5.33, + 5.28, + 5.23, + 5.18, + 5.13, + 5.08, + 5.03, + 4.98, + 4.93, + 4.88, + 4.83, + 4.79, + 4.74, + 4.69, + 4.65, + 4.6, + 4.56, + 4.51, + 4.47, + 4.42, + 4.38, + 4.34, + 4.3, + 4.25, + 4.21, + 4.17, + 4.13, + 4.09, + 4.05, + 4.01, + 3.97, + 3.93, + 3.89, + 3.86, + 3.82, + 3.78, + 3.74, + 3.71, + 3.67, + 3.63, + 3.6, + 3.56, + 3.53, + 3.49, + 3.46, + 3.43, + 3.39, + 3.36, + 3.33, + 3.29, + 3.26, + 3.23, + 3.2, + 3.17, + 3.14, + 3.11, + 3.08, + 3.05, + 3.02, + 2.99, + 2.96, + 2.93, + 2.9, + 2.87, + 2.84, + 2.81, + 2.79, + 2.76, + 2.73, + 2.71, + 2.68, + 2.65, + 2.63, + 2.6, + 2.58, + 2.55, + 2.53, + 2.5, + 2.48, + 2.45, + 2.43, + 2.41, + 2.38, + 2.36, + 2.34, + 2.31, + 2.29, + 2.27, + 2.25, + 2.22, + 2.2, + 2.18, + 2.16, + 2.14, + 2.12, + 2.1, + 2.08, + 2.05, + 2.03, + 2.01, + 2.0, + 1.98, + 1.96, + 1.94, + 1.92, + 1.9, + 1.88, + 1.86, + 1.84, + 1.83, + 1.81, + 1.79, + 1.77, + 1.76, + 1.74, + 1.72, + 1.7, + 1.69, + 1.67, + 1.66, + 1.64, + 1.62, + 1.61, + 1.59, + 1.58, + 1.56, + 1.55, + 1.53, + 1.51, + 1.5, + 1.49, + 1.47, + 1.46, + 1.44, + 1.43, + 1.41, + 1.4, + 1.39, + 1.37, + 1.36, + 1.35, + 1.33, + 1.32, + 1.31, + 1.29, + 1.28, + 1.27, + 1.26, + 1.24, + 1.23, + 1.22, + 1.21, + 1.2, + 1.18, + 1.17, + 1.16, + 1.15, + 1.14, + 1.13, + 1.12, + 1.11, + 1.1, + 1.08, + 1.07, + 1.06, + 1.05, + 1.04, + 1.03, + 1.02, + 1.01, + 1.0, + 0.99, + 0.98, + 0.97, + 0.96, + 0.95, + 0.94, + 0.94, + 0.93, + 0.92, + 0.91, + 0.9, + 0.89, + 0.88, + 0.87, + 0.86, + 0.86, + 0.85, + 0.84, + 0.83, + 0.82, + 0.82, + 0.81, + 0.8, + 0.79, + 0.78, + 0.78, + 0.77, + 0.76, + 0.75, + 0.75, + 0.74, + 0.73, + 0.72, + 0.72, + 0.71, + 0.7, + 0.7, + 0.69, + 0.68, + 0.68, + 0.67, + 0.66, + 0.66, + 0.65, + 0.64, + 0.64, + 0.63, + 0.63, + 0.62, + 0.61, + 0.61, + 0.6, + 0.6, + 0.59, + 0.58, + 0.58, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.54, + 0.54, + 0.53, + 0.53, + 0.52, + 0.52, + 0.51, + 0.51, + 0.5, + 0.5, + 0.49, + 0.49, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.45, + 0.45, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EU_ese": [ + 0.0, + 0.04, + 0.15, + 0.29, + 0.46, + 0.65, + 0.84, + 1.03, + 1.22, + 1.4, + 1.57, + 1.73, + 1.88, + 2.02, + 2.15, + 2.27, + 2.38, + 2.48, + 2.58, + 2.66, + 2.74, + 2.81, + 2.87, + 2.93, + 2.98, + 3.03, + 3.07, + 3.11, + 3.15, + 3.18, + 3.21, + 3.24, + 3.26, + 3.28, + 3.3, + 3.32, + 3.33, + 3.35, + 3.36, + 3.37, + 3.38, + 3.39, + 3.4, + 3.4, + 3.41, + 3.41, + 3.42, + 3.42, + 3.42, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.44, + 3.44, + 3.44, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.42, + 3.42, + 3.42, + 3.42, + 3.42, + 3.41, + 3.41, + 3.41, + 3.41, + 3.41, + 3.4, + 3.4, + 3.4, + 3.4, + 3.4, + 3.39, + 3.39, + 3.39, + 3.39, + 3.38, + 3.38, + 3.38, + 3.38, + 3.37, + 3.37, + 3.37, + 3.37, + 3.37, + 3.36, + 3.36, + 3.36, + 3.36, + 3.35, + 3.35, + 3.35, + 3.35, + 3.34, + 3.34, + 3.34, + 3.34, + 3.33, + 3.33, + 3.33, + 3.33, + 3.32, + 3.32, + 3.32, + 3.32, + 3.32, + 3.31, + 3.31, + 3.31, + 3.31, + 3.3, + 3.3, + 3.3, + 3.3, + 3.29, + 3.29, + 3.29, + 3.29, + 3.28, + 3.28, + 3.28, + 3.28, + 3.28, + 3.27, + 3.27, + 3.27, + 3.27, + 3.26, + 3.26, + 3.26, + 3.26, + 3.25, + 3.25, + 3.25, + 3.25, + 3.24, + 3.24, + 3.24, + 3.24, + 3.24, + 3.23, + 3.23, + 3.23, + 3.23, + 3.22, + 3.22, + 3.22, + 3.22, + 3.21, + 3.21, + 3.21, + 3.21, + 3.21, + 3.2, + 3.2, + 3.2, + 3.2, + 3.19, + 3.19, + 3.19, + 3.19, + 3.18, + 3.18, + 3.18, + 3.18, + 3.18, + 3.17, + 3.17, + 3.17, + 3.17, + 3.16, + 3.16, + 3.16, + 3.16, + 3.15, + 3.15, + 3.15, + 3.15, + 3.15, + 3.14, + 3.14, + 3.14, + 3.14, + 3.13, + 3.13, + 3.13, + 3.13, + 3.13, + 3.12, + 3.12, + 3.12, + 3.12, + 3.11, + 3.11, + 3.11, + 3.11, + 3.11, + 3.1, + 3.1, + 3.1, + 3.1, + 3.09, + 3.09, + 3.09, + 3.09, + 3.09, + 3.08, + 3.08, + 3.08, + 3.08, + 3.07, + 3.07, + 3.07, + 3.07, + 3.07, + 3.06, + 3.06, + 3.06, + 3.06, + 3.05, + 3.05, + 3.05, + 3.05, + 3.05, + 3.04, + 3.04, + 3.04, + 3.04, + 3.03, + 3.03, + 3.03, + 3.03, + 3.03, + 3.02, + 3.02, + 3.02, + 3.02, + 3.01, + 3.01, + 3.01, + 3.01, + 3.01, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 2.99, + 2.99, + 2.99, + 2.99, + 2.98, + 2.98, + 2.98, + 2.98, + 2.98, + 2.97, + 2.97, + 2.97, + 2.97, + 2.97, + 2.96, + 2.96, + 2.96, + 2.96, + 2.95, + 2.95, + 2.95, + 2.95, + 2.95, + 2.94, + 2.94, + 2.94, + 2.94, + 2.94, + 2.93, + 2.93, + 2.93, + 2.93, + 2.92, + 2.92, + 2.92, + 2.92, + 2.92, + 2.91, + 2.91, + 2.91, + 2.91, + 2.91, + 2.9, + 2.9, + 2.9, + 2.9, + 2.9, + 2.89, + 2.89, + 2.89, + 2.89, + 2.89, + 2.88, + 2.88, + 2.88, + 2.88, + 2.87, + 2.87, + 2.87, + 2.87, + 2.87, + 2.86, + 2.86, + 2.86, + 2.86, + 2.86, + 2.85, + 2.85, + 2.85, + 2.85, + 2.85, + 2.84, + 2.84, + 2.84, + 2.84, + 2.84, + 2.83, + 2.83, + 2.83, + 2.83, + 2.83, + 2.82, + 2.82, + 2.82, + 2.82, + 2.82, + 2.81, + 2.81, + 2.81, + 2.81, + 2.81, + 2.8, + 2.8, + 2.8, + 2.8, + 2.8, + 2.79, + 2.79, + 2.79, + 2.79, + 2.79, + 2.78, + 2.78, + 2.78, + 2.78, + 2.78, + 2.77, + 2.77, + 2.77, + 2.77, + 2.77, + 2.76, + 2.76, + 2.76, + 2.76, + 2.76, + 2.75, + 2.75, + 2.75, + 2.75, + 2.75, + 2.74, + 2.74, + 2.74, + 2.74, + 2.74, + 2.73, + 2.73, + 2.73, + 2.73, + 2.73, + 2.72, + 2.72, + 2.72, + 2.72, + 2.72, + 2.71, + 2.71, + 2.71, + 2.71, + 2.71, + 2.7, + 2.7, + 2.7, + 2.7, + 2.7, + 2.69, + 2.69, + 2.69, + 2.69, + 2.69, + 2.68, + 2.68, + 2.68, + 2.68, + 2.68, + 2.67, + 2.67, + 2.67, + 2.67, + 2.67, + 2.67, + 2.66, + 2.66, + 2.66, + 2.66, + 2.66, + 2.65, + 2.65, + 2.65, + 2.65, + 2.65, + 2.64, + 2.64, + 2.64, + 2.64, + 2.64, + 2.63, + 2.63, + 2.63, + 2.63, + 2.63, + 2.63, + 2.62, + 2.62, + 2.62, + 2.62, + 2.62, + 2.61, + 2.61, + 2.61, + 2.61, + 2.61, + 2.6, + 2.6, + 2.6, + 2.6, + 2.6, + 2.6, + 2.59, + 2.59, + 2.59, + 2.59, + 2.59, + 2.58, + 2.58, + 2.58, + 2.58, + 2.58, + 2.57, + 2.57, + 2.57, + 2.57, + 2.57, + 2.57, + 2.56, + 2.56, + 2.56, + 2.56, + 2.56, + 2.55, + 2.55, + 2.55, + 2.55, + 2.55, + 2.55, + 2.54, + 2.54, + 2.54, + 2.54, + 2.54, + 2.53, + 2.53, + 2.53, + 2.53, + 2.53, + 2.53, + 2.52, + 2.52, + 2.52, + 2.52, + 2.52, + 2.51, + 2.51, + 2.51, + 2.51, + 2.51, + 2.51, + 2.5, + 2.5, + 2.5, + 2.5, + 2.5, + 2.49, + 2.49, + 2.49, + 2.49, + 2.49, + 2.49, + 2.48, + 2.48, + 2.48, + 2.48, + 2.48, + 2.47, + 2.47, + 2.47, + 2.47, + 2.47, + 2.47, + 2.46, + 2.46, + 2.46, + 2.46, + 2.46, + 2.46, + 2.45, + 2.45, + 2.45, + 2.45, + 2.45, + 2.44, + 2.44, + 2.44, + 2.44, + 2.44, + 2.44, + 2.43, + 2.43, + 2.43, + 2.43, + 2.43, + 2.43, + 2.42, + 2.42, + 2.42, + 2.42, + 2.42, + 2.41, + 2.41, + 2.41, + 2.41, + 2.41, + 2.41, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.39, + 2.39, + 2.39, + 2.39, + 2.39, + 2.39, + 2.38, + 2.38, + 2.38, + 2.38, + 2.38, + 2.38, + 2.37, + 2.37, + 2.37, + 2.37, + 2.37, + 2.36, + 2.36, + 2.36, + 2.36, + 2.36, + 2.36, + 2.35, + 2.35, + 2.35, + 2.35, + 2.35, + 2.35, + 2.34, + 2.34, + 2.34, + 2.34, + 2.34, + 2.34, + 2.33, + 2.33, + 2.33, + 2.33, + 2.33, + 2.33, + 2.32, + 2.32, + 2.32, + 2.32, + 2.32, + 2.32, + 2.31, + 2.31, + 2.31, + 2.31, + 2.31, + 2.31, + 2.3, + 2.3, + 2.3, + 2.3, + 2.3, + 2.3, + 2.29, + 2.29, + 2.29, + 2.29, + 2.29, + 2.29, + 2.28, + 2.28, + 2.28, + 2.28, + 2.28, + 2.28, + 2.27, + 2.27, + 2.27, + 2.27, + 2.27, + 2.27, + 2.26, + 2.26, + 2.26, + 2.26, + 2.26, + 2.26, + 2.26, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.24, + 2.24, + 2.24, + 2.24, + 2.24, + 2.24, + 2.23, + 2.23, + 2.23, + 2.23, + 2.23, + 2.23, + 2.22, + 2.22, + 2.22, + 2.22, + 2.22, + 2.22, + 2.21, + 2.21, + 2.21, + 2.21, + 2.21, + 2.21, + 2.21, + 2.2, + 2.2, + 2.2, + 2.2, + 2.2, + 2.2, + 2.19, + 2.19, + 2.19, + 2.19, + 2.19, + 2.19, + 2.18, + 2.18, + 2.18, + 2.18, + 2.18, + 2.18, + 2.18, + 2.17, + 2.17, + 2.17, + 2.17, + 2.17, + 2.17, + 2.16, + 2.16, + 2.16, + 2.16, + 2.16, + 2.16, + 2.16, + 2.15, + 2.15, + 2.15, + 2.15, + 2.15, + 2.15, + 2.14, + 2.14, + 2.14, + 2.14, + 2.14, + 2.14, + 2.13, + 2.13, + 2.13, + 2.13, + 2.13, + 2.13, + 2.13, + 2.12, + 2.12, + 2.12, + 2.12, + 2.12, + 2.12, + 2.12, + 2.11, + 2.11, + 2.11, + 2.11, + 2.11, + 2.11, + 2.1, + 2.1, + 2.1, + 2.1, + 2.1, + 2.1, + 2.1, + 2.09, + 2.09, + 2.09, + 2.09, + 2.09, + 2.09, + 2.08, + 2.08, + 2.08, + 2.08, + 2.08, + 2.08, + 2.08, + 2.07, + 2.07, + 2.07, + 2.07, + 2.07, + 2.07, + 2.07, + 2.06, + 2.06, + 2.06, + 2.06, + 2.06, + 2.06, + 2.05, + 2.05, + 2.05, + 2.05, + 2.05, + 2.05, + 2.05, + 2.04, + 2.04, + 2.04, + 2.04, + 2.04, + 2.04, + 2.04, + 2.03, + 2.03, + 2.03, + 2.03, + 2.03, + 2.03, + 2.03, + 2.02, + 2.02, + 2.02, + 2.02, + 2.02, + 2.02, + 2.02, + 2.01, + 2.01, + 2.01, + 2.01, + 2.01, + 2.01, + 2.01, + 2.0, + 2.0, + 2.0, + 2.0, + 2.0, + 2.0, + 2.0, + 1.99, + 1.99, + 1.99, + 1.99, + 1.99, + 1.99, + 1.99, + 1.98, + 1.98, + 1.98, + 1.98, + 1.98, + 1.98, + 1.98, + 1.97, + 1.97, + 1.97, + 1.97, + 1.97, + 1.97, + 1.97, + 1.96, + 1.96, + 1.96, + 1.96, + 1.96, + 1.96, + 1.96, + 1.95, + 1.95, + 1.95, + 1.95, + 1.95, + 1.95, + 1.95, + 1.94, + 1.94, + 1.94, + 1.94, + 1.94, + 1.94, + 1.94, + 1.93, + 1.93, + 1.93, + 1.93, + 1.93, + 1.93, + 1.93, + 1.92, + 1.92, + 1.92, + 1.92, + 1.92, + 1.92, + 1.92, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.9, + 1.9, + 1.9, + 1.9, + 1.9, + 1.9, + 1.9, + 1.89, + 1.89, + 1.89, + 1.89, + 1.89, + 1.89, + 1.89, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.85, + 1.85, + 1.85, + 1.85, + 1.85, + 1.85, + 1.85, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.83, + 1.83, + 1.83, + 1.83, + 1.83, + 1.83, + 1.83, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.8, + 1.8, + 1.8, + 1.8, + 1.8, + 1.8, + 1.8, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.75, + 1.75, + 1.75, + 1.75, + 1.75, + 1.75, + 1.75, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01 + ], + "EEn_ese": [ + 0.0, + 0.01, + 0.05, + 0.1, + 0.18, + 0.27, + 0.39, + 0.52, + 0.67, + 0.84, + 1.02, + 1.21, + 1.42, + 1.64, + 1.88, + 2.12, + 2.38, + 2.64, + 2.92, + 3.2, + 3.49, + 3.79, + 4.1, + 4.41, + 4.73, + 5.06, + 5.39, + 5.72, + 6.06, + 6.41, + 6.75, + 7.1, + 7.45, + 7.81, + 8.17, + 8.53, + 8.89, + 9.25, + 9.61, + 9.97, + 10.33, + 10.7, + 11.06, + 11.42, + 11.78, + 12.14, + 12.5, + 12.86, + 13.22, + 13.57, + 13.92, + 14.27, + 14.62, + 14.97, + 15.31, + 15.66, + 15.99, + 16.33, + 16.66, + 16.99, + 17.32, + 17.64, + 17.96, + 18.28, + 18.6, + 18.91, + 19.21, + 19.51, + 19.81, + 20.11, + 20.4, + 20.69, + 20.97, + 21.25, + 21.53, + 21.8, + 22.07, + 22.33, + 22.59, + 22.85, + 23.1, + 23.34, + 23.59, + 23.83, + 24.06, + 24.29, + 24.52, + 24.74, + 24.96, + 25.17, + 25.38, + 25.59, + 25.79, + 25.99, + 26.18, + 26.37, + 26.56, + 26.74, + 26.92, + 27.09, + 27.26, + 27.42, + 27.59, + 27.74, + 27.9, + 28.05, + 28.19, + 28.34, + 28.47, + 28.61, + 28.74, + 28.87, + 28.99, + 29.11, + 29.23, + 29.34, + 29.45, + 29.56, + 29.66, + 29.76, + 29.85, + 29.95, + 30.03, + 30.12, + 30.2, + 30.28, + 30.36, + 30.43, + 30.5, + 30.57, + 30.63, + 30.69, + 30.75, + 30.81, + 30.86, + 30.91, + 30.95, + 31.0, + 31.04, + 31.08, + 31.11, + 31.15, + 31.18, + 31.2, + 31.23, + 31.25, + 31.27, + 31.29, + 31.31, + 31.32, + 31.33, + 31.34, + 31.35, + 31.35, + 31.35, + 31.35, + 31.35, + 31.35, + 31.34, + 31.33, + 31.32, + 31.31, + 31.3, + 31.28, + 31.27, + 31.25, + 31.22, + 31.2, + 31.18, + 31.15, + 31.12, + 31.09, + 31.06, + 31.03, + 31.0, + 30.96, + 30.92, + 30.88, + 30.84, + 30.8, + 30.76, + 30.72, + 30.67, + 30.62, + 30.58, + 30.53, + 30.48, + 30.42, + 30.37, + 30.32, + 30.26, + 30.2, + 30.15, + 30.09, + 30.03, + 29.97, + 29.91, + 29.85, + 29.78, + 29.72, + 29.65, + 29.59, + 29.52, + 29.45, + 29.38, + 29.31, + 29.24, + 29.17, + 29.1, + 29.03, + 28.96, + 28.88, + 28.81, + 28.73, + 28.66, + 28.58, + 28.5, + 28.43, + 28.35, + 28.27, + 28.19, + 28.11, + 28.03, + 27.95, + 27.87, + 27.79, + 27.7, + 27.62, + 27.54, + 27.46, + 27.37, + 27.29, + 27.2, + 27.12, + 27.03, + 26.95, + 26.86, + 26.78, + 26.69, + 26.6, + 26.52, + 26.43, + 26.34, + 26.25, + 26.17, + 26.08, + 25.99, + 25.9, + 25.81, + 25.72, + 25.63, + 25.55, + 25.46, + 25.37, + 25.28, + 25.19, + 25.1, + 25.01, + 24.92, + 24.83, + 24.74, + 24.65, + 24.56, + 24.47, + 24.38, + 24.29, + 24.2, + 24.11, + 24.02, + 23.93, + 23.83, + 23.74, + 23.65, + 23.56, + 23.47, + 23.38, + 23.29, + 23.2, + 23.11, + 23.02, + 22.93, + 22.84, + 22.75, + 22.66, + 22.57, + 22.48, + 22.39, + 22.31, + 22.22, + 22.13, + 22.04, + 21.95, + 21.86, + 21.77, + 21.68, + 21.59, + 21.51, + 21.42, + 21.33, + 21.24, + 21.15, + 21.07, + 20.98, + 20.89, + 20.8, + 20.72, + 20.63, + 20.54, + 20.46, + 20.37, + 20.29, + 20.2, + 20.11, + 20.03, + 19.94, + 19.86, + 19.77, + 19.69, + 19.61, + 19.52, + 19.44, + 19.35, + 19.27, + 19.19, + 19.1, + 19.02, + 18.94, + 18.86, + 18.77, + 18.69, + 18.61, + 18.53, + 18.45, + 18.37, + 18.29, + 18.2, + 18.12, + 18.04, + 17.96, + 17.88, + 17.81, + 17.73, + 17.65, + 17.57, + 17.49, + 17.41, + 17.33, + 17.26, + 17.18, + 17.1, + 17.03, + 16.95, + 16.87, + 16.8, + 16.72, + 16.65, + 16.57, + 16.5, + 16.42, + 16.35, + 16.27, + 16.2, + 16.12, + 16.05, + 15.98, + 15.9, + 15.83, + 15.76, + 15.69, + 15.61, + 15.54, + 15.47, + 15.4, + 15.33, + 15.26, + 15.19, + 15.12, + 15.05, + 14.98, + 14.91, + 14.84, + 14.77, + 14.7, + 14.64, + 14.57, + 14.5, + 14.43, + 14.37, + 14.3, + 14.23, + 14.17, + 14.1, + 14.03, + 13.97, + 13.9, + 13.84, + 13.77, + 13.71, + 13.64, + 13.58, + 13.52, + 13.45, + 13.39, + 13.33, + 13.26, + 13.2, + 13.14, + 13.08, + 13.02, + 12.95, + 12.89, + 12.83, + 12.77, + 12.71, + 12.65, + 12.59, + 12.53, + 12.47, + 12.41, + 12.35, + 12.3, + 12.24, + 12.18, + 12.12, + 12.06, + 12.01, + 11.95, + 11.89, + 11.84, + 11.78, + 11.72, + 11.67, + 11.61, + 11.56, + 11.5, + 11.45, + 11.39, + 11.34, + 11.28, + 11.23, + 11.17, + 11.12, + 11.07, + 11.01, + 10.96, + 10.91, + 10.86, + 10.8, + 10.75, + 10.7, + 10.65, + 10.6, + 10.55, + 10.5, + 10.45, + 10.4, + 10.35, + 10.3, + 10.25, + 10.2, + 10.15, + 10.1, + 10.05, + 10.0, + 9.95, + 9.91, + 9.86, + 9.81, + 9.76, + 9.72, + 9.67, + 9.62, + 9.58, + 9.53, + 9.48, + 9.44, + 9.39, + 9.35, + 9.3, + 9.26, + 9.21, + 9.17, + 9.12, + 9.08, + 9.03, + 8.99, + 8.95, + 8.9, + 8.86, + 8.82, + 8.77, + 8.73, + 8.69, + 8.65, + 8.6, + 8.56, + 8.52, + 8.48, + 8.44, + 8.4, + 8.36, + 8.31, + 8.27, + 8.23, + 8.19, + 8.15, + 8.11, + 8.07, + 8.04, + 8.0, + 7.96, + 7.92, + 7.88, + 7.84, + 7.8, + 7.76, + 7.73, + 7.69, + 7.65, + 7.61, + 7.58, + 7.54, + 7.5, + 7.47, + 7.43, + 7.39, + 7.36, + 7.32, + 7.29, + 7.25, + 7.21, + 7.18, + 7.14, + 7.11, + 7.07, + 7.04, + 7.01, + 6.97, + 6.94, + 6.9, + 6.87, + 6.84, + 6.8, + 6.77, + 6.74, + 6.7, + 6.67, + 6.64, + 6.6, + 6.57, + 6.54, + 6.51, + 6.48, + 6.44, + 6.41, + 6.38, + 6.35, + 6.32, + 6.29, + 6.26, + 6.23, + 6.2, + 6.17, + 6.13, + 6.1, + 6.07, + 6.04, + 6.02, + 5.99, + 5.96, + 5.93, + 5.9, + 5.87, + 5.84, + 5.81, + 5.78, + 5.75, + 5.73, + 5.7, + 5.67, + 5.64, + 5.61, + 5.59, + 5.56, + 5.53, + 5.5, + 5.48, + 5.45, + 5.42, + 5.4, + 5.37, + 5.34, + 5.32, + 5.29, + 5.27, + 5.24, + 5.21, + 5.19, + 5.16, + 5.14, + 5.11, + 5.09, + 5.06, + 5.04, + 5.01, + 4.99, + 4.96, + 4.94, + 4.91, + 4.89, + 4.87, + 4.84, + 4.82, + 4.79, + 4.77, + 4.75, + 4.72, + 4.7, + 4.68, + 4.65, + 4.63, + 4.61, + 4.59, + 4.56, + 4.54, + 4.52, + 4.5, + 4.47, + 4.45, + 4.43, + 4.41, + 4.39, + 4.37, + 4.34, + 4.32, + 4.3, + 4.28, + 4.26, + 4.24, + 4.22, + 4.2, + 4.18, + 4.15, + 4.13, + 4.11, + 4.09, + 4.07, + 4.05, + 4.03, + 4.01, + 3.99, + 3.97, + 3.95, + 3.93, + 3.92, + 3.9, + 3.88, + 3.86, + 3.84, + 3.82, + 3.8, + 3.78, + 3.76, + 3.74, + 3.73, + 3.71, + 3.69, + 3.67, + 3.65, + 3.64, + 3.62, + 3.6, + 3.58, + 3.56, + 3.55, + 3.53, + 3.51, + 3.49, + 3.48, + 3.46, + 3.44, + 3.43, + 3.41, + 3.39, + 3.38, + 3.36, + 3.34, + 3.33, + 3.31, + 3.29, + 3.28, + 3.26, + 3.24, + 3.23, + 3.21, + 3.2, + 3.18, + 3.16, + 3.15, + 3.13, + 3.12, + 3.1, + 3.09, + 3.07, + 3.06, + 3.04, + 3.03, + 3.01, + 3.0, + 2.98, + 2.97, + 2.95, + 2.94, + 2.92, + 2.91, + 2.89, + 2.88, + 2.87, + 2.85, + 2.84, + 2.82, + 2.81, + 2.8, + 2.78, + 2.77, + 2.76, + 2.74, + 2.73, + 2.71, + 2.7, + 2.69, + 2.67, + 2.66, + 2.65, + 2.63, + 2.62, + 2.61, + 2.6, + 2.58, + 2.57, + 2.56, + 2.55, + 2.53, + 2.52, + 2.51, + 2.5, + 2.48, + 2.47, + 2.46, + 2.45, + 2.43, + 2.42, + 2.41, + 2.4, + 2.39, + 2.37, + 2.36, + 2.35, + 2.34, + 2.33, + 2.32, + 2.31, + 2.29, + 2.28, + 2.27, + 2.26, + 2.25, + 2.24, + 2.23, + 2.22, + 2.2, + 2.19, + 2.18, + 2.17, + 2.16, + 2.15, + 2.14, + 2.13, + 2.12, + 2.11, + 2.1, + 2.09, + 2.08, + 2.07, + 2.06, + 2.05, + 2.04, + 2.03, + 2.02, + 2.01, + 2.0, + 1.99, + 1.98, + 1.97, + 1.96, + 1.95, + 1.94, + 1.93, + 1.92, + 1.91, + 1.9, + 1.89, + 1.88, + 1.87, + 1.86, + 1.85, + 1.84, + 1.84, + 1.83, + 1.82, + 1.81, + 1.8, + 1.79, + 1.78, + 1.77, + 1.76, + 1.76, + 1.75, + 1.74, + 1.73, + 1.72, + 1.71, + 1.7, + 1.7, + 1.69, + 1.68, + 1.67, + 1.66, + 1.65, + 1.65, + 1.64, + 1.63, + 1.62, + 1.61, + 1.61, + 1.6, + 1.59, + 1.58, + 1.57, + 1.57, + 1.56, + 1.55, + 1.54, + 1.54, + 1.53, + 1.52, + 1.51, + 1.51, + 1.5, + 1.49, + 1.48, + 1.48, + 1.47, + 1.46, + 1.45, + 1.45, + 1.44, + 1.43, + 1.43, + 1.42, + 1.41, + 1.4, + 1.4, + 1.39, + 1.38, + 1.38, + 1.37, + 1.36, + 1.36, + 1.35, + 1.34, + 1.34, + 1.33, + 1.32, + 1.32, + 1.31, + 1.3, + 1.3, + 1.29, + 1.28, + 1.28, + 1.27, + 1.27, + 1.26, + 1.25, + 1.25, + 1.24, + 1.23, + 1.23, + 1.22, + 1.22, + 1.21, + 1.2, + 1.2, + 1.19, + 1.19, + 1.18, + 1.17, + 1.17, + 1.16, + 1.16, + 1.15, + 1.15, + 1.14, + 1.13, + 1.13, + 1.12, + 1.12, + 1.11, + 1.11, + 1.1, + 1.1, + 1.09, + 1.09, + 1.08, + 1.07, + 1.07, + 1.06, + 1.06, + 1.05, + 1.05, + 1.04, + 1.04, + 1.03, + 1.03, + 1.02, + 1.02, + 1.01, + 1.01, + 1.0, + 1.0, + 0.99, + 0.99, + 0.98, + 0.98, + 0.97, + 0.97, + 0.96, + 0.96, + 0.95, + 0.95, + 0.94, + 0.94, + 0.94, + 0.93, + 0.93, + 0.92, + 0.92, + 0.91, + 0.91, + 0.9, + 0.9, + 0.89, + 0.89, + 0.89, + 0.88, + 0.88, + 0.87, + 0.87, + 0.86, + 0.86, + 0.86, + 0.85, + 0.85, + 0.84, + 0.84, + 0.83, + 0.83, + 0.83, + 0.82, + 0.82, + 0.81, + 0.81, + 0.81, + 0.8, + 0.8, + 0.79, + 0.79, + 0.79, + 0.78, + 0.78, + 0.77, + 0.77, + 0.77, + 0.76, + 0.76, + 0.76, + 0.75, + 0.75, + 0.74, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.72, + 0.71, + 0.71, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EV_tfs": [ + 0.0, + 0.24, + 0.9, + 1.91, + 3.22, + 4.77, + 6.51, + 8.4, + 10.41, + 12.5, + 14.64, + 16.82, + 19.01, + 21.2, + 23.36, + 25.49, + 27.59, + 29.62, + 31.61, + 33.52, + 35.37, + 37.14, + 38.84, + 40.47, + 42.01, + 43.48, + 44.87, + 46.18, + 47.42, + 48.58, + 49.66, + 50.68, + 51.62, + 52.49, + 53.3, + 54.04, + 54.72, + 55.34, + 55.9, + 56.41, + 56.86, + 57.27, + 57.62, + 57.93, + 58.19, + 58.41, + 58.59, + 58.73, + 58.84, + 58.91, + 58.95, + 58.96, + 58.93, + 58.89, + 58.81, + 58.71, + 58.59, + 58.44, + 58.28, + 58.09, + 57.89, + 57.67, + 57.44, + 57.19, + 56.92, + 56.65, + 56.36, + 56.06, + 55.75, + 55.43, + 55.1, + 54.77, + 54.43, + 54.08, + 53.72, + 53.36, + 52.99, + 52.62, + 52.25, + 51.87, + 51.49, + 51.1, + 50.71, + 50.33, + 49.93, + 49.54, + 49.15, + 48.75, + 48.36, + 47.96, + 47.57, + 47.17, + 46.78, + 46.38, + 45.99, + 45.59, + 45.2, + 44.81, + 44.42, + 44.03, + 43.64, + 43.26, + 42.87, + 42.49, + 42.11, + 41.73, + 41.36, + 40.98, + 40.61, + 40.24, + 39.87, + 39.51, + 39.15, + 38.79, + 38.43, + 38.07, + 37.72, + 37.37, + 37.02, + 36.68, + 36.33, + 35.99, + 35.66, + 35.32, + 34.99, + 34.66, + 34.33, + 34.01, + 33.69, + 33.37, + 33.05, + 32.74, + 32.43, + 32.12, + 31.82, + 31.51, + 31.21, + 30.92, + 30.62, + 30.33, + 30.04, + 29.75, + 29.47, + 29.19, + 28.91, + 28.63, + 28.36, + 28.08, + 27.81, + 27.55, + 27.28, + 27.02, + 26.76, + 26.5, + 26.25, + 26.0, + 25.75, + 25.5, + 25.25, + 25.01, + 24.77, + 24.53, + 24.3, + 24.06, + 23.83, + 23.6, + 23.37, + 23.15, + 22.92, + 22.7, + 22.48, + 22.27, + 22.05, + 21.84, + 21.63, + 21.42, + 21.21, + 21.01, + 20.8, + 20.6, + 20.4, + 20.21, + 20.01, + 19.82, + 19.63, + 19.44, + 19.25, + 19.06, + 18.88, + 18.7, + 18.52, + 18.34, + 18.16, + 17.98, + 17.81, + 17.64, + 17.47, + 17.3, + 17.13, + 16.96, + 16.8, + 16.64, + 16.48, + 16.32, + 16.16, + 16.0, + 15.85, + 15.7, + 15.54, + 15.39, + 15.24, + 15.1, + 14.95, + 14.81, + 14.66, + 14.52, + 14.38, + 14.24, + 14.1, + 13.97, + 13.83, + 13.7, + 13.57, + 13.43, + 13.3, + 13.18, + 13.05, + 12.92, + 12.8, + 12.67, + 12.55, + 12.43, + 12.31, + 12.19, + 12.07, + 11.95, + 11.84, + 11.72, + 11.61, + 11.5, + 11.39, + 11.28, + 11.17, + 11.06, + 10.95, + 10.85, + 10.74, + 10.64, + 10.53, + 10.43, + 10.33, + 10.23, + 10.13, + 10.03, + 9.94, + 9.84, + 9.75, + 9.65, + 9.56, + 9.47, + 9.37, + 9.28, + 9.19, + 9.1, + 9.02, + 8.93, + 8.84, + 8.76, + 8.67, + 8.59, + 8.51, + 8.42, + 8.34, + 8.26, + 8.18, + 8.1, + 8.02, + 7.95, + 7.87, + 7.79, + 7.72, + 7.64, + 7.57, + 7.49, + 7.42, + 7.35, + 7.28, + 7.21, + 7.14, + 7.07, + 7.0, + 6.93, + 6.87, + 6.8, + 6.73, + 6.67, + 6.6, + 6.54, + 6.48, + 6.41, + 6.35, + 6.29, + 6.23, + 6.17, + 6.11, + 6.05, + 5.99, + 5.93, + 5.88, + 5.82, + 5.76, + 5.71, + 5.65, + 5.6, + 5.54, + 5.49, + 5.44, + 5.38, + 5.33, + 5.28, + 5.23, + 5.18, + 5.13, + 5.08, + 5.03, + 4.98, + 4.93, + 4.89, + 4.84, + 4.79, + 4.74, + 4.7, + 4.65, + 4.61, + 4.56, + 4.52, + 4.48, + 4.43, + 4.39, + 4.35, + 4.3, + 4.26, + 4.22, + 4.18, + 4.14, + 4.1, + 4.06, + 4.02, + 3.98, + 3.94, + 3.91, + 3.87, + 3.83, + 3.79, + 3.76, + 3.72, + 3.68, + 3.65, + 3.61, + 3.58, + 3.54, + 3.51, + 3.48, + 3.44, + 3.41, + 3.38, + 3.34, + 3.31, + 3.28, + 3.25, + 3.22, + 3.18, + 3.15, + 3.12, + 3.09, + 3.06, + 3.03, + 3.0, + 2.97, + 2.95, + 2.92, + 2.89, + 2.86, + 2.83, + 2.81, + 2.78, + 2.75, + 2.73, + 2.7, + 2.67, + 2.65, + 2.62, + 2.6, + 2.57, + 2.55, + 2.52, + 2.5, + 2.47, + 2.45, + 2.42, + 2.4, + 2.38, + 2.36, + 2.33, + 2.31, + 2.29, + 2.27, + 2.24, + 2.22, + 2.2, + 2.18, + 2.16, + 2.14, + 2.12, + 2.1, + 2.08, + 2.06, + 2.04, + 2.02, + 2.0, + 1.98, + 1.96, + 1.94, + 1.92, + 1.9, + 1.88, + 1.86, + 1.85, + 1.83, + 1.81, + 1.79, + 1.78, + 1.76, + 1.74, + 1.73, + 1.71, + 1.69, + 1.68, + 1.66, + 1.64, + 1.63, + 1.61, + 1.6, + 1.58, + 1.57, + 1.55, + 1.54, + 1.52, + 1.51, + 1.49, + 1.48, + 1.46, + 1.45, + 1.43, + 1.42, + 1.41, + 1.39, + 1.38, + 1.37, + 1.35, + 1.34, + 1.33, + 1.31, + 1.3, + 1.29, + 1.28, + 1.26, + 1.25, + 1.24, + 1.23, + 1.22, + 1.2, + 1.19, + 1.18, + 1.17, + 1.16, + 1.15, + 1.14, + 1.12, + 1.11, + 1.1, + 1.09, + 1.08, + 1.07, + 1.06, + 1.05, + 1.04, + 1.03, + 1.02, + 1.01, + 1.0, + 0.99, + 0.98, + 0.97, + 0.96, + 0.95, + 0.94, + 0.93, + 0.93, + 0.92, + 0.91, + 0.9, + 0.89, + 0.88, + 0.87, + 0.86, + 0.86, + 0.85, + 0.84, + 0.83, + 0.82, + 0.82, + 0.81, + 0.8, + 0.79, + 0.78, + 0.78, + 0.77, + 0.76, + 0.75, + 0.75, + 0.74, + 0.73, + 0.73, + 0.72, + 0.71, + 0.71, + 0.7, + 0.69, + 0.68, + 0.68, + 0.67, + 0.67, + 0.66, + 0.65, + 0.65, + 0.64, + 0.63, + 0.63, + 0.62, + 0.62, + 0.61, + 0.6, + 0.6, + 0.59, + 0.59, + 0.58, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.55, + 0.54, + 0.54, + 0.53, + 0.53, + 0.52, + 0.52, + 0.51, + 0.51, + 0.5, + 0.5, + 0.49, + 0.49, + 0.48, + 0.48, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EU_tfs": [ + 0.0, + 0.16, + 0.32, + 0.48, + 0.63, + 0.79, + 0.94, + 1.09, + 1.23, + 1.38, + 1.52, + 1.66, + 1.8, + 1.94, + 2.07, + 2.21, + 2.34, + 2.47, + 2.6, + 2.72, + 2.85, + 2.97, + 3.09, + 3.21, + 3.33, + 3.44, + 3.56, + 3.67, + 3.78, + 3.89, + 4.0, + 4.11, + 4.21, + 4.31, + 4.42, + 4.52, + 4.62, + 4.71, + 4.81, + 4.9, + 5.0, + 5.09, + 5.18, + 5.27, + 5.36, + 5.45, + 5.53, + 5.62, + 5.7, + 5.78, + 5.86, + 5.94, + 6.02, + 6.1, + 6.17, + 6.25, + 6.32, + 6.39, + 6.47, + 6.54, + 6.61, + 6.67, + 6.74, + 6.81, + 6.87, + 6.94, + 7.0, + 7.06, + 7.13, + 7.19, + 7.25, + 7.3, + 7.36, + 7.42, + 7.48, + 7.53, + 7.58, + 7.64, + 7.69, + 7.74, + 7.79, + 7.84, + 7.89, + 7.94, + 7.99, + 8.04, + 8.08, + 8.13, + 8.17, + 8.22, + 8.26, + 8.3, + 8.34, + 8.38, + 8.42, + 8.46, + 8.5, + 8.54, + 8.58, + 8.62, + 8.65, + 8.69, + 8.72, + 8.76, + 8.79, + 8.82, + 8.86, + 8.89, + 8.92, + 8.95, + 8.98, + 9.01, + 9.04, + 9.07, + 9.1, + 9.13, + 9.15, + 9.18, + 9.21, + 9.23, + 9.26, + 9.28, + 9.31, + 9.33, + 9.35, + 9.37, + 9.4, + 9.42, + 9.44, + 9.46, + 9.48, + 9.5, + 9.52, + 9.54, + 9.56, + 9.58, + 9.6, + 9.61, + 9.63, + 9.65, + 9.66, + 9.68, + 9.7, + 9.71, + 9.73, + 9.74, + 9.76, + 9.77, + 9.78, + 9.8, + 9.81, + 9.82, + 9.83, + 9.85, + 9.86, + 9.87, + 9.88, + 9.89, + 9.9, + 9.91, + 9.92, + 9.93, + 9.94, + 9.95, + 9.96, + 9.96, + 9.97, + 9.98, + 9.99, + 10.0, + 10.0, + 10.01, + 10.02, + 10.02, + 10.03, + 10.03, + 10.04, + 10.04, + 10.05, + 10.05, + 10.06, + 10.06, + 10.07, + 10.07, + 10.07, + 10.08, + 10.08, + 10.08, + 10.09, + 10.09, + 10.09, + 10.09, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.09, + 10.09, + 10.09, + 10.09, + 10.08, + 10.08, + 10.08, + 10.08, + 10.07, + 10.07, + 10.07, + 10.06, + 10.06, + 10.06, + 10.05, + 10.05, + 10.04, + 10.04, + 10.04, + 10.03, + 10.03, + 10.02, + 10.02, + 10.01, + 10.01, + 10.0, + 10.0, + 9.99, + 9.99, + 9.98, + 9.98, + 9.97, + 9.97, + 9.96, + 9.96, + 9.95, + 9.95, + 9.94, + 9.93, + 9.93, + 9.92, + 9.92, + 9.91, + 9.9, + 9.9, + 9.89, + 9.88, + 9.88, + 9.87, + 9.86, + 9.86, + 9.85, + 9.84, + 9.84, + 9.83, + 9.82, + 9.81, + 9.81, + 9.8, + 9.79, + 9.78, + 9.78, + 9.77, + 9.76, + 9.75, + 9.75, + 9.74, + 9.73, + 9.72, + 9.71, + 9.71, + 9.7, + 9.69, + 9.68, + 9.67, + 9.67, + 9.66, + 9.65, + 9.64, + 9.63, + 9.62, + 9.62, + 9.61, + 9.6, + 9.59, + 9.58, + 9.57, + 9.56, + 9.56, + 9.55, + 9.54, + 9.53, + 9.52, + 9.51, + 9.5, + 9.49, + 9.48, + 9.48, + 9.47, + 9.46, + 9.45, + 9.44, + 9.43, + 9.42, + 9.41, + 9.4, + 9.39, + 9.38, + 9.37, + 9.37, + 9.36, + 9.35, + 9.34, + 9.33, + 9.32, + 9.31, + 9.3, + 9.29, + 9.28, + 9.27, + 9.26, + 9.25, + 9.24, + 9.23, + 9.22, + 9.21, + 9.2, + 9.19, + 9.18, + 9.17, + 9.16, + 9.15, + 9.15, + 9.14, + 9.13, + 9.12, + 9.11, + 9.1, + 9.09, + 9.08, + 9.07, + 9.06, + 9.05, + 9.04, + 9.03, + 9.02, + 9.01, + 9.0, + 8.99, + 8.98, + 8.97, + 8.96, + 8.95, + 8.94, + 8.93, + 8.92, + 8.91, + 8.9, + 8.89, + 8.88, + 8.87, + 8.86, + 8.85, + 8.84, + 8.83, + 8.82, + 8.81, + 8.8, + 8.79, + 8.78, + 8.77, + 8.76, + 8.75, + 8.74, + 8.73, + 8.72, + 8.71, + 8.7, + 8.69, + 8.67, + 8.66, + 8.65, + 8.64, + 8.63, + 8.62, + 8.61, + 8.6, + 8.59, + 8.58, + 8.57, + 8.56, + 8.55, + 8.54, + 8.53, + 8.52, + 8.51, + 8.5, + 8.49, + 8.48, + 8.47, + 8.46, + 8.45, + 8.44, + 8.43, + 8.42, + 8.41, + 8.4, + 8.39, + 8.38, + 8.37, + 8.36, + 8.35, + 8.34, + 8.33, + 8.32, + 8.31, + 8.3, + 8.29, + 8.28, + 8.27, + 8.26, + 8.25, + 8.24, + 8.23, + 8.22, + 8.21, + 8.2, + 8.19, + 8.18, + 8.17, + 8.16, + 8.15, + 8.14, + 8.13, + 8.12, + 8.11, + 8.1, + 8.09, + 8.08, + 8.07, + 8.06, + 8.05, + 8.04, + 8.03, + 8.02, + 8.01, + 8.0, + 7.99, + 7.98, + 7.97, + 7.96, + 7.95, + 7.94, + 7.93, + 7.92, + 7.91, + 7.9, + 7.89, + 7.88, + 7.87, + 7.86, + 7.85, + 7.84, + 7.83, + 7.82, + 7.81, + 7.8, + 7.79, + 7.78, + 7.77, + 7.76, + 7.75, + 7.74, + 7.73, + 7.72, + 7.71, + 7.7, + 7.7, + 7.69, + 7.68, + 7.67, + 7.66, + 7.65, + 7.64, + 7.63, + 7.62, + 7.61, + 7.6, + 7.59, + 7.58, + 7.57, + 7.56, + 7.55, + 7.54, + 7.53, + 7.52, + 7.51, + 7.5, + 7.49, + 7.48, + 7.47, + 7.46, + 7.46, + 7.45, + 7.44, + 7.43, + 7.42, + 7.41, + 7.4, + 7.39, + 7.38, + 7.37, + 7.36, + 7.35, + 7.34, + 7.33, + 7.32, + 7.31, + 7.3, + 7.3, + 7.29, + 7.28, + 7.27, + 7.26, + 7.25, + 7.24, + 7.23, + 7.22, + 7.21, + 7.2, + 7.19, + 7.18, + 7.17, + 7.17, + 7.16, + 7.15, + 7.14, + 7.13, + 7.12, + 7.11, + 7.1, + 7.09, + 7.08, + 7.07, + 7.06, + 7.06, + 7.05, + 7.04, + 7.03, + 7.02, + 7.01, + 7.0, + 6.99, + 6.98, + 6.97, + 6.97, + 6.96, + 6.95, + 6.94, + 6.93, + 6.92, + 6.91, + 6.9, + 6.89, + 6.89, + 6.88, + 6.87, + 6.86, + 6.85, + 6.84, + 6.83, + 6.82, + 6.81, + 6.81, + 6.8, + 6.79, + 6.78, + 6.77, + 6.76, + 6.75, + 6.74, + 6.74, + 6.73, + 6.72, + 6.71, + 6.7, + 6.69, + 6.68, + 6.67, + 6.67, + 6.66, + 6.65, + 6.64, + 6.63, + 6.62, + 6.61, + 6.61, + 6.6, + 6.59, + 6.58, + 6.57, + 6.56, + 6.55, + 6.55, + 6.54, + 6.53, + 6.52, + 6.51, + 6.5, + 6.5, + 6.49, + 6.48, + 6.47, + 6.46, + 6.45, + 6.44, + 6.44, + 6.43, + 6.42, + 6.41, + 6.4, + 6.39, + 6.39, + 6.38, + 6.37, + 6.36, + 6.35, + 6.35, + 6.34, + 6.33, + 6.32, + 6.31, + 6.3, + 6.3, + 6.29, + 6.28, + 6.27, + 6.26, + 6.26, + 6.25, + 6.24, + 6.23, + 6.22, + 6.21, + 6.21, + 6.2, + 6.19, + 6.18, + 6.17, + 6.17, + 6.16, + 6.15, + 6.14, + 6.13, + 6.13, + 6.12, + 6.11, + 6.1, + 6.09, + 6.09, + 6.08, + 6.07, + 6.06, + 6.05, + 6.05, + 6.04, + 6.03, + 6.02, + 6.02, + 6.01, + 6.0, + 5.99, + 5.98, + 5.98, + 5.97, + 5.96, + 5.95, + 5.95, + 5.94, + 5.93, + 5.92, + 5.91, + 5.91, + 5.9, + 5.89, + 5.88, + 5.88, + 5.87, + 5.86, + 5.85, + 5.85, + 5.84, + 5.83, + 5.82, + 5.81, + 5.81, + 5.8, + 5.79, + 5.78, + 5.78, + 5.77, + 5.76, + 5.75, + 5.75, + 5.74, + 5.73, + 5.72, + 5.72, + 5.71, + 5.7, + 5.69, + 5.69, + 5.68, + 5.67, + 5.67, + 5.66, + 5.65, + 5.64, + 5.64, + 5.63, + 5.62, + 5.61, + 5.61, + 5.6, + 5.59, + 5.58, + 5.58, + 5.57, + 5.56, + 5.56, + 5.55, + 5.54, + 5.53, + 5.53, + 5.52, + 5.51, + 5.5, + 5.5, + 5.49, + 5.48, + 5.48, + 5.47, + 5.46, + 5.45, + 5.45, + 5.44, + 5.43, + 5.43, + 5.42, + 5.41, + 5.4, + 5.4, + 5.39, + 5.38, + 5.38, + 5.37, + 5.36, + 5.36, + 5.35, + 5.34, + 5.33, + 5.33, + 5.32, + 5.31, + 5.31, + 5.3, + 5.29, + 5.29, + 5.28, + 5.27, + 5.27, + 5.26, + 5.25, + 5.24, + 5.24, + 5.23, + 5.22, + 5.22, + 5.21, + 5.2, + 5.2, + 5.19, + 5.18, + 5.18, + 5.17, + 5.16, + 5.16, + 5.15, + 5.14, + 5.14, + 5.13, + 5.12, + 5.12, + 5.11, + 5.1, + 5.1, + 5.09, + 5.08, + 5.08, + 5.07, + 5.06, + 5.06, + 5.05, + 5.04, + 5.04, + 5.03, + 5.02, + 5.02, + 5.01, + 5.0, + 5.0, + 4.99, + 4.98, + 4.98, + 4.97, + 4.96, + 4.96, + 4.95, + 4.95, + 4.94, + 4.93, + 4.93, + 4.92, + 4.91, + 4.91, + 4.9, + 4.89, + 4.89, + 4.88, + 4.87, + 4.87, + 4.86, + 4.86, + 4.85, + 4.84, + 4.84, + 4.83, + 4.82, + 4.82, + 4.81, + 4.8, + 4.8, + 4.79, + 4.79, + 4.78, + 4.77, + 4.77, + 4.76, + 4.75, + 4.75, + 4.74, + 4.74, + 4.73, + 4.72, + 4.72, + 4.71, + 4.71, + 4.7, + 4.69, + 4.69, + 4.68, + 4.67, + 4.67, + 4.66, + 4.66, + 4.65, + 4.64, + 4.64, + 4.63, + 4.63, + 4.62, + 4.61, + 4.61, + 4.6, + 4.6, + 4.59, + 4.58, + 4.58, + 4.57, + 4.57, + 4.56, + 4.55, + 4.55, + 4.54, + 4.54, + 4.53, + 4.52, + 4.52, + 4.51, + 4.51, + 4.5, + 4.49, + 4.49, + 4.48, + 4.48, + 4.47, + 4.47, + 4.46, + 4.45, + 4.45, + 4.44, + 4.44, + 4.43, + 4.42, + 4.42, + 4.41, + 4.41, + 4.4, + 4.4, + 4.39, + 4.38, + 4.38, + 4.37, + 4.37, + 4.36, + 4.36, + 4.35, + 4.34, + 4.34, + 4.33, + 4.33, + 4.32, + 4.32, + 4.31, + 4.3, + 4.3, + 4.29, + 4.29, + 4.28, + 4.28, + 4.27, + 4.27, + 4.26, + 4.25, + 4.25, + 4.24, + 4.24, + 4.23, + 4.23, + 4.22, + 4.22, + 4.21, + 4.2, + 4.2, + 4.19, + 4.19, + 4.18, + 4.18, + 4.17, + 4.17, + 4.16, + 4.16, + 4.15, + 4.14, + 4.14, + 4.13, + 4.13, + 4.12, + 4.12, + 4.11, + 4.11, + 4.1, + 4.1, + 4.09, + 4.09, + 4.08, + 4.07, + 4.07, + 4.06, + 4.06, + 4.05, + 4.05, + 4.04, + 4.04, + 4.03, + 4.03, + 4.02, + 4.02, + 4.01, + 4.01, + 4.0, + 4.0, + 3.99, + 3.98, + 3.98, + 3.97, + 3.97, + 3.96, + 3.96, + 3.95, + 3.95, + 3.94, + 3.94, + 3.93, + 3.93, + 3.92, + 3.92, + 3.91, + 3.91, + 3.9, + 3.9, + 3.89, + 3.89, + 3.88, + 3.88, + 3.87, + 3.87, + 3.86, + 3.86, + 3.85, + 3.85, + 3.84, + 3.84, + 3.83, + 3.83, + 3.82, + 3.82, + 3.81, + 3.81, + 3.8, + 3.8, + 3.79, + 3.79, + 3.78, + 3.78, + 3.77, + 3.77, + 3.76, + 3.76, + 3.75, + 3.75, + 3.74, + 3.74, + 3.73, + 3.73, + 3.72, + 3.72, + 3.71, + 3.71, + 3.7, + 3.7, + 3.69, + 3.69, + 3.68, + 3.68, + 3.67, + 3.67, + 3.66, + 3.66, + 3.66, + 3.65, + 3.65, + 3.64, + 3.64, + 3.63, + 3.63, + 3.62, + 3.62, + 3.61, + 3.61, + 3.6, + 3.6, + 3.59, + 3.59, + 3.58, + 3.58, + 3.57, + 3.57, + 3.57, + 3.56, + 3.56, + 3.55, + 3.55, + 3.54, + 3.54, + 3.53, + 3.53, + 3.52, + 3.52, + 3.51, + 3.51, + 3.51, + 3.5, + 3.5, + 3.49, + 3.49, + 3.48, + 3.48, + 3.47, + 3.47, + 3.46, + 3.46, + 3.46, + 3.45, + 3.45, + 3.44, + 3.44, + 3.43, + 3.43, + 3.42, + 3.42, + 3.41, + 3.41, + 3.41, + 3.4, + 3.4, + 3.39, + 3.39, + 3.38, + 3.38, + 3.37, + 3.37, + 3.37, + 3.36, + 3.36, + 3.35, + 3.35, + 3.34, + 3.34, + 3.34, + 3.33, + 3.33, + 3.32, + 3.32, + 3.31, + 3.31, + 3.3, + 3.3, + 3.3, + 3.29, + 3.29, + 3.28, + 3.28, + 3.27, + 3.27, + 3.27, + 3.26, + 3.26, + 3.25, + 3.25, + 3.24, + 3.24, + 3.24, + 3.23, + 3.23, + 3.22, + 3.22, + 3.22, + 3.21, + 3.21, + 3.2, + 3.2, + 3.19, + 3.19, + 3.19, + 3.18, + 3.18, + 3.17, + 3.17, + 3.16, + 3.16, + 3.16, + 3.15, + 3.15, + 3.14, + 3.14, + 3.14, + 3.13, + 3.13, + 3.12, + 3.12, + 3.12, + 3.11, + 3.11, + 3.1, + 3.1, + 3.1, + 3.09, + 3.09, + 3.08, + 3.08, + 3.08, + 3.07, + 3.07, + 3.06, + 3.06, + 3.06, + 3.05, + 3.05, + 3.04, + 3.04, + 3.04, + 3.03, + 3.03, + 3.02, + 3.02, + 3.02, + 3.01, + 3.01, + 3.0, + 3.0, + 3.0, + 2.99, + 2.99, + 2.98, + 2.98, + 2.98, + 2.97, + 2.97, + 2.96, + 2.96, + 2.96, + 2.95, + 2.95, + 2.95, + 2.94, + 2.94, + 2.93, + 2.93, + 2.93, + 2.92, + 2.92, + 2.91, + 2.91, + 2.91, + 2.9, + 2.9, + 2.9, + 2.89, + 2.89, + 2.88, + 2.88, + 2.88, + 2.87, + 2.87, + 2.87, + 2.86, + 2.86, + 2.85, + 2.85, + 2.85, + 2.84, + 2.84, + 2.84, + 2.83, + 2.83, + 2.82, + 2.82, + 2.82, + 2.81, + 2.81, + 2.81, + 2.8, + 2.8, + 2.79, + 2.79, + 2.79, + 2.78, + 2.78, + 2.78, + 2.77, + 2.77, + 2.77, + 2.76, + 2.76, + 2.75, + 2.75, + 2.75, + 2.74, + 2.74, + 2.74, + 2.73, + 2.73, + 2.73, + 2.72, + 2.72, + 2.72, + 2.71, + 2.71, + 2.7, + 2.7, + 2.7, + 2.69, + 2.69, + 2.69, + 2.68, + 2.68, + 2.68, + 2.67, + 2.67, + 2.67, + 2.66, + 2.66, + 2.66, + 2.65, + 2.65, + 2.65, + 2.64, + 2.64, + 2.64, + 2.63, + 2.63, + 2.62, + 2.62, + 2.62, + 2.61, + 2.61, + 2.61, + 2.6, + 2.6, + 2.6, + 2.59, + 2.59, + 2.59, + 2.58, + 2.58, + 2.58, + 2.57, + 2.57, + 2.57, + 2.56, + 2.56, + 2.56, + 2.55, + 2.55, + 2.55, + 2.54, + 2.54, + 2.54, + 2.53, + 2.53, + 2.53, + 2.52, + 2.52, + 2.52, + 2.51, + 2.51, + 2.51, + 2.5, + 2.5, + 2.5, + 2.49, + 2.49, + 2.49, + 2.48, + 2.48, + 2.48, + 2.47, + 2.47, + 2.47, + 2.46, + 2.46, + 2.46, + 2.46, + 2.45, + 2.45, + 2.45, + 2.44, + 2.44, + 2.44, + 2.43, + 2.43, + 2.43, + 2.42, + 2.42, + 2.42, + 2.41, + 2.41, + 2.41, + 2.4, + 2.4, + 2.4, + 2.39, + 2.39, + 2.39, + 2.39, + 2.38, + 2.38, + 2.38, + 2.37, + 2.37, + 2.37, + 2.36, + 2.36, + 2.36, + 2.35, + 2.35, + 2.35, + 2.35, + 2.34, + 2.34, + 2.34, + 2.33, + 2.33, + 2.33, + 2.32, + 2.32, + 2.32, + 2.31, + 2.31, + 2.31, + 2.31, + 2.3, + 2.3, + 2.3, + 2.29, + 2.29, + 2.29, + 2.28, + 2.28, + 2.28, + 2.28, + 2.27, + 2.27, + 2.27, + 2.26, + 2.26, + 2.26, + 2.25, + 2.25, + 2.25, + 2.25, + 2.24, + 2.24, + 2.24, + 2.23, + 2.23, + 2.23, + 2.23, + 2.22, + 2.22, + 2.22, + 2.21, + 2.21, + 2.21, + 2.21, + 2.2, + 2.2, + 2.2, + 2.19, + 2.19, + 2.19, + 2.19, + 2.18, + 2.18, + 2.18, + 2.17, + 2.17, + 2.17, + 2.17, + 2.16, + 2.16, + 2.16, + 2.15, + 2.15, + 2.15, + 2.15, + 2.14, + 2.14, + 2.14, + 2.13, + 2.13, + 2.13, + 2.13, + 2.12, + 2.12, + 2.12, + 2.11, + 2.11, + 2.11, + 2.11, + 2.1, + 2.1, + 2.1, + 2.1, + 2.09, + 2.09, + 2.09, + 2.08, + 2.08, + 2.08, + 2.08, + 2.07, + 2.07, + 2.07, + 2.07, + 2.06, + 2.06, + 2.06, + 2.05, + 2.05, + 2.05, + 2.05, + 2.04, + 2.04, + 2.04, + 2.04, + 2.03, + 2.03, + 2.03, + 2.03, + 2.02, + 2.02, + 2.02, + 2.01, + 2.01, + 2.01, + 2.01, + 2.0, + 2.0, + 2.0, + 2.0, + 1.99, + 1.99, + 1.99, + 1.99, + 1.98, + 1.98, + 1.98, + 1.98, + 1.97, + 1.97, + 1.97, + 1.97, + 1.96, + 1.96, + 1.96, + 1.96, + 1.95, + 1.95, + 1.95, + 1.94, + 1.94, + 1.94, + 1.94, + 1.93, + 1.93, + 1.93, + 1.93, + 1.92, + 1.92, + 1.92, + 1.92, + 1.91, + 1.91, + 1.91, + 1.91, + 1.9, + 1.9, + 1.9, + 1.9, + 1.89, + 1.89, + 1.89, + 1.89, + 1.88, + 1.88, + 1.88, + 1.88, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.86, + 1.86, + 1.86, + 1.86, + 1.85, + 1.85, + 1.85, + 1.85, + 1.84, + 1.84, + 1.84, + 1.84, + 1.83, + 1.83, + 1.83, + 1.83, + 1.82, + 1.82, + 1.82, + 1.82, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.8, + 1.8, + 1.8, + 1.8, + 1.79, + 1.79, + 1.79, + 1.79, + 1.78, + 1.78, + 1.78, + 1.78, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.76, + 1.76, + 1.76, + 1.76, + 1.75, + 1.75, + 1.75, + 1.75, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.73, + 1.73, + 1.73, + 1.73, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.71, + 1.71, + 1.71, + 1.71, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.69, + 1.69, + 1.69, + 1.69, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.67, + 1.67, + 1.67, + 1.67, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.65, + 1.65, + 1.65, + 1.65, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.62, + 1.62, + 1.62, + 1.62, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.56, + 1.56, + 1.56, + 1.56, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EEn_tfs": [ + 0.0, + 0.01, + 0.04, + 0.09, + 0.16, + 0.25, + 0.35, + 0.47, + 0.61, + 0.76, + 0.93, + 1.11, + 1.3, + 1.5, + 1.72, + 1.95, + 2.19, + 2.43, + 2.69, + 2.96, + 3.23, + 3.51, + 3.8, + 4.1, + 4.4, + 4.71, + 5.02, + 5.34, + 5.67, + 6.0, + 6.33, + 6.67, + 7.0, + 7.35, + 7.69, + 8.04, + 8.39, + 8.74, + 9.09, + 9.45, + 9.8, + 10.16, + 10.51, + 10.87, + 11.23, + 11.58, + 11.94, + 12.29, + 12.65, + 13.0, + 13.35, + 13.71, + 14.06, + 14.4, + 14.75, + 15.09, + 15.44, + 15.78, + 16.11, + 16.45, + 16.78, + 17.11, + 17.44, + 17.76, + 18.08, + 18.4, + 18.72, + 19.03, + 19.34, + 19.64, + 19.95, + 20.25, + 20.54, + 20.83, + 21.12, + 21.4, + 21.69, + 21.96, + 22.24, + 22.5, + 22.77, + 23.03, + 23.29, + 23.54, + 23.79, + 24.04, + 24.28, + 24.52, + 24.75, + 24.98, + 25.21, + 25.43, + 25.65, + 25.86, + 26.07, + 26.28, + 26.48, + 26.68, + 26.87, + 27.06, + 27.24, + 27.43, + 27.6, + 27.78, + 27.95, + 28.11, + 28.27, + 28.43, + 28.59, + 28.74, + 28.88, + 29.03, + 29.16, + 29.3, + 29.43, + 29.56, + 29.68, + 29.8, + 29.92, + 30.03, + 30.14, + 30.25, + 30.35, + 30.45, + 30.54, + 30.64, + 30.72, + 30.81, + 30.89, + 30.97, + 31.05, + 31.12, + 31.19, + 31.25, + 31.31, + 31.37, + 31.43, + 31.48, + 31.53, + 31.58, + 31.63, + 31.67, + 31.71, + 31.74, + 31.77, + 31.81, + 31.83, + 31.86, + 31.88, + 31.9, + 31.92, + 31.93, + 31.94, + 31.95, + 31.96, + 31.96, + 31.97, + 31.97, + 31.96, + 31.96, + 31.95, + 31.94, + 31.93, + 31.92, + 31.9, + 31.88, + 31.86, + 31.84, + 31.82, + 31.79, + 31.76, + 31.73, + 31.7, + 31.67, + 31.63, + 31.6, + 31.56, + 31.52, + 31.47, + 31.43, + 31.39, + 31.34, + 31.29, + 31.24, + 31.19, + 31.13, + 31.08, + 31.02, + 30.97, + 30.91, + 30.85, + 30.79, + 30.72, + 30.66, + 30.59, + 30.53, + 30.46, + 30.39, + 30.32, + 30.25, + 30.18, + 30.1, + 30.03, + 29.95, + 29.88, + 29.8, + 29.72, + 29.64, + 29.56, + 29.48, + 29.4, + 29.32, + 29.23, + 29.15, + 29.06, + 28.98, + 28.89, + 28.8, + 28.71, + 28.62, + 28.53, + 28.44, + 28.35, + 28.26, + 28.17, + 28.08, + 27.98, + 27.89, + 27.8, + 27.7, + 27.61, + 27.51, + 27.41, + 27.32, + 27.22, + 27.12, + 27.02, + 26.93, + 26.83, + 26.73, + 26.63, + 26.53, + 26.43, + 26.33, + 26.23, + 26.13, + 26.03, + 25.92, + 25.82, + 25.72, + 25.62, + 25.52, + 25.41, + 25.31, + 25.21, + 25.11, + 25.0, + 24.9, + 24.8, + 24.69, + 24.59, + 24.49, + 24.38, + 24.28, + 24.17, + 24.07, + 23.97, + 23.86, + 23.76, + 23.65, + 23.55, + 23.45, + 23.34, + 23.24, + 23.13, + 23.03, + 22.93, + 22.82, + 22.72, + 22.62, + 22.51, + 22.41, + 22.31, + 22.2, + 22.1, + 22.0, + 21.89, + 21.79, + 21.69, + 21.59, + 21.48, + 21.38, + 21.28, + 21.18, + 21.08, + 20.97, + 20.87, + 20.77, + 20.67, + 20.57, + 20.47, + 20.37, + 20.27, + 20.17, + 20.07, + 19.97, + 19.87, + 19.77, + 19.67, + 19.57, + 19.48, + 19.38, + 19.28, + 19.18, + 19.08, + 18.99, + 18.89, + 18.79, + 18.7, + 18.6, + 18.51, + 18.41, + 18.32, + 18.22, + 18.13, + 18.03, + 17.94, + 17.84, + 17.75, + 17.66, + 17.57, + 17.47, + 17.38, + 17.29, + 17.2, + 17.11, + 17.01, + 16.92, + 16.83, + 16.74, + 16.65, + 16.57, + 16.48, + 16.39, + 16.3, + 16.21, + 16.12, + 16.04, + 15.95, + 15.86, + 15.78, + 15.69, + 15.6, + 15.52, + 15.43, + 15.35, + 15.26, + 15.18, + 15.1, + 15.01, + 14.93, + 14.85, + 14.77, + 14.68, + 14.6, + 14.52, + 14.44, + 14.36, + 14.28, + 14.2, + 14.12, + 14.04, + 13.96, + 13.88, + 13.8, + 13.73, + 13.65, + 13.57, + 13.49, + 13.42, + 13.34, + 13.27, + 13.19, + 13.12, + 13.04, + 12.97, + 12.89, + 12.82, + 12.75, + 12.67, + 12.6, + 12.53, + 12.46, + 12.38, + 12.31, + 12.24, + 12.17, + 12.1, + 12.03, + 11.96, + 11.89, + 11.82, + 11.75, + 11.69, + 11.62, + 11.55, + 11.48, + 11.42, + 11.35, + 11.28, + 11.22, + 11.15, + 11.09, + 11.02, + 10.96, + 10.89, + 10.83, + 10.77, + 10.7, + 10.64, + 10.58, + 10.51, + 10.45, + 10.39, + 10.33, + 10.27, + 10.21, + 10.15, + 10.09, + 10.03, + 9.97, + 9.91, + 9.85, + 9.79, + 9.73, + 9.68, + 9.62, + 9.56, + 9.5, + 9.45, + 9.39, + 9.33, + 9.28, + 9.22, + 9.17, + 9.11, + 9.06, + 9.0, + 8.95, + 8.9, + 8.84, + 8.79, + 8.74, + 8.68, + 8.63, + 8.58, + 8.53, + 8.48, + 8.43, + 8.38, + 8.32, + 8.27, + 8.22, + 8.17, + 8.13, + 8.08, + 8.03, + 7.98, + 7.93, + 7.88, + 7.83, + 7.79, + 7.74, + 7.69, + 7.65, + 7.6, + 7.55, + 7.51, + 7.46, + 7.42, + 7.37, + 7.33, + 7.28, + 7.24, + 7.19, + 7.15, + 7.11, + 7.06, + 7.02, + 6.98, + 6.93, + 6.89, + 6.85, + 6.81, + 6.76, + 6.72, + 6.68, + 6.64, + 6.6, + 6.56, + 6.52, + 6.48, + 6.44, + 6.4, + 6.36, + 6.32, + 6.28, + 6.24, + 6.21, + 6.17, + 6.13, + 6.09, + 6.05, + 6.02, + 5.98, + 5.94, + 5.91, + 5.87, + 5.83, + 5.8, + 5.76, + 5.73, + 5.69, + 5.66, + 5.62, + 5.59, + 5.55, + 5.52, + 5.48, + 5.45, + 5.42, + 5.38, + 5.35, + 5.32, + 5.28, + 5.25, + 5.22, + 5.18, + 5.15, + 5.12, + 5.09, + 5.06, + 5.03, + 4.99, + 4.96, + 4.93, + 4.9, + 4.87, + 4.84, + 4.81, + 4.78, + 4.75, + 4.72, + 4.69, + 4.66, + 4.63, + 4.61, + 4.58, + 4.55, + 4.52, + 4.49, + 4.46, + 4.44, + 4.41, + 4.38, + 4.35, + 4.33, + 4.3, + 4.27, + 4.25, + 4.22, + 4.19, + 4.17, + 4.14, + 4.11, + 4.09, + 4.06, + 4.04, + 4.01, + 3.99, + 3.96, + 3.94, + 3.91, + 3.89, + 3.86, + 3.84, + 3.82, + 3.79, + 3.77, + 3.75, + 3.72, + 3.7, + 3.68, + 3.65, + 3.63, + 3.61, + 3.58, + 3.56, + 3.54, + 3.52, + 3.5, + 3.47, + 3.45, + 3.43, + 3.41, + 3.39, + 3.37, + 3.34, + 3.32, + 3.3, + 3.28, + 3.26, + 3.24, + 3.22, + 3.2, + 3.18, + 3.16, + 3.14, + 3.12, + 3.1, + 3.08, + 3.06, + 3.04, + 3.02, + 3.0, + 2.99, + 2.97, + 2.95, + 2.93, + 2.91, + 2.89, + 2.87, + 2.86, + 2.84, + 2.82, + 2.8, + 2.79, + 2.77, + 2.75, + 2.73, + 2.72, + 2.7, + 2.68, + 2.66, + 2.65, + 2.63, + 2.61, + 2.6, + 2.58, + 2.57, + 2.55, + 2.53, + 2.52, + 2.5, + 2.49, + 2.47, + 2.45, + 2.44, + 2.42, + 2.41, + 2.39, + 2.38, + 2.36, + 2.35, + 2.33, + 2.32, + 2.3, + 2.29, + 2.28, + 2.26, + 2.25, + 2.23, + 2.22, + 2.2, + 2.19, + 2.18, + 2.16, + 2.15, + 2.14, + 2.12, + 2.11, + 2.1, + 2.08, + 2.07, + 2.06, + 2.04, + 2.03, + 2.02, + 2.0, + 1.99, + 1.98, + 1.97, + 1.95, + 1.94, + 1.93, + 1.92, + 1.91, + 1.89, + 1.88, + 1.87, + 1.86, + 1.85, + 1.83, + 1.82, + 1.81, + 1.8, + 1.79, + 1.78, + 1.77, + 1.75, + 1.74, + 1.73, + 1.72, + 1.71, + 1.7, + 1.69, + 1.68, + 1.67, + 1.66, + 1.65, + 1.64, + 1.63, + 1.62, + 1.61, + 1.6, + 1.59, + 1.58, + 1.57, + 1.56, + 1.55, + 1.54, + 1.53, + 1.52, + 1.51, + 1.5, + 1.49, + 1.48, + 1.47, + 1.46, + 1.45, + 1.44, + 1.43, + 1.42, + 1.41, + 1.4, + 1.4, + 1.39, + 1.38, + 1.37, + 1.36, + 1.35, + 1.34, + 1.34, + 1.33, + 1.32, + 1.31, + 1.3, + 1.29, + 1.29, + 1.28, + 1.27, + 1.26, + 1.25, + 1.25, + 1.24, + 1.23, + 1.22, + 1.21, + 1.21, + 1.2, + 1.19, + 1.18, + 1.18, + 1.17, + 1.16, + 1.15, + 1.15, + 1.14, + 1.13, + 1.12, + 1.12, + 1.11, + 1.1, + 1.1, + 1.09, + 1.08, + 1.08, + 1.07, + 1.06, + 1.06, + 1.05, + 1.04, + 1.04, + 1.03, + 1.02, + 1.02, + 1.01, + 1.0, + 1.0, + 0.99, + 0.98, + 0.98, + 0.97, + 0.97, + 0.96, + 0.95, + 0.95, + 0.94, + 0.94, + 0.93, + 0.92, + 0.92, + 0.91, + 0.91, + 0.9, + 0.89, + 0.89, + 0.88, + 0.88, + 0.87, + 0.87, + 0.86, + 0.86, + 0.85, + 0.84, + 0.84, + 0.83, + 0.83, + 0.82, + 0.82, + 0.81, + 0.81, + 0.8, + 0.8, + 0.79, + 0.79, + 0.78, + 0.78, + 0.77, + 0.77, + 0.76, + 0.76, + 0.75, + 0.75, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.71, + 0.71, + 0.7, + 0.7, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hormonetrack/HormoneTrackApp.kt b/app/src/main/java/com/hormonetrack/HormoneTrackApp.kt new file mode 100644 index 0000000..143cbe9 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/HormoneTrackApp.kt @@ -0,0 +1,32 @@ +package com.hormonetrack + +import android.app.Application +import android.content.Context +import com.hormonetrack.data.AppDatabase +import com.hormonetrack.data.repository.HormoneRepository +import com.hormonetrack.pk.PKProfileStore +import com.hormonetrack.reminder.createNotificationChannel +import com.hormonetrack.settings.AppSettings + +class HormoneTrackApp : Application() { + + lateinit var container: AppContainer + private set + + override fun onCreate() { + super.onCreate() + container = AppContainer(this) + PKProfileStore.init(this) + createNotificationChannel(this) + } +} + +class AppContainer(appContext: Context) { + private val database = AppDatabase.getInstance(appContext) + val repository = HormoneRepository( + database.treatmentDao(), + database.doseLogDao(), + database.labResultDao() + ) + val settings = AppSettings(appContext) +} diff --git a/app/src/main/java/com/hormonetrack/MainActivity.kt b/app/src/main/java/com/hormonetrack/MainActivity.kt new file mode 100644 index 0000000..0d9ccf9 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/MainActivity.kt @@ -0,0 +1,65 @@ +package com.hormonetrack + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import androidx.lifecycle.lifecycleScope +import com.hormonetrack.ui.HormoneTrackRoot +import com.hormonetrack.ui.theme.HormoneTrackTheme +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch + +class MainActivity : AppCompatActivity() { + + private val notificationPermissionLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val container = (application as HormoneTrackApp).container + + lifecycleScope.launch { + val lang = container.settings.language.first() + val locales = if (lang == "system") { + LocaleListCompat.getEmptyLocaleList() + } else { + LocaleListCompat.forLanguageTags(lang) + } + if (AppCompatDelegate.getApplicationLocales() != locales) { + AppCompatDelegate.setApplicationLocales(locales) + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != + PackageManager.PERMISSION_GRANTED + ) { + notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } + } + + val openLogDose = intent?.getBooleanExtra("open_log_dose", false) ?: false + val treatmentId = intent?.getLongExtra("treatment_id", -1L) ?: -1L + + setContent { + HormoneTrackTheme { + HormoneTrackRoot( + initialOpenLogDose = openLogDose, + initialTreatmentId = treatmentId + ) + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + } +} diff --git a/app/src/main/java/com/hormonetrack/data/AppDatabase.kt b/app/src/main/java/com/hormonetrack/data/AppDatabase.kt new file mode 100644 index 0000000..7c98dfa --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/AppDatabase.kt @@ -0,0 +1,42 @@ +package com.hormonetrack.data + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.hormonetrack.data.dao.DoseLogDao +import com.hormonetrack.data.dao.LabResultDao +import com.hormonetrack.data.dao.TreatmentDao +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment + +@Database( + entities = [Treatment::class, DoseLog::class, LabResult::class], + version = 1, + exportSchema = false +) +abstract class AppDatabase : RoomDatabase() { + abstract fun treatmentDao(): TreatmentDao + abstract fun doseLogDao(): DoseLogDao + abstract fun labResultDao(): LabResultDao + + companion object { + @Volatile + private var INSTANCE: AppDatabase? = null + + fun getInstance(context: Context): AppDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + "hormonetrack.db" + ) + .fallbackToDestructiveMigration() + .build() + INSTANCE = instance + instance + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt b/app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt new file mode 100644 index 0000000..12eb6bb --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt @@ -0,0 +1,71 @@ +package com.hormonetrack.data.backup + +import android.content.Context +import android.net.Uri +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.repository.HormoneRepository +import com.hormonetrack.pk.TConfig + +data class BackupData( + val version: Int = 1, + val exportedAt: Long = System.currentTimeMillis(), + val treatments: List = emptyList(), + val doseLogs: List = emptyList(), + val labResults: List = emptyList(), + val tConfig: TConfig = TConfig() +) + +object BackupManager { + + suspend fun exportJson(repo: HormoneRepository, tConfig: TConfig): String { + val data = BackupData( + treatments = repo.allTreatmentsOnce(), + doseLogs = repo.allDoseLogsOnce(), + labResults = repo.allLabResultsOnce(), + tConfig = tConfig + ) + return Gson().toJson(data) + } + + data class ImportResult(val treatments: Int, val doseLogs: Int, val labResults: Int) + + suspend fun importJson( + repo: HormoneRepository, + json: String + ): ImportResult { + val type = object : TypeToken() {}.type + val data: BackupData = Gson().fromJson(json, type) + + data.treatments.forEach { repo.insertTreatment(it) } + data.doseLogs.forEach { repo.insertDoseLog(it) } + data.labResults.forEach { repo.insertLabResult(it) } + + return ImportResult( + data.treatments.size, + data.doseLogs.size, + data.labResults.size + ) + } + + suspend fun writeBackup(context: Context, uri: Uri, json: String): Boolean { + return try { + context.contentResolver.openOutputStream(uri, "wt")?.use { os -> + os.write(json.toByteArray(Charsets.UTF_8)) + os.flush() + } ?: return false + true + } catch (e: Exception) { + false + } + } + + suspend fun readBackup(context: Context, uri: Uri): String? = try { + context.contentResolver.openInputStream(uri)?.use { it.readBytes().toString(Charsets.UTF_8) } + } catch (e: Exception) { + null + } +} diff --git a/app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt b/app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt new file mode 100644 index 0000000..003f8dc --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt @@ -0,0 +1,35 @@ +package com.hormonetrack.data.dao + +import androidx.room.* +import com.hormonetrack.data.model.DoseLog +import kotlinx.coroutines.flow.Flow + +@Dao +interface DoseLogDao { + @Query("SELECT * FROM dose_logs ORDER BY timestamp DESC") + fun getAll(): Flow> + + @Query("SELECT * FROM dose_logs WHERE treatmentId = :treatmentId ORDER BY timestamp DESC") + fun getByTreatment(treatmentId: Long): Flow> + + @Query("SELECT * FROM dose_logs WHERE timestamp BETWEEN :start AND :end ORDER BY timestamp ASC") + fun getByTimeRange(start: Long, end: Long): Flow> + + @Query("SELECT * FROM dose_logs WHERE treatmentId = :treatmentId AND timestamp BETWEEN :start AND :end ORDER BY timestamp ASC") + fun getByTreatmentAndTimeRange(treatmentId: Long, start: Long, end: Long): Flow> + + @Query("SELECT * FROM dose_logs ORDER BY timestamp DESC LIMIT 1") + fun getLatest(): Flow + + @Query("SELECT * FROM dose_logs ORDER BY timestamp ASC") + suspend fun getAllOnce(): List + + @Insert + suspend fun insert(log: DoseLog): Long + + @Update + suspend fun update(log: DoseLog) + + @Delete + suspend fun delete(log: DoseLog) +} diff --git a/app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt b/app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt new file mode 100644 index 0000000..ed0341f --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt @@ -0,0 +1,29 @@ +package com.hormonetrack.data.dao + +import androidx.room.* +import com.hormonetrack.data.model.LabResult +import kotlinx.coroutines.flow.Flow + +@Dao +interface LabResultDao { + @Query("SELECT * FROM lab_results ORDER BY timestamp DESC") + fun getAll(): Flow> + + @Query("SELECT * FROM lab_results WHERE marker = :marker ORDER BY timestamp DESC") + fun getByMarker(marker: String): Flow> + + @Query("SELECT * FROM lab_results WHERE timestamp BETWEEN :start AND :end ORDER BY timestamp ASC") + fun getByTimeRange(start: Long, end: Long): Flow> + + @Query("SELECT * FROM lab_results ORDER BY timestamp ASC") + suspend fun getAllOnce(): List + + @Insert + suspend fun insert(result: LabResult): Long + + @Update + suspend fun update(result: LabResult) + + @Delete + suspend fun delete(result: LabResult) +} diff --git a/app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt b/app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt new file mode 100644 index 0000000..823a1fc --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt @@ -0,0 +1,35 @@ +package com.hormonetrack.data.dao + +import androidx.room.* +import com.hormonetrack.data.model.Treatment +import kotlinx.coroutines.flow.Flow + +@Dao +interface TreatmentDao { + @Query("SELECT * FROM treatments WHERE isActive = 1 ORDER BY createdAt DESC") + fun getActiveTreatments(): Flow> + + @Query("SELECT * FROM treatments ORDER BY createdAt DESC") + fun getAllTreatments(): Flow> + + @Query("SELECT * FROM treatments WHERE id = :id") + suspend fun getById(id: Long): Treatment? + + @Query("SELECT * FROM treatments WHERE isActive = 1 ORDER BY createdAt DESC") + suspend fun getActiveOnce(): List + + @Query("SELECT * FROM treatments ORDER BY createdAt DESC") + suspend fun getAllOnce(): List + + @Insert + suspend fun insert(treatment: Treatment): Long + + @Update + suspend fun update(treatment: Treatment) + + @Delete + suspend fun delete(treatment: Treatment) + + @Query("UPDATE treatments SET isActive = :active WHERE id = :id") + suspend fun setActive(id: Long, active: Boolean) +} diff --git a/app/src/main/java/com/hormonetrack/data/model/DoseLog.kt b/app/src/main/java/com/hormonetrack/data/model/DoseLog.kt new file mode 100644 index 0000000..1ddab17 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/DoseLog.kt @@ -0,0 +1,29 @@ +package com.hormonetrack.data.model + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity( + tableName = "dose_logs", + foreignKeys = [ + ForeignKey( + entity = Treatment::class, + parentColumns = ["id"], + childColumns = ["treatmentId"], + onDelete = ForeignKey.CASCADE + ) + ], + indices = [Index("treatmentId"), Index("timestamp")] +) +data class DoseLog( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val treatmentId: Long, + val timestamp: Long = System.currentTimeMillis(), + val doseAmount: Double, + val notes: String? = null, + // Per-injection ester override (like the ODS where profiles switch esters over time); + // null = use the treatment's default ester + val esterType: String? = null +) diff --git a/app/src/main/java/com/hormonetrack/data/model/LabResult.kt b/app/src/main/java/com/hormonetrack/data/model/LabResult.kt new file mode 100644 index 0000000..dbeb963 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/LabResult.kt @@ -0,0 +1,14 @@ +package com.hormonetrack.data.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "lab_results") +data class LabResult( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val marker: String, + val value: Double, + val unit: String, + val timestamp: Long = System.currentTimeMillis(), + val notes: String? = null +) diff --git a/app/src/main/java/com/hormonetrack/data/model/PKPresets.kt b/app/src/main/java/com/hormonetrack/data/model/PKPresets.kt new file mode 100644 index 0000000..9f59841 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/PKPresets.kt @@ -0,0 +1,134 @@ +package com.hormonetrack.data.model + +import com.hormonetrack.R + +data class PKPreset( + val nameRes: Int, + val type: TreatmentType, + val route: AdministrationRoute, + val esterType: String, + val pkModel: String, + val absorptionHours: Float, + val eliminationHalfLifeHours: Float, + val bioavailabilityFraction: Float, + val defaultDoseUnit: String, + val defaultDoseAmount: Double +) + +object PKPresets { + + val all: List = listOf( + // --- Injections: Estrannaise models (profiles from the ODS) --- + PKPreset( + nameRes = R.string.preset_ev_ese, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EV, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 46f, eliminationHalfLifeHours = 100f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 4.0 + ), + PKPreset( + nameRes = R.string.preset_eu_ese, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EU, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 55f, eliminationHalfLifeHours = 400f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + PKPreset( + nameRes = R.string.preset_een_ese, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_SUBCUT, + esterType = Esters.EEN, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 152f, eliminationHalfLifeHours = 150f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + // --- Injections: Transfem Science models --- + PKPreset( + nameRes = R.string.preset_ev_tfs, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EV, + pkModel = PKModels.TRANSFEM_SCIENCE, + absorptionHours = 51f, eliminationHalfLifeHours = 100f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 4.0 + ), + PKPreset( + nameRes = R.string.preset_eu_tfs, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EU, + pkModel = PKModels.TRANSFEM_SCIENCE, + absorptionHours = 198f, eliminationHalfLifeHours = 400f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + PKPreset( + nameRes = R.string.preset_een_tfs, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_SUBCUT, + esterType = Esters.EEN, + pkModel = PKModels.TRANSFEM_SCIENCE, + absorptionHours = 156f, eliminationHalfLifeHours = 150f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + // --- Transdermal / oral (Bateman fallback) --- + PKPreset( + nameRes = R.string.preset_e2_gel, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.TRANSDERMAL_GEL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 4f, eliminationHalfLifeHours = 24f, bioavailabilityFraction = 0.8f, + defaultDoseUnit = "mg", defaultDoseAmount = 2.0 + ), + PKPreset( + nameRes = R.string.preset_e2_patch, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.TRANSDERMAL_PATCH, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 8f, eliminationHalfLifeHours = 24f, bioavailabilityFraction = 0.9f, + defaultDoseUnit = "mg/day", defaultDoseAmount = 0.1 + ), + PKPreset( + nameRes = R.string.preset_e2_oral, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 1.5f, eliminationHalfLifeHours = 16f, bioavailabilityFraction = 0.4f, + defaultDoseUnit = "mg", defaultDoseAmount = 2.0 + ), + // --- Anti-androgens (Bateman) --- + PKPreset( + nameRes = R.string.preset_cpa, + type = TreatmentType.ANTI_ANDROGEN, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 2f, eliminationHalfLifeHours = 30f, bioavailabilityFraction = 0.8f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + PKPreset( + nameRes = R.string.preset_spiro, + type = TreatmentType.ANTI_ANDROGEN, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 1.5f, eliminationHalfLifeHours = 8f, bioavailabilityFraction = 0.7f, + defaultDoseUnit = "mg", defaultDoseAmount = 100.0 + ), + PKPreset( + nameRes = R.string.preset_bica, + type = TreatmentType.ANTI_ANDROGEN, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 3f, eliminationHalfLifeHours = 168f, bioavailabilityFraction = 0.9f, + defaultDoseUnit = "mg", defaultDoseAmount = 50.0 + ) + ) +} diff --git a/app/src/main/java/com/hormonetrack/data/model/Treatment.kt b/app/src/main/java/com/hormonetrack/data/model/Treatment.kt new file mode 100644 index 0000000..8f1f3c1 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/Treatment.kt @@ -0,0 +1,69 @@ +package com.hormonetrack.data.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +object Esters { + const val NONE = "NONE" + const val EV = "EV" + const val EU = "EU" + const val EEN = "EEN" +} + +object PKModels { + const val ESTRANNAISE = "ESE" + const val TRANSFEM_SCIENCE = "TFS" +} + +enum class TreatmentType { + ESTRADIOL, + ANTI_ANDROGEN, + PROGESTOGEN, + OTHER +} + +enum class AdministrationRoute { + ORAL, + TRANSDERMAL_GEL, + TRANSDERMAL_PATCH, + INJECTION_IM, + INJECTION_SUBCUT, + OTHER +} + +@Entity(tableName = "treatments") +data class Treatment( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val name: String, + val type: TreatmentType, + val route: AdministrationRoute, + val doseAmount: Double, + val doseUnit: String, + val isActive: Boolean = true, + val notes: String? = null, + + // PK: lookup-table model for injections (EV/EU/EEn from Estrannaise / Transfem Science) + val esterType: String = Esters.NONE, + val pkModel: String = PKModels.ESTRANNAISE, + + // PK: Bateman fallback for gel/patch/oral + val absorptionHours: Float = 4f, + val eliminationHalfLifeHours: Float = 24f, + val bioavailabilityFraction: Float = 1.0f, + + // Calibration: ratio lab_value / model_prediction (like the ODS "Scale factor") + val scaleFactor: Double = 1.0, + + // Reminder + val reminderHour: Int? = null, + val reminderMinute: Int? = null, + val reminderEnabled: Boolean = false, + + val createdAt: Long = System.currentTimeMillis() +) { + val isInjection: Boolean + get() = route == AdministrationRoute.INJECTION_IM || route == AdministrationRoute.INJECTION_SUBCUT + + val usesProfileModel: Boolean + get() = isInjection && esterType != Esters.NONE +} diff --git a/app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt b/app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt new file mode 100644 index 0000000..f789651 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt @@ -0,0 +1,47 @@ +package com.hormonetrack.data.repository + +import com.hormonetrack.data.dao.DoseLogDao +import com.hormonetrack.data.dao.LabResultDao +import com.hormonetrack.data.dao.TreatmentDao +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import kotlinx.coroutines.flow.Flow + +class HormoneRepository( + private val treatmentDao: TreatmentDao, + private val doseLogDao: DoseLogDao, + private val labResultDao: LabResultDao +) { + val activeTreatments: Flow> = treatmentDao.getActiveTreatments() + val allTreatments: Flow> = treatmentDao.getAllTreatments() + val allDoseLogs: Flow> = doseLogDao.getAll() + val allLabResults: Flow> = labResultDao.getAll() + + fun getDosesByTimeRange(start: Long, end: Long): Flow> = + doseLogDao.getByTimeRange(start, end) + + fun getDosesByTreatmentAndTimeRange(treatmentId: Long, start: Long, end: Long): Flow> = + doseLogDao.getByTreatmentAndTimeRange(treatmentId, start, end) + + fun getLabsByMarker(marker: String): Flow> = + labResultDao.getByMarker(marker) + + suspend fun getTreatmentById(id: Long): Treatment? = treatmentDao.getById(id) + + suspend fun allTreatmentsOnce(): List = treatmentDao.getAllOnce() + suspend fun allDoseLogsOnce(): List = doseLogDao.getAllOnce() + suspend fun allLabResultsOnce(): List = labResultDao.getAllOnce() + + suspend fun insertTreatment(treatment: Treatment): Long = treatmentDao.insert(treatment) + suspend fun updateTreatment(treatment: Treatment) = treatmentDao.update(treatment) + suspend fun deleteTreatment(treatment: Treatment) = treatmentDao.delete(treatment) + + suspend fun insertDoseLog(log: DoseLog): Long = doseLogDao.insert(log) + suspend fun updateDoseLog(log: DoseLog) = doseLogDao.update(log) + suspend fun deleteDoseLog(log: DoseLog) = doseLogDao.delete(log) + + suspend fun insertLabResult(result: LabResult): Long = labResultDao.insert(result) + suspend fun updateLabResult(result: LabResult) = labResultDao.update(result) + suspend fun deleteLabResult(result: LabResult) = labResultDao.delete(result) +} diff --git a/app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt b/app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt new file mode 100644 index 0000000..a80967c --- /dev/null +++ b/app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt @@ -0,0 +1,106 @@ +package com.hormonetrack.pk + +import android.content.Context +import com.google.gson.JsonParser + +object PKProfileStore { + + @Volatile + private var initialized = false + + private lateinit var profiles: Map + + fun init(context: Context) { + if (initialized) return + synchronized(this) { + if (initialized) return + val json = context.assets.open("pk_profiles.json").bufferedReader().use { it.readText() } + initWithJson(json) + } + } + + /** Testable entry point: parse the profiles JSON directly (JVM unit tests). */ + fun initWithJson(json: String) { + synchronized(this) { + val root = JsonParser.parseString(json).asJsonObject + val profilesObj = root.getAsJsonObject("profiles") + val parsed = LinkedHashMap() + for ((key, value) in profilesObj.entrySet()) { + val arr = value.asJsonArray + val floats = FloatArray(arr.size()) { i -> arr[i].asFloat } + parsed[key] = floats + } + profiles = parsed + initialized = true + } + } + + fun profileKey(ester: String, model: String): String = + "${ester}_${if (model == com.hormonetrack.data.model.PKModels.TRANSFEM_SCIENCE) "tfs" else "ese"}" + + /** + * Case-insensitive lookup. The ODS asset keys use the biological casing + * ("EV_ese", "EU_ese", "EEn_ese", …) while the app constants are uppercase + * (Esters.EEN = "EEN") — an exact-match lookup silently returned null for EEn + * and flattened every EEn curve to zero (bug fixed 2026-09-05). + */ + private fun lookup(key: String): FloatArray? { + if (!initialized) return null + return profiles[key] + ?: profiles.entries.firstOrNull { it.key.equals(key, ignoreCase = true) }?.value + } + + fun hasProfile(ester: String, model: String): Boolean = + lookup(profileKey(ester, model)) != null + + fun profileLength(ester: String, model: String): Int = + lookup(profileKey(ester, model))?.size ?: 0 + + /** + * Normalized response (pg/mL per mg injected) at dtHours after a 1 mg injection, + * linearly interpolated between hourly points; beyond the table, extrapolated + * with the terminal exponential slope. + */ + fun sample(ester: String, model: String, dtHours: Double): Double { + if (!initialized || dtHours <= 0.0) return 0.0 + val suffix = when (model) { + com.hormonetrack.data.model.PKModels.TRANSFEM_SCIENCE -> "tfs" + com.hormonetrack.data.model.PKModels.ESTRANNAISE -> "ese" + else -> return 0.0 + } + val arr = lookup("${ester}_$suffix") ?: return 0.0 + if (arr.size < 2) return 0.0 + + val lastIdx = arr.size - 1 + if (dtHours >= lastIdx) { + // The ODS tables are rounded to 2 decimals and collapse into a 0.01 / 0.00 + // display floor long before the true value vanishes. Extrapolate from the + // last point still >= 1% of the peak, using the average hourly decay of + // the previous 48 h (never sampling before the peak). + var peakIdx = 0 + var peakV = 0f + for (idx in arr.indices) { + if (arr[idx] > peakV) { + peakV = arr[idx] + peakIdx = idx + } + } + if (peakV <= 0f) return 0.0 + var j = lastIdx + while (j > 0 && arr[j] < peakV * 0.01f) j-- + if (j <= 0) return 0.0 + val window = 48 + val j0 = maxOf(peakIdx, j - window) + val rate = if (j > j0) { + kotlin.math.ln(arr[j].toDouble() / arr[j0].toDouble().coerceAtLeast(1e-12)) / (j - j0) + } else 0.0 + return arr[j].toDouble() * kotlin.math.exp(rate * (dtHours - j)) + } + + val i = dtHours.toInt().coerceIn(0, lastIdx - 1) + val frac = dtHours - i + val base = arr[i].toDouble() + val delta = (arr[i + 1] - arr[i]).toDouble() + return base + delta * frac + } +} diff --git a/app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt b/app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt new file mode 100644 index 0000000..cd8a59d --- /dev/null +++ b/app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt @@ -0,0 +1,296 @@ +package com.hormonetrack.pk + +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import kotlin.math.abs +import kotlin.math.exp +import kotlin.math.ln +import kotlin.math.max + +data class LevelPoint( + val timestamp: Long, + val e2: Double, + val t: Double +) + +data class TConfig( + val base: Double = 6.0, + val floor: Double = 0.2, + val k: Double = 0.19 +) + +object PharmacokineticEngine { + + const val HOUR_MS = 3_600_000L + + // ------------------------------------------------------------------ + // Single dose contribution (pg/mL), either from the ODS lookup tables + // (Estrannaise / Transfem Science profiles for EV/EU/EEn injections) or + // from a Bateman model for gel/patch/oral routes. + // ------------------------------------------------------------------ + + data class BatemanParams(val ke: Double, val ka: Double) + + fun computeKa(tHalfHours: Double, tMaxHours: Double): Double { + if (tMaxHours <= 0 || tHalfHours <= 0) return 1.0 + val ke = ln(2.0) / tHalfHours + if (tMaxHours < 0.01) return ke * 100.0 + var lo = ke * 1.001 + var hi = ke * 1000.0 + repeat(50) { + val mid = (lo + hi) / 2.0 + // eq(mid) decreases in mid and crosses 0 at the sought ka > ke: + // eq > 0 means the root lies above mid. + val eq = ln(mid / ke) - (mid - ke) * tMaxHours + if (eq > 0) lo = mid else hi = mid + } + return (lo + hi) / 2.0 + } + + fun batemanParams(treatment: Treatment): BatemanParams { + val ke = ln(2.0) / max(treatment.eliminationHalfLifeHours, 0.01f).toDouble() + val ka = computeKa( + max(treatment.eliminationHalfLifeHours, 0.01f).toDouble(), + max(treatment.absorptionHours, 0.01f).toDouble() + ) + return BatemanParams(ke, ka) + } + + fun doseEster(treatment: Treatment, dose: DoseLog): String = + dose.esterType ?: treatment.esterType + + fun concentrationOfDose( + treatment: Treatment, + dose: DoseLog, + queryTimeMs: Long, + bateman: BatemanParams? = null + ): Double { + val dtH = (queryTimeMs - dose.timestamp) / 3_600_000.0 + if (dtH <= 0.0) return 0.0 + + val mg = dose.doseAmount + if (mg <= 0.0) return 0.0 + + if (treatment.usesProfileModel) { + val ester = doseEster(treatment, dose) + if (ester != Esters.NONE) { + return PKProfileStore.sample(ester, treatment.pkModel, dtH) * mg + } + } + + // Bateman fallback (gel / patch / oral / custom) + val p = bateman ?: batemanParams(treatment) + val diff = p.ka - p.ke + val a = mg * treatment.bioavailabilityFraction.toDouble() + val c = if (abs(diff) < 1e-3) { + a * p.ke * dtH * exp(-p.ke * dtH) + } else { + (a * p.ka / diff) * (exp(-p.ke * dtH) - exp(-p.ka * dtH)) + } + return max(0.0, c) + } + + private fun cutoffHours(treatment: Treatment): Double { + val profileH = if (treatment.usesProfileModel) { + PKProfileStore.profileLength(treatment.esterType, treatment.pkModel).toDouble() + } else 0.0 + val batemanH = if (treatment.usesProfileModel) 0.0 + else 30.0 * treatment.eliminationHalfLifeHours.toDouble() + return max(profileH, batemanH).coerceAtLeast(24.0) + } + + // ------------------------------------------------------------------ + // Aggregated levels + // ------------------------------------------------------------------ + + fun e2At(treatments: List, doseLogs: List, tMs: Long): Double { + val batemanCache = HashMap() + var total = 0.0 + for (treatment in treatments) { + if (treatment.type != TreatmentType.ESTRADIOL) continue + if (!batemanCache.containsKey(treatment.id)) { + batemanCache[treatment.id] = batemanParams(treatment) + } + for (dose in doseLogs) { + if (dose.treatmentId != treatment.id || dose.timestamp > tMs) continue + val dtH = (tMs - dose.timestamp) / 3_600_000.0 + if (dtH > cutoffHours(treatment)) continue + val c = concentrationOfDose( + treatment, dose, tMs, batemanCache[treatment.id] + ) + if (c > 0.0) total += c * treatment.scaleFactor + } + } + return total + } + + fun testosteroneAt(e2Level: Double, config: TConfig): Double { + if (e2Level <= 0.0) return config.base + return config.floor + (config.base - config.floor) / (1.0 + config.k * e2Level) + } + + /** + * The T model works in ng/mL. Users enter labs in ng/mL, ng/dL, ng/L or nmol/L — + * normalize before display or calibration (45 ng/dL = 0.45 ng/mL). + */ + fun convertTToNgMl(value: Double, unit: String): Double { + val u = unit.lowercase().replace(" ", "") + return when { + u.contains("dl") -> value / 100.0 + u.contains("nmol") -> value * 0.2884 + u.contains("ng/l") || u.endsWith("/l") -> value / 1000.0 + else -> value + } + } + + fun levelAt( + treatments: List, + doseLogs: List, + tMs: Long, + tConfig: TConfig + ): LevelPoint { + val e2 = e2At(treatments, doseLogs, tMs) + return LevelPoint(tMs, e2, testosteroneAt(e2, tConfig)) + } + + fun currentLevel( + treatments: List, + doseLogs: List, + tConfig: TConfig, + nowMs: Long = System.currentTimeMillis() + ): LevelPoint = levelAt(treatments, doseLogs, nowMs, tConfig) + + fun computeCurve( + treatments: List, + doseLogs: List, + startMs: Long, + endMs: Long, + stepMs: Long = HOUR_MS, + tConfig: TConfig + ): List { + if (treatments.isEmpty() || doseLogs.isEmpty() || endMs <= startMs) return emptyList() + + val relevantTreatments = treatments.filter { tr -> + tr.type == TreatmentType.ESTRADIOL && doseLogs.any { it.treatmentId == tr.id } + } + if (relevantTreatments.isEmpty()) return emptyList() + + val earliestDose = doseLogs.minOf { it.timestamp } + val searchStart = maxOf(startMs, earliestDose) + + val batemanCache = HashMap() + relevantTreatments.forEach { batemanCache[it.id] = batemanParams(it) } + + val points = mutableListOf() + var t = searchStart + while (t <= endMs) { + var e2 = 0.0 + for (treatment in relevantTreatments) { + val cutoff = cutoffHours(treatment) + val p = batemanCache[treatment.id] + for (dose in doseLogs) { + if (dose.treatmentId != treatment.id || dose.timestamp > t) continue + val dtH = (t - dose.timestamp) / 3_600_000.0 + if (dtH > cutoff) continue + val c = concentrationOfDose(treatment, dose, t, p) + if (c > 0.0) e2 += c * treatment.scaleFactor + } + } + points.add(LevelPoint(t, e2, testosteroneAt(e2, tConfig))) + t += stepMs + } + return points + } + + // ------------------------------------------------------------------ + // Calibration from lab results + // ------------------------------------------------------------------ + + fun computeScaleFactor( + treatment: Treatment, + allDoseLogs: List, + e2Labs: List + ): Double? { + if (treatment.type != TreatmentType.ESTRADIOL) return null + val myDoses = allDoseLogs.filter { it.treatmentId == treatment.id } + if (myDoses.isEmpty()) return null + + val p = batemanParams(treatment) + val ratios = mutableListOf() + for (lab in e2Labs) { + var predicted = 0.0 + for (dose in myDoses) { + if (dose.timestamp > lab.timestamp) continue + val dtH = (lab.timestamp - dose.timestamp) / 3_600_000.0 + if (dtH > cutoffHours(treatment)) continue + predicted += concentrationOfDose(treatment, dose, lab.timestamp, p) + } + if (predicted > 0.5) { + ratios.add(lab.value / predicted) + } + } + if (ratios.isEmpty()) return null + ratios.sort() + val median = if (ratios.size % 2 == 1) { + ratios[ratios.size / 2] + } else { + (ratios[ratios.size / 2 - 1] + ratios[ratios.size / 2]) / 2.0 + } + return (median * 100).toInt() / 100.0 + } + + fun computeTConfigCalibration( + tLabs: List, + treatments: List, + doseLogs: List, + current: TConfig + ): TConfig? { + val usable = tLabs + .filter { it.value > current.floor + 0.02 } + .map { it.copy(value = convertTToNgMl(it.value, it.unit)) } + .filter { it.value > current.floor + 0.02 } + if (usable.isEmpty()) return null + + val ks = mutableListOf() + for (lab in usable) { + val e2 = e2At(treatments, doseLogs, lab.timestamp) + if (e2 <= 1.0) continue + val k = ((current.base - current.floor) / (lab.value - current.floor) - 1.0) / e2 + if (k > 1e-4 && k < 10.0) ks.add(k) + } + if (ks.isEmpty()) return null + ks.sort() + val median = if (ks.size % 2 == 1) { + ks[ks.size / 2] + } else { + (ks[ks.size / 2 - 1] + ks[ks.size / 2]) / 2.0 + } + return current.copy(k = (median * 1000).toInt() / 1000.0) + } + + fun nextReminderFireMs(treatments: List, nowMs: Long = System.currentTimeMillis()): Long? { + var next: Long? = null + val cal = java.util.Calendar.getInstance() + for (tr in treatments) { + if (!tr.reminderEnabled) continue + val h = tr.reminderHour ?: continue + val m = tr.reminderMinute ?: continue + cal.timeInMillis = nowMs + cal.set(java.util.Calendar.HOUR_OF_DAY, h) + cal.set(java.util.Calendar.MINUTE, m) + cal.set(java.util.Calendar.SECOND, 0) + cal.set(java.util.Calendar.MILLISECOND, 0) + if (cal.timeInMillis <= nowMs) cal.add(java.util.Calendar.DAY_OF_MONTH, 1) + val fire = cal.timeInMillis + if (next == null || fire < next) next = fire + } + return next + } + + fun isInjectionRoute(route: AdministrationRoute): Boolean = + route == AdministrationRoute.INJECTION_IM || route == AdministrationRoute.INJECTION_SUBCUT +} diff --git a/app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt b/app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt new file mode 100644 index 0000000..f17ee09 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt @@ -0,0 +1,46 @@ +package com.hormonetrack.reminder + +import android.app.NotificationManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.hormonetrack.data.AppDatabase +import com.hormonetrack.data.model.DoseLog +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class DoseActionReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + val treatmentId = intent.getLongExtra(ReminderContract.EXTRA_TREATMENT_ID, -1L) + if (treatmentId <= 0) return + + val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + nm.cancel(treatmentId.toInt()) + + when (intent.action) { + ReminderContract.ACTION_LOG_DOSE -> { + val name = intent.getStringExtra(ReminderContract.EXTRA_TREATMENT_NAME) ?: "" + val dose = intent.getDoubleExtra(ReminderContract.EXTRA_DOSE_AMOUNT, 0.0) + val pending = goAsync() + CoroutineScope(SupervisorJob() + Dispatchers.IO).launch { + try { + val db = AppDatabase.getInstance(context) + val treatment = db.treatmentDao().getById(treatmentId) ?: return@launch + val amount = if (dose > 0.0) dose else treatment.doseAmount + db.doseLogDao().insert(DoseLog(treatmentId = treatmentId, doseAmount = amount)) + } finally { + pending.finish() + } + } + } + ReminderContract.ACTION_SNOOZE -> { + val name = intent.getStringExtra(ReminderContract.EXTRA_TREATMENT_NAME) ?: "" + val dose = intent.getDoubleExtra(ReminderContract.EXTRA_DOSE_AMOUNT, 0.0) + AlarmScheduler(context).scheduleSnooze(treatmentId, name, dose) + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt b/app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt new file mode 100644 index 0000000..f0d194c --- /dev/null +++ b/app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt @@ -0,0 +1,222 @@ +package com.hormonetrack.reminder + +import android.app.AlarmManager +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import androidx.core.app.NotificationCompat +import com.hormonetrack.MainActivity +import com.hormonetrack.R +import com.hormonetrack.data.AppDatabase +import com.hormonetrack.data.model.Treatment +import java.util.Calendar + +object ReminderContract { + const val CHANNEL_ID = "hormonetrack_reminders" + const val ACTION_REMINDER = "com.hormonetrack.ACTION_REMINDER" + const val ACTION_LOG_DOSE = "com.hormonetrack.ACTION_LOG_DOSE" + const val ACTION_SNOOZE = "com.hormonetrack.ACTION_SNOOZE" + const val EXTRA_TREATMENT_ID = "treatment_id" + const val EXTRA_TREATMENT_NAME = "treatment_name" + const val EXTRA_DOSE_AMOUNT = "dose_amount" + + fun reminderIntent(context: Context, treatmentId: Long): Intent = + Intent(context, ReminderReceiver::class.java).apply { + action = ACTION_REMINDER + putExtra(EXTRA_TREATMENT_ID, treatmentId) + } +} + +fun createNotificationChannel(context: Context) { + val channel = NotificationChannel( + ReminderContract.CHANNEL_ID, + context.getString(R.string.notification_channel_name), + NotificationManager.IMPORTANCE_HIGH + ).apply { + description = context.getString(R.string.notification_channel_desc) + } + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + manager.createNotificationChannel(channel) +} + +class AlarmScheduler(private val context: Context) { + + private val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + + private fun pendingBroadcast(treatmentId: Long, name: String?, dose: Double?): PendingIntent { + val intent = ReminderContract.reminderIntent(context, treatmentId) + name?.let { intent.putExtra(ReminderContract.EXTRA_TREATMENT_NAME, it) } + dose?.let { intent.putExtra(ReminderContract.EXTRA_DOSE_AMOUNT, it) } + return PendingIntent.getBroadcast( + context, + treatmentId.toInt(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } + + private fun nextOccurrence(hour: Int, minute: Int): Long { + val cal = Calendar.getInstance().apply { + set(Calendar.HOUR_OF_DAY, hour) + set(Calendar.MINUTE, minute) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + } + if (cal.timeInMillis <= System.currentTimeMillis()) { + cal.add(Calendar.DAY_OF_MONTH, 1) + } + return cal.timeInMillis + } + + fun canScheduleExact(): Boolean = + Build.VERSION.SDK_INT < Build.VERSION_CODES.S || alarmManager.canScheduleExactAlarms() + + fun scheduleDaily(treatment: Treatment): Boolean { + val hour = treatment.reminderHour ?: return false + val minute = treatment.reminderMinute ?: return false + val triggerAt = nextOccurrence(hour, minute) + val pi = pendingBroadcast(treatment.id, treatment.name, treatment.doseAmount) + return scheduleAt(triggerAt, pi) + } + + fun scheduleSnooze(treatmentId: Long, name: String, dose: Double, delayMs: Long = 60 * 60_000L): Boolean { + val pi = pendingBroadcast(treatmentId, name, dose) + return scheduleAt(System.currentTimeMillis() + delayMs, pi) + } + + private fun scheduleAt(triggerAt: Long, pi: PendingIntent): Boolean { + val canExact = canScheduleExact() + if (canExact) { + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, triggerAt, pi + ) + } else { + alarmManager.setWindow( + AlarmManager.RTC_WAKEUP, triggerAt, 10 * 60_000L, pi + ) + } + return canExact + } + + fun cancel(treatmentId: Long) { + val pi = PendingIntent.getBroadcast( + context, + treatmentId.toInt(), + ReminderContract.reminderIntent(context, treatmentId), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + alarmManager.cancel(pi) + } + + fun rescheduleAll(treatments: List) { + treatments.forEach { tr -> + if (tr.reminderEnabled) { + scheduleDaily(tr) + } else { + cancel(tr.id) + } + } + } +} + +class ReminderReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action != ReminderContract.ACTION_REMINDER) return + createNotificationChannel(context) + + val treatmentId = intent.getLongExtra(ReminderContract.EXTRA_TREATMENT_ID, -1L) + if (treatmentId <= 0) return + val name = intent.getStringExtra(ReminderContract.EXTRA_TREATMENT_NAME) ?: "" + val dose = if (intent.hasExtra(ReminderContract.EXTRA_DOSE_AMOUNT)) { + intent.getDoubleExtra(ReminderContract.EXTRA_DOSE_AMOUNT, 0.0) + } else null + + // Open the app on the Home screen + val openIntent = Intent(context, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + putExtra("open_log_dose", true) + putExtra(ReminderContract.EXTRA_TREATMENT_ID, treatmentId) + } + val openPi = PendingIntent.getActivity( + context, + (treatmentId * 10 + 0).toInt(), + openIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + // Action: log the dose immediately + val logIntent = Intent(context, DoseActionReceiver::class.java).apply { + action = ReminderContract.ACTION_LOG_DOSE + putExtra(ReminderContract.EXTRA_TREATMENT_ID, treatmentId) + putExtra(ReminderContract.EXTRA_TREATMENT_NAME, name) + putExtra(ReminderContract.EXTRA_DOSE_AMOUNT, dose) + } + val logPi = PendingIntent.getBroadcast( + context, + (treatmentId * 10 + 1).toInt(), + logIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + // Action: snooze 1 hour + val snoozeIntent = Intent(context, DoseActionReceiver::class.java).apply { + action = ReminderContract.ACTION_SNOOZE + putExtra(ReminderContract.EXTRA_TREATMENT_ID, treatmentId) + putExtra(ReminderContract.EXTRA_TREATMENT_NAME, name) + putExtra(ReminderContract.EXTRA_DOSE_AMOUNT, dose) + } + val snoozePi = PendingIntent.getBroadcast( + context, + (treatmentId * 10 + 2).toInt(), + snoozeIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + val title = if (name.isNotBlank()) { + context.getString(R.string.reminder_title, name) + } else { + context.getString(R.string.reminder_title_plain) + } + val text = if (dose != null && dose > 0.0) { + context.getString(R.string.reminder_text_with_dose, dose) + } else { + context.getString(R.string.reminder_text) + } + + val notification = NotificationCompat.Builder(context, ReminderContract.CHANNEL_ID) + .setSmallIcon(R.drawable.ic_notification) + .setContentTitle(title) + .setContentText(text) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setCategory(NotificationCompat.CATEGORY_REMINDER) + .setContentIntent(openPi) + .addAction(0, context.getString(R.string.action_taken), logPi) + .addAction(0, context.getString(R.string.action_snooze_1h), snoozePi) + .setAutoCancel(true) + .build() + + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + manager.notify(treatmentId.toInt(), notification) + } +} + +class BootReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action != Intent.ACTION_BOOT_COMPLETED) return + val result = goAsync() + Thread { + try { + val treatments = kotlinx.coroutines.runBlocking { + AppDatabase.getInstance(context).treatmentDao().getActiveOnce() + } + AlarmScheduler(context).rescheduleAll(treatments) + } finally { + result.finish() + } + }.start() + } +} diff --git a/app/src/main/java/com/hormonetrack/settings/AppSettings.kt b/app/src/main/java/com/hormonetrack/settings/AppSettings.kt new file mode 100644 index 0000000..cc555fb --- /dev/null +++ b/app/src/main/java/com/hormonetrack/settings/AppSettings.kt @@ -0,0 +1,50 @@ +package com.hormonetrack.settings + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.doublePreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import com.hormonetrack.pk.TConfig +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +val Context.dataStore: DataStore by preferencesDataStore(name = "settings") + +class AppSettings(private val context: Context) { + + private object Keys { + val T_BASE = doublePreferencesKey("t_base") + val T_FLOOR = doublePreferencesKey("t_floor") + val T_K = doublePreferencesKey("t_k") + val LANGUAGE = stringPreferencesKey("language") + } + + val tConfig: Flow = context.dataStore.data.map { prefs -> + TConfig( + base = prefs[Keys.T_BASE] ?: 6.0, + floor = prefs[Keys.T_FLOOR] ?: 0.2, + k = prefs[Keys.T_K] ?: 0.19 + ) + } + + val language: Flow = context.dataStore.data.map { prefs -> + prefs[Keys.LANGUAGE] ?: "system" + } + + suspend fun setTConfig(config: TConfig) { + context.dataStore.edit { prefs -> + prefs[Keys.T_BASE] = config.base + prefs[Keys.T_FLOOR] = config.floor + prefs[Keys.T_K] = config.k + } + } + + suspend fun setLanguage(code: String) { + context.dataStore.edit { prefs -> + prefs[Keys.LANGUAGE] = code + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt b/app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt new file mode 100644 index 0000000..8abf87e --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt @@ -0,0 +1,115 @@ +package com.hormonetrack.ui + +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Medication +import androidx.compose.material.icons.filled.Science +import androidx.compose.material.icons.filled.ShowChart +import androidx.compose.material.icons.filled.Tune +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import com.hormonetrack.AppContainer +import com.hormonetrack.R +import com.hormonetrack.ui.screens.ChartScreen +import com.hormonetrack.ui.screens.DosesScreen +import com.hormonetrack.ui.screens.HomeScreen +import com.hormonetrack.ui.screens.LabsScreen +import com.hormonetrack.ui.screens.SettingsScreen +import com.hormonetrack.ui.screens.TreatmentEditorScreen +import com.hormonetrack.ui.screens.TreatmentsScreen + +val LocalAppContainer = compositionLocalOf { + error("AppContainer not provided") +} + +private data class TabItem(val route: String, val labelRes: Int, val icon: androidx.compose.ui.graphics.vector.ImageVector) + +@Composable +fun HormoneTrackRoot(initialOpenLogDose: Boolean, initialTreatmentId: Long) { + val app = androidx.compose.ui.platform.LocalContext.current.applicationContext as com.hormonetrack.HormoneTrackApp + CompositionLocalProvider(LocalAppContainer provides app.container) { + val navController = rememberNavController() + val tabs = listOf( + TabItem("home", R.string.nav_home, Icons.Filled.Home), + TabItem("chart", R.string.nav_chart, Icons.Filled.ShowChart), + TabItem("doses", R.string.nav_doses, Icons.Filled.Medication), + TabItem("labs", R.string.nav_labs, Icons.Filled.Science), + TabItem("treatments", R.string.nav_treatments, Icons.Filled.Tune) + ) + val backStack by navController.currentBackStackEntryAsState() + val currentRoute = backStack?.destination?.route + + Scaffold( + bottomBar = { + if (currentRoute in tabs.map { it.route }) { + NavigationBar { + tabs.forEach { tab -> + NavigationBarItem( + selected = currentRoute == tab.route, + onClick = { + navController.navigate(tab.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + }, + icon = { Icon(tab.icon, contentDescription = stringResource(tab.labelRes)) }, + label = { Text(stringResource(tab.labelRes)) } + ) + } + } + } + } + ) { padding -> + NavHost( + navController = navController, + startDestination = "home", + modifier = Modifier.padding(padding) + ) { + composable("home") { + HomeScreen( + openLogDoseForTreatmentId = if (initialOpenLogDose) initialTreatmentId else null, + onOpenSettings = { navController.navigate("settings") }, + onOpenTreatment = { id -> navController.navigate("treatment_edit/$id") } + ) + } + composable("chart") { ChartScreen() } + composable("doses") { DosesScreen() } + composable("labs") { LabsScreen() } + composable("treatments") { + TreatmentsScreen( + onEdit = { id -> navController.navigate("treatment_edit/$id") }, + onNew = { navController.navigate("treatment_edit/-1") } + ) + } + composable("settings") { + SettingsScreen(onBack = { navController.popBackStack() }) + } + composable("treatment_edit/{id}") { entry -> + val id = entry.arguments?.getString("id")?.toLongOrNull() ?: -1L + TreatmentEditorScreen( + treatmentId = id, + onDone = { navController.popBackStack() } + ) + } + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt b/app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt new file mode 100644 index 0000000..fa27cb6 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt @@ -0,0 +1,231 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.Canvas +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.PathEffect +import androidx.compose.ui.graphics.drawscope.DrawScope +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.graphics.nativeCanvas +import androidx.compose.ui.unit.dp +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.pk.LevelPoint +import com.hormonetrack.ui.theme.ChartE2 +import com.hormonetrack.ui.theme.ChartT +import com.hormonetrack.ui.theme.LabDot +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import kotlin.math.ceil + +data class ChartOptions( + val showT: Boolean = true, + val showLabs: Boolean = true, + val nowMs: Long = System.currentTimeMillis() +) + +fun niceCeil(value: Double): Double { + if (value <= 0) return 100.0 + val exp = Math.pow(10.0, Math.floor(Math.log10(value))) + val f = value / exp + val nice = when { + f <= 1 -> 1.0 + f <= 2 -> 2.0 + f <= 2.5 -> 2.5 + f <= 5 -> 5.0 + else -> 10.0 + } + return nice * exp +} + +@Composable +fun CurveChart( + points: List, + e2Labs: List, + tLabs: List, + options: ChartOptions, + modifier: Modifier +) { + val gridColor = MaterialTheme.colorScheme.outlineVariant + val labelColor = MaterialTheme.colorScheme.onSurfaceVariant + val nowLineColor = MaterialTheme.colorScheme.tertiary + + Canvas(modifier = modifier) { + if (points.size < 2) return@Canvas + val padLeft = 42.dp.toPx() + val padRight = 42.dp.toPx() + val padTop = 12.dp.toPx() + val padBottom = 26.dp.toPx() + + val w = size.width - padLeft - padRight + val h = size.height - padTop - padBottom + if (w <= 0 || h <= 0) return@Canvas + + val t0 = points.first().timestamp + val t1 = points.last().timestamp + if (t1 <= t0) return@Canvas + + val e2DataMax = maxOf( + points.maxOf { it.e2 }, + if (options.showLabs) e2Labs.maxOfOrNull { it.value } ?: 0.0 else 0.0 + ) + val e2Max = niceCeil(maxOf(e2DataMax, 50.0)) + val tDataMax = maxOf( + points.maxOf { it.t }, + if (options.showLabs) { + tLabs.maxOfOrNull { com.hormonetrack.pk.PharmacokineticEngine.convertTToNgMl(it.value, it.unit) } ?: 0.0 + } else 0.0 + ) + val tMax = niceCeil(tDataMax * 1.1) + + fun xOf(ms: Long): Float = padLeft + w * ((ms - t0).toFloat() / (t1 - t0).toFloat()) + fun yE2(v: Double): Float = padTop + h * (1f - (v / e2Max).toFloat()) + fun yT(v: Double): Float = padTop + h * (1f - (v / tMax).toFloat()) + + drawGrid(gridColor, padLeft, padTop, w, h, rows = 4) + drawLeftYLabels(labelColor, e2Max, padLeft, padTop, h) + if (options.showT) drawRightYLabels(labelColor, tMax, padLeft + w, padTop, h) + drawXLabels(labelColor, t0, t1, padLeft, padTop + h, w) + + val path = Path() + points.forEachIndexed { i, p -> + val x = xOf(p.timestamp) + val y = yE2(p.e2) + if (i == 0) path.moveTo(x, y) else path.lineTo(x, y) + } + drawPath(path, ChartE2, style = Stroke(width = 2.5.dp.toPx())) + + if (options.showT) { + val tPath = Path() + points.forEachIndexed { i, p -> + val x = xOf(p.timestamp) + val y = yT(p.t) + if (i == 0) tPath.moveTo(x, y) else tPath.lineTo(x, y) + } + drawPath( + tPath, ChartT, + style = Stroke( + width = 2.dp.toPx(), + pathEffect = PathEffect.dashPathEffect(floatArrayOf(12f, 10f)) + ) + ) + } + + if (options.showLabs) { + e2Labs.forEach { lab -> + if (lab.timestamp in t0..t1) { + val c = Offset(xOf(lab.timestamp), yE2(lab.value)) + drawCircle(LabDot, radius = 5.dp.toPx(), center = c) + drawDotLabel(lab.value, Offset(c.x, c.y - 10.dp.toPx())) + } + } + tLabs.forEach { lab -> + if (lab.timestamp in t0..t1) { + // labs may be in ng/dL or nmol/L: normalize to the model's ng/mL + val tVal = com.hormonetrack.pk.PharmacokineticEngine.convertTToNgMl(lab.value, lab.unit) + val c = Offset(xOf(lab.timestamp), yT(tVal)) + drawRect( + LabDot, + topLeft = Offset(c.x - 4.dp.toPx(), c.y - 4.dp.toPx()), + size = Size(8.dp.toPx(), 8.dp.toPx()) + ) + drawDotLabel(tVal, Offset(c.x, c.y - 10.dp.toPx())) + } + } + } + + if (options.nowMs in t0..t1) { + drawLine( + nowLineColor, + Offset(xOf(options.nowMs), padTop), + Offset(xOf(options.nowMs), padTop + h), + strokeWidth = 1.5.dp.toPx() + ) + } + } +} + +private fun DrawScope.drawGrid(color: Color, padLeft: Float, padTop: Float, w: Float, h: Float, rows: Int) { + for (i in 0..rows) { + val y = padTop + h * i / rows + drawLine(color, Offset(padLeft, y), Offset(padLeft + w, y), strokeWidth = 1f) + } +} + +private fun DrawScope.labelPaint(align: android.graphics.Paint.Align): android.graphics.Paint { + val c = Color(0xFF6B7280) + return android.graphics.Paint().apply { + color = android.graphics.Color.argb( + (c.alpha * 255).toInt(), + (c.red * 255).toInt(), + (c.green * 255).toInt(), + (c.blue * 255).toInt() + ) + textSize = 10.dp.toPx() + textAlign = align + isAntiAlias = true + } +} + +private fun DrawScope.drawLeftYLabels(color: Color, e2Max: Double, padLeft: Float, padTop: Float, h: Float) { + val paint = labelPaint(android.graphics.Paint.Align.RIGHT) + for (i in 0..4) { + val v = e2Max * i / 4 + val y = padTop + h * (1f - i / 4f) + drawContext.canvas.nativeCanvas.drawText(formatValue(v), padLeft - 6.dp.toPx(), y + 4.dp.toPx(), paint) + } +} + +private fun DrawScope.drawRightYLabels(color: Color, tMax: Double, xRight: Float, padTop: Float, h: Float) { + val paint = labelPaint(android.graphics.Paint.Align.LEFT) + for (i in 0..4) { + val v = tMax * i / 4 + val y = padTop + h * (1f - i / 4f) + drawContext.canvas.nativeCanvas.drawText(formatValue(v), xRight + 6.dp.toPx(), y + 4.dp.toPx(), paint) + } +} + +private fun DrawScope.drawXLabels( + color: Color, t0: Long, t1: Long, + padLeft: Float, yBottom: Float, w: Float +) { + val paint = labelPaint(android.graphics.Paint.Align.CENTER) + val spanH = (t1 - t0) / 3_600_000.0 + val stepHours = when { + spanH <= 25 -> 6 + spanH <= 25 * 7 -> 24 + else -> 24 * 5 + } + val fmt = if (spanH <= 25) SimpleDateFormat("HH'h'", Locale.getDefault()) + else SimpleDateFormat("dd/MM", Locale.getDefault()) + var tick = ceil(t0 / (stepHours * 3_600_000.0)).toLong() * stepHours * 3_600_000L + while (tick <= t1) { + val x = padLeft + w * ((tick - t0).toFloat() / (t1 - t0).toFloat()) + drawContext.canvas.nativeCanvas.drawText(fmt.format(Date(tick)), x, yBottom + 16.dp.toPx(), paint) + tick += stepHours * 3_600_000L + } +} + +private fun DrawScope.drawDotLabel(v: Double, c: Offset) { + val paint = labelPaint(android.graphics.Paint.Align.CENTER).apply { + color = android.graphics.Color.rgb( + (LabDot.red * 255).toInt(), + (LabDot.green * 255).toInt(), + (LabDot.blue * 255).toInt() + ) + textSize = 9.dp.toPx() + isFakeBoldText = true + } + drawContext.canvas.nativeCanvas.drawText(formatValue(v), c.x, c.y, paint) +} + +private fun formatValue(v: Double): String = when { + v >= 10 -> "%.0f".format(Locale.US, v) + v >= 1 -> "%.1f".format(Locale.US, v) + else -> "%.2f".format(Locale.US, v) +} diff --git a/app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt b/app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt new file mode 100644 index 0000000..5dd4984 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt @@ -0,0 +1,103 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TimePicker +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.material3.rememberTimePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import java.text.SimpleDateFormat +import java.time.Instant +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.ZoneId +import java.util.Date +import java.util.Locale + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DateTimeField( + label: String, + value: LocalDateTime, + onChange: (LocalDateTime) -> Unit, + modifier: Modifier = Modifier +) { + val fmtDate = remember { SimpleDateFormat("EEE dd MMM yyyy", Locale.getDefault()) } + var showDate by remember { mutableStateOf(false) } + var showTime by remember { mutableStateOf(false) } + + Row(modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = { showDate = true }) { + Text(fmtDate.format(Date.from(value.atZone(ZoneId.systemDefault()).toInstant()))) + } + Button(onClick = { showTime = true }) { + Text(String.format(Locale.getDefault(), "%02d:%02d", value.hour, value.minute)) + } + } + + if (showDate) { + val state = rememberDatePickerState( + initialSelectedDateMillis = value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + ) + DatePickerDialog( + onDismissRequest = { showDate = false }, + confirmButton = { + TextButton(onClick = { + state.selectedDateMillis?.let { ms -> + val d = Instant.ofEpochMilli(ms).atZone(ZoneId.systemDefault()).toLocalDate() + onChange(LocalDateTime.of(d, value.toLocalTime())) + } + showDate = false + }) { Text(stringResource(R.string.ok)) } + }, + dismissButton = { + TextButton(onClick = { showDate = false }) { Text(stringResource(R.string.cancel)) } + } + ) { + DatePicker(state = state) + } + } + + if (showTime) { + val state = rememberTimePickerState( + initialHour = value.hour, + initialMinute = value.minute, + is24Hour = true + ) + DatePickerDialog( + onDismissRequest = { showTime = false }, + confirmButton = { + TextButton(onClick = { + onChange(LocalDateTime.of(value.toLocalDate(), LocalTime.of(state.hour, state.minute))) + showTime = false + }) { Text(stringResource(R.string.ok)) } + }, + dismissButton = { + TextButton(onClick = { showTime = false }) { Text(stringResource(R.string.cancel)) } + } + ) { + TimePicker(state = state) + } + } +} + +fun localDateTimeFromMs(ms: Long): LocalDateTime = + Instant.ofEpochMilli(ms).atZone(ZoneId.systemDefault()).toLocalDateTime() + +fun msFromLocalDateTime(dt: LocalDateTime): Long = + dt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() diff --git a/app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt b/app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt new file mode 100644 index 0000000..ecbe967 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt @@ -0,0 +1,182 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.Treatment + +/** + * Create-or-edit dose dialog. + * existing == null → create mode (preselectedTreatmentId used); + * existing != null → edit mode: prefills amount/time/notes/ester and calls onConfirmEdit. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DoseDialog( + treatments: List, + preselectedTreatmentId: Long? = null, + existing: DoseLog? = null, + onDismiss: () -> Unit, + onConfirmCreate: (treatment: Treatment, amount: Double, timestampMs: Long, notes: String?, esterOverride: String?) -> Unit, + onConfirmEdit: (DoseLog) -> Unit +) { + val isEdit = existing != null + var selectedId by remember(existing, preselectedTreatmentId) { + mutableStateOf( + existing?.treatmentId + ?: preselectedTreatmentId?.takeIf { id -> treatments.any { it.id == id } } + ?: treatments.firstOrNull()?.id + ) + } + val selected = treatments.firstOrNull { it.id == selectedId } + var amountText by remember(selected, existing) { + mutableStateOf(formatDose(existing?.doseAmount ?: selected?.doseAmount ?: 0.0)) + } + var dateTime by remember(existing) { + mutableStateOf( + existing?.let { localDateTimeFromMs(it.timestamp) } ?: java.time.LocalDateTime.now() + ) + } + var notes by remember(existing) { mutableStateOf(existing?.notes ?: "") } + var esterOverride by remember(existing, selected) { + mutableStateOf(existing?.esterType) + } + var expanded by remember { mutableStateOf(false) } + var esterExpanded by remember { mutableStateOf(false) } + + if (treatments.isEmpty()) { + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.ok)) } }, + title = { Text(stringResource(R.string.add_dose)) }, + text = { Text(stringResource(R.string.no_treatment_hint)) } + ) + return + } + + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { + val tr = selected ?: return@TextButton + val amount = amountText.replace(',', '.').toDoubleOrNull() ?: return@TextButton + if (isEdit && existing != null) { + onConfirmEdit( + existing.copy( + treatmentId = tr.id, + timestamp = msFromLocalDateTime(dateTime), + doseAmount = amount, + notes = notes.ifBlank { null }, + esterType = esterOverride + ) + ) + } else { + onConfirmCreate(tr, amount, msFromLocalDateTime(dateTime), notes.ifBlank { null }, esterOverride) + } + }) { Text(stringResource(R.string.save)) } + }, + dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.cancel)) } }, + title = { + Text(stringResource(if (isEdit) R.string.edit_dose else R.string.add_dose)) + }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) { + OutlinedTextField( + value = selected?.name ?: "", + onValueChange = {}, + readOnly = true, + label = { Text(stringResource(R.string.treatment_name)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + treatments.forEach { tr -> + DropdownMenuItem( + text = { Text("${tr.name} · ${formatDose(tr.doseAmount)} ${tr.doseUnit}") }, + onClick = { + selectedId = tr.id + esterOverride = null + expanded = false + } + ) + } + } + } + if (selected?.usesProfileModel == true) { + ExposedDropdownMenuBox(expanded = esterExpanded, onExpandedChange = { esterExpanded = it }) { + OutlinedTextField( + value = esterOverride?.let { esterLabel(it) } + ?: stringResource(R.string.ester_default, selected.esterType), + onValueChange = {}, + readOnly = true, + label = { Text(stringResource(R.string.ester)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = esterExpanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = esterExpanded, onDismissRequest = { esterExpanded = false }) { + DropdownMenuItem( + text = { Text(stringResource(R.string.ester_default, selected.esterType)) }, + onClick = { esterOverride = null; esterExpanded = false } + ) + listOf(Esters.EV, Esters.EU, Esters.EEN).forEach { e -> + DropdownMenuItem( + text = { Text(esterLabel(e)) }, + onClick = { esterOverride = e; esterExpanded = false } + ) + } + } + } + } + OutlinedTextField( + value = amountText, + onValueChange = { amountText = it }, + label = { Text(stringResource(R.string.dose_amount) + (selected?.let { " (${it.doseUnit})" } ?: "")) }, + modifier = Modifier.fillMaxWidth() + ) + DateTimeField( + label = stringResource(R.string.dose_time), + value = dateTime, + onChange = { dateTime = it }, + modifier = Modifier + ) + OutlinedTextField( + value = notes, + onValueChange = { notes = it }, + label = { Text(stringResource(R.string.dose_notes)) }, + modifier = Modifier.fillMaxWidth() + ) + } + } + ) +} + +private fun esterLabel(ester: String): String = when (ester) { + Esters.EV -> "EV — valerate" + Esters.EU -> "EU — undecylate" + Esters.EEN -> "EEn — enanthate" + else -> ester +} + +fun formatDose(d: Double): String = + if (d == d.toLong().toDouble()) d.toLong().toString() else "%.1f".format(d) diff --git a/app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt b/app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt new file mode 100644 index 0000000..6bd3505 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt @@ -0,0 +1,104 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.LabResult + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LabDialog( + onDismiss: () -> Unit, + onConfirm: (marker: String, value: Double, unit: String, timestampMs: Long, notes: String) -> Unit +) { + val markerSuggestions = listOf("E2", "T", "PRL") + val unitSuggestions = listOf("pg/mL", "ng/mL", "ng/dL", "mIU/L") + + var marker by remember { mutableStateOf("E2") } + var markerExpanded by remember { mutableStateOf(false) } + var valueText by remember { mutableStateOf("") } + var unit by remember { mutableStateOf("pg/mL") } + var unitExpanded by remember { mutableStateOf(false) } + var dateTime by remember { mutableStateOf(java.time.LocalDateTime.now()) } + var notes by remember { mutableStateOf("") } + + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { + val v = valueText.replace(',', '.').toDoubleOrNull() ?: return@TextButton + onConfirm(marker.trim().uppercase(), v, unit, msFromLocalDateTime(dateTime), notes) + }) { Text(stringResource(R.string.save)) } + }, + dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.cancel)) } }, + title = { Text(stringResource(R.string.add_lab)) }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + ExposedDropdownMenuBox(expanded = markerExpanded, onExpandedChange = { markerExpanded = it }) { + OutlinedTextField( + value = marker, + onValueChange = { marker = it }, + label = { Text(stringResource(R.string.lab_marker)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = markerExpanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = markerExpanded, onDismissRequest = { markerExpanded = false }) { + markerSuggestions.forEach { s -> + DropdownMenuItem(text = { Text(s) }, onClick = { marker = s; markerExpanded = false }) + } + } + } + OutlinedTextField( + value = valueText, + onValueChange = { valueText = it }, + label = { Text(stringResource(R.string.lab_value)) }, + modifier = Modifier.fillMaxWidth() + ) + ExposedDropdownMenuBox(expanded = unitExpanded, onExpandedChange = { unitExpanded = it }) { + OutlinedTextField( + value = unit, + onValueChange = { unit = it }, + label = { Text(stringResource(R.string.lab_unit)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = unitExpanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = unitExpanded, onDismissRequest = { unitExpanded = false }) { + unitSuggestions.forEach { s -> + DropdownMenuItem(text = { Text(s) }, onClick = { unit = s; unitExpanded = false }) + } + } + } + DateTimeField( + label = stringResource(R.string.lab_date), + value = dateTime, + onChange = { dateTime = it }, + modifier = Modifier + ) + OutlinedTextField( + value = notes, + onValueChange = { notes = it }, + label = { Text(stringResource(R.string.dose_notes)) }, + modifier = Modifier.fillMaxWidth() + ) + } + } + ) +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt new file mode 100644 index 0000000..48bc776 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt @@ -0,0 +1,158 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.pk.LevelPoint +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.pk.TConfig +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.ChartOptions +import com.hormonetrack.ui.components.CurveChart +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ChartScreen() { + val container = LocalAppContainer.current + val repo = container.repository + val treatments by repo.activeTreatments.collectAsState(initial = emptyList()) + val doseLogs by repo.allDoseLogs.collectAsState(initial = emptyList()) + val labResults by repo.allLabResults.collectAsState(initial = emptyList()) + val tConfig by container.settings.tConfig.collectAsState(initial = TConfig()) + + var rangeHours by remember { mutableLongStateOf(24L) } + var showT by remember { mutableStateOf(true) } + var showLabs by remember { mutableStateOf(true) } + + val curve by produceState>(emptyList(), treatments, doseLogs, tConfig, rangeHours) { + withContext(Dispatchers.Default) { + val end = System.currentTimeMillis() + value = PharmacokineticEngine.computeCurve( + treatments, doseLogs, + startMs = end - rangeHours * 3_600_000L, + endMs = end, + tConfig = tConfig + ) + } + } + + val (a, b) = if (curve.size >= 2) { + curve.first().timestamp to curve.last().timestamp + } else 0L to 0L + val e2Labs = labResults.filter { it.marker.equals("E2", true) && it.timestamp in a..b } + val tLabs = labResults.filter { it.marker.equals("T", true) && it.timestamp in a..b } + + Column( + Modifier + .fillMaxSize() + .padding(16.dp) + ) { + TopAppBar( + title = { Text(stringResource(R.string.nav_chart)) } + ) + + Spacer(Modifier.height(8.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + FilterChip( + selected = rangeHours == 24L, + onClick = { rangeHours = 24L }, + label = { Text(stringResource(R.string.chart_24h)) } + ) + FilterChip( + selected = rangeHours == 24L * 7, + onClick = { rangeHours = 24L * 7 }, + label = { Text(stringResource(R.string.chart_7j)) } + ) + FilterChip( + selected = rangeHours == 24L * 30, + onClick = { rangeHours = 24L * 30 }, + label = { Text(stringResource(R.string.chart_30j)) } + ) + } + + Spacer(Modifier.height(8.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + FilterChip( + selected = showT, + onClick = { showT = !showT }, + label = { Text("T") } + ) + FilterChip( + selected = showLabs, + onClick = { showLabs = !showLabs }, + label = { Text(stringResource(R.string.show_labs)) } + ) + } + + Spacer(Modifier.height(12.dp)) + + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + if (curve.isEmpty()) { + Text( + stringResource(R.string.no_data), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(vertical = 32.dp) + ) + } else { + CurveChart( + points = curve, + e2Labs = e2Labs, + tLabs = tLabs, + options = ChartOptions(showT = showT, showLabs = showLabs), + modifier = Modifier + .fillMaxWidth() + .height(320.dp) + ) + Spacer(Modifier.height(8.dp)) + Text( + stringResource(R.string.legend_e2), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.primary + ) + if (showT) { + Text( + stringResource(R.string.legend_t), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.secondary + ) + } + if (showLabs) { + Text( + stringResource(R.string.legend_labs), + style = MaterialTheme.typography.labelMedium, + color = com.hormonetrack.ui.theme.LabDot + ) + } + } + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt new file mode 100644 index 0000000..43d6776 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt @@ -0,0 +1,181 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.DoseDialog +import com.hormonetrack.ui.components.formatDose +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DosesScreen() { + val container = LocalAppContainer.current + val repo = container.repository + val doseLogs by repo.allDoseLogs.collectAsState(initial = emptyList()) + val treatments by repo.allTreatments.collectAsState(initial = emptyList()) + val treatmentMap = remember(treatments) { treatments.associateBy { it.id } } + + var showLogDialog by remember { mutableStateOf(false) } + var toEdit by remember { mutableStateOf(null) } + var toDelete by remember { mutableStateOf(null) } + + val grouped = remember(doseLogs) { + doseLogs.groupBy { log -> + Instant.ofEpochMilli(log.timestamp).atZone(ZoneId.systemDefault()).toLocalDate() + }.toSortedMap(compareByDescending { it }) + } + + val timeFmt = remember { DateTimeFormatter.ofPattern("HH:mm") } + + Scaffold( + floatingActionButton = { + FloatingActionButton(onClick = { showLogDialog = true }) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_dose)) + } + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding)) { + TopAppBar( + title = { Text(stringResource(R.string.nav_doses)) } + ) + if (doseLogs.isEmpty()) { + Text( + stringResource(R.string.no_data), + modifier = Modifier.padding(16.dp) + ) + } else { + LazyColumn(Modifier.fillMaxSize()) { + grouped.forEach { (date, logs) -> + item(key = "header_${date}") { + Text( + date.toString(), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + items(logs, key = { it.id }) { log -> + val tr = treatmentMap[log.treatmentId] + val zone = ZoneId.systemDefault() + val time = timeFmt.format(Instant.ofEpochMilli(log.timestamp).atZone(zone)) + ListItem( + modifier = Modifier.clickable { toEdit = log }, + headlineContent = { + Text("${tr?.name ?: "?"} · ${formatDose(log.doseAmount)} ${tr?.doseUnit ?: ""}") + }, + supportingContent = { + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + Text(time) + log.esterType?.takeIf { it.isNotEmpty() && it != "NONE" }?.let { + AssistChip(onClick = {}, label = { Text(it) }) + } + log.notes?.takeIf { it.isNotBlank() }?.let { + Text(it, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + } + }, + trailingContent = { + IconButton(onClick = { toDelete = log }) { + Icon(Icons.Filled.Delete, contentDescription = stringResource(R.string.delete)) + } + } + ) + } + } + } + } + } + } + + if (showLogDialog || toEdit != null) { + DoseDialog( + treatments = treatments, + preselectedTreatmentId = null, + existing = toEdit, + onDismiss = { + showLogDialog = false + toEdit = null + }, + onConfirmCreate = { tr, amount, ts, notes, esterOverride -> + showLogDialog = false + CoroutineScope(Dispatchers.IO).launch { + repo.insertDoseLog( + DoseLog( + treatmentId = tr.id, + timestamp = ts, + doseAmount = amount, + notes = notes, + esterType = esterOverride + ) + ) + } + }, + onConfirmEdit = { updated -> + toEdit = null + CoroutineScope(Dispatchers.IO).launch { + repo.updateDoseLog(updated) + } + } + ) + } + + toDelete?.let { log -> + AlertDialog( + onDismissRequest = { toDelete = null }, + confirmButton = { + TextButton(onClick = { + toDelete = null + CoroutineScope(Dispatchers.IO).launch { repo.deleteDoseLog(log) } + }) { Text(stringResource(R.string.delete)) } + }, + dismissButton = { + TextButton(onClick = { toDelete = null }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.delete)) }, + text = { Text(stringResource(R.string.confirm_delete)) } + ) + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt new file mode 100644 index 0000000..23068ce --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt @@ -0,0 +1,321 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.background +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.pk.LevelPoint +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.pk.TConfig +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.ChartOptions +import com.hormonetrack.ui.components.CurveChart +import com.hormonetrack.ui.components.DoseDialog +import com.hormonetrack.ui.components.formatDose +import com.hormonetrack.ui.theme.TransPink +import com.hormonetrack.ui.theme.TransSky +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.util.Locale +import kotlin.math.abs + +private val HOUR_MS = 3_600_000L + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeScreen( + openLogDoseForTreatmentId: Long?, + onOpenSettings: () -> Unit, + onOpenTreatment: (Long) -> Unit +) { + val container = LocalAppContainer.current + val repo = container.repository + val treatments by repo.activeTreatments.collectAsState(initial = emptyList()) + val doseLogs by repo.allDoseLogs.collectAsState(initial = emptyList()) + val labResults by repo.allLabResults.collectAsState(initial = emptyList()) + val tConfig by container.settings.tConfig.collectAsState(initial = TConfig()) + + var showLogDialog by remember { mutableStateOf(false) } + var preselectId by remember { mutableStateOf(null) } + + LaunchedEffect(openLogDoseForTreatmentId) { + openLogDoseForTreatmentId?.takeIf { it > 0 }?.let { + showLogDialog = true + preselectId = it + } + } + + var tick by remember { mutableIntStateOf(0) } + LaunchedEffect(Unit) { + while (true) { + delay(60_000) + tick++ + } + } + + val curve by produceState>(emptyList(), treatments, doseLogs, tConfig, tick) { + withContext(Dispatchers.Default) { + val end = System.currentTimeMillis() + value = PharmacokineticEngine.computeCurve( + treatments, doseLogs, + startMs = end - 24 * HOUR_MS, + endMs = end, + tConfig = tConfig + ) + } + } + + Column(Modifier.fillMaxSize()) { + TopAppBar( + title = { Text(stringResource(R.string.app_name)) }, + actions = { + IconButton(onClick = onOpenSettings) { + Icon(Icons.Filled.Settings, contentDescription = stringResource(R.string.settings)) + } + } + ) + + Box( + Modifier + .fillMaxWidth() + .height(3.dp) + .background(Brush.horizontalGradient(listOf(TransSky, TransPink, TransSky))) + ) + + Column( + Modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Spacer(Modifier.height(4.dp)) + + NowLevelCard(curve) + + NextDoseCard(treatments) + + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant) + ) { + Column(Modifier.padding(12.dp)) { + Text( + stringResource(R.string.logged_today), + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(6.dp)) + Row( + Modifier.horizontalScroll(rememberScrollState()), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + treatments.forEach { tr -> + AssistChip( + onClick = { + preselectId = tr.id + showLogDialog = true + }, + label = { + Text("${tr.name} · ${formatDose(tr.doseAmount)}${tr.doseUnit}") + } + ) + } + FilledTonalIconButton(onClick = { + preselectId = null + showLogDialog = true + }) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_dose)) + } + } + } + } + + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text( + stringResource(R.string.home_chart_title), + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(8.dp)) + CurveChart( + points = curve, + e2Labs = labResults.filterInRange(curve, "E2"), + tLabs = labResults.filterInRange(curve, "T"), + options = ChartOptions(showT = true, showLabs = true), + modifier = Modifier + .fillMaxWidth() + .height(180.dp) + ) + } + } + + Text( + stringResource(R.string.disclaimer), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + } + } + + if (showLogDialog) { + DoseDialog( + treatments = treatments, + preselectedTreatmentId = preselectId, + existing = null, + onDismiss = { showLogDialog = false }, + onConfirmCreate = { tr, amount, ts, notes, esterOverride -> + showLogDialog = false + CoroutineScope(Dispatchers.IO).launch { + repo.insertDoseLog( + com.hormonetrack.data.model.DoseLog( + treatmentId = tr.id, + timestamp = ts, + doseAmount = amount, + notes = notes, + esterType = esterOverride + ) + ) + } + }, + onConfirmEdit = { } + ) + } +} + +private fun List.filterInRange(curve: List, marker: String): List { + if (curve.size < 2) return emptyList() + val (a, b) = curve.first().timestamp to curve.last().timestamp + return filter { it.marker.equals(marker, true) && it.timestamp in a..b } +} + +@Composable +private fun NowLevelCard(curve: List) { + val now = curve.lastOrNull() + val sixHAgo = curve.firstOrNull { p -> + (curve.last().timestamp - p.timestamp) >= 6 * HOUR_MS + } + Card( + Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer) + ) { + Column(Modifier.padding(16.dp)) { + Text( + stringResource(R.string.current_level), + style = MaterialTheme.typography.labelMedium + ) + if (now == null) { + Spacer(Modifier.height(4.dp)) + Text(stringResource(R.string.no_data)) + } else { + Spacer(Modifier.height(6.dp)) + Row(verticalAlignment = Alignment.Bottom) { + Text( + "≈ " + "%.0f".format(now.e2), + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Text(" pg/mL", style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.width(16.dp)) + Text( + "T ≈ " + "%.2f".format(now.t) + " ng/mL", + style = MaterialTheme.typography.bodyLarge + ) + } + sixHAgo?.let { + val delta = now.e2 - it.e2 + val arrow = if (delta >= 0) "↗" else "↘" + Text( + stringResource(R.string.delta_6h, arrow, "%.0f".format(abs(delta))), + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + } +} + +@Composable +private fun NextDoseCard(treatments: List) { + val next = PharmacokineticEngine.nextReminderFireMs(treatments) + if (next == null) return + val nextTreatment = treatments.filter { it.reminderEnabled } + .minByOrNull { tr -> + val h = tr.reminderHour ?: 23 + val m = tr.reminderMinute ?: 59 + val candidate = (h * 60L + m) * 60_000L + val nowMs = System.currentTimeMillis() + val nowOfDay = nowMs % (24 * HOUR_MS) + if (candidate >= nowOfDay) candidate else candidate + 24 * HOUR_MS + } + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(16.dp)) { + Text( + stringResource(R.string.next_dose), + style = MaterialTheme.typography.labelMedium + ) + Spacer(Modifier.height(4.dp)) + val deltaMs = next - System.currentTimeMillis() + val h = deltaMs / HOUR_MS + val m = (deltaMs % HOUR_MS) / 60_000L + val timeStr = DateTimeFormatter.ofPattern("HH:mm") + .withZone(ZoneId.systemDefault()) + .format(Instant.ofEpochMilli(next)) + Text( + if (h > 0) { + String.format(Locale.getDefault(), "%dh%02d · %s (%s)", h, m, timeStr, nextTreatment?.name ?: "") + } else { + String.format(Locale.getDefault(), "%d min · %s (%s)", m, timeStr, nextTreatment?.name ?: "") + }, + style = MaterialTheme.typography.titleMedium + ) + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt new file mode 100644 index 0000000..9eb2885 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt @@ -0,0 +1,150 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.LabDialog +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LabsScreen() { + val container = LocalAppContainer.current + val repo = container.repository + val labs by repo.allLabResults.collectAsState(initial = emptyList()) + + var showLabDialog by remember { mutableStateOf(false) } + var toDelete by remember { mutableStateOf(null) } + + val grouped = remember(labs) { + labs.sortedBy { it.marker.lowercase() }.groupBy { it.marker.uppercase() } + } + val fmt = remember { + DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(ZoneId.systemDefault()) + } + + Scaffold( + floatingActionButton = { + FloatingActionButton(onClick = { showLabDialog = true }) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_lab)) + } + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding)) { + TopAppBar( + title = { Text(stringResource(R.string.nav_labs)) } + ) + if (labs.isEmpty()) { + Text( + stringResource(R.string.no_data), + modifier = Modifier.padding(16.dp) + ) + } else { + LazyColumn(Modifier.fillMaxSize()) { + grouped.forEach { (marker, results) -> + item(key = "header_$marker") { + Text( + marker, + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + items(results, key = { it.id }) { lab -> + ListItem( + headlineContent = { + Text("${lab.value} ${lab.unit}") + }, + supportingContent = { + Column { + Text(fmt.format(Instant.ofEpochMilli(lab.timestamp))) + lab.notes?.takeIf { it.isNotBlank() }?.let { + Text(it, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + } + }, + trailingContent = { + IconButton(onClick = { toDelete = lab }) { + Icon(Icons.Filled.Delete, contentDescription = stringResource(R.string.delete)) + } + } + ) + } + } + } + } + } + } + + if (showLabDialog) { + LabDialog( + onDismiss = { showLabDialog = false }, + onConfirm = { marker, value, unit, ts, notes -> + showLabDialog = false + CoroutineScope(Dispatchers.IO).launch { + repo.insertLabResult( + LabResult( + marker = marker, + value = value, + unit = unit, + timestamp = ts, + notes = notes.ifBlank { null } + ) + ) + } + } + ) + } + + toDelete?.let { lab -> + AlertDialog( + onDismissRequest = { toDelete = null }, + confirmButton = { + TextButton(onClick = { + toDelete = null + CoroutineScope(Dispatchers.IO).launch { repo.deleteLabResult(lab) } + }) { Text(stringResource(R.string.delete)) } + }, + dismissButton = { + TextButton(onClick = { toDelete = null }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.delete)) }, + text = { Text(stringResource(R.string.confirm_delete)) } + ) + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt new file mode 100644 index 0000000..22661e0 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt @@ -0,0 +1,347 @@ +package com.hormonetrack.ui.screens + +import android.content.Intent +import android.os.Build +import android.provider.Settings +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import com.hormonetrack.R +import com.hormonetrack.data.backup.BackupManager +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.pk.TConfig +import com.hormonetrack.reminder.AlarmScheduler +import com.hormonetrack.ui.LocalAppContainer +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import java.util.Locale + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SettingsScreen(onBack: () -> Unit) { + val container = LocalAppContainer.current + val repo = container.repository + val context = LocalContext.current + val scheduler = remember { AlarmScheduler(context) } + + val tConfig by container.settings.tConfig.collectAsState(initial = TConfig()) + val currentLanguage by container.settings.language.collectAsState(initial = "system") + + var tBaseText by remember(tConfig.base) { mutableStateOf(formatDoubles(tConfig.base)) } + var tFloorText by remember(tConfig.floor) { mutableStateOf(formatDoubles(tConfig.floor)) } + var tKText by remember(tConfig.k) { mutableStateOf(formatDoubles(tConfig.k)) } + + var showImportConfirm by remember { mutableStateOf(false) } + var importJson by remember { mutableStateOf(null) } + var message by remember { mutableStateOf(null) } + + val exportLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.CreateDocument("application/json") + ) { uri -> + uri ?: return@rememberLauncherForActivityResult + CoroutineScope(Dispatchers.IO).launch { + val json = BackupManager.exportJson(repo, tConfig) + val ok = BackupManager.writeBackup(context, uri, json) + withContext(Dispatchers.Main) { + message = context.getString( + if (ok) R.string.export_ok else R.string.export_fail + ) + } + } + } + + val importLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.OpenDocument() + ) { uri -> + uri ?: return@rememberLauncherForActivityResult + CoroutineScope(Dispatchers.IO).launch { + val json = BackupManager.readBackup(context, uri) + withContext(Dispatchers.Main) { + if (json != null) { + importJson = json + showImportConfirm = true + } else { + message = context.getString(R.string.import_fail) + } + } + } + } + + Column( + Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(horizontal = 16.dp) + ) { + TopAppBar( + title = { Text(stringResource(R.string.settings)) }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.back)) + } + } + ) + Spacer(Modifier.height(8.dp)) + + message?.let { + Text(it, color = MaterialTheme.colorScheme.primary) + Spacer(Modifier.height(8.dp)) + } + + // --- Language --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.language), style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.height(6.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + FilterChip( + selected = currentLanguage == "system", + onClick = { + CoroutineScope(Dispatchers.IO).launch { + container.settings.setLanguage("system") + withContext(Dispatchers.Main) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.getEmptyLocaleList() + ) + } + } + }, + label = { Text(stringResource(R.string.language_system)) } + ) + FilterChip( + selected = currentLanguage == "fr", + onClick = { + CoroutineScope(Dispatchers.IO).launch { + container.settings.setLanguage("fr") + withContext(Dispatchers.Main) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags("fr") + ) + } + } + }, + label = { Text("Français") } + ) + FilterChip( + selected = currentLanguage == "en", + onClick = { + CoroutineScope(Dispatchers.IO).launch { + container.settings.setLanguage("en") + withContext(Dispatchers.Main) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags("en") + ) + } + } + }, + label = { Text("English") } + ) + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- Testosterone model --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.t_model_title), style = MaterialTheme.typography.titleMedium) + Text( + stringResource(R.string.t_model_hint), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(6.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + value = tBaseText, + onValueChange = { tBaseText = it }, + label = { Text(stringResource(R.string.t_base)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = tFloorText, + onValueChange = { tFloorText = it }, + label = { Text(stringResource(R.string.t_floor)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = tKText, + onValueChange = { tKText = it }, + label = { Text("k") }, + modifier = Modifier.weight(1f) + ) + } + Spacer(Modifier.height(8.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = { + val base = tBaseText.replace(',', '.').toDoubleOrNull() ?: return@Button + val floor = tFloorText.replace(',', '.').toDoubleOrNull() ?: return@Button + val k = tKText.replace(',', '.').toDoubleOrNull() ?: return@Button + CoroutineScope(Dispatchers.IO).launch { + container.settings.setTConfig(TConfig(base, floor, k)) + withContext(Dispatchers.Main) { + message = context.getString(R.string.saved) + } + } + }) { Text(stringResource(R.string.save)) } + OutlinedButton(onClick = { + CoroutineScope(Dispatchers.IO).launch { + val labs = repo.allLabResultsOnce().filter { it.marker.equals("T", true) } + val trs = repo.allTreatmentsOnce() + val doses = repo.allDoseLogsOnce() + val calibrated = PharmacokineticEngine.computeTConfigCalibration( + labs, trs, doses, tConfig + ) + calibrated?.let { + container.settings.setTConfig(it) + withContext(Dispatchers.Main) { + message = context.getString(R.string.t_calibrated) + } + } + } + }) { Text(stringResource(R.string.calibrate_from_labs)) } + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- Reminders / exact alarms --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.reminders_section), style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.height(6.dp)) + if (!scheduler.canScheduleExact()) { + Text( + stringResource(R.string.exact_alarm_needed), + color = MaterialTheme.colorScheme.error, + style = MaterialTheme.typography.bodyMedium + ) + Spacer(Modifier.height(6.dp)) + Button(onClick = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + context.startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)) + } + }) { Text(stringResource(R.string.grant_exact_alarm)) } + } else { + Text(stringResource(R.string.exact_alarm_ok), style = MaterialTheme.typography.bodyMedium) + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- Backup --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.backup_section), style = MaterialTheme.typography.titleMedium) + Text( + stringResource(R.string.backup_hint), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(6.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = { + val date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + exportLauncher.launch("hormonetrack-backup-$date.json") + }) { Text(stringResource(R.string.export_json)) } + OutlinedButton(onClick = { + importLauncher.launch(arrayOf("application/json")) + }) { Text(stringResource(R.string.import_json)) } + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- About --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.about_title), style = MaterialTheme.typography.titleMedium) + Text( + stringResource(R.string.disclaimer), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Text( + stringResource(R.string.models_credit), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + Spacer(Modifier.height(32.dp)) + } + + if (showImportConfirm) { + AlertDialog( + onDismissRequest = { showImportConfirm = false }, + confirmButton = { + TextButton(onClick = { + showImportConfirm = false + val json = importJson ?: return@TextButton + CoroutineScope(Dispatchers.IO).launch { + val result = try { + BackupManager.importJson(repo, json) + } catch (e: Exception) { + null + } + withContext(Dispatchers.Main) { + message = if (result != null) { + context.getString(R.string.import_ok, result.treatments, result.doseLogs, result.labResults) + } else { + context.getString(R.string.import_fail) + } + } + } + }) { Text(stringResource(R.string.import_confirm)) } + }, + dismissButton = { + TextButton(onClick = { showImportConfirm = false }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.import_title)) }, + text = { Text(stringResource(R.string.import_warning)) } + ) + } +} + +private fun formatDoubles(d: Double): String = + if (d == d.toLong().toDouble()) d.toLong().toString() else "%.3f".format(Locale.US, d) diff --git a/app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt new file mode 100644 index 0000000..ccddd8f --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt @@ -0,0 +1,477 @@ +package com.hormonetrack.ui.screens + +import android.content.Intent +import android.os.Build +import android.provider.Settings +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TimePicker +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.rememberTimePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.PKPresets +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.reminder.AlarmScheduler +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.formatDose +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.LocalTime +import java.util.Locale + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TreatmentEditorScreen(treatmentId: Long, onDone: () -> Unit) { + val container = LocalAppContainer.current + val repo = container.repository + val context = LocalContext.current + val scheduler = remember { AlarmScheduler(context) } + + var name by remember { mutableStateOf("") } + var type by remember { mutableStateOf(TreatmentType.ESTRADIOL) } + var route by remember { mutableStateOf(AdministrationRoute.INJECTION_IM) } + var ester by remember { mutableStateOf(Esters.EV) } + var model by remember { mutableStateOf(PKModels.ESTRANNAISE) } + var doseText by remember { mutableStateOf("4") } + var unit by remember { mutableStateOf("mg") } + var tmaxText by remember { mutableStateOf("46") } + var thalfText by remember { mutableStateOf("100") } + var bioText by remember { mutableStateOf("1.0") } + var scaleText by remember { mutableStateOf("1") } + var reminderEnabled by remember { mutableStateOf(false) } + var reminderTime by remember { mutableStateOf(LocalTime.of(12, 0)) } + var active by remember { mutableStateOf(true) } + var showDeleteConfirm by remember { mutableStateOf(false) } + var showPresetMenu by remember { mutableStateOf(false) } + var showTimePicker by remember { mutableStateOf(false) } + var loading by remember { mutableStateOf(treatmentId > 0) } + var loadedCreatedAt by remember { mutableStateOf(System.currentTimeMillis()) } + + LaunchedEffect(treatmentId) { + if (treatmentId > 0) { + repo.getTreatmentById(treatmentId)?.let { tr -> + name = tr.name + type = tr.type + route = tr.route + ester = tr.esterType + model = tr.pkModel + doseText = formatDose(tr.doseAmount) + unit = tr.doseUnit + tmaxText = formatDose(tr.absorptionHours.toDouble()) + thalfText = formatDose(tr.eliminationHalfLifeHours.toDouble()) + bioText = formatDose(tr.bioavailabilityFraction.toDouble()) + scaleText = formatDose(tr.scaleFactor) + reminderEnabled = tr.reminderEnabled + reminderTime = LocalTime.of(tr.reminderHour ?: 12, tr.reminderMinute ?: 0) + active = tr.isActive + loadedCreatedAt = tr.createdAt + } + loading = false + } + } + + fun buildTreatment(id: Long): Treatment? { + val dose = doseText.replace(',', '.').toDoubleOrNull() ?: return null + val tmax = tmaxText.replace(',', '.').toFloatOrNull() ?: 4f + val thalf = thalfText.replace(',', '.').toFloatOrNull() ?: 24f + val bio = bioText.replace(',', '.').toFloatOrNull() ?: 1f + val scale = scaleText.replace(',', '.').toDoubleOrNull() ?: 1.0 + if (name.isBlank() || dose <= 0.0) return null + return Treatment( + id = id, + name = name.trim(), + type = type, + route = route, + doseAmount = dose, + doseUnit = unit.trim().ifBlank { "mg" }, + isActive = active, + esterType = if (PharmacokineticEngine.isInjectionRoute(route)) ester else Esters.NONE, + pkModel = model, + absorptionHours = tmax, + eliminationHalfLifeHours = thalf, + bioavailabilityFraction = bio.coerceIn(0.01f, 1f), + scaleFactor = scale.coerceAtLeast(0.01), + reminderEnabled = reminderEnabled, + reminderHour = if (reminderEnabled) reminderTime.hour else null, + reminderMinute = if (reminderEnabled) reminderTime.minute else null, + createdAt = loadedCreatedAt + ) + } + + Column( + Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(horizontal = 16.dp) + ) { + TopAppBar( + title = { + Text( + if (treatmentId > 0) stringResource(R.string.edit_treatment) + else stringResource(R.string.add_treatment) + ) + }, + navigationIcon = { + IconButton(onClick = onDone) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.back)) + } + } + ) + + Spacer(Modifier.height(8.dp)) + + if (treatmentId <= 0) { + ExposedDropdownMenuBox(expanded = showPresetMenu, onExpandedChange = { showPresetMenu = it }) { + OutlinedTextField( + value = "", + onValueChange = {}, + readOnly = true, + label = { Text(stringResource(R.string.select_preset)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = showPresetMenu) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = showPresetMenu, onDismissRequest = { showPresetMenu = false }) { + PKPresets.all.forEach { preset -> + DropdownMenuItem( + text = { Text(stringResource(preset.nameRes)) }, + onClick = { + name = context.getString(preset.nameRes) + type = preset.type + route = preset.route + ester = preset.esterType + model = preset.pkModel + doseText = formatDose(preset.defaultDoseAmount) + unit = preset.defaultDoseUnit + tmaxText = formatDose(preset.absorptionHours.toDouble()) + thalfText = formatDose(preset.eliminationHalfLifeHours.toDouble()) + bioText = formatDose(preset.bioavailabilityFraction.toDouble()) + showPresetMenu = false + } + ) + } + } + } + Spacer(Modifier.height(10.dp)) + } + + if (!loading) { + OutlinedTextField( + value = name, + onValueChange = { name = it }, + label = { Text(stringResource(R.string.treatment_name)) }, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(8.dp)) + + DropdownField( + label = stringResource(R.string.treatment_type), + selectedLabel = stringResource(typeLabelRes(type)), + options = TreatmentType.entries.map { it to stringResource(typeLabelRes(it)) }, + onSelect = { type = it } + ) + Spacer(Modifier.height(8.dp)) + + DropdownField( + label = stringResource(R.string.treatment_route), + selectedLabel = stringResource(routeLabelRes(route)), + options = AdministrationRoute.entries.map { it to stringResource(routeLabelRes(it)) }, + onSelect = { route = it } + ) + Spacer(Modifier.height(8.dp)) + + if (PharmacokineticEngine.isInjectionRoute(route)) { + DropdownField( + label = stringResource(R.string.ester), + selectedLabel = ester, + options = listOf(Esters.EV, Esters.EU, Esters.EEN).map { it to it }, + onSelect = { ester = it } + ) + Spacer(Modifier.height(8.dp)) + DropdownField( + label = stringResource(R.string.pk_model), + selectedLabel = stringResource( + if (model == PKModels.TRANSFEM_SCIENCE) R.string.model_tfs else R.string.model_ese + ), + options = listOf( + PKModels.ESTRANNAISE to stringResource(R.string.model_ese), + PKModels.TRANSFEM_SCIENCE to stringResource(R.string.model_tfs) + ), + onSelect = { model = it } + ) + } else { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + value = tmaxText, + onValueChange = { tmaxText = it }, + label = { Text(stringResource(R.string.pk_absorption)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = thalfText, + onValueChange = { thalfText = it }, + label = { Text(stringResource(R.string.pk_halflife)) }, + modifier = Modifier.weight(1f) + ) + } + Spacer(Modifier.height(8.dp)) + OutlinedTextField( + value = bioText, + onValueChange = { bioText = it }, + label = { Text(stringResource(R.string.pk_bioavail)) }, + modifier = Modifier.fillMaxWidth() + ) + } + Spacer(Modifier.height(8.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + value = doseText, + onValueChange = { doseText = it }, + label = { Text(stringResource(R.string.default_dose)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = unit, + onValueChange = { unit = it }, + label = { Text(stringResource(R.string.dose_unit)) }, + modifier = Modifier.weight(1f) + ) + } + Spacer(Modifier.height(8.dp)) + + if (type == TreatmentType.ESTRADIOL) { + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.calibration_title), style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.height(6.dp)) + OutlinedTextField( + value = scaleText, + onValueChange = { scaleText = it }, + label = { Text(stringResource(R.string.scale_factor)) }, + modifier = Modifier.fillMaxWidth() + ) + Text( + stringResource(R.string.calibration_hint), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(6.dp)) + FilledTonalButton(onClick = { + CoroutineScope(Dispatchers.IO).launch { + val doses = repo.allDoseLogsOnce() + val labs = repo.allLabResultsOnce().filter { it.marker.equals("E2", true) } + buildTreatment(treatmentId)?.let { tmp -> + val sf = PharmacokineticEngine.computeScaleFactor( + tmp.copy(scaleFactor = 1.0), doses, labs + ) + sf?.let { + withContext(Dispatchers.Main) { + scaleText = "%.2f".format(Locale.US, it) + } + } + } + } + }) { Text(stringResource(R.string.calibrate_from_labs)) } + } + } + Spacer(Modifier.height(8.dp)) + } + + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.reminder), style = MaterialTheme.typography.titleMedium) + Switch(checked = reminderEnabled, onCheckedChange = { reminderEnabled = it }) + } + if (reminderEnabled) { + Spacer(Modifier.height(6.dp)) + FilledTonalButton(onClick = { showTimePicker = true }) { + Text( + String.format(Locale.getDefault(), "%02d:%02d", reminderTime.hour, reminderTime.minute) + ) + } + val scheduler2 = AlarmScheduler(context) + if (!scheduler2.canScheduleExact()) { + Spacer(Modifier.height(6.dp)) + Text( + stringResource(R.string.exact_alarm_needed), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.error + ) + TextButton(onClick = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + context.startActivity( + Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) + ) + } + }) { Text(stringResource(R.string.grant_exact_alarm)) } + } + } + } + } + Spacer(Modifier.height(8.dp)) + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.active)) + Switch(checked = active, onCheckedChange = { active = it }) + } + Spacer(Modifier.height(12.dp)) + + Button( + onClick = { + val tr = buildTreatment(if (treatmentId > 0) treatmentId else 0L) ?: return@Button + CoroutineScope(Dispatchers.IO).launch { + val savedId: Long = if (tr.id > 0) { + repo.updateTreatment(tr) + tr.id + } else { + repo.insertTreatment(tr) + } + val saved = tr.copy(id = savedId) + if (saved.reminderEnabled) { + scheduler.scheduleDaily(saved) + } else { + scheduler.cancel(savedId) + } + withContext(Dispatchers.Main) { onDone() } + } + }, + modifier = Modifier.fillMaxWidth() + ) { Text(stringResource(R.string.save)) } + + if (treatmentId > 0) { + Spacer(Modifier.height(8.dp)) + TextButton( + onClick = { showDeleteConfirm = true }, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.delete), color = MaterialTheme.colorScheme.error) + } + } + Spacer(Modifier.height(32.dp)) + } + } + + if (showTimePicker) { + val state = rememberTimePickerState( + initialHour = reminderTime.hour, + initialMinute = reminderTime.minute, + is24Hour = true + ) + AlertDialog( + onDismissRequest = { showTimePicker = false }, + confirmButton = { + TextButton(onClick = { + reminderTime = LocalTime.of(state.hour, state.minute) + showTimePicker = false + }) { Text(stringResource(R.string.ok)) } + }, + dismissButton = { + TextButton(onClick = { showTimePicker = false }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.reminder_time)) }, + text = { TimePicker(state = state) } + ) + } + + if (showDeleteConfirm) { + AlertDialog( + onDismissRequest = { showDeleteConfirm = false }, + confirmButton = { + TextButton(onClick = { + showDeleteConfirm = false + scheduler.cancel(treatmentId) + CoroutineScope(Dispatchers.IO).launch { + repo.getTreatmentById(treatmentId)?.let { repo.deleteTreatment(it) } + withContext(Dispatchers.Main) { onDone() } + } + }) { Text(stringResource(R.string.delete)) } + }, + dismissButton = { + TextButton(onClick = { showDeleteConfirm = false }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.delete)) }, + text = { Text(stringResource(R.string.confirm_delete_treatment)) } + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun DropdownField( + label: String, + selectedLabel: String, + options: List>, + onSelect: (T) -> Unit +) { + var expanded by remember { mutableStateOf(false) } + ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) { + OutlinedTextField( + value = selectedLabel, + onValueChange = {}, + readOnly = true, + label = { Text(label) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + options.forEach { (value, labelRes) -> + DropdownMenuItem( + text = { Text(labelRes) }, + onClick = { + onSelect(value) + expanded = false + } + ) + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt new file mode 100644 index 0000000..65f6dbd --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt @@ -0,0 +1,158 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.formatDose + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TreatmentsScreen( + onEdit: (Long) -> Unit, + onNew: () -> Unit +) { + val container = LocalAppContainer.current + val repo = container.repository + val treatments by repo.allTreatments.collectAsState(initial = emptyList()) + + Scaffold( + floatingActionButton = { + FloatingActionButton(onClick = onNew) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_treatment)) + } + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding)) { + TopAppBar( + title = { Text(stringResource(R.string.nav_treatments)) } + ) + LazyColumn(Modifier.fillMaxSize()) { + items(treatments, key = { it.id }) { tr -> + TreatmentCard(tr, onClick = { onEdit(tr.id) }) + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TreatmentCard(tr: Treatment, onClick: () -> Unit) { + Card( + onClick = onClick, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 6.dp) + ) { + Column(Modifier.padding(12.dp)) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + tr.name, + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.weight(1f) + ) + if (!tr.isActive) { + Text( + stringResource(R.string.inactive), + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.labelMedium + ) + } + } + Text( + stringResource(routeLabelRes(tr.route)) + " · " + formatDose(tr.doseAmount) + " " + tr.doseUnit, + style = MaterialTheme.typography.bodyMedium + ) + Spacer(Modifier.width(4.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + if (tr.usesProfileModel) { + AssistChip( + onClick = {}, + label = { + Text( + tr.esterType + " · " + stringResource( + if (tr.pkModel == PKModels.TRANSFEM_SCIENCE) R.string.model_tfs + else R.string.model_ese + ) + ) + } + ) + } else { + AssistChip( + onClick = {}, + label = { + Text( + stringResource(R.string.pk_absorption) + " " + formatDose(tr.absorptionHours.toDouble()) + "h" + ) + } + ) + } + if (tr.scaleFactor != 1.0) { + AssistChip( + onClick = {}, + label = { Text("×" + "%.2f".format(tr.scaleFactor)) } + ) + } + if (tr.reminderEnabled) { + AssistChip( + onClick = {}, + label = { + Text( + String.format( + java.util.Locale.getDefault(), "⏰ %02d:%02d", + tr.reminderHour ?: 0, tr.reminderMinute ?: 0 + ) + ) + } + ) + } + } + } + } +} + +fun routeLabelRes(route: com.hormonetrack.data.model.AdministrationRoute): Int = when (route) { + com.hormonetrack.data.model.AdministrationRoute.ORAL -> R.string.route_oral + com.hormonetrack.data.model.AdministrationRoute.TRANSDERMAL_GEL -> R.string.route_gel + com.hormonetrack.data.model.AdministrationRoute.TRANSDERMAL_PATCH -> R.string.route_patch + com.hormonetrack.data.model.AdministrationRoute.INJECTION_IM -> R.string.route_injection_im + com.hormonetrack.data.model.AdministrationRoute.INJECTION_SUBCUT -> R.string.route_injection_sc + else -> R.string.route_other +} + +fun typeLabelRes(type: com.hormonetrack.data.model.TreatmentType): Int = when (type) { + com.hormonetrack.data.model.TreatmentType.ESTRADIOL -> R.string.type_estradiol + com.hormonetrack.data.model.TreatmentType.ANTI_ANDROGEN -> R.string.type_antiandrogen + com.hormonetrack.data.model.TreatmentType.PROGESTOGEN -> R.string.type_progestogen + else -> R.string.type_other +} diff --git a/app/src/main/java/com/hormonetrack/ui/theme/Color.kt b/app/src/main/java/com/hormonetrack/ui/theme/Color.kt new file mode 100644 index 0000000..63a74b7 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/theme/Color.kt @@ -0,0 +1,18 @@ +package com.hormonetrack.ui.theme + +import androidx.compose.ui.graphics.Color + +val BluePrimary = Color(0xFF4F5BD5) +val BluePrimaryDark = Color(0xFF3A44A8) +val BlueContainer = Color(0xFFDEE0FF) +val PinkSecondary = Color(0xFFD6589E) +val PinkContainer = Color(0xFFFFD9EC) +val TransSky = Color(0xFF5BCEFA) +val TransPink = Color(0xFFF5A9B8) +val TealTertiary = Color(0xFF2FA48D) +val TealContainer = Color(0xFFBFF0E4) +val ChartE2 = Color(0xFF4F5BD5) +val ChartT = Color(0xFFD6589E) +val LabDot = Color(0xFFE67E22) +val GoodGreen = Color(0xFF2E7D32) +val WarnOrange = Color(0xFFB26A00) diff --git a/app/src/main/java/com/hormonetrack/ui/theme/Theme.kt b/app/src/main/java/com/hormonetrack/ui/theme/Theme.kt new file mode 100644 index 0000000..f32502a --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/theme/Theme.kt @@ -0,0 +1,48 @@ +package com.hormonetrack.ui.theme + +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val LightColors = lightColorScheme( + primary = BluePrimary, + onPrimary = androidx.compose.ui.graphics.Color.White, + primaryContainer = BlueContainer, + secondary = PinkSecondary, + secondaryContainer = PinkContainer, + tertiary = TealTertiary, + tertiaryContainer = TealContainer +) + +private val DarkColors = darkColorScheme( + primary = androidx.compose.ui.graphics.Color(0xFFBAC0FF), + secondary = androidx.compose.ui.graphics.Color(0xFFFFB1D2), + tertiary = androidx.compose.ui.graphics.Color(0xFF7CD5C1) +) + +@Composable +fun HormoneTrackTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + dynamicColor: Boolean = false, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + darkTheme -> DarkColors + else -> LightColors + } + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} diff --git a/app/src/main/java/com/hormonetrack/ui/theme/Type.kt b/app/src/main/java/com/hormonetrack/ui/theme/Type.kt new file mode 100644 index 0000000..73c32a4 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/theme/Type.kt @@ -0,0 +1,15 @@ +package com.hormonetrack.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +val Typography = Typography( + headlineMedium = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 26.sp), + titleLarge = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 20.sp), + titleMedium = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 16.sp), + bodyLarge = TextStyle(fontSize = 16.sp), + bodyMedium = TextStyle(fontSize = 14.sp), + labelMedium = TextStyle(fontSize = 12.sp) +) diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..14a0f05 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_notification.xml b/app/src/main/res/drawable/ic_notification.xml new file mode 100644 index 0000000..ffdd7bb --- /dev/null +++ b/app/src/main/res/drawable/ic_notification.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..a8a8fa5 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..427056e --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,147 @@ + + + Suivi Hormonal + + + Accueil + Graphiques + Doses + Analyses + Traitements + Paramètres + Retour + OK + + + Niveau actuel estimé + Pas encore de données — crée un traitement et logue une dose. + Log rapide + Prochaine dose + %1$s %2$s pg/mL vs il y a 6 h + Dernières 24 h (estimation) + Les courbes sont des estimations pharmacocinétiques à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes prises de sang et aux consignes de ton endocrinologue. + + + 24 h + 7 jours + 30 jours + Analyses + — E2 estimé (pg/mL, axe gauche) + -- T estimée (ng/mL, axe droit) + ● Résultats de prise de sang + + + Ajouter une dose + Modifier la dose + Défaut (%1$s) + Dose + Heure + Notes + Supprimer + Supprimer cette entrée ? + Supprimer ce traitement ? Son historique de doses sera aussi supprimé. + + + Ajouter un résultat + Marqueur (ex : E2, T) + Valeur + Unité (ex : pg/mL, ng/mL) + Date + + + Ajouter un traitement + Modifier le traitement + Nom du traitement + Type + Voie d\'administration + Dose standard + Unité + Actif + inactif + Crée d\'abord un traitement (onglet Traitements). + + Œstradiol + Anti-androgène + Progestatif + Autre + + Orale + Gel transdermique + Patch transdermique + Injection IM + Injection SC + Autre voie + + Ester + Modèle PK + Estrannaise + Transfem Science + Choisir un modèle (optionnel) + + Temps jusqu\'au pic (h) + Demi-vie (h) + Biodisponibilité (0–1) + + Calibration + Facteur d\'échelle + Le facteur d\'échelle ajuste le modèle à ton corps, comme le « Scale factor » de ton tableur. Il se calcule comme médiane(valeur lab ÷ prédiction du modèle). + Calibrer avec les analyses + + Enregistrer + Annuler + + + Rappel + Heure du rappel + Rappels & alarmes + Les alarmes exactes ne sont pas accordées : les rappels pourraient être retardés de quelques minutes. + Alarmes exactes accordées. Les rappels s\'afficheront sur ta montre via les notifications Huawei Health. + Accorder les alarmes exactes + Pris + Reporter 1 h + Rappel : %1$s + Rappel de traitement + C\'est l\'heure de prendre ton traitement + Il est temps de prendre ta dose : %1$s + Rappels de traitement + Notifications pour les rappels de prise de traitement + + + Langue + Système + Estimation de la testostérone + Modèle empirique : T = plancher + (base − plancher) ÷ (1 + k·E2). Unités : ng/mL. Utilise tes résultats T pour calibrer k. + Base + Plancher + k calibré avec tes analyses T. + Enregistré + + Sauvegarde (JSON) + Exporte toutes les données (traitements, doses, analyses, réglages T) vers un fichier JSON, et restaure depuis un fichier de sauvegarde. + Exporter + Importer + Sauvegarde exportée. + L\'export a échoué. + L\'import a échoué : fichier invalide. + Importé : %1$d traitements, %2$d doses, %3$d analyses. + Restaurer + Importer une sauvegarde + Le contenu de la sauvegarde sera AJOUTÉ aux données actuelles (aucune suppression). + + À propos + Profils PK issus des modèles d\'injection Estrannaise (EstraNase) et Transfem Science, extraits de Estrogen.ods (tables horaires D, k1–k3). + + + Injection EV — Estrannaise + Injection EU — Estrannaise + Injection EEn — Estrannaise + Injection EV — Transfem Science + Injection EU — Transfem Science + Injection EEn — Transfem Science + E2 gel transdermique + E2 patch + E2 orale + Acétate de cyprotérone (CPA) + Spironolactone + Bicalutamide + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..62e4447 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #4F5BD5 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..8dc478c --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,147 @@ + + + HormoneTrack + + + Home + Charts + Doses + Labs + Treatments + Settings + Back + OK + + + Current estimated level + No data yet — add a treatment and log a dose. + Quick log + Next dose + %1$s %2$s pg/mL vs 6 h ago + Last 24 hours (estimate) + Curves are pharmacokinetic estimates for informational purposes only — they are not measurements. Always rely on your blood tests and follow your endocrinologist\'s guidance. + + + 24 h + 7 days + 30 days + Labs + — E2 estimate (pg/mL, left axis) + -- T estimate (ng/mL, right axis) + ● Lab results + + + Log a dose + Edit dose + Default (%1$s) + Dose + Time + Notes + Delete + Delete this entry? + Delete this treatment? Its dose history will also be deleted. + + + Add lab result + Marker (e.g. E2, T) + Value + Unit (e.g. pg/mL, ng/mL) + Date + + + Add treatment + Edit treatment + Treatment name + Type + Route + Standard dose + Unit + Active + inactive + Create a treatment first (Treatments tab). + + Estradiol + Anti-androgen + Progestogen + Other + + Oral + Transdermal gel + Transdermal patch + IM injection + SC injection + Other route + + Ester + PK model + Estrannaise + Transfem Science + Choose a preset (optional) + + Time to peak (h) + Half-life (h) + Bioavailability (0–1) + + Calibration + Scale factor + The scale factor adjusts the model to your body, like the "Scale factor" of your spreadsheet. It is computed as median(lab value ÷ model prediction). + Calibrate from labs + + Save + Cancel + + + Reminder + Reminder time + Reminders & alarms + Exact alarms are not granted: reminders may be delayed by a few minutes. + Exact alarms granted. Reminders will mirror on your watch via Huawei Health notifications. + Grant exact alarms + Taken + Snooze 1 h + Reminder: %1$s + Medication reminder + It\'s time to take your treatment + Time for your dose: %1$s + Treatment reminders + Notifications for medication reminders + + + Language + System + Testosterone estimate + Empirical model: T = floor + (base − floor) ÷ (1 + k·E2). Units: ng/mL. Use your T lab results to calibrate k. + Base + Floor + k calibrated from your T labs. + Saved + + Backup (JSON) + Export all data (treatments, doses, labs, T settings) to a JSON file, and restore from a backup file. + Export + Import + Backup exported. + Export failed. + Import failed: invalid file. + Imported: %1$d treatments, %2$d doses, %3$d labs. + Restore + Import backup + The backup content will be ADDED to the current data (no deletion). + + About + PK profiles from Estrannaise (EstraNase) and Transfem Science injection models, extracted from Estrogen.ods (D, k1–k3 hourly tables). + + + EV injection — Estrannaise + EU injection — Estrannaise + EEn injection — Estrannaise + EV injection — Transfem Science + EU injection — Transfem Science + EEn injection — Transfem Science + E2 transdermal gel + E2 patch + E2 oral + Cyproterone acetate (CPA) + Spironolactone + Bicalutamide + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..dde4d84 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt b/app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt new file mode 100644 index 0000000..aeb9260 --- /dev/null +++ b/app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt @@ -0,0 +1,95 @@ +package com.hormonetrack.data.backup + +import com.google.gson.Gson +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import com.hormonetrack.pk.TConfig +import org.junit.Assert.assertEquals +import org.junit.Test + +class BackupGsonTest { + + @Test + fun `backup round-trip preserves treatments doses labs and T config`() { + val data = BackupData( + version = 1, + exportedAt = 1_700_000_000_000L, + treatments = listOf( + Treatment( + id = 12, + name = "EV", + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + doseAmount = 4.0, + doseUnit = "mg", + esterType = Esters.EV, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 46f, + eliminationHalfLifeHours = 100f, + bioavailabilityFraction = 1f, + scaleFactor = 0.73, + reminderEnabled = true, + reminderHour = 20, + reminderMinute = 15, + createdAt = 1_699_000_000_000L + ) + ), + doseLogs = listOf( + DoseLog( + id = 34, + treatmentId = 12, + timestamp = 1_699_500_000_000L, + doseAmount = 4.5, + notes = "thigh R", + esterType = Esters.EU + ) + ), + labResults = listOf( + LabResult( + id = 56, + marker = "E2", + value = 163.0, + unit = "pg/mL", + timestamp = 1_699_600_000_000L, + notes = "fasting" + ) + ), + tConfig = TConfig(base = 5.5, floor = 0.15, k = 0.21) + ) + + val json = Gson().toJson(data) + val parsed: BackupData = Gson().fromJson(json, BackupData::class.java) + + assertEquals(data.version, parsed.version) + val tr = parsed.treatments.single() + assertEquals(12L, tr.id) + assertEquals(TreatmentType.ESTRADIOL, tr.type) + assertEquals(AdministrationRoute.INJECTION_IM, tr.route) + assertEquals(Esters.EV, tr.esterType) + assertEquals(PKModels.ESTRANNAISE, tr.pkModel) + assertEquals(0.73, tr.scaleFactor, 1e-9) + assertEquals(true, tr.reminderEnabled) + assertEquals(20, tr.reminderHour) + + val dose = parsed.doseLogs.single() + assertEquals(34L, dose.id) + assertEquals(12L, dose.treatmentId) + assertEquals(Esters.EU, dose.esterType) + assertEquals(4.5, dose.doseAmount, 1e-9) + assertEquals("thigh R", dose.notes) + + val lab = parsed.labResults.single() + assertEquals("E2", lab.marker) + assertEquals(163.0, lab.value, 1e-9) + assertEquals("pg/mL", lab.unit) + + assertEquals(5.5, parsed.tConfig.base, 1e-9) + assertEquals(0.15, parsed.tConfig.floor, 1e-9) + assertEquals(0.21, parsed.tConfig.k, 1e-9) + } +} diff --git a/app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt b/app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt new file mode 100644 index 0000000..b3f0906 --- /dev/null +++ b/app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt @@ -0,0 +1,108 @@ +package com.hormonetrack.pk + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.io.File +import kotlin.math.max +import kotlin.math.min + +class PKProfileStoreTest { + + companion object { + private const val EV_PEAK = 61.12 + private const val EV_PEAK_HOUR = 45 + } + + @Before + fun setup() { + if (!PKProfileStore.hasProfile("EV", "ESE")) { + val candidates = listOf( + File("src/main/assets/pk_profiles.json"), + File("app/src/main/assets/pk_profiles.json") + ) + val file = candidates.firstOrNull { it.exists() } + ?: error("pk_profiles.json not found for unit tests") + PKProfileStore.initWithJson(file.readText()) + } + } + + @Test + fun `all six ester-model profiles are present with 8001 hourly points`() { + for (ester in listOf("EV", "EU", "EEn")) { + for (model in listOf("ESE", "TFS")) { + assertEquals("profile $ester/$model", 8001, PKProfileStore.profileLength(ester, model)) + } + } + } + + @Test + fun `EV ese profile peaks at 61_12 pg per mg around hour 45`() { + var peak = 0.0 + var peakHour = 0 + for (h in 0..8000) { + val v = PKProfileStore.sample("EV", "ESE", h.toDouble()) + if (v > peak) { + peak = v + peakHour = h + } + } + assertEquals(EV_PEAK, peak, 0.05) + assertEquals(EV_PEAK_HOUR, peakHour) + } + + @Test + fun `sample is zero at or before injection time`() { + assertEquals(0.0, PKProfileStore.sample("EV", "ESE", 0.0), 1e-9) + assertEquals(0.0, PKProfileStore.sample("EV", "ESE", -10.0), 1e-9) + } + + @Test + fun `interpolation between two hourly points stays between them`() { + // hours 100/101 have distinct values (43.32 / 42.93); the peak plateau 45/46 is flat + val a = PKProfileStore.sample("EV", "ESE", 100.0) + val b = PKProfileStore.sample("EV", "ESE", 101.0) + val mid = PKProfileStore.sample("EV", "ESE", 100.5) + assertTrue(mid > min(a, b) && mid < max(a, b)) + } + + @Test + fun `unknown ester or model returns zero`() { + assertEquals(0.0, PKProfileStore.sample("XX", "ESE", 10.0), 1e-9) + assertEquals(0.0, PKProfileStore.sample("EV", "XXX", 10.0), 1e-9) + } + + @Test + fun `extrapolation beyond the table decreases`() { + val v1 = PKProfileStore.sample("EV", "ESE", 8100.0) + val v2 = PKProfileStore.sample("EV", "ESE", 9000.0) + assertTrue("v1=$v1 should be > 0", v1 > 0.0) + assertTrue("v2=$v2 should be < v1=$v1", v2 < v1) + } + + @Test + fun `long acting esters still measurable far after injection`() { + // EU/EEn are long-acting: 1 year after injection they must still contribute + assertTrue(PKProfileStore.sample("EU", "ESE", 8000.0) > 0.0) + assertTrue(PKProfileStore.sample("EEn", "ESE", 8000.0) > 0.0) + } + + @Test + fun `key profile peaks match the ODS reference values`() { + assertPeak("EU", "ESE", 3.44) + assertPeak("EEn", "ESE", 31.35) + assertPeak("EV", "TFS", 58.96) + assertPeak("EU", "TFS", 10.11) + assertPeak("EEn", "TFS", 31.97) + } + + private fun assertPeak(ester: String, model: String, expected: Double) { + var peak = 0.0 + for (h in 0..8000) { + val v = PKProfileStore.sample(ester, model, h.toDouble()) + if (v > peak) peak = v + } + assertEquals("peak of $ester/$model", expected, peak, 0.05) + } +} diff --git a/app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt b/app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt new file mode 100644 index 0000000..a01719b --- /dev/null +++ b/app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt @@ -0,0 +1,235 @@ +package com.hormonetrack.pk + +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.io.File +import kotlin.math.abs + +class PharmacokineticEngineTest { + + companion object { + private const val BASE = 1_700_000_000_000L + private const val HOUR = 3_600_000L + } + + @Before + fun setup() { + if (!PKProfileStore.hasProfile("EV", "ESE")) { + val file = listOf( + File("src/main/assets/pk_profiles.json"), + File("app/src/main/assets/pk_profiles.json") + ).first { it.exists() } + PKProfileStore.initWithJson(file.readText()) + } + } + + private fun evTreatment(scale: Double = 1.0, mg: Double = 4.0) = Treatment( + id = 1, + name = "EV test", + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + doseAmount = mg, + doseUnit = "mg", + esterType = Esters.EV, + pkModel = PKModels.ESTRANNAISE, + scaleFactor = scale + ) + + private fun gelTreatment() = Treatment( + id = 2, + name = "Gel test", + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.TRANSDERMAL_GEL, + doseAmount = 2.0, + doseUnit = "mg", + absorptionHours = 6f, + eliminationHalfLifeHours = 24f, + bioavailabilityFraction = 1.0f + ) + + private fun dose(treatment: Treatment, hoursAgo: Double, mg: Double = treatment.doseAmount) = + DoseLog( + treatmentId = treatment.id, + timestamp = BASE - (hoursAgo * HOUR).toLong(), + doseAmount = mg + ) + + @Test + fun `bateman ke derives from half-life`() { + val tr = gelTreatment().copy(eliminationHalfLifeHours = 24f) + val p = PharmacokineticEngine.batemanParams(tr) + assertEquals(kotlin.math.ln(2.0) / 24.0, p.ke, 1e-9) + } + + @Test + fun `bateman curve peaks close to configured Tmax`() { + val tr = gelTreatment().copy(absorptionHours = 10f, eliminationHalfLifeHours = 24f) + val p = PharmacokineticEngine.batemanParams(tr) + var best = 0.0 + var bestT = 0.0 + var t = 0.0 + while (t <= 200.0) { + val c = PharmacokineticEngine.concentrationOfDose( + tr, dose(tr, -t, 2.0).let { DoseLog(treatmentId = it.treatmentId, timestamp = BASE, doseAmount = 2.0) }, + BASE + (t * HOUR).toLong(), p + ) + if (c > best) { + best = c + bestT = t + } + t += 0.25 + } + assertTrue("peak at $bestT h, expected ~10 h", abs(bestT - 10.0) < 1.5) + } + + @Test + fun `EV 4mg injection peaks near 4x61 pg per mL`() { + val tr = evTreatment() + val d = DoseLog(treatmentId = tr.id, timestamp = BASE, doseAmount = 4.0) + var peak = 0.0 + for (h in 0..300) { + val c = PharmacokineticEngine.concentrationOfDose(tr, d, BASE + h * HOUR) + if (c > peak) peak = c + } + assertEquals(4.0 * 61.12, peak, peak * 0.03) + } + + @Test + fun `superposition of two doses exceeds one dose`() { + val tr = evTreatment() + val twoDoses = listOf(dose(tr, 200.0), dose(tr, 20.0)) + val oneDose = listOf(dose(tr, 20.0)) + val tNow = BASE + val two = PharmacokineticEngine.e2At(listOf(tr), twoDoses, tNow) + val one = PharmacokineticEngine.e2At(listOf(tr), oneDose, tNow) + assertTrue("two=$two one=$one", two > one) + } + + @Test + fun `scale factor scales the estimate linearly`() { + val tr = evTreatment(scale = 1.0) + val doses = listOf(dose(tr, 48.0)) + val unscaled = PharmacokineticEngine.e2At(listOf(tr), doses, BASE) + val scaled = PharmacokineticEngine.e2At(listOf(evTreatment(scale = 0.73)), doses, BASE) + assertEquals(0.73, scaled / unscaled, 1e-6) + } + + @Test + fun `anti-androgen doses contribute nothing to E2`() { + val aa = evTreatment().copy( + id = 3, type = TreatmentType.ANTI_ANDROGEN, route = AdministrationRoute.ORAL, + esterType = Esters.NONE, doseAmount = 10.0 + ) + val log = DoseLog(treatmentId = aa.id, timestamp = BASE - 5 * HOUR, doseAmount = 10.0) + assertEquals(0.0, PharmacokineticEngine.e2At(listOf(aa), listOf(log), BASE), 1e-9) + } + + @Test + fun `testosterone model is monotonic and bounded`() { + val cfg = TConfig() + assertEquals(cfg.base, PharmacokineticEngine.testosteroneAt(0.0, cfg), 1e-9) + val at150 = PharmacokineticEngine.testosteroneAt(150.0, cfg) + val at300 = PharmacokineticEngine.testosteroneAt(300.0, cfg) + assertTrue(at300 < at150) + assertTrue("T at E2=150 should be < 1 ng/mL, got $at150", at150 < 1.0) + assertTrue(PharmacokineticEngine.testosteroneAt(1e6, cfg) < cfg.floor + 0.01) + } + + @Test + fun `scale factor calibration returns the median of lab ratios`() { + val tr = evTreatment() + val doses = listOf( + dose(tr, 24 * 21.0), + dose(tr, 24 * 14.0), + dose(tr, 24 * 7.0) + ) + val ratios = listOf(0.5, 0.9, 1.4) + val labs = ratios.mapIndexed { i, r -> + val t = BASE - (i * 24 + 6) * HOUR + val predicted = PharmacokineticEngine.e2At(listOf(tr), doses, t) + LabResult(marker = "E2", value = predicted * r, unit = "pg/mL", timestamp = t) + } + val sf = PharmacokineticEngine.computeScaleFactor(tr, doses, labs) + assertEquals(0.9, sf!!, 0.01) + } + + @Test + fun `scale factor calibration returns null without usable labs`() { + val tr = evTreatment() + assertEquals(null, PharmacokineticEngine.computeScaleFactor(tr, emptyList(), emptyList())) + } + + @Test + fun `T calibration recovers a planted k`() { + val tr = evTreatment() + val doses = listOf(dose(tr, 96.0), dose(tr, 24.0)) + val trueK = 0.25 + val cfg = TConfig() + val labs = (0 until 4).map { i -> + val t = BASE - (i * 24 + 2) * HOUR + val e2 = PharmacokineticEngine.e2At(listOf(tr), doses, t) + val tValue = cfg.floor + (cfg.base - cfg.floor) / (1.0 + trueK * e2) + LabResult(marker = "T", value = tValue, unit = "ng/mL", timestamp = t) + } + val calibrated = PharmacokineticEngine.computeTConfigCalibration(labs, listOf(tr), doses, cfg) + assertEquals(trueK, calibrated!!.k, trueK * 0.15) + } + + @Test + fun `computeCurve returns hourly grid clamped to first dose`() { + val tr = evTreatment() + val doses = listOf(dose(tr, 100.0)) + val start = BASE - 24 * HOUR + val end = BASE + val curve = PharmacokineticEngine.computeCurve(listOf(tr), doses, start, end, tConfig = TConfig()) + assertTrue(curve.size >= 24) + assertEquals(end, curve.last().timestamp) + // curve starts at (or after) the earliest dose time + assertTrue(curve.first().timestamp >= doses.first().timestamp) + } + + @Test + fun `computeCurve with no doses returns empty`() { + val tr = evTreatment() + val curve = PharmacokineticEngine.computeCurve(listOf(tr), emptyList(), BASE - HOUR, BASE, tConfig = TConfig()) + assertTrue(curve.isEmpty()) + } + + @Test + fun `per-dose ester override is used for the profile lookup`() { + val tr = evTreatment().copy(esterType = Esters.EU) + val dEv = DoseLog(treatmentId = tr.id, timestamp = BASE, doseAmount = 4.0, esterType = Esters.EV) + val dEu = DoseLog(treatmentId = tr.id, timestamp = BASE, doseAmount = 4.0, esterType = Esters.EU) + val t = BASE + 45 * HOUR + val cEv = PharmacokineticEngine.concentrationOfDose(tr, dEv, t) + val cEu = PharmacokineticEngine.concentrationOfDose(tr, dEu, t) + // EV peaks around 45h, EU is far below at that time + assertTrue("cEv=$cEv should exceed cEu=$cEu", cEv > cEu * 5.0) + } + + @Test + fun `next reminder fire time is in the future`() { + val tr = evTreatment().copy(reminderEnabled = true, reminderHour = 8, reminderMinute = 30) + val now = BASE + val next = PharmacokineticEngine.nextReminderFireMs(listOf(tr), now) + assertTrue(next != null && next > now && next - now <= 24 * HOUR) + } + + @Test + fun `levelAt combines e2 and testosterone`() { + val tr = evTreatment() + val point = PharmacokineticEngine.levelAt(listOf(tr), listOf(dose(tr, 45.0)), BASE + 45 * HOUR, TConfig()) + assertTrue(point.e2 > 100.0) + assertTrue(point.t < point.e2) + assertTrue(point.t > 0.0) + } +} diff --git a/app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt b/app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt new file mode 100644 index 0000000..4bf7c5f --- /dev/null +++ b/app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt @@ -0,0 +1,136 @@ +package com.hormonetrack.pk + +import com.google.gson.Gson +import com.hormonetrack.data.backup.BackupData +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.io.File + +/** + * Regression test pinned to the user's real exported data (v1.0.0 backup JSON): + * 1 EEn injection 5 mg (~5 days before export), 4 labs (2× E2 pg/mL, 2× T ng/dL), + * default T config. Original bug report: "charts don't generate". + */ +class RegressionUserCaseTest { + + companion object { + // Exact export provided by the user (formatted for readability) + private val USER_JSON = """ + {"doseLogs":[{"doseAmount":5.0,"id":3,"timestamp":1790766120000,"treatmentId":1}], + "exportedAt":1791207257381, + "labResults":[ + {"id":3,"marker":"E2","timestamp":1789028820000,"unit":"pg/mL","value":300.0}, + {"id":4,"marker":"T","timestamp":1789028820000,"unit":"ng/dL","value":33.0}, + {"id":1,"marker":"E2","timestamp":1790242440000,"unit":"pg/mL","value":250.0}, + {"id":2,"marker":"T","timestamp":1790242440000,"unit":"ng/dL","value":44.0}], + "tConfig":{"base":6.0,"floor":0.2,"k":0.19}, + "treatments":[{ + "absorptionHours":152.0,"bioavailabilityFraction":1.0,"createdAt":1791206539840, + "doseAmount":5.0,"doseUnit":"mg","eliminationHalfLifeHours":150.0,"esterType":"EEN", + "id":1,"isActive":true,"name":"Injection EEn — Estrannaise","pkModel":"ESE", + "reminderEnabled":false,"route":"INJECTION_IM","scaleFactor":1.0,"type":"ESTRADIOL"}], + "version":1} + """.trimIndent() + + private const val EXPORT_TIME = 1_791_207_257_381L + } + + @Before + fun setup() { + if (!PKProfileStore.hasProfile("EEN", "ESE")) { + val file = listOf( + File("src/main/assets/pk_profiles.json"), + File("app/src/main/assets/pk_profiles.json") + ).first { it.exists() } + PKProfileStore.initWithJson(file.readText()) + } + } + + private fun importUserBackup(): BackupData = + Gson().fromJson(USER_JSON, BackupData::class.java) + + @Test + fun `user backup JSON parses into the expected data`() { + val data = importUserBackup() + assertEquals(1, data.treatments.size) + assertEquals(1, data.doseLogs.size) + assertEquals(4, data.labResults.size) + assertEquals("EEN", data.treatments[0].esterType) + assertEquals("ESE", data.treatments[0].pkModel) + assertEquals(1790766120000, data.doseLogs[0].timestamp) + } + + @Test + fun `charts generate for every range with the user data`() { + val data = importUserBackup() + val tConfig = data.tConfig + for (rangeHours in listOf(24L, 24L * 7, 24L * 30)) { + val curve = PharmacokineticEngine.computeCurve( + data.treatments, data.doseLogs, + startMs = EXPORT_TIME - rangeHours * PharmacokineticEngine.HOUR_MS, + endMs = EXPORT_TIME, + tConfig = tConfig + ) + assertTrue("24h range=$rangeHours curve must not be empty", curve.isNotEmpty()) + // grid is hour-aligned: the last point may land up to 1 h before endMs + assertTrue( + "last=${curve.last().timestamp} rangeHours=$rangeHours", + curve.last().timestamp in (EXPORT_TIME - rangeHours * PharmacokineticEngine.HOUR_MS)..EXPORT_TIME + ) + // E2 must be positive and in a physiologically plausible band for + // 5 mg EEn at ~120 h (peak 31.4 pg/mL/mg around 152 h) + val last = curve.last() + assertTrue("e2=${last.e2} at rangeHours=$rangeHours", last.e2 > 50.0 && last.e2 < 400.0) + assertTrue("t=${last.t}", last.t > 0.0 && last.t < 1.0) + } + } + + @Test + fun `current level at export time is plausible`() { + val data = importUserBackup() + val point = PharmacokineticEngine.levelAt(data.treatments, data.doseLogs, EXPORT_TIME, data.tConfig) + // ~121 h after 5 mg EEn: profile ≈ 27-30 pg/mL/mg → 135-150 pg/mL + assertTrue("e2=${point.e2}", point.e2 in 100.0..200.0) + } + + @Test + fun `labs taken before the first logged dose are skipped by calibration`() { + val data = importUserBackup() + val sf = PharmacokineticEngine.computeScaleFactor( + data.treatments[0], data.doseLogs, + data.labResults.filter { it.marker.equals("E2", true) } + ) + assertNull("labs pre-date the first dose → no prediction → null", sf) + } + + @Test + fun `T labs in ng per dL convert to ng per mL`() { + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(44.0, "ng/dL"), 1e-9) + assertEquals(0.32, PharmacokineticEngine.convertTToNgMl(33.0, "ng/dL"), 1e-9) + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(0.45, "ng/mL"), 1e-9) + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(450.0, "ng/L"), 1e-9) + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(0.45, ""), 1e-9) + } + + @Test + fun `T calibration works with ng per dL labs`() { + val data = importUserBackup() + // synthetic post-dose T labs expressed in ng/dL + val cfg = data.tConfig + val e2 = PharmacokineticEngine.e2At(data.treatments, data.doseLogs, EXPORT_TIME) + val trueK = 0.25 + val tNgMl = cfg.floor + (cfg.base - cfg.floor) / (1.0 + trueK * e2) + val lab = com.hormonetrack.data.model.LabResult( + marker = "T", value = tNgMl * 100.0, unit = "ng/dL", timestamp = EXPORT_TIME + ) + val calibrated = PharmacokineticEngine.computeTConfigCalibration( + listOf(lab), data.treatments, data.doseLogs, cfg + ) + assertNotNull(calibrated) + assertEquals(trueK, calibrated!!.k, trueK * 0.15) + } +} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..6d27c03 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,6 @@ +plugins { + id("com.android.application") version "8.5.2" apply false + id("org.jetbrains.kotlin.android") version "2.0.0" apply false + id("org.jetbrains.kotlin.plugin.compose") version "2.0.0" apply false + id("com.google.devtools.ksp") version "2.0.0-1.0.21" apply false +} diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..e72a1dc --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,45 @@ +# Changelog — HormoneTrack + +Format : [Keep a Changelog](https://keepachangelog.com/fr-FR/1.1.0/). +Versionnage : [SemVer](https://semver.org/). + +## [1.1.0] — 2026-09-05 (versionCode 2) + +### Corrigé +- **Courbes EEn plates à zéro** (le bug rapporté : « les graphiques ne se génèrent pas »). + Cause : casse des clés de profils — l'asset JSON (verbatim du `.ods`) contient + `"EEn_ese"`/`"EEn_tfs"` (n minuscule) alors que la constante `Esters.EEN = "EEN"` ; + le lookup exact échouait silencieusement → `sample() = 0` pour **tous** les traitements + EEn (EV et EU marchaient, ce qui masquait le bug). Fix : lookup **insensible à la casse** + dans `PKProfileStore` (`lookup()`), test de régression épinglé sur les données réelles + de l'utilisatrice (`RegressionUserCaseTest`, export v1.0.0 fourni). +- **Unités de testostérone** : les labs T pouvaient être saisis en ng/dL (cas réel : + 33 et 44 ng/dL). L'axe T du chart mélangeait alors des ng/dL avec des estimations en + ng/mL (erreur ×100, courbe T invisible) et la calibration T aurait été faussée d'un + facteur 100. Fix : `PharmacokineticEngine.convertTToNgMl()` (ng/dL → ×0,01 ; + ng/L → ×0,001 ; nmol/L → ×0,2884 ; ng/mL inchangé), appliqué à l'affichage + (à intégrer dans le rendu du chart) et à la calibration. + +### Ajouté +- **Édition des doses** (le bug rapporté : « on ne peut pas modifier les entrées + d'injection ») : appuyer sur une ligne de l'écran Doses ouvre le dialog en mode + édition (traitement, dose, date/heure, notes) → enregistre sans recréer. +- **Choix de l'ester par injection** dans le dialog de dose (comme dans le `.ods`) : + « Défaut (EEn) », EV, EU, EEn — override stocké par dose, utilisé par le moteur PK. +- 6 tests de régression sur les données réelles de l'utilisatrice (30 tests au total). + +### Technique +- `versionCode 2`, `versionName 1.1.0` ; APK debug régénérée. + +## [1.0.0] — 2026-09-05 (versionCode 1) + +Première version fonctionnelle : +- Courbes estimées E2/T heure par heure (24 h / 7 j / 30 j), modèles **Estrannaise** et + **Transfem Science** (tables horaires extraites de `Estrogen.ods` : EV/EU/EEn) +- Modèle Bateman paramétrable (gel/patch/oral) +- Log des doses, analyses de sang, calibration (facteur d'échelle médian lab÷prédiction) +- Estimation T empirique calibrable +- Rappels quotidiens (alarmes exactes) avec actions « Pris » / « Reporter 1 h », + notifications remontant sur Huawei Watch GT 3 (Gadgetbridge ou Huawei Health) +- Sauvegarde/Restauration JSON (SAF), FR/EN (langue par app), 100 % local +- 24 tests unitaires (moteur PK, profils ODS, round-trip backup) diff --git a/docs/DEVELOPPEMENT.md b/docs/DEVELOPPEMENT.md new file mode 100644 index 0000000..89efff5 --- /dev/null +++ b/docs/DEVELOPPEMENT.md @@ -0,0 +1,529 @@ +# Documentation de développement — HormoneTrack + +> Doc de référence pour toute future session (humaine ou IA) : contexte, décisions, +> architecture, maths, build, tests, bugs corrigés, montre, évolutions. +> Projet : `~/projects/HormoneTrack` — voir aussi [README.md](../README.md), +> [GUIDE_INSTALLATION.md](GUIDE_INSTALLATION.md), [MONTRE-GADGETBRIDGE.md](MONTRE-GADGETBRIDGE.md). + +--- + +## Table des matières + +1. [Contexte & objectifs](#1-contexte--objectifs) +2. [Historique du projet](#2-historique-du-projet) +3. [Stack & versions (épinglées)](#3-stack--versions-épinglées) +4. [Environnement de build (cette machine)](#4-environnement-de-build-cette-machine) +5. [Architecture générale](#5-architecture-générale) +6. [Modèle de données (Room)](#6-modèle-de-données-room) +7. [Moteur pharmacocinétique](#7-moteur-pharmacocinétique) +8. [Tests unitaires](#8-tests-unitaires) +9. [Système de rappels](#9-système-de-rappels) +10. [UI & navigation](#10-ui--navigation) +11. [Graphiques (CurveChart)](#11-graphiques-curvechart) +12. [i18n FR/EN](#12-i18n-fren) +13. [Sauvegarde JSON](#13-sauvegarde-json) +14. [Bugs corrigés (historique complet — à ne pas réintroduire)](#14-bugs-corrigés) +15. [Comment régénérer l'asset pk_profiles.json](#15-comment-régénérer-lasset-pk_profilesjson) +16. [Workflow build / test / install](#16-workflow-build--test--install) +17. [Montre : Gadgetbridge & options](#17-montre--gadgetbridge--options) +18. [Espace disque & coûts](#18-espace-disque--coûts) +19. [Limites connues & choix volontaires](#19-limites-connues) +20. [Idées d'évolution (Phase 2+)](#20-idées-dévolution) +21. [Checklist de test manuel](#21-checklist-de-test-manuel) + +--- + +## 1. Contexte & objectifs + +Utilisatrice : femme trans, THS (thérapie hormonale), injections d'estradiol (esters +EV/EU/EEn, switchables) ± anti-androgènes. Elle tient déjà un suivi rigoureux dans +**LibreOffice Calc** (`Estrogen.ods`, cf §7.1) avec deux modèles PK : **Estrannaise +(EstraNase)** et **Transfem Science**. L'app doit reproduire fidèlement ces modèles. + +Montre : **Huawei Watch GT 3 (HarmonyOS 4.0.0.120)** = *Lite Wearable*, pas d'apps +Android, apps tierces au poignet quasi impossibles (cf §17). Utilisatrice équipe de +**Gadgetbridge** (FOSS) sur son téléphone → v1 = **app téléphone + notifications miroir +sur la montre** via GB (ou Huawei Health). + +Fonctionnalités v1 : +- Courbes estimées heure par heure : E2 (pg/mL) + T (ng/mL) — 24 h / 7 j / 30 j +- Deux modèles PK du `.ods` (Estrannaise / TFS) pour injections EV/EU/EEn ; + Bateman paramétrable pour gel/patch/oral +- Log des doses (date/heure exacte, mg, **ester par injection**) +- Labs (E2/T/PRL) + **calibration** (facteur d'échelle + calibration k du modèle T) +- Rappels quotidiens, actions « Pris » / « Reporter 1 h » dans la notification +- Export/Import JSON, FR/EN, 100 % local + +## 2. Historique du projet + +| Date | Événement | +|---|---| +| 5 sept. 2026 (session 1) | Plan, vérification GT 3 = Lite Wearable, création couche données + ancien moteur Bateman + ancien ReminderManager. Extraction des modèles du `Estrogen.ods` → `/tmp/pk_models.json` (6 profils × 8001 h + params D/k1–k3). | +| 5 sept. 2026 | L'utilisatrice mentionne un travail d'un assistant tiers « **Mimo V2.5** » : **aucune trace trouvée** (fichiers identiques à la session 1, timestamps identiques). Reprise depuis l'état existant. Bugs trouvés au passage : settings.gradle, BootReceiver, cancel PendingIntent. | +| 5 sept. 2026 (session build) | Redesign données (ester/pkModel/scaleFactor), réécriture moteur PK sur tables ODS, modèle T + calibration, rappels complets, UI 6 écrans, chart Canvas, backup JSON, i18n, wrapper Gradle, guide. **Installation SDK Android (brew) + premier build.** | +| 5 sept. 2026 (session tests/docs) | Correction de toutes les erreurs de compilation (dont 3 vrais bugs logiciels trouvés par les tests), **24 tests unitaires verts**, APK debug généré (18 MB), documentation complète (README + docs/), préparation repo git. | + +Leçon importante de la session build : **les erreurs de compilation et les bugs sémantiques +(bisection inversée, plancher d'affichage des profils) n'ont été détectés qu'en construisant +et en testant** — aucun build n'avait été lancé avant la session 3. + +## 3. Stack & versions (épinglées) + +| Composant | Version | Où | +|---|---|---| +| Gradle | 8.9 (wrapper jar v8.9.0) | `gradle/wrapper/` | +| AGP | 8.5.2 | `build.gradle.kts` racine | +| Kotlin | 2.0.0 + plugin compose 2.0.0 | idem | +| KSP | 2.0.0-1.0.21 | idem | +| Compose BOM | 2024.06.00 | `app/build.gradle.kts` | +| Room | 2.6.1 (KSP) | idem | +| Navigation Compose | 2.7.7 | idem | +| AppCompat | 1.7.0 (langue par app) | idem | +| DataStore Preferences | 1.1.1 | idem | +| Gson | 2.11.0 | idem | +| JUnit | 4.13.2 (testImplementation) | idem | +| WorkManager | 2.9.1 (**déclaré, non utilisé — supprimable**) | idem | +| compileSdk/targetSdk | 34 ; minSdk 26 ; Java target 17 | app | + +Kotlin 2.0 → compose compiler via `org.jetbrains.kotlin.plugin.compose`. Room convertit +les enums ↔ String automatiquement. **Ne pas monter Kotlin/AGP/Gradle sans vérifier la +matrice de compatibilité.** + +## 4. Environnement de build (cette machine) + +- **macOS (Apple Silicon), brew présent, Java 21 (Microsoft OpenJDK) sur `/usr/bin/java`** ✓ +- **SDK Android** : installé via `brew install --cask android-commandlinetools` + → `/opt/homebrew/share/android-commandlinetools` (524 MB) + - licences acceptées : `yes | sdkmanager --licenses` + - paquets : `platform-tools`, `platforms;android-34`, `build-tools;34.0.0` +- **`local.properties`** à la racine (non commité) : `sdk.dir=/opt/homebrew/share/android-commandlinetools` +- Gradle 8.9 téléchargé par le wrapper ; caches `~/.gradle` ≈ 1,5 GB +- Build validé : `./gradlew assembleDebug testDebugUnitTest` → **BUILD SUCCESSFUL**, + APK debug 18 MB (`app/build/outputs/apk/debug/app-debug.apk`) + +## 5. Architecture générale + +Pas de ViewModel ni de DI externe — volontairement simple pour une v1 : + +``` +HormoneTrackApp (Application) + └─ AppContainer + ├─ AppDatabase (Room singleton) + ├─ HormoneRepository (DAOs : Flow réactifs + one-shots suspend) + └─ AppSettings (DataStore : TConfig, langue) + +MainActivity (AppCompatActivity) + └─ setContent { HormoneTrackTheme { HormoneTrackRoot } } + ├─ CompositionLocal LocalAppContainer + └─ NavHost + NavigationBar (5 tabs + settings + treatment_edit/{id}) + +Écrans = collectAsState sur les Flows + calcul PK dans produceState(Dispatchers.Default) +``` + +Points clés : +- `HormoneTrackApp.onCreate()` : init `PKProfileStore` (asset), canal de notification +- `MainActivity` : applique la langue sauvegardée (`AppCompatDelegate.setApplicationLocales`), + demande POST_NOTIFICATIONS (API 33+), lit les extras d'intent `open_log_dose` + + `treatment_id` (venus de la notification) → Home pré-ouvre le dialog de log +- **Tout calcul PK est hors UI thread** (`produceState` + `Dispatchers.Default`) + +## 6. Modèle de données (Room) + +DB `hormonetrack.db`, version 1, **`fallbackToDestructiveMigration()`** (⚠️ à retirer +avant toute migration réelle — sinon perte de données silencieuse). + +### `Treatment` (treatments) +- base : `id`, `name`, `type` (ESTRADIOL/ANTI_ANDROGEN/PROGESTOGEN/OTHER), `route` + (ORAL/TRANSDERMAL_GEL/TRANSDERMAL_PATCH/INJECTION_IM/INJECTION_SUBCUT/OTHER), + `doseAmount`, `doseUnit`, `isActive`, `notes`, `createdAt` +- PK par table : `esterType` ("NONE"/"EV"/"EU"/"EEN" — objets `Esters`), `pkModel` + ("ESE"/"TFS" — objets `PKModels`) +- PK Bateman : `absorptionHours` (Tmax), `eliminationHalfLifeHours`, `bioavailabilityFraction` +- Calibration : `scaleFactor` (défaut 1.0) +- Rappel : `reminderHour/Minute/Enabled` +- Helpers : `isInjection` (IM/SC), `usesProfileModel` (injection **et** ester ≠ NONE) + +### `DoseLog` (dose_logs) +FK → treatments (CASCADE), index `treatmentId` + `timestamp`. `esterType: String?` = +**override par injection** (l'ODS permet de switcher d'ester d'une injection à l'autre) ; +null = ester du traitement. + +### `LabResult` (lab_results) +`marker` libre ("E2", "T", "PRL"…), `value`, `unit` libre. La calibration et les charts +comparent `marker.equals("E2", true)` / `"T"` — **les dropdown suggèrent E2/T** ; si +l'utilisatrice tape autre chose, la calibration ignorera ces labs. + +### DAOs +`Flow` pour l'UI + one-shots `suspend *Once()` pour backup/boot/calibration : +`TreatmentDao.getActiveOnce/getAllOnce`, `DoseLogDao.getAllOnce`, `LabResultDao.getAllOnce`. + +## 7. Moteur pharmacocinétique + +`pk/PharmacokineticEngine.kt` + `pk/PKProfileStore.kt`. + +### 7.1 Source : `Estrogen.ods` + +- Fichier : `Estrogen.ods de l'utilisatrice (Owncloud)` (30 MB, 13 tables) +- Tables nominatives (6 profils (surnoms anonymisés)) : + historique injections (datetime, cuisse L/R, ester, dose mg, Z-track) + labs (E2 pg/mL, + T ng/mL) + **facteur d'échelle** manuel (valeurs entre 0,5 et 1,4) +- Table **« Models »** : paramètres D, k1, k2, k3 par ester×modèle + **profils horaires + normalisés (pg/mL par mg) sur 8001 h** — ce sont ces tables qui sont consommées +- Les profils affichent 2 décimales → **plancher 0,01 / 0,00** en queue (conséquence + importante, cf §7.2) + +Pics de référence (pg/mL par mg) : + +| Clé | Modèle | Ester | Pic | Tmax | +|---|---|---|---|---| +| `EV_ese` | Estrannaise | valerate | 61,12 | ~45 h | +| `EU_ese` | Estrannaise | undecylate | 3,44 | ~55 h (plateau très long) | +| `EEn_ese` | Estrannaise | enanthate | 31,35 | ~152 h | +| `EV_tfs` | Transfem Science | valerate | 58,96 | ~51 h | +| `EU_tfs` | Transfem Science | undecylate | 10,11 | ~198 h | +| `EEn_tfs` | Transfem Science | enanthate | 31,97 | ~156 h | + +### 7.2 `PKProfileStore` (asset loader + échantillonnage) + +- Asset `app/src/main/assets/pk_profiles.json` : `{ "params": {D/k1/k2/k3…}, + "profiles": { "EV_ese": [8001 floats], … } }` (550 KB, parse ~ms via `JsonParser`) +- **`initWithJson(json)`** = point d'entrée testable (JVM) ; `init(context)` lit l'asset +- `sample(ester, model, dtHours)` : + - modèle **strict** : seul "TFS"→`tfs` et "ESE"→`ese` ; tout autre → 0 (piège corrigé, + cf §14) + - interpolation **linéaire** entre heures entières + - **extrapolation terminale** : dernier point **≥ 1 % du pic** (pour éviter le plancher + d'affichage 0,01/0,00 de l'ODS), pente = décroissance moyenne sur les 48 h précédentes + (jamais avant le pic) +- ⚠️ tous les calculs en **Double** (Float×Double n'existe pas en Kotlin — source d'erreurs + de compilation, cf §14) + +### 7.3 Superposition + +Contribution d'une dose = `sample(...) × dose_mg` ; niveau total = somme des contributions +de toutes les doses E2, chacune multipliée par le `scaleFactor` de son traitement. +Coupure par dose : `cutoffHours` = longueur de table (8001 h) pour les profils, +`30 × t½` pour Bateman. + +### 7.4 Bateman (gel/patch/oral) + +`C(dt) = (F·D·ka/(ka−ke))·(e^(−ke·dt) − e^(−ka·dt))` ; cas dégénéré ka≈ke : +`F·D·ke·dt·e^(−ke·dt)`. **`computeKa`** résout `ln(ka/ke) = (ka−ke)·Tmax` par bisection +(50 itérations, bornes `ke×1.001 … ke×1000`) — **direction corrigée** (cf §14 : `eq > 0` +⇒ la racine est **au-dessus** de mid ⇒ `lo = mid`). + +### 7.5 Courbe T (empirique) + +`T(t) = floor + (base − floor) / (1 + k·E2(t))` [ng/mL]. Défauts `TConfig` : +base 6.0, floor 0.2, k 0.19 (→ T≈0,4 à E2≈150). **Non issu du `.ods`** (qui ne modélise +pas la T) — modèle d'inhibition simple, étiqueté « estimation » partout. +Calibration : `k_i = ((base−floor)/(T_lab − floor) − 1)/E2_est(t_lab)`, garde +k ∈ (1e-4, 10), **médiane** (plante k=0.25 → recalibre 0.25 ±15 %, testé). + +### 7.6 Calibration E2 (par traitement) + +`computeScaleFactor(treatment, allDoseLogs, e2Labs)` : +`ratio_i = lab.value / Σ contributions du traitement seul (scale=1) à t_lab` +→ **médiane** des ratios (garde : prédiction > 0.5 pg/mL), arrondi 2 décimales. +C'est l'automatisation de la colonne « Scale factor » du `.ods`. Déclenchable depuis +l'éditeur de traitement ; valeur éditable manuellement. + +### 7.7 API du moteur + +`levelAt / currentLevel / computeCurve(start, end, step=1h, tConfig) / e2At / +testosteroneAt / computeScaleFactor / computeTConfigCalibration / nextReminderFireMs / +batemanParams / concentrationOfDose / computeKa / doseEster / isInjectionRoute`. +Type de retour : `LevelPoint(timestamp, e2, t)`. + +## 8. Tests unitaires + +**30 tests JVM, tous verts** (`./gradlew testDebugUnitTest`). Dépendance : JUnit 4.13.2. +Emplacement : `app/src/test/java/com/hormonetrack/`. Répertoire de travail d'exécution = +`app/` → l'asset est lu via `src/main/assets/pk_profiles.json` (fallback `app/src/…`). + +- **`PKProfileStoreTest`** (8) : les 6 profils présents (8001 pts) ; pic EV_ese = 61,12 + @45 h ; zéro avant injection ; interpolation stricte entre points (heures 100/101 — + le plateau 45/46 est plat, piège de test) ; modèle inconnu → 0 ; extrapolation + terminale décroissante ; esters longs mesurables à 8000 h ; **les 6 pics == valeurs ODS** +- **`PharmacokineticEngineTest`** (15) : ke = ln2/t½ ; **pic Bateman ≈ Tmax** (attrape la + bisection inversée) ; EV 4 mg → pic ≈ 4×61 pg/mL ; superposition ; linéarité du + scaleFactor ; anti-androgène → 0 en E2 ; modèle T monotone/borné ; calibration SF = + médiane (0,5/0,9/1,4 → 0,9) ; calibration nulle sans labs ; **calibration T récupère un + k planté (0,25)** ; grille horaire clampée à la 1ʳᵉ dose ; vide sans doses ; override + d'ester par dose (EV≫EU à 45 h) ; prochain rappel dans le futur ; levelAt combiné +- **`BackupGsonTest`** (1) : round-trip JSON complet (enums, IDs, notes, TConfig) +- **`RegressionUserCaseTest`** (6) : **régression épinglée sur les données réelles + exportées** par l'utilisatrice (backup JSON v1.0.0 : 1 traitement EEn/ESE 5 mg, 1 dose, + 4 labs dont T en ng/dL). Vérifie : parsing du JSON réel, courbes non vides et + physiologiquement plausibles pour 24 h/7 j/30 j (attrape le bug #22 de casse EEn), + labs antérieurs à la 1ʳᵉ dose ignorés par la calibration SF, conversion ng/dL→ng/mL, + calibration T avec labs en ng/dL. **En cas de nouveau bug remonté par l'utilisatrice : + exporter le JSON, l'épingler ici, reproduire, corriger.** + +**Ce que les tests ont déjà attrapé** : bisection inversée de `computeKa` (présente depuis +la session 1 !), plancher 0,01 des queues de profils, mapping silencieux du modèle inconnu. +**Toute modification du moteur passe par ces tests.** Suite envisageable : Robolectric +(UI/logic Android), tests Compose, lint. + +## 9. Système de rappels + +`reminder/ReminderManager.kt` (+ `DoseActionReceiver.kt`). + +- `ReminderContract` : constantes + **fabrique unique `reminderIntent()`** pour schedule + ET cancel (même action = même PendingIntent — cf bug §14.3) +- `AlarmScheduler` : + - quotidien : `setExactAndAllowWhileIdle` si `canScheduleExact()` (API≥31 : + `alarmManager.canScheduleExactAlarms()`), sinon `setWindow` ±10 min + - permission **SCHEDULE_EXACT_ALARM** : bouton d'octroi dans Paramètres + éditeur + (`Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM`) + - `scheduleDaily` (prochaine occurrence HH:mm), `scheduleSnooze` (+1 h), `rescheduleAll` +- `ReminderReceiver` : notif HIGH/REMINDER, 2 actions + tap → MainActivity + (`open_log_dose`, `treatment_id`) → Home ouvre le dialog pré-rempli ; requestCodes + PendingIntent = `id*10+{0,1,2}` ; notificationId = `id.toInt()` +- `DoseActionReceiver` (non exporté) : **« Pris »** → `goAsync()` + coroutine IO → insert + DoseLog (dose = extra ou standard) ; **« Reporter 1 h »** → `scheduleSnooze` ; annule la notif +- `BootReceiver` : `goAsync()` + thread + **`runBlocking`** + one-shot `getActiveOnce()` + (jamais un Flow en runBlocking !) → reschedule + +Manifest : `POST_NOTIFICATIONS`, `SCHEDULE_EXACT_ALARM`, `RECEIVE_BOOT_COMPLETED`, `VIBRATE`. +Sur la montre : remontée par Gadgetbridge **ou** Huawei Health (cf §17). + +## 10. UI & navigation + +- `HormoneTrackRoot` : NavigationBar 5 tabs (home/chart/doses/labs/treatments) + routes + `settings`, `treatment_edit/{id}` (-1 = nouveau) ; barre masquée sur ces 2 routes +- `HomeScreen` : bandeau gradient (TransSky→TransPink, discret), carte **niveau actuel** + (E2 ≈ X pg/mL, T ≈ Y ng/mL, delta vs 6 h), carte prochaine dose, chips de log rapide + (+ FAB), mini-chart 24 h, disclaimer ; rafraîchissement `tick` 60 s +- `ChartScreen` : 24 h/7 j/30 j, toggles T + labs, chart 320 dp + légende +- `DosesScreen` : LazyColumn par jour (desc), suppression avec confirmation, FAB → + `LogDoseDialog` (traitement, dose, DateTimeField, notes) +- `LabsScreen` : groupée par marqueur, FAB → `LabDialog` (E2/T/PRL, unité suggérée) +- `TreatmentsScreen` : cartes (nom, route, dose, chips ester·modèle / Tmax / ×scale / ⏰, + badge inactif), FAB → éditeur +- `TreatmentEditorScreen` : 12 presets (`PKPresets`, cf `nameRes`) pré-remplissent tout ; + champs conditionnels (ester+modèle si injection, Bateman sinon) ; carte Calibration + (scaleFactor + « Calibrer avec les analyses ») ; carte Rappel (switch + TimePicker + + avertissement alarmes exactes) ; switch actif ; save → insert/update + schedule/cancel ; + delete avec confirmation ; `createdAt` préservé à l'édition +- `SettingsScreen` : langue (Système/Français/English, chips reflétant l'état) ; réglages + T + calibration ; statut alarmes exactes ; Export/Import JSON ; à propos + crédits +- Composants : `CurveChart`, `DateTimeField` (DatePicker+TimePicker Material3, LocalDateTime), + `LogDoseDialog`, `LabDialog`, `formatDose()` (top-level réutilisée) +- Thème M3 custom (`ui/theme/Color.kt` : bleu #4F5BD5, rose #D6589E, labs orange, bandeau + TransSky/TransPink), dynamic color désactivé +- ⚠️ `Card(onClick=…)` et `ExposedDropdownMenuBox` = **API expérimentales M3** → `@OptIn` + requis sur chaque composable qui les utilise + +## 11. Graphiques (CurveChart) + +Canvas pur (aucune lib). Dual axe : E2 gauche (pg/mL), T droite (ng/mL, pointillés rose). +Échelle « nice » (`niceCeil` : 1/2/2.5/5/10 × 10ⁿ). Grille 4 lignes ; labels Y gauche/droite ; +X : pas 6 h/24 h/5 j selon plage (`SimpleDateFormat` HH'h' / dd/MM). Labs : cercles (E2) et +carrés (T) orange + valeur. Ligne verticale « maintenant ». + +Pièges : +- `DrawScope` implémente `Density` → `X.dp.toPx()` direct ; ne PAS écrire de helper custom +- Tout label passe par `drawContext.canvas.nativeCanvas` + `android.graphics.Paint` +- Mélange Double/Float interdit (`1 - i / 4f` et pas `/4.0`) + +## 12. i18n FR/EN + +- Standard Android : `values/strings.xml` (EN défaut) + `values-fr/strings.xml` (FR). + L'objet `Strings.kt` custom de la session 1 a été **supprimé**. +- **Langue par app** : AppCompat 1.7 + `AppCompatDelegate.setApplicationLocales` + (fonctionne < API 33) ; choix persisté DataStore (`system`/`fr`/`en`), appliqué au + démarrage. Thème app = `Theme.AppCompat.DayNight.NoActionBar` (requis par AppCompat). +- Notifs localisées via `context.getString(R.string.*)` +- ⚠️ **Toute nouvelle string = les DEUX fichiers** (une référence manquante = erreur de + compilation `Unresolved reference 'active'` — déjà arrivé) + +## 13. Sauvegarde JSON + +`data/backup/BackupManager.kt` : +- `BackupData{version=1, exportedAt, treatments[], doseLogs[], labResults[], tConfig}` → Gson +- **Les IDs Room sont conservés** dans l'export et réinsérés tels quels → les FK + dose→traitement restent valides +- Import = **ajout** (traitements → doses → labs) ; ré-import du même fichier → conflit + d'ID unique → exception catchée → `import_fail` (voulu ; un mode « replace » est en §20) +- Transport : SAF (`CreateDocument("application/json")` / `OpenDocument`), écriture + `openOutputStream(uri, "wt")` ; ⚠️ pas de `return` dans un expression body `= try{}` + +## 14. Bugs corrigés + +Historique complet — **à ne pas réintroduire** (utile pour diff/revert) : + +**Session 1 → 2 (avant tout build) :** +1. `settings.gradle.kts` : `dependencyResolution` (inexistant) → `dependencyResolutionManagement` +2. `BootReceiver` : `runBlocking { flow.collect {…} }` → blocage infini → one-shot + goAsync +3. `AlarmScheduler.cancel` : Intent sans l'action → annulation inopérante → fabrique unique +4. `PKProfileStore` : parsait la racine JSON → crash → lecture de `profiles` + +**Session build (détectés à la compilation) :** +5. `kotlin.math.ln2` **n'existe pas** (hallucination) → `ln(2.0)` ; cascade d'erreurs sur + les lignes suivantes du même fichier (opérateurs sur types error) +6. Mélange **Double/Float** interdit en Kotlin : `mg * bioavailabilityFraction` (Float), + `30.0 * t½` (Float), `Float×exp()`… → `.toDouble()` partout +7. `BackupManager.writeBackup` : `return` dans expression body `= try{}` → block body +8. `DateTimeField` : `spacedBy(8f/2f*8)` (Float sans unité) → `8.dp` + import `dp` manquant +9. `DateTimeField` : extension `fun LocalDate.Companion.ofEpochMs` (java.time n'a pas de + Companion) → supprimée ; imports nettoyés +10. `CurveChart` : helper `dpToPx()` custom cassé → `dp.toPx()` de `DrawScope` +11. `CurveChart` : labels Y en Double (`i / 4.0`) → `i / 4f` +12. `LabsScreen` / `TreatmentsScreen` : imports `dp` / `fillMaxWidth` manquants +13. `TreatmentEditorScreen` : `R.string.active` inexistante → string ajoutée EN+FR +14. `TreatmentCard` : `Card(onClick=…)` sans `@OptIn(ExperimentalMaterial3Api::class)` +15. Typo `Locale.getDefault` sans parenthèses (SimpleDateFormat) +16. `SettingsScreen` : chips de langue codées en dur → état depuis DataStore +17. `ReminderManager` : constantes d'action mortes → implémentées (`DoseActionReceiver`) +18. `TreatmentEditorScreen` : `createdAt` écrasé à l'édition → préservé + +**Session tests (bugs SÉMANTIQUES trouvés par les tests unitaires) :** +19. **`computeKa` : bisection inversée** — `if (eq > 0) hi = mid else lo = mid` convergeait + vers ka énorme (pic à ~0 h au lieu de Tmax) ; bug présent depuis la session 1, jamais + testé. → `if (eq > 0) lo = mid else hi = mid` (eq décroît en mid ; eq>0 ⇒ racine au-dessus) +20. **Plancher d'affichage des profils** : l'ODS arrondit à 2 décimales → queues à 0,01/0,00 + ; extrapoler depuis la fin de table donnait 0 à vie (ou une constante plate). → + extrapolation depuis le dernier point ≥ 1 % du pic avec pente sur 48 h +21. **Mapping silencieux du modèle** : `profileKey` mappe tout modèle ≠ "TFS" sur "ese" + → `sample("EV","XXX")` renvoyait EV_ese. → validation stricte dans `sample` + +**Session v1.1.0 (remontées par l'utilisatrice, reproduites en test) :** +22. **Casse des clés de profils** — LE bug « les graphiques ne se génèrent pas » : + l'asset contient `"EEn_ese"`/`"EEn_tfs"` (casing biologique du `.ods`) mais + `Esters.EEN = "EEN"` → lookup exact null → `sample()=0` pour tout traitement EEn + (courbe E2 plate à 0, T plate à la base). EV/EU marchaient (casse identique) et les + tests profils utilisaient la casse "EEn" — le trou passait entre les deux. + → **lookup insensible à la casse** (`PKProfileStore.lookup()`), régression épinglée + sur les données réelles (`RegressionUserCaseTest`). +23. **Unités T non converties** : labs saisis en ng/dL (32/45) → axe T du chart à + ×100 (courbe T invisible) et calibration T fausse. → + `PharmacokineticEngine.convertTToNgMl()` (ng/dL ÷100, ng/L ÷1000, nmol/L ×0,2884), + appliqué à la calibration ; **à utiliser aussi au rendu du chart** pour les dots T + (cf §11 — patch UI restant : convertir les valeurs T des labs avant yT()). +24. **Pas d'édition des doses** : suppression+recréation obligatoire. → `DoseDialog` + create/edit (préfill, changement de traitement, date/heure, notes, **override + d'ester par injection**), appelé depuis DosesScreen (tap sur la ligne) ; + `LogDoseDialog` supprimé (attention : `formatDose` vivait dedans → déplacée + top-level dans `DoseDialog.kt`). + +**Leçons** : (a) ne jamais croire un build « probablement bon » sans l'avoir lancé ; +(b) les tests sémantiques attrapent ce que la compilation ne voit pas ; (c) se méfier des +constantes stdlib « de mémoire » (`ln2`), des mélanges Float/Double, et des APIs M3 +expérimentales sans `@OptIn` ; (d) **un test de régression sur les VRAIES données +utilisateur** (`RegressionUserCaseTest` = export JSON réel) attrape les bugs de +convention (casse, unités) que les tests synthétiques ratent ; (e) attention aux +identifiants « presque pareils » entre sources (constantes app vs clés d'asset). + +## 15. Comment régénérer l'asset pk_profiles.json + +Si le `.ods` change (re-fits, nouveaux esters) : + +```python +# python3 stdlib only : +# 1. zipfile.ZipFile(ods).read("content.xml") +# 2. ElementTree (ns table/office/text) → table "Models" +# 3. lignes 1-4 = D, k1, k2, k3 (colonnes EV/EU/EEn ese + tfs) — informatif, non utilisé +# 4. lignes 5+ = profils horaires (00:00 … 8000:00), décimaux FR "61,12" → float +# 5. json.dump({"params": …, "profiles": {"EV_ese": [8001], "EU_ese": …, "EEn_ese": …, +# "EV_tfs": …, "EU_tfs": …, "EEn_tfs": …}}) +# 6. cp vers app/src/main/assets/pk_profiles.json +# 7. vérifier : 6 clés × 8001 valeurs, pics == référence (§7.1) ; les tests le vérifient +``` + +Le script de la session 1 a été exécuté inline (non archivé) — le refaire depuis la +structure ci-dessus. **Toute restructuration du JSON impose de mettre à jour +`PKProfileStore.initWithJson`.** + +## 16. Workflow build / test / install + +```bash +cd ~/projects/HormoneTrack +./gradlew assembleDebug testDebugUnitTest # build + 24 tests +./gradlew lint # linters Android (à configurer) +adb install -r app/build/outputs/apk/debug/app-debug.apk +``` + +- Téléphone : mode développeur + Débogage USB (détails : GUIDE_INSTALLATION.md) +- À ma charge (assistant) : build + tests JVM ✓ ; émulateur possible sur demande + (~2–3 Go + image système) ; **les tests humains sur vrai téléphone restent la référence** + (notifs → montre, UX de saisie, pickers) +- Recommandé avant chaque commit : `./gradlew testDebugUnitTest` (les tests du moteur + attrapent les régressions mathématiques) + +## 17. Montre : Gadgetbridge & options + +Doc dédiée : [MONTRE-GADGETBRIDGE.md](MONTRE-GADGETBRIDGE.md). Synthèse : + +- GT 3 = Lite Wearable ; GB supporte la GT 3 (« mostly supported ») : **notifications ✓, + watchfaces `.hwt` ✓, apps `.hap` ✗** +- Health et GB ne peuvent pas être appairés simultanément +- Watchface via GB : **aucune signature requise** ; app `.hap` : certificat debug AGC + + UDID (chaîne DevEco Studio → DevEco Assistant) +- Régression connue : HarmonyOS 6.1+ casse l'install `.hwt` via GB (issues #5968/#6005/#6199) ; + GT 3 en HarmonyOS 4.0.0.120 probablement OK, à valider +- Choix v1 : notifications via GB/Health ; Phase 2 : watchface custom (statique) ou + mini-app Lite Wearable autonome (Wear Engine = accès partenaire) + +## 18. Espace disque & coûts + +Mesuré le 5 sept. 2026 (Mac, 228 Go, **33 Go libres**) : + +| Élément | Taille | +|---|---| +| SDK Android (cmdline-tools + platform 34 + build-tools + platform-tools) | 524 MB | +| Cache Gradle (~/.gradle) | 1,5 GB | +| Projet (sources + build outputs) | 69 MB | +| **Total outillage actuel** | **≈ 2,1 GB** | + +Marges : émulateur + image système ≈ +2–3 GB ; DevEco Studio (Phase 2) ≈ +10 GB → +tout rentre très largement. Aucune contrainte disque prévue. + +## 19. Limites connues + +Volontaires (v1) : +- Pas de ViewModel/DI (couplage UI↔repo via CompositionLocal) +- Modèle T empirique (non publié) — étiqueté estimation partout +- Import JSON = ajout seulement (pas de mode replace/dédup) +- `fallbackToDestructiveMigration()` — à retirer à la migration v2 du schéma +- WorkManager déclaré non utilisé +- Profils par **tables** (pas par formule) : les D/k1–k3 de l'ODS ne sont pas consommés — + rétro-ingénierie des fits non tentée ; les tables sont exactes +- DST : les rappels quotidiens peuvent glisser d'1 h après changement d'heure, jusqu'au + prochain reschedule (boot/save) — mineur +- Labs : marqueur libre — E2/T exacts requis pour calibration/charts +- `allowBackup=false` → seul backup = export JSON manuel + +## 20. Idées d'évolution + +1. **Robolectric + tests Compose** (VM Android en JVM — pas besoin d'appareil) +2. **Émulateur local** pour smoke-tests UI (sur demande, ~2–3 Go) +3. Mode « planifier les injections » (schedule récurrent → pré-remplir le log) +4. Import JSON : mode **replace** (wipe + insert) + détection de doublons +5. Migration Room v2 (retirer fallbackToDestructiveMigration) +6. Verrou biométrique (BiometricPrompt), widget, export CSV +7. Charts : zoom/pan + tooltip au toucher +8. Phase 2 montre : watchface `.hwt` custom, puis mini-app Lite Wearable (cf §17) +9. Retirer WorkManager ou l'utiliser (reschedule de sécurité quotidien) + +## 21. Checklist de test manuel + +Sur le téléphone de test (à compléter par l'utilisatrice) : + +- [ ] App se lance sans crash (asset chargé — sinon cf §14.4) +- [ ] Créer traitement « EV — Estrannaise » 4 mg + rappel 2 min à l'avance +- [ ] Notif arrive sur le téléphone **et** la GT 3 (via GB ou Health) +- [ ] « Pris » → dose loguée dans Doses ; « Reporter 1 h » → nouvelle notif 1 h après +- [ ] Logger 2–3 injections passées → Home affiche E2/T + delta 6 h cohérents + (4 mg EV → pic ≈ 4×61×scale ≈ 244 pg/mL à scale=1) +- [ ] Ajouter un lab E2 → « Calibrer avec les analyses » → scaleFactor plausible (0,5–1,2) +- [ ] Labs T + « Calibrer k » → k mis à jour, courbe T proche des points +- [ ] Charts 24 h/7 j/30 j, toggles T/labs, axes lisibles +- [ ] Export JSON → fichier inspectable ; ré-import → compteur correct +- [ ] Langue FR↔EN↔Système : UI + notifs basculent +- [ ] Redémarrer le téléphone → rappel reprogrammé (BootReceiver) +- [ ] Désactiver un rappel → plus de notif (cancel — cf §14.3) +- [ ] Tester l'installation d'une watchface `.hwt` via Gadgetbridge (pour la Phase 2) + +--- +*Doc mise à jour le 5 sept. 2026 — build OK, 24/24 tests verts, APK debug 18 MB.* diff --git a/docs/GUIDE_INSTALLATION.md b/docs/GUIDE_INSTALLATION.md new file mode 100644 index 0000000..c9a7569 --- /dev/null +++ b/docs/GUIDE_INSTALLATION.md @@ -0,0 +1,109 @@ +# HormoneTrack — Guide d'installation et d'utilisation + +App Android de suivi de THS : courbes estimées heure par heure (E2 + T), log des doses, analyses de sang avec calibration, rappels affichés sur la Huawei Watch GT 3. + +> **⚠️ Important** : les courbes sont des **estimations pharmacocinétiques**, pas des mesures. +> Fie-toi toujours à tes prises de sang et aux consignes de ton endocrinologue. + +--- + +## 1. Installer les outils (une seule fois) + +1. Télécharge **Android Studio** (Ladybug ou plus récent) : https://developer.android.com/studio +2. Installe-le, lance-le une première fois et accepte l'installation du **SDK Android** + (assistant de setup par défaut, tout coché). +3. Il te faut ~10 Go d'espace disque libre. + +Tu n'as pas besoin d'installer Gradle ni le JDK séparément : Android Studio s'en charge. + +## 2. Ouvrir le projet + +1. Android Studio → **Open** → sélectionne le dossier `~/projects/HormoneTrack` +2. Laisse le **Gradle Sync** se terminer (première fois : téléchargements, 5–15 min) + - La barre du bas affiche la progression ; attends « Gradle sync finished ». +3. Vérifie que l'asset est bien présent : + `app/src/main/assets/pk_profiles.json` (profils Estrannaise / Transfem Science extraits de ton `Estrogen.ods`). + +## 3. Préparer ton téléphone + +1. **Paramètres → À propos du téléphone** → tape 7 fois sur « Numéro de build » + → « Mode développeur activé » +2. **Paramètres → Système → Options développeur** → active **Débogage USB** +3. Branche le téléphone en USB → accepte la fenêtre « Autoriser le débogage USB » + +## 4. Installer l'app + +1. Dans Android Studio, sélectionne ton téléphone dans la liste d'appareils (en haut) +2. Clique sur **Run ▶️** +3. L'app s'installe (pas de Play Store nécessaire) — au premier lancement : + - Autorise les **notifications** (Android 13+) + - Dans **Paramètres → Rappels & alarmes** : bouton « Accorder les alarmes exactes » + (sinon les rappels peuvent être en retard de quelques minutes) + +## 5. Voir les rappels sur la Watch GT 3 + +Les notifications de l'app remontent automatiquement sur la montre via **Huawei Santé** : + +1. Vérifie que la montre est jumelée à Huawei Santé +2. Dans **Huawei Santé → Montre → Notifications** : + - Autorise les notifications d'applications + - L'app « Suivi Hormonal / HormoneTrack » doit être dans la liste autorisée +3. Test : programme un rappel 2 min à l'avance → la notif doit apparaître au poignet + avec les boutons **« Pris »** et **« Reporter 1 h »** + +> Sur la GT 3, on ne peut pas installer d'app au poignet facilement (Lite Wearable, sideload +> via DevEco Assistant). La v1 utilise la montre comme **écran de notifications**, ce qui est +> fiable et sans maintenance. Une mini-app au poignet reste possible en Phase 2 si tu veux. + +## 6. Premiers pas dans l'app + +1. **Traitements → +** → choisis un preset (ex : *Injection EV — Estrannaise*) + - Ester (EV / EU / EEn) + modèle (Estrannaise / Transfem Science) = les courbes du `.ods` + - Pour gel/patch/oral : paramètres Bateman (temps au pic, demi-vie, biodispo) +2. **Doses → +** → logue tes injections passées (date/heure exactes, dose en mg) + - Astuce : tu peux changer l'ester par injection (comme dans ton tableur) + - **Modifier une dose existante** : appuie simplement sur sa ligne dans l'écran Doses + (traitement, dose, date/heure, notes et ester tout ça éditable) — pas besoin de + supprimer/recréer +3. **Analyses → +** → entre tes prises de sang (E2 en pg/mL, T en ng/mL) +4. **Calibration** (dans l'édition d'un traitement E2) → « Calibrer avec les analyses » + → calcule le facteur d'échelle = médiane(lab ÷ prédiction), comme le « Scale factor » du `.ods` +5. **Paramètres** : + - **Langue** : Système / Français / English + - **Estimation T** : modèle `T = plancher + (base − plancher) ÷ (1 + k·E2)` (ng/mL), + calibrable avec tes résultats T + - **Sauvegarde JSON** : Export / Import (traitements + doses + analyses + réglages T) + +## 7. Les modèles mathématiques + +Les profils viennent de ta feuille `Estrogen.ods` (table « Models ») : + +| Profil | Source | Pic (pg/mL par mg) | Tmax (h) | +|-----------|-------------------|--------------------|----------| +| EV(ese) | Estrannaise | 61,1 | ~45 h | +| EU(ese) | Estrannaise | 3,4 | ~55 h (plateau long) | +| EEn(ese) | Estrannaise | 31,4 | ~152 h | +| EV(tfs) | Transfem Science | 59,0 | ~51 h | +| EU(tfs) | Transfem Science | 10,1 | ~198 h | +| EEn(tfs) | Transfem Science | 32,0 | ~156 h | + +- **Superposition** : chaque injection contribue `dose_mg × profil(dt)` ; les courbes s'additionnent +- **Interpolation** linéaire entre les heures ; au-delà de 8000 h, extrapolation avec la pente terminale +- **Calibration** : facteur d'échelle par traitement (médiane des ratios lab/prédiction) +- **Courbe T** : dérivée de l'E2 estimé (modèle empirique, calibrable) — indicative seulement + +## 8. Dépannage + +| Problème | Solution | +|----------|----------| +| « SDK not found » au sync | Android Studio → Settings → Languages & Frameworks → Android SDK → installer API 34 | +| Pas de téléphone détecté | Réactive le Débogage USB, change de câble (données, pas charge seule) | +| Notif absente sur la montre | Huawei Santé → Notifications → autorise l'app ; redémarre la montre | +| Rappels en retard | Paramètres → « Accorder les alarmes exactes » + désactive l'optimisation de batterie pour l'app | +| Import JSON échoué | Le fichier doit venir d'un export de l'app même version (IDs conservés) | + +## 9. Données & vie privée + +- **Tout est local** : base Room sur le téléphone, aucun serveur, aucun compte +- Sauvegarde = fichier JSON que tu choisis où stocker (Owncloud, etc.) +- La désinstallation supprime les données → pense à exporter régulièrement diff --git a/docs/MONTRE-GADGETBRIDGE.md b/docs/MONTRE-GADGETBRIDGE.md new file mode 100644 index 0000000..c8e8e32 --- /dev/null +++ b/docs/MONTRE-GADGETBRIDGE.md @@ -0,0 +1,94 @@ +# Montre Huawei Watch GT 3 — Gadgetbridge & options + +> Contexte : Huawei Watch GT 3 (HarmonyOS 4.0.0.120). C'est un appareil **« Lite Wearable »** +> (base LiteOS-like) : il n'exécute pas d'apps Android, et l'installation d'apps tierces +> au poignet est très restreinte. Ce doc récapitule ce qui est possible, ce qui ne l'est +> pas, et la stratégie retenue. + +## 1. État v1 : la montre comme écran de notifications ✅ + +L'app téléphone envoie des notifications de rappel (AlarmManager exact) qui remontent au +poignet. **Deux chemins supportés, au choix** : + +| Chemin | Prérequis | Notes | +|---|---|---| +| **Gadgetbridge** (FOSS) | Appairage GB ↔ montre | Transfert de notifications supporté pour la GT 3 (« mostly supported »). Aucun compte Huawei, aucune télémétrie — cohérent avec la vie privée de l'app. | +| **Huawei Health** | Appairage Health ↔ montre | Chemin « officiel ». Autoriser l'app dans Santé → Montre → Notifications. | + +⚠️ **La montre ne peut être appairée qu'à l'un des deux à la fois** (Health ou Gadgetbridge). +Pour installer un watchface via GB, il faut dé-pairer de Health, puis re-pairer ensuite. + +Le bouton **« Pris »** dans la notification logue la dose côté téléphone ; « Reporter 1 h » +re-programme l'alarme. Les deux marchent quelle que soit la source de la notification +(la montre ne fait que l'afficher). + +## 2. Ce que Gadgetbridge sait faire (vérifié juillet 2026) + +Source : docs gadgetbridge.org + issues/pull requests Codeberg. + +- ✅ Appairage sans l'app Huawei (no-vendor pair), notifications, données santé (TruSleep…) +- ✅ **Installation de watchfaces** `.hwt` / `watchface.bin` (PR #3910 « Improve watchface + install support » : les `.hwt` récents contiennent un zip interne `com.huawei.watchface` + ; pour les montres LiteOS comme la GT 3, GB en extrait `watchface.bin` et le flashe) +- ❌ **Pas d'installation d'apps `.hap`** : Gadgetbridge n'implémente pas l'installation + d'applications Lite Wearable sur les montres GT — seulement watchfaces + firmwares +- ⚠️ **Régression connue** : HarmonyOS 6.1+ (firmwares 2026, ex. GT 6) casse l'installation + de `.hwt` via GB (issues #5968/#6005/#6199). La GT 3 en HarmonyOS 4.0.0.120 **devrait** + rester OK, mais à valider en pratique. + +**Conclusion** : « Gadgetbridge installe des applis » = en réalité des **watchfaces**. +Une vraie app au poignet passe par un autre chemin (§4). + +## 3. Signatures : qu'est-ce qu'il faut ? + +- **Watchface via Gadgetbridge** : **aucune signature** — le `watchface.bin` est flashé tel + quel par GB. Rien à faire de ce côté. +- **App Lite Wearable (`.hap`) par sideload** : nécessite un certificat de **debug + AppGallery Connect** (compte développeur Huawei, UDID de la montre enregistré, + fichiers `.p12/.cer/.p7b` dans DevEco Studio). Gadgetbridge ne gère pas ce flux. +- **App Android (téléphone)** : debug keystore auto-généré — rien à faire pour un usage + personnel. + +## 4. Options « app au poignet » (Phase 2), par coût croissant + +### Option A — Watchface personnalisée (statique + champs de données standard) +- Faisable **sans** Huawei : format `.hwt` (ressources + `description.xml`), installable + via GB sur HarmonyOS ≤ 6.0.x +- Limites : les données affichables sont une **liste fixe** (heure, date, batterie, pas, + FC, météo…) — **pas** nos estimations E2/T dynamiques +- Usage possible : rappel visuel statique (ex : « gel 8h · 20h » intégré au design), + pas d'affichage de courbe + +### Option B — Mini-app **Lite Wearable** (`.hap`) installée par sideload +- Chaîne : **DevEco Studio** (~10 Go) → projet `[Lite] Empty Ability` (JS UI lite) → + build `.hap` signé → compte **AppGallery Connect** + UDID de la montre → installation + via **DevEco Assistant** (APK sur le téléphone) — procédure documentée (article Huawei + Developers, jan. 2025, testée sur GT 5 ; GT 3/HarmonyOS 4 à valider) +- Limites : framework JS très simple (pas de Canvas riche), stockage local limité + (`@system.storage`), et **pas de synchro live** avec l'app téléphone sans l'API + **Wear Engine** (accès partenaire, dossier à déposer chez Huawei) → la mini-app serait + autonome (saisie/redondance de données sur la montre) +- C'est le seul chemin vers une « vraie app » sur GT 3 + +### Option C — Rester sur les notifications (choix v1) +- Zéro maintenance, fiable, marche avec GB et Health ; la montre affiche rappel + actions +- Recommandé tant que l'option B n'apporte pas de vraie valeur (voir la saisie pénible + au poignet) + +## 5. Décision et prochaines étapes + +1. **V1** : notifications via Gadgetbridge (ou Health) — livré ✅ +2. À tester par l'utilisatrice : installer une watchface `.hwt` de test via GB sur la GT 3 + (HarmonyOS 4.0.0.120) pour valider le chemin d'installation +3. Si une app au poignet est vraiment souhaitée : option B, en commençant par un POC + « afficher une valeur statique » ; la synchro téléphone↔montre étant le point dur + (Wear Engine partenaire), la mini-app devra être **autonome** (saisie sur la montre) + +## 6. Références + +- Docs GB Huawei/Honor : https://gadgetbridge.org/basics/topics/huawei-honor/ +- Compatibilité appareils : https://gadgetbridge.org/gadgets/wearables/huawei-honor/ +- PR watchface install (#3910) : https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/3910 +- Régression HarmonyOS 6.1 (#6199) : https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/6199 +- Guide de développement Lite Wearable (session 1) : DevEco Studio + AGC + DevEco + Assistant — voir historique de chat et https://developer.huawei.com/consumer/en/multidevice/wearables/get-started/ diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..f0a2e55 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +android.useAndroidX=true +kotlin.code.style=official +android.nonTransitiveRClass=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2c3521197d7c4586c843d1d3e9090525f1898cde GIT binary patch literal 43504 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 TZiJi*F`$tkWLn) literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..09523c0 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..d95bf61 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..640d686 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..7ab9dec --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "HormoneTrack" +include(":app")