From 97540d734ffc3f835fc2730771557f12b103223e Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 1 Aug 2019 23:07:28 +0200 Subject: [PATCH 001/124] Mi Band 3/4: Allow enabling the "NFC" menu where supported Pretty useless, because we do not support NFC - but nice for testing --- .../gadgetbridge/devices/huami/miband3/MiBand3Service.java | 2 +- .../service/devices/huami/miband3/MiBand3Support.java | 6 +++++- app/src/main/res/values/arrays.xml | 2 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/values.xml | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Service.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Service.java index 5974cdb85..f4e6a5381 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Service.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Service.java @@ -22,7 +22,7 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.EN import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService.ENDPOINT_DISPLAY_ITEMS; public class MiBand3Service { - public static final byte[] COMMAND_CHANGE_SCREENS = new byte[]{ENDPOINT_DISPLAY_ITEMS, DISPLAY_ITEM_BIT_CLOCK, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00}; + public static final byte[] COMMAND_CHANGE_SCREENS = new byte[]{ENDPOINT_DISPLAY_ITEMS, DISPLAY_ITEM_BIT_CLOCK, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}; public static final byte[] COMMAND_ENABLE_BAND_SCREEN_UNLOCK = new byte[]{ENDPOINT_DISPLAY, 0x16, 0x00, 0x01}; public static final byte[] COMMAND_DISABLE_BAND_SCREEN_UNLOCK = new byte[]{ENDPOINT_DISPLAY, 0x16, 0x00, 0x00}; public static final byte[] COMMAND_NIGHT_MODE_OFF = new byte[]{0x1a, 0x00}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java index 2d7117b8f..8fab17d14 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband3/MiBand3Support.java @@ -86,9 +86,13 @@ public class MiBand3Support extends AmazfitBipSupport { command[1] |= 0x80; command[10] = pos++; } + if (pages.contains("nfc")) { + command[2] |= 0x01; + command[11] = pos++; + } } - for (int i = 4; i <= 10; i++) { + for (int i = 4; i <= 11; i++) { if (command[i] == 0) { command[i] = pos++; } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index acf7efcad..c86d9c54f 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -238,6 +238,7 @@ @string/menuitem_status @string/heart_rate @string/menuitem_timer + @string/menuitem_nfc @@ -248,6 +249,7 @@ @string/p_menuitem_status @string/p_heart_rate @string/p_menuitem_timer + @string/p_menuitem_nfc diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c67acfef2..20ae4994a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -662,6 +662,7 @@ Alipay Music More + NFC Minutes: Hours: Seconds: diff --git a/app/src/main/res/values/values.xml b/app/src/main/res/values/values.xml index 570783715..a9170a503 100644 --- a/app/src/main/res/values/values.xml +++ b/app/src/main/res/values/values.xml @@ -32,6 +32,7 @@ notifications music more + nfc off on From aefd7520f30341e5486de98973ad079fc82b4ee5 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 2 Aug 2019 00:11:11 +0200 Subject: [PATCH 002/124] Mi Band 3/4, Amazfit Cor/Bip: set language immediately when changing it (not only on connect) Helps testing --- .../DeviceSpecificSettingsFragment.java | 9 ++++++--- .../gadgetbridge/devices/huami/HuamiConst.java | 3 +++ .../gadgetbridge/devices/huami/HuamiService.java | 2 ++ .../service/devices/huami/HuamiSupport.java | 13 +++++++++---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 33cadbb2e..83aa6ab2f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -16,18 +16,20 @@ import org.slf4j.LoggerFactory; import java.util.Objects; import nodomain.freeyourgadget.gadgetbridge.GBApplication; -import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.XTimePreference; import nodomain.freeyourgadget.gadgetbridge.util.XTimePreferenceFragment; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_ACTIVATE_DISPLAY_ON_LIFT; +import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DATEFORMAT; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_END; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISCONNECT_NOTIFICATION_START; +import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ITEMS; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ON_LIFT_END; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ON_LIFT_START; +import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_LANGUAGE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_END; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_OFF; @@ -282,8 +284,9 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat { addPreferenceHandlerFor(PREF_SWIPE_UNLOCK); addPreferenceHandlerFor(PREF_MI2_DATEFORMAT); - addPreferenceHandlerFor("dateformat"); - addPreferenceHandlerFor(HuamiConst.PREF_DISPLAY_ITEMS); + addPreferenceHandlerFor(PREF_DATEFORMAT); + addPreferenceHandlerFor(PREF_DISPLAY_ITEMS); + addPreferenceHandlerFor(PREF_LANGUAGE); String displayOnLiftState = prefs.getString(PREF_ACTIVATE_DISPLAY_ON_LIFT, PREF_DO_NOT_DISTURB_OFF); boolean displayOnLiftScheduled = displayOnLiftState.equals(PREF_DO_NOT_DISTURB_SCHEDULED); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java index 3a6852621..d595f37f0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java @@ -59,6 +59,9 @@ public class HuamiConst { public static final String PREF_DISCONNECT_NOTIFICATION_END = "disconnect_notification_end"; public static final String PREF_DISPLAY_ITEMS = "display_items"; + public static final String PREF_LANGUAGE = "language"; + public static final String PREF_DATEFORMAT = "dateformat"; + public static int toActivityKind(int rawType) { switch (rawType) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java index f87c31d78..86fd89ff2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java @@ -49,6 +49,8 @@ public class HuamiService { // service uuid fee1 public static final UUID UUID_CHARACTERISTIC_AUTH = UUID.fromString("00000009-0000-3512-2118-0009af100700"); public static final UUID UUID_CHARACTERISTIC_DEVICEEVENT = UUID.fromString("00000010-0000-3512-2118-0009af100700"); + public static final UUID UUID_CHARACTERISTIC_AUDIO = UUID.fromString("00000012-0000-3512-2118-0009af100700"); + public static final UUID UUID_CHARACTERISTIC_AUDIODATA = UUID.fromString("00000013-0000-3512-2118-0009af100700"); public static final UUID UUID_CHARACTERISTIC_CHUNKEDTRANSFER = UUID.fromString("00000020-0000-3512-2118-0009af100700"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index ad7d815e1..9d0c5b14d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -301,6 +301,8 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), enable); builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_6_BATTERY_INFO), enable); builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_DEVICEEVENT), enable); + builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_AUDIO), enable); + builder.notify(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_AUDIODATA), enable); return this; } @@ -682,7 +684,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { sendCalendarEvents(builder); builder.queue(getQueue()); } catch (IOException ex) { - LOG.error("Unable to set time on MI device", ex); + LOG.error("Unable to set time on Huami device", ex); } } @@ -878,7 +880,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { builder.write(characteristicHRControlPoint, startHeartMeasurementManual); builder.queue(getQueue()); } catch (IOException ex) { - LOG.error("Unable to read heart rate with MI2", ex); + LOG.error("Unable to read heart rate from Huami device", ex); } } @@ -939,7 +941,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { try { new FetchActivityOperation(this).perform(); } catch (IOException ex) { - LOG.error("Unable to fetch MI activity data", ex); + LOG.error("Unable to fetch activity data", ex); } } @@ -1557,9 +1559,12 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { case MiBandConst.PREF_SWIPE_UNLOCK: setBandScreenUnlock(builder); break; - case "dateformat": + case HuamiConst.PREF_DATEFORMAT: setDateFormat(builder); break; + case HuamiConst.PREF_LANGUAGE: + setLanguage(builder); + break; } builder.queue(getQueue()); } catch (IOException e) { From 02d02d2329b156fc382ec97e7a267a033bdfd919 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 2 Aug 2019 23:49:14 +0200 Subject: [PATCH 003/124] Add Initial Mijia LYWSD02 support (Smart Clock with Humidity and Temperature Sensor) This only sets the time on connect. --- .../activities/DiscoveryActivity.java | 4 +- .../MijiaLywsd02Coordinator.java | 140 +++++++++ .../vibratissimo/VibratissimoCoordinator.java | 5 +- .../gadgetbridge/model/DeviceType.java | 1 + .../service/DeviceSupportFactory.java | 13 +- .../mijia_lywsd02/MijiaLywsd02Support.java | 294 ++++++++++++++++++ .../gadgetbridge/util/DeviceHelper.java | 2 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 451 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java index 57f1267fb..736a7b2f4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java @@ -95,7 +95,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView // continue with LE scan, if available if (isScanning == Scanning.SCANNING_BT) { checkAndRequestLocationPermission(); - if (GBApplication.isRunningLollipopOrLater()) { + if (!GBApplication.isRunningLollipopOrLater()) { startDiscovery(Scanning.SCANNING_NEW_BTLE); } else { startDiscovery(Scanning.SCANNING_BTLE); @@ -652,7 +652,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView super.onPause(); stopBTDiscovery(); stopBTLEDiscovery(); - if (GBApplication.isRunningLollipopOrLater()) { + if (!GBApplication.isRunningLollipopOrLater()) { stopNewBTLEDiscovery(); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java new file mode 100644 index 000000000..d0bcdee58 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java @@ -0,0 +1,140 @@ +/* Copyright (C) 2019 Andreas Shimokawa + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.devices.mijia_lywsd02; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; + +import androidx.annotation.NonNull; + +import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; +import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; +import nodomain.freeyourgadget.gadgetbridge.entities.Device; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate; +import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; +import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; + +public class MijiaLywsd02Coordinator extends AbstractDeviceCoordinator { + @NonNull + @Override + public DeviceType getSupportedType(GBDeviceCandidate candidate) { + String name = candidate.getDevice().getName(); + if (name != null && name.equals("LYWSD02")) { + return DeviceType.MIJIA_LYWSD02; + } + return DeviceType.UNKNOWN; + } + + @Override + public DeviceType getDeviceType() { + return DeviceType.MIJIA_LYWSD02; + } + + @Override + public int getBondingStyle(GBDevice deviceCandidate) { + return BONDING_STYLE_NONE; + } + + @Override + public Class getPairingActivity() { + return null; + } + + @Override + public InstallHandler findInstallHandler(Uri uri, Context context) { + return null; + } + + @Override + public boolean supportsActivityDataFetching() { + return false; + } + + @Override + public boolean supportsActivityTracking() { + return false; + } + + @Override + public SampleProvider getSampleProvider(GBDevice device, DaoSession session) { + return null; + } + + @Override + public boolean supportsScreenshots() { + return false; + } + + @Override + public int getAlarmSlotCount() { + return 0; + } + + @Override + public boolean supportsSmartWakeup(GBDevice device) { + return false; + } + + @Override + public boolean supportsHeartRateMeasurement(GBDevice device) { + return false; + } + + @Override + public String getManufacturer() { + return "Xiaomi"; + } + + @Override + public boolean supportsAppsManagement() { + return false; + } + + @Override + public Class getAppsManagementActivity() { + return null; + } + + @Override + public boolean supportsCalendarEvents() { + return false; + } + + @Override + public boolean supportsRealtimeData() { + return false; + } + + @Override + public boolean supportsWeather() { + return false; + } + + @Override + public boolean supportsFindDevice() { + return false; + } + + @Override + protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) { + // nothing to delete, yet + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java index c19833900..70cdbe1e4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java @@ -22,7 +22,7 @@ import android.content.Context; import android.net.Uri; import androidx.annotation.NonNull; -import nodomain.freeyourgadget.gadgetbridge.GBException; + import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; @@ -34,6 +34,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; public class VibratissimoCoordinator extends AbstractDeviceCoordinator { + @NonNull @Override public DeviceType getSupportedType(GBDeviceCandidate candidate) { String name = candidate.getDevice().getName(); @@ -129,7 +130,7 @@ public class VibratissimoCoordinator extends AbstractDeviceCoordinator { } @Override - protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException { + protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) { // nothing to delete, yet } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java index 553b4e7a8..d81751ba8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java @@ -56,6 +56,7 @@ public enum DeviceType { CASIOGB6900(120, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_casiogb6900), MISCALE2(131, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_miscale2), BFH16(140, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_bfh16), + MIJIA_LYWSD02(200, R.drawable.ic_device_pebble, R.drawable.ic_device_pebble_disabled, R.string.devicetype_mijia_lywsd02), TEST(1000, R.drawable.ic_device_default, R.drawable.ic_device_default_disabled, R.string.devicetype_test); private final int key; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java index afcc3a411..dfa4e83ce 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java @@ -30,19 +30,20 @@ import nodomain.freeyourgadget.gadgetbridge.GBException; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitcor2.AmazfitCor2Support; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.miband4.MiBand4Support; -import nodomain.freeyourgadget.gadgetbridge.service.devices.jyou.BFH16DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.casiogb6900.CasioGB6900DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.hplus.HPlusSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitcor.AmazfitCorSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitcor2.AmazfitCor2Support; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.miband3.MiBand3Support; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.miband4.MiBand4Support; import nodomain.freeyourgadget.gadgetbridge.service.devices.id115.ID115Support; +import nodomain.freeyourgadget.gadgetbridge.service.devices.jyou.BFH16DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.jyou.TeclastH30Support; import nodomain.freeyourgadget.gadgetbridge.service.devices.liveview.LiveviewSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.MiBandSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.mijia_lywsd02.MijiaLywsd02Support; import nodomain.freeyourgadget.gadgetbridge.service.devices.miscale2.MiScale2DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.no1f1.No1F1Support; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.PebbleSupport; @@ -57,13 +58,13 @@ public class DeviceSupportFactory { private final BluetoothAdapter mBtAdapter; private final Context mContext; - public DeviceSupportFactory(Context context) { + DeviceSupportFactory(Context context) { mContext = context; mBtAdapter = BluetoothAdapter.getDefaultAdapter(); } public synchronized DeviceSupport createDeviceSupport(GBDevice device) throws GBException { - DeviceSupport deviceSupport = null; + DeviceSupport deviceSupport; String deviceAddress = device.getAddress(); int indexFirstColon = deviceAddress.indexOf(":"); if (indexFirstColon > 0) { @@ -192,6 +193,8 @@ public class DeviceSupportFactory { case BFH16: deviceSupport = new ServiceDeviceSupport(new BFH16DeviceSupport(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING)); break; + case MIJIA_LYWSD02: + deviceSupport = new ServiceDeviceSupport(new MijiaLywsd02Support(), EnumSet.of(ServiceDeviceSupport.Flags.BUSY_CHECKING)); } if (deviceSupport != null) { deviceSupport.setContext(gbDevice, mBtAdapter, mContext); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java new file mode 100644 index 000000000..c40a1e16b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java @@ -0,0 +1,294 @@ +/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Sebastian + Kranz + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.mijia_lywsd02; + +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; +import android.content.Intent; +import android.net.Uri; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Objects; +import java.util.SimpleTimeZone; +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo; +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.Alarm; +import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec; +import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; +import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec; +import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec; +import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; +import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; +import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; +import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport; +import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService; +import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction; +import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.IntentListener; +import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfoProfile; +import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile; + +public class MijiaLywsd02Support extends AbstractBTLEDeviceSupport { + + private static final Logger LOG = LoggerFactory.getLogger(MijiaLywsd02Support.class); + private final DeviceInfoProfile deviceInfoProfile; + private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo(); + private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo(); + private final IntentListener mListener = new IntentListener() { + @Override + public void notify(Intent intent) { + String s = intent.getAction(); + if (Objects.equals(s, DeviceInfoProfile.ACTION_DEVICE_INFO)) { + handleDeviceInfo((nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo) intent.getParcelableExtra(DeviceInfoProfile.EXTRA_DEVICE_INFO)); + } + } + }; + + public MijiaLywsd02Support() { + super(LOG); + addSupportedService(GattService.UUID_SERVICE_GENERIC_ACCESS); + addSupportedService(GattService.UUID_SERVICE_GENERIC_ATTRIBUTE); + addSupportedService(GattService.UUID_SERVICE_DEVICE_INFORMATION); + addSupportedService(UUID.fromString("ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6")); + deviceInfoProfile = new DeviceInfoProfile<>(this); + deviceInfoProfile.addListener(mListener); + addSupportedProfile(deviceInfoProfile); + } + + @Override + protected TransactionBuilder initializeDevice(TransactionBuilder builder) { + builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext())); + requestDeviceInfo(builder); + setTime(builder); + setInitialized(builder); + return builder; + } + + private void setTime(TransactionBuilder builder) { + BluetoothGattCharacteristic timeCharacteristc = getCharacteristic(UUID.fromString("ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6")); + long ts = System.currentTimeMillis(); + byte offsetHours = (byte) (SimpleTimeZone.getDefault().getOffset(ts) / (1000 * 60 * 60)); + ts /= 1000; + builder.write(timeCharacteristc, new byte[]{ + (byte) (ts & 0xff), + (byte) ((ts >> 8) & 0xff), + (byte) ((ts >> 16) & 0xff), + (byte) ((ts >> 24) & 0xff), + offsetHours}); + } + + private void requestDeviceInfo(TransactionBuilder builder) { + LOG.debug("Requesting Device Info!"); + deviceInfoProfile.requestDeviceInfo(builder); + } + + private void setInitialized(TransactionBuilder builder) { + builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext())); + } + + @Override + public boolean useAutoConnect() { + return false; + } + + private void handleDeviceInfo(nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo info) { + LOG.warn("Device info: " + info); + versionCmd.hwVersion = info.getHardwareRevision(); + versionCmd.fwVersion = info.getFirmwareRevision(); + handleGBDeviceEvent(versionCmd); + } + + @Override + public void onNotification(NotificationSpec notificationSpec) { + } + + @Override + public void onDeleteNotification(int id) { + + } + + @Override + public void onSetTime() { + // better only on connect for now + } + + @Override + public void onSetAlarms(ArrayList alarms) { + + } + + @Override + public void onSetCallState(CallSpec callSpec) { + + } + + @Override + public void onSetCannedMessages(CannedMessagesSpec cannedMessagesSpec) { + + } + + @Override + public void onSetMusicState(MusicStateSpec stateSpec) { + + } + + @Override + public void onSetMusicInfo(MusicSpec musicSpec) { + + } + + @Override + public void onEnableRealtimeSteps(boolean enable) { + + } + + @Override + public void onInstallApp(Uri uri) { + + } + + @Override + public void onAppInfoReq() { + + } + + @Override + public void onAppStart(UUID uuid, boolean start) { + + } + + @Override + public void onAppDelete(UUID uuid) { + + } + + @Override + public void onAppConfiguration(UUID appUuid, String config, Integer id) { + + } + + @Override + public void onAppReorder(UUID[] uuids) { + + } + + @Override + public void onFetchRecordedData(int dataTypes) { + + } + + @Override + public void onReset(int flags) { + + } + + @Override + public void onHeartRateTest() { + + } + + @Override + public void onEnableRealtimeHeartRateMeasurement(boolean enable) { + + } + + @Override + public void onFindDevice(boolean start) { + } + + @Override + public void onSetConstantVibration(int intensity) { + + } + + @Override + public void onScreenshotReq() { + + } + + @Override + public void onEnableHeartRateSleepSupport(boolean enable) { + + } + + @Override + public void onSetHeartRateMeasurementInterval(int seconds) { + + } + + @Override + public void onAddCalendarEvent(CalendarEventSpec calendarEventSpec) { + + } + + @Override + public void onDeleteCalendarEvent(byte type, long id) { + + } + + + @Override + public boolean onCharacteristicChanged(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic) { + if (super.onCharacteristicChanged(gatt, characteristic)) { + return true; + } + + UUID characteristicUUID = characteristic.getUuid(); + LOG.info("Unhandled characteristic changed: " + characteristicUUID); + return false; + } + + @Override + public boolean onCharacteristicRead(BluetoothGatt gatt, + BluetoothGattCharacteristic characteristic, int status) { + if (super.onCharacteristicRead(gatt, characteristic, status)) { + return true; + } + UUID characteristicUUID = characteristic.getUuid(); + + LOG.info("Unhandled characteristic read: " + characteristicUUID); + return false; + } + + @Override + public void onSendConfiguration(String config) { + + } + + @Override + public void onReadConfiguration(String config) { + + } + + @Override + public void onTestNewFunction() { + + } + + @Override + public void onSendWeather(WeatherSpec weatherSpec) { + + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java index 998d5bb5a..1d6eb6f79 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java @@ -59,6 +59,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.jyou.TeclastH30Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.liveview.LiveviewCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.mijia_lywsd02.MijiaLywsd02Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.miscale2.MiScale2DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.no1f1.No1F1Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleCoordinator; @@ -226,6 +227,7 @@ public class DeviceHelper { result.add(new Roidmi3Coordinator()); result.add(new CasioGB6900DeviceCoordinator()); result.add(new BFH16DeviceCoordinator()); + result.add(new MijiaLywsd02Coordinator()); return result; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 20ae4994a..feb1c6dd4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -646,6 +646,7 @@ Casio GB-6900 Mi Scale 2 BFH-16 + Mijia Smart Clock Choose export location Gadgetbridge notifications From 461842a945d43f68d2eea0d99d1f70c8a6fd666e Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 2 Aug 2019 23:52:25 +0200 Subject: [PATCH 004/124] fix copyright header for newly added file --- .../service/devices/mijia_lywsd02/MijiaLywsd02Support.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java index c40a1e16b..bc8dc318f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/mijia_lywsd02/MijiaLywsd02Support.java @@ -1,5 +1,4 @@ -/* Copyright (C) 2016-2019 Andreas Shimokawa, Carsten Pfeiffer, Sebastian - Kranz +/* Copyright (C) 2019 Andreas Shimokawa This file is part of Gadgetbridge. From 57a235742d887908a5b5279f1a5e900fb6b06065 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 3 Aug 2019 23:40:07 +0200 Subject: [PATCH 005/124] Properly disable new ble scanning for testing (inverted logic committed accidentially) --- .../gadgetbridge/activities/DiscoveryActivity.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java index 736a7b2f4..d29bacc70 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DiscoveryActivity.java @@ -49,6 +49,7 @@ import android.widget.ListView; import android.widget.ProgressBar; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import org.slf4j.Logger; @@ -77,6 +78,9 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView private ScanCallback newLeScanCallback = null; + // Disabled for testing, it seems worse for a few people + private final boolean disableNewBLEScanning = true; + private final Handler handler = new Handler(); private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() { @@ -95,7 +99,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView // continue with LE scan, if available if (isScanning == Scanning.SCANNING_BT) { checkAndRequestLocationPermission(); - if (!GBApplication.isRunningLollipopOrLater()) { + if (GBApplication.isRunningLollipopOrLater() && !disableNewBLEScanning) { startDiscovery(Scanning.SCANNING_NEW_BTLE); } else { startDiscovery(Scanning.SCANNING_BTLE); @@ -297,7 +301,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView } @Override - protected void onSaveInstanceState(Bundle outState) { + protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelableArrayList("deviceCandidates", deviceCandidates); } @@ -652,7 +656,7 @@ public class DiscoveryActivity extends AbstractGBActivity implements AdapterView super.onPause(); stopBTDiscovery(); stopBTLEDiscovery(); - if (!GBApplication.isRunningLollipopOrLater()) { + if (GBApplication.isRunningLollipopOrLater() && !disableNewBLEScanning) { stopNewBTLEDiscovery(); } } From a81bd87be94b5b788f85e5d6c8f80f4755f3e230 Mon Sep 17 00:00:00 2001 From: vanous Date: Wed, 7 Aug 2019 12:52:58 +0200 Subject: [PATCH 006/124] Add Screenshots --- .../images/phoneScreenshots/1-MainScreen.png | Bin 0 -> 63883 bytes .../phoneScreenshots/2-ActivityAndSleep.png | Bin 0 -> 89055 bytes .../images/phoneScreenshots/3-SleepPerWeek.png | Bin 0 -> 88742 bytes .../images/phoneScreenshots/4-StepsPerWeek.png | Bin 0 -> 71350 bytes .../images/phoneScreenshots/5-SpeedZones.png | Bin 0 -> 54939 bytes .../images/phoneScreenshots/6-LiveActivity.png | Bin 0 -> 77049 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1-MainScreen.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/2-ActivityAndSleep.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/3-SleepPerWeek.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4-StepsPerWeek.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/5-SpeedZones.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/6-LiveActivity.png diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1-MainScreen.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1-MainScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfd41fb8b3ba13a8a59fa365716cf4b5da448c7 GIT binary patch literal 63883 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�wn5!}M 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2-ActivityAndSleep.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2-ActivityAndSleep.png new file mode 100644 index 0000000000000000000000000000000000000000..4b30f2e5772494f2b7f4a0fb7e3ba4654316f7a2 GIT binary patch literal 89055 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 I()jiN0kOSW*8l(j literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3-SleepPerWeek.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3-SleepPerWeek.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6293a499452e5efee42b90d31b21f2c7264146 GIT binary patch literal 88742 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�{2h24RFE(vP~ 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°%f}zM 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 T+;^MDs}$oOjvRWZ?{x7$<_Nyv literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5-SpeedZones.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/5-SpeedZones.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4e30673a8d68210a5df76a06e5ec4fc68bc0f0 GIT binary patch literal 54939 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

On incoming parcel (to be unmarshalled): + * + *

+ *     ParcelInfo incomingParcelInfo = Concierge.receiveParcel(incomingParcel);
+ *     int parcelableVersion = incomingParcelInfo.getParcelVersion();
+ *
+ *     // Do unmarshalling steps here iterating over every plausible version
+ *
+ *     // Complete the process
+ *     incomingParcelInfo.complete();
+ * 
+ * + *

On outgoing parcel (to be marshalled): + * + *

+ *     ParcelInfo outgoingParcelInfo = Concierge.prepareParcel(incomingParcel);
+ *
+ *     // Do marshalling steps here iterating over every plausible version
+ *
+ *     // Complete the process
+ *     outgoingParcelInfo.complete();
+ * 
+ */ +public final class Concierge { + + /** Not instantiable */ + private Concierge() { + // Don't instantiate + } + + /** + * Since there might be a case where new versions of the lineage framework use applications running + * old versions of the protocol (and thus old versions of this class), we need a versioning + * system for the parcels sent between the core framework and its sdk users. + * + * This parcelable version should be the latest version API version listed in + * {@link LINEAGE_VERSION_CODES} + * @hide + */ + public static final int PARCELABLE_VERSION = LINEAGE_VERSION_CODES.ILAMA; + + /** + * Tell the concierge to receive our parcel, so we can get information from it. + * + * MUST CALL {@link ParcelInfo#complete()} AFTER UNMARSHALLING. + * + * @param parcel Incoming parcel to be unmarshalled + * @return {@link ParcelInfo} containing parcel information, specifically the version. + */ + public static ParcelInfo receiveParcel(Parcel parcel) { + return new ParcelInfo(parcel); + } + + /** + * Prepare a parcel for the Concierge. + * + * MUST CALL {@link ParcelInfo#complete()} AFTER MARSHALLING. + * + * @param parcel Outgoing parcel to be marshalled + * @return {@link ParcelInfo} containing parcel information, specifically the version. + */ + public static ParcelInfo prepareParcel(Parcel parcel) { + return new ParcelInfo(parcel, PARCELABLE_VERSION); + } + + /** + * Parcel header info specific to the Parcel object that is passed in via + * {@link #prepareParcel(Parcel)} or {@link #receiveParcel(Parcel)}. The exposed method + * of {@link #getParcelVersion()} gets the api level of the parcel object. + */ + public final static class ParcelInfo { + private Parcel mParcel; + private int mParcelableVersion; + private int mParcelableSize; + private int mStartPosition; + private int mSizePosition; + private boolean mCreation = false; + + ParcelInfo(Parcel parcel) { + mCreation = false; + mParcel = parcel; + mParcelableVersion = parcel.readInt(); + mParcelableSize = parcel.readInt(); + mStartPosition = parcel.dataPosition(); + } + + ParcelInfo(Parcel parcel, int parcelableVersion) { + mCreation = true; + mParcel = parcel; + mParcelableVersion = parcelableVersion; + + // Write parcelable version, make sure to define explicit changes + // within {@link #PARCELABLE_VERSION); + mParcel.writeInt(mParcelableVersion); + + // Inject a placeholder that will store the parcel size from this point on + // (not including the size itself). + mSizePosition = parcel.dataPosition(); + mParcel.writeInt(0); + mStartPosition = parcel.dataPosition(); + } + + /** + * Get the parcel version from the {@link Parcel} received by the Concierge. + * @return {@link #PARCELABLE_VERSION} of the {@link Parcel} + */ + public int getParcelVersion() { + return mParcelableVersion; + } + + /** + * Complete the {@link ParcelInfo} for the Concierge. + */ + public void complete() { + if (mCreation) { + // Go back and write size + mParcelableSize = mParcel.dataPosition() - mStartPosition; + mParcel.setDataPosition(mSizePosition); + mParcel.writeInt(mParcelableSize); + mParcel.setDataPosition(mStartPosition + mParcelableSize); + } else { + mParcel.setDataPosition(mStartPosition + mParcelableSize); + } + } + } +} diff --git a/app/src/main/java/lineageos/providers/WeatherContract.java b/app/src/main/java/lineageos/providers/WeatherContract.java new file mode 100644 index 000000000..b352db526 --- /dev/null +++ b/app/src/main/java/lineageos/providers/WeatherContract.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.providers; + +import android.net.Uri; + +/** + * The contract between the weather provider and applications. + */ +public class WeatherContract { + + /** + * The authority of the weather content provider + */ + public static final String AUTHORITY = "org.lineageos.weather"; + + /** + * A content:// style uri to the authority for the weather provider + */ + public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY); + + public static class WeatherColumns { + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "weather"); + + public static final Uri CURRENT_AND_FORECAST_WEATHER_URI + = Uri.withAppendedPath(CONTENT_URI, "current_and_forecast"); + public static final Uri CURRENT_WEATHER_URI + = Uri.withAppendedPath(CONTENT_URI, "current"); + public static final Uri FORECAST_WEATHER_URI + = Uri.withAppendedPath(CONTENT_URI, "forecast"); + + /** + * The city name + *

Type: TEXT

+ */ + public static final String CURRENT_CITY = "city"; + + /** + * A Valid {@link WeatherCode} + *

Type: INTEGER

+ */ + public static final String CURRENT_CONDITION_CODE = "condition_code"; + + + /** + * A localized string mapped to the current weather condition code. Note that, if no + * locale is found, the string will be in english + *

Type: TEXT

+ */ + public static final String CURRENT_CONDITION = "condition"; + + /** + * The current weather temperature + *

Type: DOUBLE

+ */ + public static final String CURRENT_TEMPERATURE = "temperature"; + + /** + * The unit in which current temperature is reported + *

Type: INTEGER

+ * Can be one of the following: + *
    + *
  • {@link TempUnit#CELSIUS}
  • + *
  • {@link TempUnit#FAHRENHEIT}
  • + *
+ */ + public static final String CURRENT_TEMPERATURE_UNIT = "temperature_unit"; + + /** + * The current weather humidity + *

Type: DOUBLE

+ */ + public static final String CURRENT_HUMIDITY = "humidity"; + + /** + * The current wind direction (in degrees) + *

Type: DOUBLE

+ */ + public static final String CURRENT_WIND_DIRECTION = "wind_direction"; + + /** + * The current wind speed + *

Type: DOUBLE

+ */ + public static final String CURRENT_WIND_SPEED = "wind_speed"; + + /** + * The unit in which the wind speed is reported + *

Type: INTEGER

+ * Can be one of the following: + *
    + *
  • {@link WindSpeedUnit#KPH}
  • + *
  • {@link WindSpeedUnit#MPH}
  • + *
+ */ + public static final String CURRENT_WIND_SPEED_UNIT = "wind_speed_unit"; + + /** + * The timestamp when this weather was reported + *

Type: LONG

+ */ + public static final String CURRENT_TIMESTAMP = "timestamp"; + + /** + * Today's high temperature. + *

Type: DOUBLE

+ */ + public static final String TODAYS_HIGH_TEMPERATURE = "todays_high"; + + /** + * Today's low temperature. + *

Type: DOUBLE

+ */ + public static final String TODAYS_LOW_TEMPERATURE = "todays_low"; + + /** + * The forecasted low temperature + *

Type: DOUBLE

+ */ + public static final String FORECAST_LOW = "forecast_low"; + + /** + * The forecasted high temperature + *

Type: DOUBLE

+ */ + public static final String FORECAST_HIGH = "forecast_high"; + + /** + * A localized string mapped to the forecasted weather condition code. Note that, if no + * locale is found, the string will be in english + *

Type: TEXT

+ */ + public static final String FORECAST_CONDITION = "forecast_condition"; + + /** + * The code identifying the forecasted weather condition. + * @see #CURRENT_CONDITION_CODE + */ + public static final String FORECAST_CONDITION_CODE = "forecast_condition_code"; + + /** + * Temperature units + */ + public static final class TempUnit { + private TempUnit() {} + public final static int CELSIUS = 1; + public final static int FAHRENHEIT = 2; + } + + /** + * Wind speed units + */ + public static final class WindSpeedUnit { + private WindSpeedUnit() {} + /** + * Kilometers per hour + */ + public final static int KPH = 1; + + /** + * Miles per hour + */ + public final static int MPH = 2; + } + + /** + * Weather condition codes + */ + public static final class WeatherCode { + private WeatherCode() {} + + /** + * @hide + */ + public final static int WEATHER_CODE_MIN = 0; + + public final static int TORNADO = 0; + public final static int TROPICAL_STORM = 1; + public final static int HURRICANE = 2; + public final static int SEVERE_THUNDERSTORMS = 3; + public final static int THUNDERSTORMS = 4; + public final static int MIXED_RAIN_AND_SNOW = 5; + public final static int MIXED_RAIN_AND_SLEET = 6; + public final static int MIXED_SNOW_AND_SLEET = 7; + public final static int FREEZING_DRIZZLE = 8; + public final static int DRIZZLE = 9; + public final static int FREEZING_RAIN = 10; + public final static int SHOWERS = 11; + public final static int SNOW_FLURRIES = 12; + public final static int LIGHT_SNOW_SHOWERS = 13; + public final static int BLOWING_SNOW = 14; + public final static int SNOW = 15; + public final static int HAIL = 16; + public final static int SLEET = 17; + public final static int DUST = 18; + public final static int FOGGY = 19; + public final static int HAZE = 20; + public final static int SMOKY = 21; + public final static int BLUSTERY = 22; + public final static int WINDY = 23; + public final static int COLD = 24; + public final static int CLOUDY = 25; + public final static int MOSTLY_CLOUDY_NIGHT = 26; + public final static int MOSTLY_CLOUDY_DAY = 27; + public final static int PARTLY_CLOUDY_NIGHT = 28; + public final static int PARTLY_CLOUDY_DAY = 29; + public final static int CLEAR_NIGHT = 30; + public final static int SUNNY = 31; + public final static int FAIR_NIGHT = 32; + public final static int FAIR_DAY = 33; + public final static int MIXED_RAIN_AND_HAIL = 34; + public final static int HOT = 35; + public final static int ISOLATED_THUNDERSTORMS = 36; + public final static int SCATTERED_THUNDERSTORMS = 37; + public final static int SCATTERED_SHOWERS = 38; + public final static int HEAVY_SNOW = 39; + public final static int SCATTERED_SNOW_SHOWERS = 40; + public final static int PARTLY_CLOUDY = 41; + public final static int THUNDERSHOWER = 42; + public final static int SNOW_SHOWERS = 43; + public final static int ISOLATED_THUNDERSHOWERS = 44; + + /** + * @hide + */ + public final static int WEATHER_CODE_MAX = 44; + + public final static int NOT_AVAILABLE = 3200; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/lineageos/weather/LineageWeatherManager.java b/app/src/main/java/lineageos/weather/LineageWeatherManager.java new file mode 100644 index 000000000..48c767dce --- /dev/null +++ b/app/src/main/java/lineageos/weather/LineageWeatherManager.java @@ -0,0 +1,435 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.location.Location; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.ArraySet; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import lineageos.app.LineageContextConstants; +import lineageos.providers.WeatherContract; + +/** + * Provides access to the weather services in the device. + */ +@RequiresApi(api = Build.VERSION_CODES.M) +public class LineageWeatherManager { + + private static ILineageWeatherManager sWeatherManagerService; + private static LineageWeatherManager sInstance; + private Context mContext; + private Map mWeatherUpdateRequestListeners + = Collections.synchronizedMap(new HashMap()); + private Map mLookupNameRequestListeners + = Collections.synchronizedMap(new HashMap()); + private Handler mHandler; + private Set mProviderChangedListeners = new ArraySet<>(); + + private static final String TAG = LineageWeatherManager.class.getSimpleName(); + + + /** + * The different request statuses + */ + public static final class RequestStatus { + + private RequestStatus() {} + + /** + * Request successfully completed + */ + public static final int COMPLETED = 1; + /** + * An error occurred while trying to honor the request + */ + public static final int FAILED = -1; + /** + * The request can't be processed at this time + */ + public static final int SUBMITTED_TOO_SOON = -2; + /** + * Another request is already in progress + */ + public static final int ALREADY_IN_PROGRESS = -3; + /** + * No match found for the query + */ + public static final int NO_MATCH_FOUND = -4; + } + + private LineageWeatherManager(Context context) { + Context appContext = context.getApplicationContext(); + mContext = (appContext != null) ? appContext : context; + sWeatherManagerService = getService(); + + if (context.getPackageManager().hasSystemFeature( + LineageContextConstants.Features.WEATHER_SERVICES) && (sWeatherManagerService == null)) { + Log.wtf(TAG, "Unable to bind the LineageWeatherManagerService"); + } + mHandler = new Handler(appContext.getMainLooper()); + } + + /** + * Gets or creates an instance of the {@link lineageos.weather.LineageWeatherManager} + * @param context + * @return {@link LineageWeatherManager} + */ + public static LineageWeatherManager getInstance(Context context) { + if (sInstance == null) { + sInstance = new LineageWeatherManager(context); + } + return sInstance; + } + + /** + * @hide + */ + @SuppressLint("PrivateApi") + public static ILineageWeatherManager getService() { + if (sWeatherManagerService != null) { + return sWeatherManagerService; + } + + // This is a Gadgetbridge hack + IBinder binder = null; + try { + Class localClass = Class.forName("android.os.ServiceManager"); + Method getService = localClass.getMethod("getService", String.class); + Object result = getService.invoke(localClass, LineageContextConstants.LINEAGE_WEATHER_SERVICE); + if (result != null) { + binder = (IBinder) result; + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + if (binder != null) { + sWeatherManagerService = ILineageWeatherManager.Stub.asInterface(binder); + return sWeatherManagerService; + } + + return null; + } + + /** + * Forces the weather service to request the latest available weather information for + * the supplied {@link android.location.Location} location. + * + * @param location The location you want to get the latest weather data from. + * @param listener {@link WeatherUpdateRequestListener} To be notified once the active weather + * service provider has finished + * processing your request + * @return An integer that identifies the request submitted to the weather service + * Note that this method might return -1 if an error occurred while trying to submit + * the request. + */ + public int requestWeatherUpdate(@NonNull Location location, + @NonNull WeatherUpdateRequestListener listener) { + if (sWeatherManagerService == null) { + return -1; + } + + try { + int tempUnit = WeatherContract.WeatherColumns.TempUnit.CELSIUS; + + RequestInfo info = new RequestInfo + .Builder(mRequestInfoListener) + .setLocation(location) + .setTemperatureUnit(tempUnit) + .build(); + if (listener != null) mWeatherUpdateRequestListeners.put(info, listener); + sWeatherManagerService.updateWeather(info); + return info.hashCode(); + } catch (RemoteException e) { + return -1; + } + } + + /** + * Forces the weather service to request the latest weather information for the provided + * WeatherLocation. This is the preferred method for requesting a weather update. + * + * @param weatherLocation A {@link lineageos.weather.WeatherLocation} that was previously + * obtained by calling + * {@link #lookupCity(String, LookupCityRequestListener)} + * @param listener {@link WeatherUpdateRequestListener} To be notified once the active weather + * service provider has finished + * processing your request + * @return An integer that identifies the request submitted to the weather service. + * Note that this method might return -1 if an error occurred while trying to submit + * the request. + */ + public int requestWeatherUpdate(@NonNull WeatherLocation weatherLocation, + @NonNull WeatherUpdateRequestListener listener) { + if (sWeatherManagerService == null) { + return -1; + } + + try { + int tempUnit = WeatherContract.WeatherColumns.TempUnit.CELSIUS; + + RequestInfo info = new RequestInfo + .Builder(mRequestInfoListener) + .setWeatherLocation(weatherLocation) + .setTemperatureUnit(tempUnit) + .build(); + if (listener != null) mWeatherUpdateRequestListeners.put(info, listener); + sWeatherManagerService.updateWeather(info); + return info.hashCode(); + } catch (RemoteException e) { + return -1; + } + } + + /** + * Request the active weather provider service to lookup the supplied city name. + * + * @param city The city name + * @param listener {@link LookupCityRequestListener} To be notified once the request has been + * completed. Upon success, a list of + * {@link lineageos.weather.WeatherLocation} + * will be provided + * @return An integer that identifies the request submitted to the weather service. + * Note that this method might return -1 if an error occurred while trying to submit + * the request. + */ + public int lookupCity(@NonNull String city, @NonNull LookupCityRequestListener listener) { + if (sWeatherManagerService == null) { + return -1; + } + try { + RequestInfo info = new RequestInfo + .Builder(mRequestInfoListener) + .setCityName(city) + .build(); + if (listener != null) mLookupNameRequestListeners.put(info, listener); + sWeatherManagerService.lookupCity(info); + return info.hashCode(); + } catch (RemoteException e) { + return -1; + } + } + + /** + * Cancels a request that was previously submitted to the weather service. + * @param requestId The ID that you received when the request was submitted + */ + public void cancelRequest(int requestId) { + if (sWeatherManagerService == null) { + return; + } + + try { + sWeatherManagerService.cancelRequest(requestId); + }catch (RemoteException e){ + } + } + + /** + * Registers a {@link WeatherServiceProviderChangeListener} to be notified when a new weather + * service provider becomes active. + * @param listener {@link WeatherServiceProviderChangeListener} to register + */ + public void registerWeatherServiceProviderChangeListener( + @NonNull WeatherServiceProviderChangeListener listener) { + if (sWeatherManagerService == null) return; + + synchronized (mProviderChangedListeners) { + if (mProviderChangedListeners.contains(listener)) { + throw new IllegalArgumentException("Listener already registered"); + } + if (mProviderChangedListeners.size() == 0) { + try { + sWeatherManagerService.registerWeatherServiceProviderChangeListener( + mProviderChangeListener); + } catch (RemoteException e){ + } + } + mProviderChangedListeners.add(listener); + } + } + + /** + * Unregisters a listener + * @param listener A previously registered {@link WeatherServiceProviderChangeListener} + */ + public void unregisterWeatherServiceProviderChangeListener( + @NonNull WeatherServiceProviderChangeListener listener) { + if (sWeatherManagerService == null) return; + + synchronized (mProviderChangedListeners) { + if (!mProviderChangedListeners.contains(listener)) { + throw new IllegalArgumentException("Listener was never registered"); + } + mProviderChangedListeners.remove(listener); + if (mProviderChangedListeners.size() == 0) { + try { + sWeatherManagerService.unregisterWeatherServiceProviderChangeListener( + mProviderChangeListener); + } catch(RemoteException e){ + } + } + } + } + + /** + * Gets the service's label as declared by the active weather service provider in its manifest + * @return the service's label + */ + public String getActiveWeatherServiceProviderLabel() { + if (sWeatherManagerService == null) return null; + + try { + return sWeatherManagerService.getActiveWeatherServiceProviderLabel(); + } catch(RemoteException e){ + } + return null; + } + + private final IWeatherServiceProviderChangeListener mProviderChangeListener = + new IWeatherServiceProviderChangeListener.Stub() { + @Override + public void onWeatherServiceProviderChanged(final String providerName) { + mHandler.post(new Runnable() { + @Override + public void run() { + synchronized (mProviderChangedListeners) { + List deadListeners + = new ArrayList<>(); + for (WeatherServiceProviderChangeListener listener + : mProviderChangedListeners) { + try { + listener.onWeatherServiceProviderChanged(providerName); + } catch (Throwable e) { + deadListeners.add(listener); + } + } + if (deadListeners.size() > 0) { + for (WeatherServiceProviderChangeListener listener : deadListeners) { + mProviderChangedListeners.remove(listener); + } + } + } + } + }); + } + }; + + private final IRequestInfoListener mRequestInfoListener = new IRequestInfoListener.Stub() { + + @Override + public void onWeatherRequestCompleted(final RequestInfo requestInfo, final int status, + final WeatherInfo weatherInfo) { + final WeatherUpdateRequestListener listener + = mWeatherUpdateRequestListeners.remove(requestInfo); + if (listener != null) { + mHandler.post(new Runnable() { + @Override + public void run() { + listener.onWeatherRequestCompleted(status, weatherInfo); + } + }); + } + } + + @Override + public void onLookupCityRequestCompleted(RequestInfo requestInfo, final int status, + final List weatherLocations) { + + final LookupCityRequestListener listener + = mLookupNameRequestListeners.remove(requestInfo); + if (listener != null) { + mHandler.post(new Runnable() { + @Override + public void run() { + listener.onLookupCityRequestCompleted(status, weatherLocations); + } + }); + } + } + }; + + /** + * Interface used to receive notifications upon completion of a weather update request + */ + public interface WeatherUpdateRequestListener { + /** + * This method will be called when the weather service provider has finished processing the + * request + * + * @param status See {@link RequestStatus} + * + * @param weatherInfo A fully populated {@link WeatherInfo} if state is + * {@link RequestStatus#COMPLETED}, null otherwise + */ + void onWeatherRequestCompleted(int status, WeatherInfo weatherInfo); + } + + /** + * Interface used to receive notifications upon completion of a request to lookup a city name + */ + public interface LookupCityRequestListener { + /** + * This method will be called when the weather service provider has finished processing the + * request. + * + * @param status See {@link RequestStatus} + * + * @param locations A list of {@link WeatherLocation} if the status is + * {@link RequestStatus#COMPLETED}, null otherwise + */ + void onLookupCityRequestCompleted(int status, List locations); + } + + /** + * Interface used to be notified when the user changes the weather service provider + */ + public interface WeatherServiceProviderChangeListener { + /** + * This method will be called when a new weather service provider becomes active in the + * system. The parameter can be null when + *

The user removed the active weather service provider from the system

+ *

The active weather provider was disabled.

+ * + * @param providerLabel The label as declared on the weather service provider manifest + */ + void onWeatherServiceProviderChanged(String providerLabel); + } +} diff --git a/app/src/main/java/lineageos/weather/RequestInfo.java b/app/src/main/java/lineageos/weather/RequestInfo.java new file mode 100644 index 000000000..a236bef6b --- /dev/null +++ b/app/src/main/java/lineageos/weather/RequestInfo.java @@ -0,0 +1,379 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +import android.location.Location; +import android.os.Parcel; +import android.os.Parcelable; + +import android.text.TextUtils; + +import lineageos.os.Build; +import lineageos.os.Concierge; +import lineageos.os.Concierge.ParcelInfo; +import lineageos.providers.WeatherContract; + +import java.util.UUID; + +/** + * This class holds the information of a request submitted to the active weather provider service + */ +public final class RequestInfo implements Parcelable { + + private Location mLocation; + private String mCityName; + private WeatherLocation mWeatherLocation; + private int mRequestType; + private IRequestInfoListener mListener; + private int mTempUnit; + private String mKey; + private boolean mIsQueryOnly; + + /** + * A request to update the weather data using a geographical {@link android.location.Location} + */ + public static final int TYPE_WEATHER_BY_GEO_LOCATION_REQ = 1; + /** + * A request to update the weather data using a {@link WeatherLocation} + */ + public static final int TYPE_WEATHER_BY_WEATHER_LOCATION_REQ = 2; + + /** + * A request to look up a city name + */ + public static final int TYPE_LOOKUP_CITY_NAME_REQ = 3; + + private RequestInfo() {} + + /* package */ static class Builder { + private Location mLocation; + private String mCityName; + private WeatherLocation mWeatherLocation; + private int mRequestType; + private IRequestInfoListener mListener; + private int mTempUnit = WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT; + private boolean mIsQueryOnly = false; + + public Builder(IRequestInfoListener listener) { + this.mListener = listener; + } + + /** + * Sets the city name and identifies this request as a {@link #TYPE_LOOKUP_CITY_NAME_REQ} + * request. If set, will null out the location and weather location. Attempting to set + * a null city name will get you an IllegalArgumentException + */ + public Builder setCityName(String cityName) { + if (cityName == null) { + throw new IllegalArgumentException("City name can't be null"); + } + this.mCityName = cityName; + this.mRequestType = TYPE_LOOKUP_CITY_NAME_REQ; + this.mLocation = null; + this.mWeatherLocation = null; + return this; + } + + /** + * Sets the Location and identifies this request as a + * {@link #TYPE_WEATHER_BY_GEO_LOCATION_REQ}. If set, will null out the city name and + * weather location. Attempting to set a null location will get you an + * IllegalArgumentException + */ + public Builder setLocation(Location location) { + if (location == null) { + throw new IllegalArgumentException("Location can't be null"); + } + this.mLocation = new Location(location); + this.mCityName = null; + this.mWeatherLocation = null; + this.mRequestType = TYPE_WEATHER_BY_GEO_LOCATION_REQ; + return this; + } + + /** + * Sets the weather location and identifies this request as a + * {@link #TYPE_WEATHER_BY_WEATHER_LOCATION_REQ}. If set, will null out the location and + * city name. Attempting to set a null weather location will get you an + * IllegalArgumentException + */ + public Builder setWeatherLocation(WeatherLocation weatherLocation) { + if (weatherLocation == null) { + throw new IllegalArgumentException("WeatherLocation can't be null"); + } + this.mWeatherLocation = weatherLocation; + this.mLocation = null; + this.mCityName = null; + this.mRequestType = TYPE_WEATHER_BY_WEATHER_LOCATION_REQ; + return this; + } + + /** + * Sets the unit in which the temperature will be reported if the request is honored. + * Valid values are: + *
    + * {@link lineageos.providers.WeatherContract.WeatherColumns.TempUnit#CELSIUS} + * {@link lineageos.providers.WeatherContract.WeatherColumns.TempUnit#FAHRENHEIT} + *
+ * Any other value will generate an IllegalArgumentException. If the temperature unit is not + * set, the default will be degrees Fahrenheit + * @param unit A valid temperature unit + */ + public Builder setTemperatureUnit(int unit) { + if (!isValidTempUnit(unit)) { + throw new IllegalArgumentException("Invalid temperature unit"); + } + this.mTempUnit = unit; + return this; + } + + /** + * If this is a weather request, marks the request as a query only, meaning that the + * content provider won't be updated after the active weather service has finished + * processing the request. + */ + public Builder queryOnly() { + switch (mRequestType) { + case TYPE_WEATHER_BY_GEO_LOCATION_REQ: + case TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + this.mIsQueryOnly = true; + break; + default: + this.mIsQueryOnly = false; + break; + } + return this; + } + + /** + * Combine all of the options that have been set and return a new {@link RequestInfo} object + * @return {@link RequestInfo} + */ + public RequestInfo build() { + RequestInfo info = new RequestInfo(); + info.mListener = this.mListener; + info.mRequestType = this.mRequestType; + info.mCityName = this.mCityName; + info.mWeatherLocation = this.mWeatherLocation; + info.mLocation = this.mLocation; + info.mTempUnit = this.mTempUnit; + info.mIsQueryOnly = this.mIsQueryOnly; + info.mKey = UUID.randomUUID().toString(); + return info; + } + + private boolean isValidTempUnit(int unit) { + switch (unit) { + case WeatherContract.WeatherColumns.TempUnit.CELSIUS: + case WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT: + return true; + default: + return false; + } + } + + } + + private RequestInfo(Parcel parcel) { + // Read parcelable version via the Concierge + ParcelInfo parcelInfo = Concierge.receiveParcel(parcel); + int parcelableVersion = parcelInfo.getParcelVersion(); + + if (parcelableVersion >= Build.LINEAGE_VERSION_CODES.ELDERBERRY) { + mKey = parcel.readString(); + mRequestType = parcel.readInt(); + switch (mRequestType) { + case TYPE_WEATHER_BY_GEO_LOCATION_REQ: + mLocation = Location.CREATOR.createFromParcel(parcel); + mTempUnit = parcel.readInt(); + break; + case TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + mWeatherLocation = WeatherLocation.CREATOR.createFromParcel(parcel); + mTempUnit = parcel.readInt(); + break; + case TYPE_LOOKUP_CITY_NAME_REQ: + mCityName = parcel.readString(); + break; + } + mIsQueryOnly = (parcel.readInt() == 1); + mListener = IRequestInfoListener.Stub.asInterface(parcel.readStrongBinder()); + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + + /** + * @return The request type + */ + public int getRequestType() { + return mRequestType; + } + + /** + * @return the {@link android.location.Location} if this is a request by location, null + * otherwise + */ + public Location getLocation() { + return new Location(mLocation); + } + + /** + * @return the {@link lineageos.weather.WeatherLocation} if this is a request by weather + * location, null otherwise + */ + public WeatherLocation getWeatherLocation() { + return mWeatherLocation; + } + + /** + * @hide + */ + public IRequestInfoListener getRequestListener() { + return mListener; + } + + /** + * @return the city name if this is a lookup request, null otherwise + */ + public String getCityName() { + return mCityName; + } + + /** + * @return the temperature unit if this is a weather request, -1 otherwise + */ + public int getTemperatureUnit() { + switch (mRequestType) { + case TYPE_WEATHER_BY_GEO_LOCATION_REQ: + case TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + return mTempUnit; + default: + return -1; + } + } + + /** + * @return if this is a weather request, whether the request will update the content provider. + * False for other kind of requests + * @hide + */ + public boolean isQueryOnlyWeatherRequest() { + switch (mRequestType) { + case TYPE_WEATHER_BY_GEO_LOCATION_REQ: + case TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + return mIsQueryOnly; + default: + return false; + } + } + + public static final Creator CREATOR = new Creator() { + @Override + public RequestInfo createFromParcel(Parcel in) { + return new RequestInfo(in); + } + + @Override + public RequestInfo[] newArray(int size) { + return new RequestInfo[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Tell the concierge to prepare the parcel + ParcelInfo parcelInfo = Concierge.prepareParcel(dest); + + // ==== ELDERBERRY ===== + dest.writeString(mKey); + dest.writeInt(mRequestType); + switch (mRequestType) { + case TYPE_WEATHER_BY_GEO_LOCATION_REQ: + mLocation.writeToParcel(dest, 0); + dest.writeInt(mTempUnit); + break; + case TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + mWeatherLocation.writeToParcel(dest, 0); + dest.writeInt(mTempUnit); + break; + case TYPE_LOOKUP_CITY_NAME_REQ: + dest.writeString(mCityName); + break; + } + dest.writeInt(mIsQueryOnly == true ? 1 : 0); + dest.writeStrongBinder(mListener.asBinder()); + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("{ Request for "); + switch (mRequestType) { + case TYPE_WEATHER_BY_GEO_LOCATION_REQ: + builder.append("Location: ").append(mLocation); + builder.append(" Temp Unit: "); + if (mTempUnit == WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT) { + builder.append("Fahrenheit"); + } else { + builder.append(" Celsius"); + } + break; + case TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + builder.append("WeatherLocation: ").append(mWeatherLocation); + builder.append(" Temp Unit: "); + if (mTempUnit == WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT) { + builder.append("Fahrenheit"); + } else { + builder.append(" Celsius"); + } + break; + case TYPE_LOOKUP_CITY_NAME_REQ: + builder.append("Lookup City: ").append(mCityName); + break; + } + return builder.append(" }").toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((mKey != null) ? mKey.hashCode() : 0); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + + if (getClass() == obj.getClass()) { + RequestInfo info = (RequestInfo) obj; + return (TextUtils.equals(mKey, info.mKey)); + } + return false; + } +} diff --git a/app/src/main/java/lineageos/weather/WeatherInfo.java b/app/src/main/java/lineageos/weather/WeatherInfo.java new file mode 100755 index 000000000..91d8b3474 --- /dev/null +++ b/app/src/main/java/lineageos/weather/WeatherInfo.java @@ -0,0 +1,642 @@ +/* + * Copyright (C) 2016 The CyanongenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import lineageos.os.Build; +import lineageos.os.Concierge; +import lineageos.os.Concierge.ParcelInfo; +import lineageos.providers.WeatherContract; +import lineageos.weatherservice.ServiceRequest; +import lineageos.weatherservice.ServiceRequestResult; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * This class represents the weather information that a + * {@link lineageos.weatherservice.WeatherProviderService} will use to update the weather content + * provider. A weather provider service will be called by the system to process an update + * request at any time. If the service successfully processes the request, then the weather provider + * service is responsible of calling + * {@link ServiceRequest#complete(ServiceRequestResult)} to notify the + * system that the request was completed and that the weather content provider should be updated + * with the supplied weather information. + */ +public final class WeatherInfo implements Parcelable { + + private String mCity; + private int mConditionCode; + private double mTemperature; + private int mTempUnit; + private double mTodaysHighTemp; + private double mTodaysLowTemp; + private double mHumidity; + private double mWindSpeed; + private double mWindDirection; + private int mWindSpeedUnit; + private long mTimestamp; + private List mForecastList; + private String mKey; + + private WeatherInfo() {} + + /** + * Builder class for {@link WeatherInfo} + */ + public static class Builder { + private String mCity; + private int mConditionCode = WeatherContract.WeatherColumns.WeatherCode.NOT_AVAILABLE; + private double mTemperature; + private int mTempUnit; + private double mTodaysHighTemp = Double.NaN; + private double mTodaysLowTemp = Double.NaN; + private double mHumidity = Double.NaN; + private double mWindSpeed = Double.NaN; + private double mWindDirection = Double.NaN; + private int mWindSpeedUnit = WeatherContract.WeatherColumns.WindSpeedUnit.MPH; + private long mTimestamp = -1; + private List mForecastList = new ArrayList<>(0); + + /** + * @param cityName A valid city name. Attempting to pass null will get you an + * IllegalArgumentException + * @param temperature A valid temperature value. Attempting pass an invalid double value, + * will get you an IllegalArgumentException + * @param tempUnit A valid temperature unit value. See + * {@link lineageos.providers.WeatherContract.WeatherColumns.TempUnit} for + * valid values. Attempting to pass an invalid temperature unit will get you + * an IllegalArgumentException + */ + public Builder(@NonNull String cityName, double temperature, int tempUnit) { + if (cityName == null) { + throw new IllegalArgumentException("City name can't be null"); + } + if (Double.isNaN(temperature)) { + throw new IllegalArgumentException("Invalid temperature"); + } + if (!isValidTempUnit(tempUnit)) { + throw new IllegalArgumentException("Invalid temperature unit"); + } + this.mCity = cityName; + this.mTemperature = temperature; + this.mTempUnit = tempUnit; + } + + /** + * @param timeStamp A timestamp indicating when this data was generated. If timestamps is + * not set, then the builder will set it to the time of object creation + * @return The {@link Builder} instance + */ + public Builder setTimestamp(long timeStamp) { + mTimestamp = timeStamp; + return this; + } + + /** + * @param humidity The weather humidity. Attempting to pass an invalid double value will get + * you an IllegalArgumentException + * @return The {@link Builder} instance + */ + public Builder setHumidity(double humidity) { + if (Double.isNaN(humidity)) { + throw new IllegalArgumentException("Invalid humidity value"); + } + + mHumidity = humidity; + return this; + } + + /** + * @param windSpeed The wind speed. Attempting to pass an invalid double value will get you + * an IllegalArgumentException + * @param windDirection The wind direction. Attempting to pass an invalid double value will + * get you an IllegalArgumentException + * @param windSpeedUnit A valid wind speed direction unit. See + * {@link lineageos.providers.WeatherContract.WeatherColumns.WindSpeedUnit} + * for valid values. Attempting to pass an invalid speed unit will get + * you an IllegalArgumentException + * @return The {@link Builder} instance + */ + public Builder setWind(double windSpeed, double windDirection, int windSpeedUnit) { + if (Double.isNaN(windSpeed)) { + throw new IllegalArgumentException("Invalid wind speed value"); + } + if (Double.isNaN(windDirection)) { + throw new IllegalArgumentException("Invalid wind direction value"); + } + if (!isValidWindSpeedUnit(windSpeedUnit)) { + throw new IllegalArgumentException("Invalid speed unit"); + } + mWindSpeed = windSpeed; + mWindSpeedUnit = windSpeedUnit; + mWindDirection = windDirection; + return this; + } + + /** + * @param conditionCode A valid weather condition code. See + * {@link lineageos.providers.WeatherContract.WeatherColumns.WeatherCode} + * for valid codes. Attempting to pass an invalid code will get you an + * IllegalArgumentException. + * @return The {@link Builder} instance + */ + public Builder setWeatherCondition(int conditionCode) { + if (!isValidWeatherCode(conditionCode)) { + throw new IllegalArgumentException("Invalid weather condition code"); + } + mConditionCode = conditionCode; + return this; + } + + /** + * @param forecasts A valid array list of {@link DayForecast} objects. Attempting to pass + * null will get you an IllegalArgumentException' + * @return The {@link Builder} instance + */ + public Builder setForecast(@NonNull List forecasts) { + if (forecasts == null) { + throw new IllegalArgumentException("Forecast list can't be null"); + } + mForecastList = forecasts; + return this; + } + + /** + * + * @param todaysHigh Today's high temperature. Attempting to pass an invalid double value + * will get you an IllegalArgumentException + * @return The {@link Builder} instance + */ + public Builder setTodaysHigh(double todaysHigh) { + if (Double.isNaN(todaysHigh)) { + throw new IllegalArgumentException("Invalid temperature value"); + } + mTodaysHighTemp = todaysHigh; + return this; + } + + /** + * @param todaysLow Today's low temperature. Attempting to pass an invalid double value will + * get you an IllegalArgumentException + * @return + */ + public Builder setTodaysLow(double todaysLow) { + if (Double.isNaN(todaysLow)) { + throw new IllegalArgumentException("Invalid temperature value"); + } + mTodaysLowTemp = todaysLow; + return this; + } + + /** + * Combine all of the options that have been set and return a new {@link WeatherInfo} object + * @return {@link WeatherInfo} + */ + public WeatherInfo build() { + WeatherInfo info = new WeatherInfo(); + info.mCity = this.mCity; + info.mConditionCode = this.mConditionCode; + info.mTemperature = this.mTemperature; + info.mTempUnit = this.mTempUnit; + info.mHumidity = this.mHumidity; + info.mWindSpeed = this.mWindSpeed; + info.mWindDirection = this.mWindDirection; + info.mWindSpeedUnit = this.mWindSpeedUnit; + info.mTimestamp = this.mTimestamp == -1 ? System.currentTimeMillis() : this.mTimestamp; + info.mForecastList = this.mForecastList; + info.mTodaysHighTemp = this.mTodaysHighTemp; + info.mTodaysLowTemp = this.mTodaysLowTemp; + info.mKey = UUID.randomUUID().toString(); + return info; + } + + private boolean isValidTempUnit(int unit) { + switch (unit) { + case WeatherContract.WeatherColumns.TempUnit.CELSIUS: + case WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT: + return true; + default: + return false; + } + } + + private boolean isValidWindSpeedUnit(int unit) { + switch (unit) { + case WeatherContract.WeatherColumns.WindSpeedUnit.KPH: + case WeatherContract.WeatherColumns.WindSpeedUnit.MPH: + return true; + default: + return false; + } + } + } + + + private static boolean isValidWeatherCode(int code) { + if (code < WeatherContract.WeatherColumns.WeatherCode.WEATHER_CODE_MIN + || code > WeatherContract.WeatherColumns.WeatherCode.WEATHER_CODE_MAX) { + if (code != WeatherContract.WeatherColumns.WeatherCode.NOT_AVAILABLE) { + return false; + } + } + return true; + } + + /** + * @return city name + */ + public String getCity() { + return mCity; + } + + /** + * @return An implementation specific weather condition code + */ + public int getConditionCode() { + return mConditionCode; + } + + /** + * @return humidity + */ + public double getHumidity() { + return mHumidity; + } + + /** + * @return time stamp when the request was processed + */ + public long getTimestamp() { + return mTimestamp; + } + + /** + * @return wind direction (degrees) + */ + public double getWindDirection() { + return mWindDirection; + } + + /** + * @return wind speed + */ + public double getWindSpeed() { + return mWindSpeed; + } + + /** + * @return wind speed unit + */ + public int getWindSpeedUnit() { + return mWindSpeedUnit; + } + + /** + * @return current temperature + */ + public double getTemperature() { + return mTemperature; + } + + /** + * @return temperature unit + */ + public int getTemperatureUnit() { + return mTempUnit; + } + + /** + * @return today's high temperature + */ + public double getTodaysHigh() { + return mTodaysHighTemp; + } + + /** + * @return today's low temperature + */ + public double getTodaysLow() { + return mTodaysLowTemp; + } + + /** + * @return List of {@link lineageos.weather.WeatherInfo.DayForecast}. This list will contain + * the forecast weather for the upcoming days. If you want to know today's high and low + * temperatures, use {@link WeatherInfo#getTodaysHigh()} and {@link WeatherInfo#getTodaysLow()} + */ + public List getForecasts() { + return new ArrayList<>(mForecastList); + } + + private WeatherInfo(Parcel parcel) { + // Read parcelable version via the Concierge + ParcelInfo parcelInfo = Concierge.receiveParcel(parcel); + int parcelableVersion = parcelInfo.getParcelVersion(); + + if (parcelableVersion >= Build.LINEAGE_VERSION_CODES.ELDERBERRY) { + mKey = parcel.readString(); + mCity = parcel.readString(); + mConditionCode = parcel.readInt(); + mTemperature = parcel.readDouble(); + mTempUnit = parcel.readInt(); + mHumidity = parcel.readDouble(); + mWindSpeed = parcel.readDouble(); + mWindDirection = parcel.readDouble(); + mWindSpeedUnit = parcel.readInt(); + mTodaysHighTemp = parcel.readDouble(); + mTodaysLowTemp = parcel.readDouble(); + mTimestamp = parcel.readLong(); + int forecastListSize = parcel.readInt(); + mForecastList = new ArrayList<>(); + while (forecastListSize > 0) { + mForecastList.add(DayForecast.CREATOR.createFromParcel(parcel)); + forecastListSize--; + } + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Tell the concierge to prepare the parcel + ParcelInfo parcelInfo = Concierge.prepareParcel(dest); + + // ==== ELDERBERRY ===== + dest.writeString(mKey); + dest.writeString(mCity); + dest.writeInt(mConditionCode); + dest.writeDouble(mTemperature); + dest.writeInt(mTempUnit); + dest.writeDouble(mHumidity); + dest.writeDouble(mWindSpeed); + dest.writeDouble(mWindDirection); + dest.writeInt(mWindSpeedUnit); + dest.writeDouble(mTodaysHighTemp); + dest.writeDouble(mTodaysLowTemp); + dest.writeLong(mTimestamp); + dest.writeInt(mForecastList.size()); + for (DayForecast dayForecast : mForecastList) { + dayForecast.writeToParcel(dest, 0); + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + + @Override + public WeatherInfo createFromParcel(Parcel source) { + return new WeatherInfo(source); + } + + @Override + public WeatherInfo[] newArray(int size) { + return new WeatherInfo[size]; + } + }; + + /** + * This class represents the weather forecast for a given day. Do not add low and high + * temperatures for the current day in this list. Use + * {@link WeatherInfo.Builder#setTodaysHigh(double)} and + * {@link WeatherInfo.Builder#setTodaysLow(double)} instead. + */ + public static class DayForecast implements Parcelable{ + double mLow; + double mHigh; + int mConditionCode; + String mKey; + + private DayForecast() {} + + /** + * Builder class for {@link DayForecast} + */ + public static class Builder { + double mLow = Double.NaN; + double mHigh = Double.NaN; + int mConditionCode; + + /** + * @param conditionCode A valid weather condition code. See + * {@link lineageos.providers.WeatherContract.WeatherColumns.WeatherCode} for valid + * values. Attempting to pass an invalid code will get you an + * IllegalArgumentException + */ + public Builder(int conditionCode) { + if (!isValidWeatherCode(conditionCode)) { + throw new IllegalArgumentException("Invalid weather condition code"); + } + mConditionCode = conditionCode; + } + + /** + * @param high Forecast high temperature for this day. Attempting to pass an invalid + * double value will get you an IllegalArgumentException + * @return The {@link Builder} instance + */ + public Builder setHigh(double high) { + if (Double.isNaN(high)) { + throw new IllegalArgumentException("Invalid high forecast temperature"); + } + mHigh = high; + return this; + } + + /** + * @param low Forecast low temperate for this day. Attempting to pass an invalid double + * value will get you an IllegalArgumentException + * @return The {@link Builder} instance + */ + public Builder setLow(double low) { + if (Double.isNaN(low)) { + throw new IllegalArgumentException("Invalid low forecast temperature"); + } + mLow = low; + return this; + } + + + /** + * Combine all of the options that have been set and return a new {@link DayForecast} + * object + * @return {@link DayForecast} + */ + public DayForecast build() { + DayForecast forecast = new DayForecast(); + forecast.mLow = this.mLow; + forecast.mHigh = this.mHigh; + forecast.mConditionCode = this.mConditionCode; + forecast.mKey = UUID.randomUUID().toString(); + return forecast; + } + } + + /** + * @return forecasted low temperature + */ + public double getLow() { + return mLow; + } + + /** + * @return not what you think. Returns the forecasted high temperature + */ + public double getHigh() { + return mHigh; + } + + /** + * @return forecasted weather condition code. Implementation specific + */ + public int getConditionCode() { + return mConditionCode; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Tell the concierge to prepare the parcel + ParcelInfo parcelInfo = Concierge.prepareParcel(dest); + + // ==== ELDERBERRY ===== + dest.writeString(mKey); + dest.writeDouble(mLow); + dest.writeDouble(mHigh); + dest.writeInt(mConditionCode); + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public DayForecast createFromParcel(Parcel source) { + return new DayForecast(source); + } + + @Override + public DayForecast[] newArray(int size) { + return new DayForecast[size]; + } + }; + + private DayForecast(Parcel parcel) { + // Read parcelable version via the Concierge + ParcelInfo parcelInfo = Concierge.receiveParcel(parcel); + int parcelableVersion = parcelInfo.getParcelVersion(); + + if (parcelableVersion >= Build.LINEAGE_VERSION_CODES.ELDERBERRY) { + mKey = parcel.readString(); + mLow = parcel.readDouble(); + mHigh = parcel.readDouble(); + mConditionCode = parcel.readInt(); + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + @Override + public String toString() { + return new StringBuilder() + .append("{Low temp: ").append(mLow) + .append(" High temp: ").append(mHigh) + .append(" Condition code: ").append(mConditionCode) + .append("}").toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((mKey != null) ? mKey.hashCode() : 0); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + + if (getClass() == obj.getClass()) { + DayForecast forecast = (DayForecast) obj; + return (TextUtils.equals(mKey, forecast.mKey)); + } + return false; + } + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder() + .append(" City Name: ").append(mCity) + .append(" Condition Code: ").append(mConditionCode) + .append(" Temperature: ").append(mTemperature) + .append(" Temperature Unit: ").append(mTempUnit) + .append(" Humidity: ").append(mHumidity) + .append(" Wind speed: ").append(mWindSpeed) + .append(" Wind direction: ").append(mWindDirection) + .append(" Wind Speed Unit: ").append(mWindSpeedUnit) + .append(" Today's high temp: ").append(mTodaysHighTemp) + .append(" Today's low temp: ").append(mTodaysLowTemp) + .append(" Timestamp: ").append(mTimestamp).append(" Forecasts: ["); + for (DayForecast dayForecast : mForecastList) { + builder.append(dayForecast.toString()); + } + return builder.append("]}").toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((mKey != null) ? mKey.hashCode() : 0); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + + if (getClass() == obj.getClass()) { + WeatherInfo info = (WeatherInfo) obj; + return (TextUtils.equals(mKey, info.mKey)); + } + return false; + } +} \ No newline at end of file diff --git a/app/src/main/java/lineageos/weather/WeatherLocation.java b/app/src/main/java/lineageos/weather/WeatherLocation.java new file mode 100644 index 000000000..21a6b07ba --- /dev/null +++ b/app/src/main/java/lineageos/weather/WeatherLocation.java @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +import android.os.Parcel; +import android.os.Parcelable; + +import android.text.TextUtils; +import lineageos.os.Build; +import lineageos.os.Concierge; +import lineageos.os.Concierge.ParcelInfo; + +import java.util.UUID; + +/** + * A class representing a geographical location that a weather service provider can use to + * get weather data from. Each service provider will potentially populate objects of this class + * with different content, so make sure you don't preserve the values when a service provider + * is changed + */ +public final class WeatherLocation implements Parcelable{ + private String mCityId; + private String mCity; + private String mState; + private String mPostal; + private String mCountryId; + private String mCountry; + private String mKey; + + private WeatherLocation() {} + + /** + * Builder class for {@link WeatherLocation} + */ + public static class Builder { + String mCityId = ""; + String mCity = ""; + String mState = ""; + String mPostal = ""; + String mCountryId = ""; + String mCountry = ""; + + /** + * @param cityId An identifier for the city (for example WOEID - Where On Earth IDentifier) + * @param cityName The name of the city + */ + public Builder(String cityId, String cityName) { + if (cityId == null || cityName == null) { + throw new IllegalArgumentException("Illegal to set city id AND city to null"); + } + this.mCityId = cityId; + this.mCity = cityName; + } + + /** + * @param cityName The name of the city + */ + public Builder(String cityName) { + if (cityName == null) { + throw new IllegalArgumentException("City name can't be null"); + } + this.mCity = cityName; + } + + /** + * @param countryId An identifier for the country (for example ISO alpha-2, ISO alpha-3, + * ISO 3166-1 numeric-3, etc) + * @return The {@link Builder} instance + */ + public Builder setCountryId(String countryId) { + if (countryId == null) { + throw new IllegalArgumentException("Country ID can't be null"); + } + this.mCountryId = countryId; + return this; + } + + /** + * @param country The country name + * @return The {@link Builder} instance + */ + public Builder setCountry(String country) { + if (country == null) { + throw new IllegalArgumentException("Country can't be null"); + } + this.mCountry = country; + return this; + } + + /** + * @param postalCode The postal/ZIP code + * @return The {@link Builder} instance + */ + public Builder setPostalCode(String postalCode) { + if (postalCode == null) { + throw new IllegalArgumentException("Postal code/ZIP can't be null"); + } + this.mPostal = postalCode; + return this; + } + + /** + * @param state The state or territory where the city is located + * @return The {@link Builder} instance + */ + public Builder setState(String state) { + if (state == null) { + throw new IllegalArgumentException("State can't be null"); + } + this.mState = state; + return this; + } + + /** + * Combine all of the options that have been set and return a new {@link WeatherLocation} + * object + * @return {@link WeatherLocation} + */ + public WeatherLocation build() { + WeatherLocation weatherLocation = new WeatherLocation(); + weatherLocation.mCityId = this.mCityId; + weatherLocation.mCity = this.mCity; + weatherLocation.mState = this.mState; + weatherLocation.mPostal = this.mPostal; + weatherLocation.mCountryId = this.mCountryId; + weatherLocation.mCountry = this.mCountry; + weatherLocation.mKey = UUID.randomUUID().toString(); + return weatherLocation; + } + } + + /** + * @return The city ID. This method will return an empty string if the city ID was not set + */ + public String getCityId() { + return mCityId; + } + + /** + * @return The city name. This method will return an empty string if the city name was not set + */ + public String getCity() { + return mCity; + } + + /** + * @return The state name. This method will return an empty string if the state was not set + */ + public String getState() { + return mState; + } + + /** + * @return The postal/ZIP code. This method will return an empty string if the postal/ZIP code + * was not set + */ + public String getPostalCode() { + return mPostal; + } + + /** + * @return The country ID. This method will return an empty string if the country ID was not set + */ + public String getCountryId() { + return mCountryId; + } + + /** + * @return The country name. This method will return an empty string if the country ID was not + * set + */ + public String getCountry() { + return mCountry; + } + + private WeatherLocation(Parcel in) { + // Read parcelable version via the Concierge + ParcelInfo parcelInfo = Concierge.receiveParcel(in); + int parcelableVersion = parcelInfo.getParcelVersion(); + + if (parcelableVersion >= Build.LINEAGE_VERSION_CODES.ELDERBERRY) { + mKey = in.readString(); + mCityId = in.readString(); + mCity = in.readString(); + mState = in.readString(); + mPostal = in.readString(); + mCountryId = in.readString(); + mCountry = in.readString(); + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public WeatherLocation createFromParcel(Parcel in) { + return new WeatherLocation(in); + } + + @Override + public WeatherLocation[] newArray(int size) { + return new WeatherLocation[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Tell the concierge to prepare the parcel + ParcelInfo parcelInfo = Concierge.prepareParcel(dest); + + // ==== ELDERBERRY ===== + dest.writeString(mKey); + dest.writeString(mCityId); + dest.writeString(mCity); + dest.writeString(mState); + dest.writeString(mPostal); + dest.writeString(mCountryId); + dest.writeString(mCountry); + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + @Override + public String toString() { + return new StringBuilder() + .append("{ City ID: ").append(mCityId) + .append(" City: ").append(mCity) + .append(" State: ").append(mState) + .append(" Postal/ZIP Code: ").append(mPostal) + .append(" Country Id: ").append(mCountryId) + .append(" Country: ").append(mCountry).append("}") + .toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((mKey != null) ? mKey.hashCode() : 0); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + + if (getClass() == obj.getClass()) { + WeatherLocation location = (WeatherLocation) obj; + return (TextUtils.equals(mKey, location.mKey)); + } + return false; + } +} diff --git a/app/src/main/java/lineageos/weather/util/WeatherUtils.java b/app/src/main/java/lineageos/weather/util/WeatherUtils.java new file mode 100644 index 000000000..dd8418ffd --- /dev/null +++ b/app/src/main/java/lineageos/weather/util/WeatherUtils.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather.util; + + +import lineageos.providers.WeatherContract; + +import java.text.DecimalFormat; + +/** + * Helper class to perform operations and formatting of weather data + */ +public class WeatherUtils { + + /** + * Converts a temperature expressed in degrees Celsius to degrees Fahrenheit + * @param celsius temperature in Celsius + * @return the temperature in degrees Fahrenheit + */ + public static double celsiusToFahrenheit(double celsius) { + return ((celsius * (9d/5d)) + 32d); + } + + /** + * Converts a temperature expressed in degrees Fahrenheit to degrees Celsius + * @param fahrenheit temperature in Fahrenheit + * @return the temperature in degrees Celsius + */ + public static double fahrenheitToCelsius(double fahrenheit) { + return ((fahrenheit - 32d) * (5d/9d)); + } + + /** + * Returns a string representation of the temperature and unit supplied. The temperature value + * will be half-even rounded. + * @param temperature the temperature value + * @param tempUnit A valid {@link WeatherContract.WeatherColumns.TempUnit} + * @return A string with the format XX°F or XX°C (where XX is the temperature) + * depending on the temperature unit that was provided or null if an invalid unit is supplied + */ + public static String formatTemperature(double temperature, int tempUnit) { + if (!isValidTempUnit(tempUnit)) return null; + if (Double.isNaN(temperature)) return "-"; + + DecimalFormat noDigitsFormat = new DecimalFormat("0"); + String noDigitsTemp = noDigitsFormat.format(temperature); + if (noDigitsTemp.equals("-0")) { + noDigitsTemp = "0"; + } + + StringBuilder formatted = new StringBuilder() + .append(noDigitsTemp).append("\u00b0"); + if (tempUnit == WeatherContract.WeatherColumns.TempUnit.CELSIUS) { + formatted.append("C"); + } else if (tempUnit == WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT) { + formatted.append("F"); + } + return formatted.toString(); + } + + private static boolean isValidTempUnit(int unit) { + switch (unit) { + case WeatherContract.WeatherColumns.TempUnit.CELSIUS: + case WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT: + return true; + default: + return false; + } + } +} diff --git a/app/src/main/java/lineageos/weatherservice/ServiceRequest.java b/app/src/main/java/lineageos/weatherservice/ServiceRequest.java new file mode 100644 index 000000000..7f45e5686 --- /dev/null +++ b/app/src/main/java/lineageos/weatherservice/ServiceRequest.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weatherservice; + + +import android.os.RemoteException; + +import androidx.annotation.NonNull; + +import lineageos.weatherservice.IWeatherProviderServiceClient; +import lineageos.weather.LineageWeatherManager; +import lineageos.weather.RequestInfo; + +/** + * This class represents a request submitted by the system to the active weather provider service + */ +public final class ServiceRequest { + + private final RequestInfo mInfo; + private final IWeatherProviderServiceClient mClient; + + private enum Status { + IN_PROGRESS, COMPLETED, CANCELLED, FAILED, REJECTED + } + private Status mStatus; + + /* package */ ServiceRequest(RequestInfo info, IWeatherProviderServiceClient client) { + mInfo = info; + mClient = client; + mStatus = Status.IN_PROGRESS; + } + + /** + * Obtains the request information + * @return {@link lineageos.weather.RequestInfo} + */ + public RequestInfo getRequestInfo() { + return mInfo; + } + + /** + * This method should be called once the request has been completed + */ + public void complete(@NonNull ServiceRequestResult result) { + synchronized (this) { + if (mStatus.equals(Status.IN_PROGRESS)) { + try { + final int requestType = mInfo.getRequestType(); + switch (requestType) { + case RequestInfo.TYPE_WEATHER_BY_GEO_LOCATION_REQ: + case RequestInfo.TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + if (result.getWeatherInfo() == null) { + throw new IllegalStateException("The service request result doesn't" + + " contain a valid WeatherInfo object"); + } + mClient.setServiceRequestState(mInfo, result, + LineageWeatherManager.RequestStatus.COMPLETED); + break; + case RequestInfo.TYPE_LOOKUP_CITY_NAME_REQ: + if (result.getLocationLookupList() == null + || result.getLocationLookupList().size() <= 0) { + //In case the user decided to mark this request as completed with + //null or empty list. It's not necessarily a failure + mClient.setServiceRequestState(mInfo, null, + LineageWeatherManager.RequestStatus.NO_MATCH_FOUND); + } else { + mClient.setServiceRequestState(mInfo, result, + LineageWeatherManager.RequestStatus.COMPLETED); + } + break; + } + } catch (RemoteException e) { + } + mStatus = Status.COMPLETED; + } + } + } + + /** + * This method should be called if the service failed to process the request + * (no internet connection, time out, etc.) + */ + public void fail() { + synchronized (this) { + if (mStatus.equals(Status.IN_PROGRESS)) { + try { + final int requestType = mInfo.getRequestType(); + switch (requestType) { + case RequestInfo.TYPE_WEATHER_BY_GEO_LOCATION_REQ: + case RequestInfo.TYPE_WEATHER_BY_WEATHER_LOCATION_REQ: + mClient.setServiceRequestState(mInfo, null, + LineageWeatherManager.RequestStatus.FAILED); + break; + case RequestInfo.TYPE_LOOKUP_CITY_NAME_REQ: + mClient.setServiceRequestState(mInfo, null, + LineageWeatherManager.RequestStatus.FAILED); + break; + } + } catch (RemoteException e) { + } + mStatus = Status.FAILED; + } + } + } + + /** + * This method should be called if the service decides not to honor the request. Note this + * method will accept only the following values. + *
    + *
  • {@link lineageos.weather.LineageWeatherManager.RequestStatus#SUBMITTED_TOO_SOON}
  • + *
  • {@link lineageos.weather.LineageWeatherManager.RequestStatus#ALREADY_IN_PROGRESS}
  • + *
+ * Attempting to pass any other value will get you an IllegalArgumentException + * @param status + */ + public void reject(int status) { + synchronized (this) { + if (mStatus.equals(Status.IN_PROGRESS)) { + switch (status) { + case LineageWeatherManager.RequestStatus.ALREADY_IN_PROGRESS: + case LineageWeatherManager.RequestStatus.SUBMITTED_TOO_SOON: + try { + mClient.setServiceRequestState(mInfo, null, status); + } catch (RemoteException e) { + e.printStackTrace(); + } + break; + default: + throw new IllegalArgumentException("Can't reject with status " + status); + } + mStatus = Status.REJECTED; + } + } + } + + /** + * Called by the WeatherProviderService base class to notify we don't want this request anymore. + * The service implementing the WeatherProviderService will be notified of this action + * via onRequestCancelled() + * @hide + */ + public void cancel() { + synchronized (this) { + mStatus = Status.CANCELLED; + } + } +} diff --git a/app/src/main/java/lineageos/weatherservice/ServiceRequestResult.java b/app/src/main/java/lineageos/weatherservice/ServiceRequestResult.java new file mode 100644 index 000000000..cb1b2a0fc --- /dev/null +++ b/app/src/main/java/lineageos/weatherservice/ServiceRequestResult.java @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weatherservice; + +import android.os.Parcel; +import android.os.Parcelable; + +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import lineageos.os.Build; +import lineageos.os.Concierge; +import lineageos.os.Concierge.ParcelInfo; +import lineageos.weather.WeatherLocation; +import lineageos.weather.WeatherInfo; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * Use this class to build a request result. + */ +public final class ServiceRequestResult implements Parcelable { + + private WeatherInfo mWeatherInfo; + private List mLocationLookupList; + private String mKey; + + private ServiceRequestResult() {} + + private ServiceRequestResult(Parcel in) { + // Read parcelable version via the Concierge + ParcelInfo parcelInfo = Concierge.receiveParcel(in); + int parcelableVersion = parcelInfo.getParcelVersion(); + + if (parcelableVersion >= Build.LINEAGE_VERSION_CODES.ELDERBERRY) { + mKey = in.readString(); + int hasWeatherInfo = in.readInt(); + if (hasWeatherInfo == 1) { + mWeatherInfo = WeatherInfo.CREATOR.createFromParcel(in); + } + int hasLocationLookupList = in.readInt(); + if (hasLocationLookupList == 1) { + mLocationLookupList = new ArrayList<>(); + int listSize = in.readInt(); + while (listSize > 0) { + mLocationLookupList.add(WeatherLocation.CREATOR.createFromParcel(in)); + listSize--; + } + } + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + public static final Creator CREATOR + = new Creator() { + @Override + public ServiceRequestResult createFromParcel(Parcel in) { + return new ServiceRequestResult(in); + } + + @Override + public ServiceRequestResult[] newArray(int size) { + return new ServiceRequestResult[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Tell the concierge to prepare the parcel + ParcelInfo parcelInfo = Concierge.prepareParcel(dest); + + // ==== ELDERBERRY ===== + dest.writeString(mKey); + if (mWeatherInfo != null) { + dest.writeInt(1); + mWeatherInfo.writeToParcel(dest, 0); + } else { + dest.writeInt(0); + } + if (mLocationLookupList != null) { + dest.writeInt(1); + dest.writeInt(mLocationLookupList.size()); + for (WeatherLocation lookup : mLocationLookupList) { + lookup.writeToParcel(dest, 0); + } + } else { + dest.writeInt(0); + } + + // Complete parcel info for the concierge + parcelInfo.complete(); + } + + /** + * Builder class for {@link ServiceRequestResult} + */ + public static class Builder { + private WeatherInfo mWeatherInfo; + private List mLocationLookupList; + public Builder() { + this.mWeatherInfo = null; + this.mLocationLookupList = null; + } + + /** + * @param weatherInfo The WeatherInfo object holding the data that will be used to update + * the weather content provider + */ + public Builder(@NonNull WeatherInfo weatherInfo) { + if (weatherInfo == null) { + throw new IllegalArgumentException("WeatherInfo can't be null"); + } + + mWeatherInfo = weatherInfo; + } + + /** + * @param locations The list of WeatherLocation objects. The list should not be null + */ + public Builder(@NonNull List locations) { + if (locations == null) { + throw new IllegalArgumentException("Weather location list can't be null"); + } + mLocationLookupList = locations; + } + + /** + * Creates a {@link ServiceRequestResult} with the arguments + * supplied to this builder + * @return {@link ServiceRequestResult} + */ + public ServiceRequestResult build() { + ServiceRequestResult result = new ServiceRequestResult(); + result.mWeatherInfo = this.mWeatherInfo; + result.mLocationLookupList = this.mLocationLookupList; + result.mKey = UUID.randomUUID().toString(); + return result; + } + } + + /** + * @return The WeatherInfo object supplied by the weather provider service + */ + public WeatherInfo getWeatherInfo() { + return mWeatherInfo; + } + + /** + * @return The list of WeatherLocation objects supplied by the weather provider service + */ + public List getLocationLookupList() { + return new ArrayList<>(mLocationLookupList); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((mKey != null) ? mKey.hashCode() : 0); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + + if (getClass() == obj.getClass()) { + ServiceRequestResult request = (ServiceRequestResult) obj; + return (TextUtils.equals(mKey, request.mKey)); + } + return false; + } +} diff --git a/app/src/main/java/lineageos/weatherservice/WeatherProviderService.java b/app/src/main/java/lineageos/weatherservice/WeatherProviderService.java new file mode 100644 index 000000000..2e3a53539 --- /dev/null +++ b/app/src/main/java/lineageos/weatherservice/WeatherProviderService.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weatherservice; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import lineageos.weather.RequestInfo; + +import java.util.Collections; +import java.util.Set; +import java.util.WeakHashMap; + + +public abstract class WeatherProviderService extends Service { + + private Handler mHandler; + private IWeatherProviderServiceClient mClient; + private Set mWeakRequestsSet + = Collections.newSetFromMap(new WeakHashMap()); + + /** + * The {@link android.content.Intent} action that must be declared as handled by a service in + * its manifest for the system to recognize it as a weather provider service + */ + public static final String SERVICE_INTERFACE + = "lineageos.weatherservice.WeatherProviderService"; + + /** + * Name under which a {@link WeatherProviderService} publishes information about itself. + * This meta-data must reference an XML resource containing + * a <weather-provider-service> + * tag. + */ + public static final String SERVICE_META_DATA = "lineageos.weatherservice"; + + @Override + protected final void attachBaseContext(Context base) { + super.attachBaseContext(base); + mHandler = new ServiceHandler(base.getMainLooper()); + } + + @Override + public final IBinder onBind(Intent intent) { + return mBinder; + } + + private final IWeatherProviderService.Stub mBinder = new IWeatherProviderService.Stub() { + + @Override + public void processWeatherUpdateRequest(final RequestInfo info) { + mHandler.obtainMessage(ServiceHandler.MSG_ON_NEW_REQUEST, info).sendToTarget(); + } + + @Override + public void processCityNameLookupRequest(final RequestInfo info) { + mHandler.obtainMessage(ServiceHandler.MSG_ON_NEW_REQUEST, info).sendToTarget(); + } + + @Override + public void setServiceClient(IWeatherProviderServiceClient client) { + mHandler.obtainMessage(ServiceHandler.MSG_SET_CLIENT, client).sendToTarget(); + } + + @Override + public void cancelOngoingRequests() { + synchronized (mWeakRequestsSet) { + for (final ServiceRequest request : mWeakRequestsSet) { + request.cancel(); + mWeakRequestsSet.remove(request); + mHandler.obtainMessage(ServiceHandler.MSG_CANCEL_REQUEST, request) + .sendToTarget(); + } + } + } + + @Override + public void cancelRequest(int requestId) { + synchronized (mWeakRequestsSet) { + for (final ServiceRequest request : mWeakRequestsSet) { + if (request.getRequestInfo().hashCode() == requestId) { + mWeakRequestsSet.remove(request); + request.cancel(); + mHandler.obtainMessage(ServiceHandler.MSG_CANCEL_REQUEST, request) + .sendToTarget(); + break; + } + } + } + } + }; + + private class ServiceHandler extends Handler { + + public ServiceHandler(Looper looper) { + super(looper); + } + public static final int MSG_SET_CLIENT = 1; + public static final int MSG_ON_NEW_REQUEST = 2; + public static final int MSG_CANCEL_REQUEST = 3; + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_SET_CLIENT: { + mClient = (IWeatherProviderServiceClient) msg.obj; + if (mClient != null) { + onConnected(); + } else { + onDisconnected(); + } + return; + } + case MSG_ON_NEW_REQUEST: { + RequestInfo info = (RequestInfo) msg.obj; + if (info != null) { + ServiceRequest request = new ServiceRequest(info, mClient); + synchronized (mWeakRequestsSet) { + mWeakRequestsSet.add(request); + } + onRequestSubmitted(request); + } + return; + } + case MSG_CANCEL_REQUEST: { + ServiceRequest request = (ServiceRequest) msg.obj; + onRequestCancelled(request); + return; + } + } + } + } + + /** + * The system has connected to this service. + */ + protected void onConnected() { + /* Do nothing */ + } + + /** + * The system has disconnected from this service. + */ + protected void onDisconnected() { + /* Do nothing */ + } + + /** + * A new request has been submitted to this service + * @param request The service request to be processed by this service + */ + protected abstract void onRequestSubmitted(ServiceRequest request); + + /** + * Called when the system is not interested on this request anymore. Note that the service + * has marked the request as cancelled and you must stop any ongoing operation + * (such as pulling data from internet) that this service could've been performing to honor the + * request. + * + * @param request The request cancelled by the system + */ + protected abstract void onRequestCancelled(ServiceRequest request); +} \ No newline at end of file From a70aa5e749cb7f876f208be330be3db55580fb40 Mon Sep 17 00:00:00 2001 From: keeshii Date: Thu, 22 Aug 2019 17:57:26 +0200 Subject: [PATCH 036/124] Added LineageOs Weather receiver. --- app/src/main/AndroidManifest.xml | 2 + .../LineageOsWeatherReceiver.java | 221 ++++++++++++++++++ .../service/DeviceCommunicationService.java | 10 + 3 files changed, 233 insertions(+) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/LineageOsWeatherReceiver.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6bfd292b9..6e962b68c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,8 @@ + + . */ +package nodomain.freeyourgadget.gadgetbridge.externalevents; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import lineageos.weather.LineageWeatherManager; +import lineageos.weather.WeatherInfo; +import lineageos.weather.WeatherLocation; +import lineageos.weather.util.WeatherUtils; +import nodomain.freeyourgadget.gadgetbridge.BuildConfig; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.model.Weather; +import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; +import nodomain.freeyourgadget.gadgetbridge.util.Prefs; + +import static lineageos.providers.WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT; +import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.ISOLATED_THUNDERSHOWERS; +import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.NOT_AVAILABLE; +import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_SNOW_SHOWERS; +import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_THUNDERSTORMS; +import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SHOWERS; +import static lineageos.providers.WeatherContract.WeatherColumns.WindSpeedUnit.MPH; + +public class LineageOsWeatherReceiver extends BroadcastReceiver implements LineageWeatherManager.WeatherUpdateRequestListener, LineageWeatherManager.LookupCityRequestListener { + + private static final Logger LOG = LoggerFactory.getLogger(LineageOsWeatherReceiver.class); + + private WeatherLocation weatherLocation = null; + private Context mContext; + private PendingIntent mPendingIntent = null; + + public LineageOsWeatherReceiver() { + mContext = GBApplication.getContext(); + final LineageWeatherManager weatherManager = LineageWeatherManager.getInstance(mContext); + if (weatherManager == null) { + return; + } + + Prefs prefs = GBApplication.getPrefs(); + + String city = prefs.getString("weather_city", null); + String cityId = prefs.getString("weather_cityid", null); + + if ((cityId == null || cityId.equals("")) && city != null && !city.equals("")) { + lookupCity(city); + } else if (city != null && cityId != null) { + weatherLocation = new WeatherLocation.Builder(cityId, city).build(); + enablePeriodicAlarm(true); + } + } + + private void lookupCity(String city) { + final LineageWeatherManager weatherManager = LineageWeatherManager.getInstance(mContext); + if (weatherManager == null) { + return; + } + + if (city != null && !city.equals("")) { + if (weatherManager.getActiveWeatherServiceProviderLabel() != null) { + weatherManager.lookupCity(city, this); + } + } + } + + private void enablePeriodicAlarm(boolean enable) { + if ((mPendingIntent != null && enable) || (mPendingIntent == null && !enable)) { + return; + } + + AlarmManager am = (AlarmManager) (mContext.getSystemService(Context.ALARM_SERVICE)); + if (am == null) { + LOG.warn("could not get alarm manager!"); + return; + } + + if (enable) { + Intent intent = new Intent("GB_UPDATE_WEATHER"); + intent.setPackage(BuildConfig.APPLICATION_ID); + mPendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); + am.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 10000, AlarmManager.INTERVAL_HOUR, mPendingIntent); + } else { + am.cancel(mPendingIntent); + mPendingIntent = null; + } + } + + @Override + public void onReceive(Context context, Intent intent) { + Prefs prefs = GBApplication.getPrefs(); + + String city = prefs.getString("weather_city", null); + String cityId = prefs.getString("weather_cityid", null); + + if (city != null && !city.equals("") && cityId == null) { + lookupCity(city); + } else { + requestWeather(); + } + } + + private void requestWeather() { + final LineageWeatherManager weatherManager = LineageWeatherManager.getInstance(GBApplication.getContext()); + if (weatherManager.getActiveWeatherServiceProviderLabel() != null && weatherLocation != null) { + weatherManager.requestWeatherUpdate(weatherLocation, this); + } + } + + @Override + public void onWeatherRequestCompleted(int status, WeatherInfo weatherInfo) { + if (weatherInfo != null) { + LOG.info("weather: " + weatherInfo.toString()); + WeatherSpec weatherSpec = new WeatherSpec(); + weatherSpec.timestamp = (int) (weatherInfo.getTimestamp() / 1000); + weatherSpec.location = weatherInfo.getCity(); + + if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) { + weatherSpec.currentTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTemperature()) + 273; + weatherSpec.todayMaxTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysHigh()) + 273; + weatherSpec.todayMinTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysLow()) + 273; + } else { + weatherSpec.currentTemp = (int) weatherInfo.getTemperature() + 273; + weatherSpec.todayMaxTemp = (int) weatherInfo.getTodaysHigh() + 273; + weatherSpec.todayMinTemp = (int) weatherInfo.getTodaysLow() + 273; + } + if (weatherInfo.getWindSpeedUnit() == MPH) { + weatherSpec.windSpeed = (float) weatherInfo.getWindSpeed() * 1.609344f; + } else { + weatherSpec.windSpeed = (float) weatherInfo.getWindSpeed(); + } + weatherSpec.windDirection = (int) weatherInfo.getWindDirection(); + + weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(LineageOstoYahooCondintion(weatherInfo.getConditionCode())); + weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode); + weatherSpec.currentHumidity = (int) weatherInfo.getHumidity(); + + weatherSpec.forecasts = new ArrayList<>(); + List forecasts = weatherInfo.getForecasts(); + for (int i = 1; i < forecasts.size(); i++) { + WeatherInfo.DayForecast cmForecast = forecasts.get(i); + WeatherSpec.Forecast gbForecast = new WeatherSpec.Forecast(); + if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) { + gbForecast.maxTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getHigh()) + 273; + gbForecast.minTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getLow()) + 273; + } else { + gbForecast.maxTemp = (int) cmForecast.getHigh() + 273; + gbForecast.minTemp = (int) cmForecast.getLow() + 273; + } + gbForecast.conditionCode = Weather.mapToOpenWeatherMapCondition(LineageOstoYahooCondintion(cmForecast.getConditionCode())); + weatherSpec.forecasts.add(gbForecast); + } + Weather.getInstance().setWeatherSpec(weatherSpec); + GBApplication.deviceService().onSendWeather(weatherSpec); + } else { + LOG.info("request has returned null for WeatherInfo"); + } + } + + /** + * @param cmCondition + * @return + */ + private int LineageOstoYahooCondintion(int cmCondition) { + int yahooCondition; + if (cmCondition <= SHOWERS) { + yahooCondition = cmCondition; + } else if (cmCondition <= SCATTERED_THUNDERSTORMS) { + yahooCondition = cmCondition + 1; + } else if (cmCondition <= SCATTERED_SNOW_SHOWERS) { + yahooCondition = cmCondition + 2; + } else if (cmCondition <= ISOLATED_THUNDERSHOWERS) { + yahooCondition = cmCondition + 3; + } else { + yahooCondition = NOT_AVAILABLE; + } + return yahooCondition; + } + + @Override + public void onLookupCityRequestCompleted(int result, List list) { + if (list != null) { + weatherLocation = list.get(0); + String cityId = weatherLocation.getCityId(); + String city = weatherLocation.getCity(); + + SharedPreferences.Editor editor = GBApplication.getPrefs().getPreferences().edit(); + editor.putString("weather_city", city).apply(); + editor.putString("weather_cityid", cityId).apply(); + enablePeriodicAlarm(true); + requestWeather(); + } else { + enablePeriodicAlarm(false); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 1a7876332..2ea7f740a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -56,6 +56,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectRecei import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingRequestReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver; +import nodomain.freeyourgadget.gadgetbridge.externalevents.LineageOsWeatherReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.OmniJawsObserver; import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver; @@ -193,6 +194,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private AlarmReceiver mAlarmReceiver = null; private CalendarReceiver mCalendarReceiver = null; private CMWeatherReceiver mCMWeatherReceiver = null; + private LineageOsWeatherReceiver mLineageOsWeatherReceiver = null; private OmniJawsObserver mOmniJawsObserver = null; private Random mRandom = new Random(); @@ -733,6 +735,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mCMWeatherReceiver = new CMWeatherReceiver(); registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); } + if (mLineageOsWeatherReceiver == null && coordinator != null && coordinator.supportsWeather()) { + mLineageOsWeatherReceiver = new LineageOsWeatherReceiver(); + registerReceiver(mLineageOsWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); + } if (mOmniJawsObserver == null && coordinator != null && coordinator.supportsWeather()) { try { mOmniJawsObserver = new OmniJawsObserver(new Handler()); @@ -784,6 +790,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere unregisterReceiver(mCMWeatherReceiver); mCMWeatherReceiver = null; } + if (mLineageOsWeatherReceiver != null) { + unregisterReceiver(mLineageOsWeatherReceiver); + mLineageOsWeatherReceiver = null; + } if (mOmniJawsObserver != null) { getContentResolver().unregisterContentObserver(mOmniJawsObserver); } From 8bed673a9591a162ef398996fbd5d14b018e7f74 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 22 Aug 2019 21:31:08 +0200 Subject: [PATCH 037/124] Annotate LineageOsWeatherReceiver as Android >=M, and only try to use it with Oreo or later --- .../LineageOsWeatherReceiver.java | 4 ++++ .../service/DeviceCommunicationService.java | 18 +++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/LineageOsWeatherReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/LineageOsWeatherReceiver.java index e1deb346a..b42bde56b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/LineageOsWeatherReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/LineageOsWeatherReceiver.java @@ -22,6 +22,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Build; + +import androidx.annotation.RequiresApi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,6 +51,7 @@ import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SCA import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SHOWERS; import static lineageos.providers.WeatherContract.WeatherColumns.WindSpeedUnit.MPH; +@RequiresApi(api = Build.VERSION_CODES.M) public class LineageOsWeatherReceiver extends BroadcastReceiver implements LineageWeatherManager.WeatherUpdateRequestListener, LineageWeatherManager.LookupCityRequestListener { private static final Logger LOG = LoggerFactory.getLogger(LineageOsWeatherReceiver.class); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 2ea7f740a..152d457d1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -36,6 +36,10 @@ import android.os.Handler; import android.os.IBinder; import android.widget.Toast; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,9 +47,6 @@ import java.util.ArrayList; import java.util.Random; import java.util.UUID; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils; @@ -97,12 +98,12 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_FI import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_HEARTRATE_TEST; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_INSTALL; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_NOTIFICATION; +import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_READ_CONFIGURATION; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_REQUEST_APPINFO; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_REQUEST_DEVICEINFO; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_REQUEST_SCREENSHOT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_RESET; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SEND_CONFIGURATION; -import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_READ_CONFIGURATION; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SEND_WEATHER; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SETCANNEDMESSAGES; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SETMUSICINFO; @@ -735,9 +736,12 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mCMWeatherReceiver = new CMWeatherReceiver(); registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); } - if (mLineageOsWeatherReceiver == null && coordinator != null && coordinator.supportsWeather()) { - mLineageOsWeatherReceiver = new LineageOsWeatherReceiver(); - registerReceiver(mLineageOsWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); + if (GBApplication.isRunningOreoOrLater()) { + if (mLineageOsWeatherReceiver == null && coordinator != null && coordinator.supportsWeather()) { + + mLineageOsWeatherReceiver = new LineageOsWeatherReceiver(); + registerReceiver(mLineageOsWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); + } } if (mOmniJawsObserver == null && coordinator != null && coordinator.supportsWeather()) { try { From 2d233141b421d13cd1cf9412794280525bb081b3 Mon Sep 17 00:00:00 2001 From: vanous Date: Sat, 24 Aug 2019 11:58:32 +0200 Subject: [PATCH 038/124] adds custom renderer for better view of many columns --- .../charts/AbstractWeekChartFragment.java | 4 +++ .../charts/AngledLabelsChartRenderer.java | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index 0af2e32f9..744fe5134 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -88,6 +88,10 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { setupLegend(mWeekChart); mTodayPieChart.setCenterText(mcd.getDayData().centerText); mTodayPieChart.setData(mcd.getDayData().data); + //set custom renderer for 30days bar charts + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + mWeekChart.setRenderer(new AngledLabelsChartRenderer(mWeekChart, mWeekChart.getAnimator(), mWeekChart.getViewPortHandler())); + } mWeekChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317 mWeekChart.setData(mcd.getWeekBeforeData().getData()); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java new file mode 100644 index 000000000..d95708b6f --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java @@ -0,0 +1,31 @@ +package nodomain.freeyourgadget.gadgetbridge.activities.charts; + +import android.graphics.Canvas; + +import com.github.mikephil.charting.animation.ChartAnimator; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; +import com.github.mikephil.charting.renderer.BarChartRenderer; +import com.github.mikephil.charting.utils.ViewPortHandler; + +public class AngledLabelsChartRenderer extends BarChartRenderer { + public AngledLabelsChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { + super(chart, animator, viewPortHandler); + } + + @Override + public void drawValue(Canvas canvas, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) { + + mValuePaint.setColor(color); + + //move position to the center of bar + x=x+8; + y=y-25; + + canvas.save(); + canvas.rotate(-90, x, y); + + canvas.drawText(formatter.getFormattedValue(value, entry, dataSetIndex, mViewPortHandler), x, y, mValuePaint); + canvas.restore(); + }} From a69a139602fd6d2cb364f08620064450c2dbea58 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 24 Aug 2019 12:41:26 +0200 Subject: [PATCH 039/124] Migrate to upstream MPAndroidChart v3.1.0 --- app/build.gradle | 2 +- .../activities/charts/AbstractChartFragment.java | 13 +++++++------ .../charts/AbstractWeekChartFragment.java | 9 ++++----- .../charts/ActivitySleepChartFragment.java | 2 +- .../charts/AngledLabelsChartRenderer.java | 9 ++++----- .../activities/charts/SleepChartFragment.java | 5 +++-- .../activities/charts/TimestampValueFormatter.java | 3 ++- .../activities/charts/WeekSleepChartFragment.java | 14 +++++++------- .../activities/charts/WeekStepsChartFragment.java | 9 ++++----- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7121ef0c6..64749243b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,7 +79,7 @@ dependencies { exclude group: "com.google.android", module: "android" } implementation "org.slf4j:slf4j-api:1.7.12" - implementation "com.github.Freeyourgadget:MPAndroidChart:5e5bd6c1d3e95c515d4853647ae554e48ee1d593" + implementation "com.github.PhilJay:MPAndroidChart:v3.1.0" implementation "com.github.pfichtner:durationformatter:0.1.1" implementation "de.cketti.library.changelog:ckchangelog:1.2.2" implementation "net.e175.klaus:solarpositioning:0.0.9" diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java index b0722bd7d..6bf3f738d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java @@ -36,6 +36,7 @@ import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.formatter.IAxisValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import org.slf4j.Logger; @@ -572,7 +573,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { lineData = new LineData(); } - IAxisValueFormatter xValueFormatter = new SampleXLabelFormatter(tsTranslation); + ValueFormatter xValueFormatter = new SampleXLabelFormatter(tsTranslation); return new DefaultChartsData(lineData, xValueFormatter); } @@ -753,14 +754,14 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { public static class DefaultChartsData> extends ChartsData { private final T data; - private IAxisValueFormatter xValueFormatter; + private ValueFormatter xValueFormatter; - public DefaultChartsData(T data, IAxisValueFormatter xValueFormatter) { + public DefaultChartsData(T data, ValueFormatter xValueFormatter) { this.xValueFormatter = xValueFormatter; this.data = data; } - public IAxisValueFormatter getXValueFormatter() { + public ValueFormatter getXValueFormatter() { return xValueFormatter; } @@ -769,7 +770,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { } } - protected static class SampleXLabelFormatter implements IAxisValueFormatter { + protected static class SampleXLabelFormatter extends ValueFormatter { private final TimestampTranslation tsTranslation; SimpleDateFormat annotationDateFormat = new SimpleDateFormat("HH:mm"); // SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); @@ -791,7 +792,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { } } - protected static class PreformattedXIndexLabelFormatter implements IAxisValueFormatter { + protected static class PreformattedXIndexLabelFormatter extends ValueFormatter { private ArrayList xLabels; public PreformattedXIndexLabelFormatter(ArrayList xLabels) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index 744fe5134..8dcbaed2e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -37,8 +37,7 @@ import com.github.mikephil.charting.data.ChartData; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; -import com.github.mikephil.charting.formatter.IAxisValueFormatter; -import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -372,11 +371,11 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { abstract String[] getPieLabels(); - abstract IValueFormatter getPieValueFormatter(); + abstract ValueFormatter getPieValueFormatter(); - abstract IValueFormatter getBarValueFormatter(); + abstract ValueFormatter getBarValueFormatter(); - abstract IAxisValueFormatter getYAxisFormatter(); + abstract ValueFormatter getYAxisFormatter(); abstract int[] getColors(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java index 4c4e1000f..5bdd11ae8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java @@ -143,7 +143,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment { @Override protected void renderCharts() { - mChart.animateX(ANIM_TIME, Easing.EasingOption.EaseInOutQuart); + mChart.animateX(ANIM_TIME, Easing.EaseInOutQuart); // mChart.invalidate(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java index d95708b6f..286d484c0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AngledLabelsChartRenderer.java @@ -3,19 +3,17 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import android.graphics.Canvas; import com.github.mikephil.charting.animation.ChartAnimator; -import com.github.mikephil.charting.data.Entry; -import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; import com.github.mikephil.charting.renderer.BarChartRenderer; import com.github.mikephil.charting.utils.ViewPortHandler; public class AngledLabelsChartRenderer extends BarChartRenderer { - public AngledLabelsChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { + AngledLabelsChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { super(chart, animator, viewPortHandler); } @Override - public void drawValue(Canvas canvas, IValueFormatter formatter, float value, Entry entry, int dataSetIndex, float x, float y, int color) { + public void drawValue(Canvas canvas, String valueText, float x, float y, int color) { mValuePaint.setColor(color); @@ -26,6 +24,7 @@ public class AngledLabelsChartRenderer extends BarChartRenderer { canvas.save(); canvas.rotate(-90, x, y); - canvas.drawText(formatter.getFormattedValue(value, entry, dataSetIndex, mViewPortHandler), x, y, mValuePaint); + canvas.drawText(valueText, x, y, mValuePaint); + canvas.restore(); }} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java index 05b090368..1d64cae3d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java @@ -38,6 +38,7 @@ import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; import com.github.mikephil.charting.utils.ViewPortHandler; import org.slf4j.Logger; @@ -118,7 +119,7 @@ public class SleepChartFragment extends AbstractChartFragment { } String totalSleep = DateTimeUtils.formatDurationHoursMinutes(totalSeconds, TimeUnit.SECONDS); PieDataSet set = new PieDataSet(entries, ""); - set.setValueFormatter(new IValueFormatter() { + set.setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { return DateTimeUtils.formatDurationHoursMinutes((long) value, TimeUnit.SECONDS); @@ -269,7 +270,7 @@ public class SleepChartFragment extends AbstractChartFragment { @Override protected void renderCharts() { - mActivityChart.animateX(ANIM_TIME, Easing.EasingOption.EaseInOutQuart); + mActivityChart.animateX(ANIM_TIME, Easing.EaseInOutQuart); mSleepAmountChart.invalidate(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java index e6bfdd55c..cbb62eb11 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java @@ -18,6 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.formatter.IAxisValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -25,7 +26,7 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; -public class TimestampValueFormatter implements IAxisValueFormatter { +public class TimestampValueFormatter extends ValueFormatter { private final Calendar cal; // private DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); private DateFormat dateFormat; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index 04ed240a6..155f31c3b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -22,7 +22,7 @@ import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.components.LegendEntry; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.formatter.IAxisValueFormatter; -import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; import com.github.mikephil.charting.utils.ViewPortHandler; import java.util.ArrayList; @@ -115,8 +115,8 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { } @Override - IValueFormatter getPieValueFormatter() { - return new IValueFormatter() { + ValueFormatter getPieValueFormatter() { + return new ValueFormatter() { @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { return formatPieValue((long) value); @@ -125,8 +125,8 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { } @Override - IValueFormatter getBarValueFormatter() { - return new IValueFormatter() { + ValueFormatter getBarValueFormatter() { + return new ValueFormatter() { @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { return DateTimeUtils.minutesToHHMM((int) value); @@ -135,8 +135,8 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { } @Override - IAxisValueFormatter getYAxisFormatter() { - return new IAxisValueFormatter() { + ValueFormatter getYAxisFormatter() { + return new ValueFormatter() { @Override public String getFormattedValue(float value, AxisBase axis) { return DateTimeUtils.minutesToHHMM((int) value); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java index 24f02940d..ec720a6da 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java @@ -18,8 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import com.github.mikephil.charting.charts.Chart; -import com.github.mikephil.charting.formatter.IAxisValueFormatter; -import com.github.mikephil.charting.formatter.IValueFormatter; +import com.github.mikephil.charting.formatter.ValueFormatter; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; @@ -82,17 +81,17 @@ public class WeekStepsChartFragment extends AbstractWeekChartFragment { } @Override - IValueFormatter getPieValueFormatter() { + ValueFormatter getPieValueFormatter() { return null; } @Override - IValueFormatter getBarValueFormatter() { + ValueFormatter getBarValueFormatter() { return null; } @Override - IAxisValueFormatter getYAxisFormatter() { + ValueFormatter getYAxisFormatter() { return null; } From 984db60c5f4408eb71e258977a27fbd29d07984b Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 24 Aug 2019 12:55:33 +0200 Subject: [PATCH 040/124] Fix formatted values for charts --- .../activities/charts/AbstractChartFragment.java | 15 +++++++-------- .../activities/charts/SleepChartFragment.java | 8 +++----- .../charts/TimestampValueFormatter.java | 4 +--- .../activities/charts/WeekSleepChartFragment.java | 10 +++------- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java index 6bf3f738d..3c49dbfa2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java @@ -26,16 +26,19 @@ import android.os.Bundle; import android.util.TypedValue; import android.view.View; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.github.mikephil.charting.charts.BarChart; import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.charts.Chart; -import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.ChartData; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; -import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.formatter.ValueFormatter; import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; @@ -52,10 +55,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.FragmentActivity; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBFragment; @@ -782,7 +781,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { } // TODO: this does not work. Cannot use precomputed labels @Override - public String getFormattedValue(float value, AxisBase axis) { + public String getFormattedValue(float value) { cal.clear(); int ts = (int) value; cal.setTimeInMillis(tsTranslation.toOriginalValue(ts) * 1000L); @@ -800,7 +799,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { } @Override - public String getFormattedValue(float value, AxisBase axis) { + public String getFormattedValue(float value) { int index = (int) value; if (xLabels == null || index >= xLabels.size()) { return String.valueOf(value); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java index 1d64cae3d..e28011701 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java @@ -25,6 +25,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.Nullable; + import com.github.mikephil.charting.animation.Easing; import com.github.mikephil.charting.charts.Chart; import com.github.mikephil.charting.charts.LineChart; @@ -32,14 +34,11 @@ import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.LegendEntry; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; -import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; -import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.formatter.ValueFormatter; -import com.github.mikephil.charting.utils.ViewPortHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,7 +48,6 @@ import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; -import androidx.annotation.Nullable; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; @@ -121,7 +119,7 @@ public class SleepChartFragment extends AbstractChartFragment { PieDataSet set = new PieDataSet(entries, ""); set.setValueFormatter(new ValueFormatter() { @Override - public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { + public String getFormattedValue(float value) { return DateTimeUtils.formatDurationHoursMinutes((long) value, TimeUnit.SECONDS); } }); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java index cbb62eb11..a79af0781 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/TimestampValueFormatter.java @@ -16,8 +16,6 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.activities.charts; -import com.github.mikephil.charting.components.AxisBase; -import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.formatter.ValueFormatter; import java.text.DateFormat; @@ -43,7 +41,7 @@ public class TimestampValueFormatter extends ValueFormatter { } @Override - public String getFormattedValue(float value, AxisBase axis) { + public String getFormattedValue(float value) { cal.setTimeInMillis((int) value * 1000L); Date date = cal.getTime(); String dateString = dateFormat.format(date); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index 155f31c3b..62018cd18 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -17,13 +17,9 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import com.github.mikephil.charting.charts.Chart; -import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.components.LegendEntry; -import com.github.mikephil.charting.data.Entry; -import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.formatter.ValueFormatter; -import com.github.mikephil.charting.utils.ViewPortHandler; import java.util.ArrayList; import java.util.List; @@ -118,7 +114,7 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { ValueFormatter getPieValueFormatter() { return new ValueFormatter() { @Override - public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { + public String getFormattedValue(float value) { return formatPieValue((long) value); } }; @@ -128,7 +124,7 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { ValueFormatter getBarValueFormatter() { return new ValueFormatter() { @Override - public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { + public String getFormattedValue(float value) { return DateTimeUtils.minutesToHHMM((int) value); } }; @@ -138,7 +134,7 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { ValueFormatter getYAxisFormatter() { return new ValueFormatter() { @Override - public String getFormattedValue(float value, AxisBase axis) { + public String getFormattedValue(float value) { return DateTimeUtils.minutesToHHMM((int) value); } }; From d07ca6faa6b3debfe5d465d2db2e80c0e6fecbf7 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 25 Aug 2019 09:55:23 +0200 Subject: [PATCH 041/124] Mi Band 4: Fix location not being updated on the Band Also move generic code from AmazfitBipSupport to HuamiSupport where is belongs Fixes #1609 --- .../service/devices/huami/HuamiSupport.java | 190 ++++++++++++++++- .../huami/amazfitbip/AmazfitBipSupport.java | 195 +----------------- 2 files changed, 190 insertions(+), 195 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index 9d0c5b14d..b8f1f7624 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -42,11 +42,13 @@ import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.SimpleTimeZone; import java.util.Timer; import java.util.TimerTask; import java.util.UUID; import java.util.concurrent.TimeUnit; +import cyanogenmod.weather.util.WeatherUtils; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.Logging; import nodomain.freeyourgadget.gadgetbridge.R; @@ -66,6 +68,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiWeatherConditions; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService; import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband2.MiBand2FWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.miband3.MiBand3Coordinator; @@ -95,6 +98,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec; import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; +import nodomain.freeyourgadget.gadgetbridge.model.Weather; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; @@ -762,9 +766,8 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { } + private void sendMusicStateToDevice() { - - if (characteristicChunked == null) { return; } @@ -1584,7 +1587,190 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { @Override public void onSendWeather(WeatherSpec weatherSpec) { + // FIXME: currently HuamiSupport *is* MiBand2 support, so return if we are using Mi Band 2 + if (gbDevice.getType() == DeviceType.MIBAND2) { + return; + } + if (gbDevice.getFirmwareVersion() == null) { + LOG.warn("Device not initialized yet, so not sending weather info"); + return; + } + boolean supportsConditionString = false; + + Version version = new Version(gbDevice.getFirmwareVersion()); + if (version.compareTo(new Version("0.0.8.74")) >= 0) { + supportsConditionString = true; + } + + MiBandConst.DistanceUnit unit = HuamiCoordinator.getDistanceUnit(); + int tz_offset_hours = SimpleTimeZone.getDefault().getOffset(weatherSpec.timestamp * 1000L) / (1000 * 60 * 60); + try { + TransactionBuilder builder; + builder = performInitialized("Sending current temp"); + + byte condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(weatherSpec.currentConditionCode); + + int length = 8; + if (supportsConditionString) { + length += weatherSpec.currentCondition.getBytes().length + 1; + } + ByteBuffer buf = ByteBuffer.allocate(length); + buf.order(ByteOrder.LITTLE_ENDIAN); + + buf.put((byte) 2); + buf.putInt(weatherSpec.timestamp); + buf.put((byte) (tz_offset_hours * 4)); + buf.put(condition); + + int currentTemp = weatherSpec.currentTemp - 273; + if (unit == MiBandConst.DistanceUnit.IMPERIAL) { + currentTemp = (int) WeatherUtils.celsiusToFahrenheit(currentTemp); + } + buf.put((byte) currentTemp); + + if (supportsConditionString) { + buf.put(weatherSpec.currentCondition.getBytes()); + buf.put((byte) 0); + } + + if (characteristicChunked != null) { + writeToChunked(builder, 1, buf.array()); + } else { + builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); + } + + builder.queue(getQueue()); + } catch (Exception ex) { + LOG.error("Error sending current weather", ex); + } + + try { + TransactionBuilder builder; + builder = performInitialized("Sending air quality index"); + int length = 8; + String aqiString = "(n/a)"; + if (supportsConditionString) { + length += aqiString.getBytes().length + 1; + } + ByteBuffer buf = ByteBuffer.allocate(length); + buf.order(ByteOrder.LITTLE_ENDIAN); + buf.put((byte) 4); + buf.putInt(weatherSpec.timestamp); + buf.put((byte) (tz_offset_hours * 4)); + buf.putShort((short) 0); + if (supportsConditionString) { + buf.put(aqiString.getBytes()); + buf.put((byte) 0); + } + + if (characteristicChunked != null) { + writeToChunked(builder, 1, buf.array()); + } else { + builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); + } + + builder.queue(getQueue()); + } catch (IOException ex) { + LOG.error("Error sending air quality"); + } + + try { + TransactionBuilder builder = performInitialized("Sending weather forecast"); + + final byte NR_DAYS = (byte) (1 + weatherSpec.forecasts.size()); + int bytesPerDay = 4; + + int conditionsLength = 0; + if (supportsConditionString) { + bytesPerDay = 5; + conditionsLength = weatherSpec.currentCondition.getBytes().length; + for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) { + conditionsLength += Weather.getConditionString(forecast.conditionCode).getBytes().length; + } + } + + int length = 7 + bytesPerDay * NR_DAYS + conditionsLength; + ByteBuffer buf = ByteBuffer.allocate(length); + + buf.order(ByteOrder.LITTLE_ENDIAN); + buf.put((byte) 1); + buf.putInt(weatherSpec.timestamp); + buf.put((byte) (tz_offset_hours * 4)); + + buf.put(NR_DAYS); + + byte condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(weatherSpec.currentConditionCode); + buf.put(condition); + buf.put(condition); + + int todayMaxTemp = weatherSpec.todayMaxTemp - 273; + int todayMinTemp = weatherSpec.todayMinTemp - 273; + if (unit == MiBandConst.DistanceUnit.IMPERIAL) { + todayMaxTemp = (int) WeatherUtils.celsiusToFahrenheit(todayMaxTemp); + todayMinTemp = (int) WeatherUtils.celsiusToFahrenheit(todayMinTemp); + } + buf.put((byte) todayMaxTemp); + buf.put((byte) todayMinTemp); + + if (supportsConditionString) { + buf.put(weatherSpec.currentCondition.getBytes()); + buf.put((byte) 0); + } + + for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) { + condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(forecast.conditionCode); + buf.put(condition); + buf.put(condition); + + int forecastMaxTemp = forecast.maxTemp - 273; + int forecastMinTemp = forecast.minTemp - 273; + if (unit == MiBandConst.DistanceUnit.IMPERIAL) { + forecastMaxTemp = (int) WeatherUtils.celsiusToFahrenheit(forecastMaxTemp); + forecastMinTemp = (int) WeatherUtils.celsiusToFahrenheit(forecastMinTemp); + } + buf.put((byte) forecastMaxTemp); + buf.put((byte) forecastMinTemp); + + if (supportsConditionString) { + buf.put(Weather.getConditionString(forecast.conditionCode).getBytes()); + buf.put((byte) 0); + } + } + + if (characteristicChunked != null) { + writeToChunked(builder, 1, buf.array()); + } else { + builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); + } + + builder.queue(getQueue()); + } catch (Exception ex) { + LOG.error("Error sending weather forecast", ex); + } + + try { + TransactionBuilder builder; + builder = performInitialized("Sending forecast location"); + + int length = 2 + weatherSpec.location.getBytes().length; + ByteBuffer buf = ByteBuffer.allocate(length); + buf.order(ByteOrder.LITTLE_ENDIAN); + buf.put((byte) 8); + buf.put(weatherSpec.location.getBytes()); + buf.put((byte) 0); + + + if (characteristicChunked != null) { + writeToChunked(builder, 4, buf.array()); + } else { + builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); + } + + builder.queue(getQueue()); + } catch (Exception ex) { + LOG.error("Error sending current forecast location", ex); + } } private HuamiSupport setDateDisplay(TransactionBuilder builder) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java index e67c6532e..469e360c7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java @@ -28,39 +28,30 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.Set; -import java.util.SimpleTimeZone; import java.util.UUID; -import cyanogenmod.weather.util.WeatherUtils; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService; -import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiWeatherConditions; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes; -import nodomain.freeyourgadget.gadgetbridge.model.Weather; -import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.AlertCategory; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.AlertNotificationProfile; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.NewAlert; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiIcon; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.HuamiFetchDebugLogsOperation; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.FetchActivityOperation; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.FetchSportsSummaryOperation; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.HuamiFetchDebugLogsOperation; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.NotificationStrategy; import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; -import nodomain.freeyourgadget.gadgetbridge.util.Version; public class AmazfitBipSupport extends HuamiSupport { @@ -248,187 +239,6 @@ public class AmazfitBipSupport extends HuamiSupport { builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), command); } - @Override - public void onSendWeather(WeatherSpec weatherSpec) { - if (gbDevice.getFirmwareVersion() == null) { - LOG.warn("Device not initialized yet, so not sending weather info"); - return; - } - boolean supportsConditionString = false; - - Version version = new Version(gbDevice.getFirmwareVersion()); - if (version.compareTo(new Version("0.0.8.74")) >= 0) { - supportsConditionString = true; - } - - MiBandConst.DistanceUnit unit = HuamiCoordinator.getDistanceUnit(); - int tz_offset_hours = SimpleTimeZone.getDefault().getOffset(weatherSpec.timestamp * 1000L) / (1000 * 60 * 60); - try { - TransactionBuilder builder; - builder = performInitialized("Sending current temp"); - - byte condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(weatherSpec.currentConditionCode); - - int length = 8; - if (supportsConditionString) { - length += weatherSpec.currentCondition.getBytes().length + 1; - } - ByteBuffer buf = ByteBuffer.allocate(length); - buf.order(ByteOrder.LITTLE_ENDIAN); - - buf.put((byte) 2); - buf.putInt(weatherSpec.timestamp); - buf.put((byte) (tz_offset_hours * 4)); - buf.put(condition); - - int currentTemp = weatherSpec.currentTemp - 273; - if (unit == MiBandConst.DistanceUnit.IMPERIAL) { - currentTemp = (int) WeatherUtils.celsiusToFahrenheit(currentTemp); - } - buf.put((byte) currentTemp); - - if (supportsConditionString) { - buf.put(weatherSpec.currentCondition.getBytes()); - buf.put((byte) 0); - } - - if (characteristicChunked != null) { - writeToChunked(builder, 1, buf.array()); - } else { - builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); - } - - builder.queue(getQueue()); - } catch (Exception ex) { - LOG.error("Error sending current weather", ex); - } - - if (gbDevice.getType() != DeviceType.AMAZFITCOR) { - try { - TransactionBuilder builder; - builder = performInitialized("Sending air quality index"); - int length = 8; - String aqiString = "(n/a)"; - if (supportsConditionString) { - length += aqiString.getBytes().length + 1; - } - ByteBuffer buf = ByteBuffer.allocate(length); - buf.order(ByteOrder.LITTLE_ENDIAN); - buf.put((byte) 4); - buf.putInt(weatherSpec.timestamp); - buf.put((byte) (tz_offset_hours * 4)); - buf.putShort((short) 0); - if (supportsConditionString) { - buf.put(aqiString.getBytes()); - buf.put((byte) 0); - } - - if (characteristicChunked != null) { - writeToChunked(builder, 1, buf.array()); - } else { - builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); - } - - builder.queue(getQueue()); - } catch (IOException ex) { - LOG.error("Error sending air quality"); - } - } - - try { - TransactionBuilder builder = performInitialized("Sending weather forecast"); - - final byte NR_DAYS = (byte) (1 + weatherSpec.forecasts.size()); - int bytesPerDay = 4; - - int conditionsLength = 0; - if (supportsConditionString) { - bytesPerDay = 5; - conditionsLength = weatherSpec.currentCondition.getBytes().length; - for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) { - conditionsLength += Weather.getConditionString(forecast.conditionCode).getBytes().length; - } - } - - int length = 7 + bytesPerDay * NR_DAYS + conditionsLength; - ByteBuffer buf = ByteBuffer.allocate(length); - - buf.order(ByteOrder.LITTLE_ENDIAN); - buf.put((byte) 1); - buf.putInt(weatherSpec.timestamp); - buf.put((byte) (tz_offset_hours * 4)); - - buf.put(NR_DAYS); - - byte condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(weatherSpec.currentConditionCode); - buf.put(condition); - buf.put(condition); - - int todayMaxTemp = weatherSpec.todayMaxTemp - 273; - int todayMinTemp = weatherSpec.todayMinTemp - 273; - if (unit == MiBandConst.DistanceUnit.IMPERIAL) { - todayMaxTemp = (int) WeatherUtils.celsiusToFahrenheit(todayMaxTemp); - todayMinTemp = (int) WeatherUtils.celsiusToFahrenheit(todayMinTemp); - } - buf.put((byte) todayMaxTemp); - buf.put((byte) todayMinTemp); - - if (supportsConditionString) { - buf.put(weatherSpec.currentCondition.getBytes()); - buf.put((byte) 0); - } - - for (WeatherSpec.Forecast forecast : weatherSpec.forecasts) { - condition = HuamiWeatherConditions.mapToAmazfitBipWeatherCode(forecast.conditionCode); - buf.put(condition); - buf.put(condition); - - int forecastMaxTemp = forecast.maxTemp - 273; - int forecastMinTemp = forecast.minTemp - 273; - if (unit == MiBandConst.DistanceUnit.IMPERIAL) { - forecastMaxTemp = (int) WeatherUtils.celsiusToFahrenheit(forecastMaxTemp); - forecastMinTemp = (int) WeatherUtils.celsiusToFahrenheit(forecastMinTemp); - } - buf.put((byte) forecastMaxTemp); - buf.put((byte) forecastMinTemp); - - if (supportsConditionString) { - buf.put(Weather.getConditionString(forecast.conditionCode).getBytes()); - buf.put((byte) 0); - } - } - - if (characteristicChunked != null) { - writeToChunked(builder, 1, buf.array()); - } else { - builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); - } - - builder.queue(getQueue()); - } catch (Exception ex) { - LOG.error("Error sending weather forecast", ex); - } - - if (gbDevice.getType() == DeviceType.AMAZFITCOR) { - try { - TransactionBuilder builder; - builder = performInitialized("Sending forecast location"); - - int length = 2 + weatherSpec.location.getBytes().length; - ByteBuffer buf = ByteBuffer.allocate(length); - buf.order(ByteOrder.LITTLE_ENDIAN); - buf.put((byte) 8); - buf.put(weatherSpec.location.getBytes()); - buf.put((byte) 0); - - builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); - builder.queue(getQueue()); - } catch (Exception ex) { - LOG.error("Error sending current forecast location", ex); - } - } - } - @Override public void onFetchRecordedData(int dataTypes) { try { @@ -439,8 +249,7 @@ public class AmazfitBipSupport extends HuamiSupport { new FetchSportsSummaryOperation(this).perform(); } else if (dataTypes == RecordedDataTypes.TYPE_DEBUGLOGS) { new HuamiFetchDebugLogsOperation(this).perform(); - } - else { + } else { LOG.warn("fetching multiple data types at once is not supported yet"); } } catch (IOException ex) { From 4663dbf0b9664dd5152efa06809cbd4c84308c2e Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 25 Aug 2019 09:58:18 +0200 Subject: [PATCH 042/124] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4406b2393..d6f7ccdf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Mi Band 3/4, Amazfit Cor/Bip: Set language immediately when changing it (not only on connect) * Mi Band 3/4, Amazfir Cor/Bip: Add icons for "swimming" and "exercise" * Mi Band 4: Support flashing the V2 font +* Mi Band 4: Fix weather location not being updated on the Band * Mi Band 4: remove unsupported DND setting from settings menu * Amazfit Bip/Cor: Fix resetting of last fetched date for sports activities * Amazfit Bip: Fix sharing GPX files for some Apps From da2e073dc29d7efd8801fad9a038dae6e2427b02 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 25 Aug 2019 20:23:53 +0200 Subject: [PATCH 043/124] Mi Band 4: Whitelist latest stable and beta firmware --- .../service/devices/huami/miband4/MiBand4FirmwareInfo.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java index 38987a3b2..15d5a4790 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java @@ -38,9 +38,13 @@ public class MiBand4FirmwareInfo extends HuamiFirmwareInfo { static { // firmware crcToVersion.put(8969, "1.0.5.22"); + crcToVersion.put(43437, "1.0.5.66"); + crcToVersion.put(31632, "1.0.6.00"); // resources crcToVersion.put(27412, "1.0.5.22"); + crcToVersion.put(5466, "1.0.5.66"); + crcToVersion.put(20047, "1.0.6.00"); // font crcToVersion.put(31978, "1"); From a8b53bdecab96c6df25e8d72c7f058ffbf4bbdfd Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 25 Aug 2019 20:43:49 +0200 Subject: [PATCH 044/124] bump version add changelogs --- CHANGELOG.md | 3 ++- app/build.gradle | 4 ++-- app/src/main/res/xml/changelog_master.xml | 15 +++++++++++++++ .../metadata/android/en-US/changelogs/155.txt | 13 +++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/155.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index d6f7ccdf1..2eabecee4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### Changelog -#### NEXT +#### Version 0.36.0 * Initial Mijia LYWSD02 support (Smart Clock with Humidity and Temperature Sensor), just for setting the time * Mi Band 3/4: Allow enabling the NFC menu where supported (useless for now) * Mi Band 3/4, Amazfit Cor/Bip: Set language immediately when changing it (not only on connect) @@ -11,6 +11,7 @@ * Amazfit Bip/Cor: Fix resetting of last fetched date for sports activities * Amazfit Bip: Fix sharing GPX files for some Apps * Pebble: Use Rebble Store URI +* Support LineageOS 16.0 weather provider * Add Averages to Charts * Allow togging between weekly and monthly charts diff --git a/app/build.gradle b/app/build.gradle index 64749243b..60cfbf04e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,8 +25,8 @@ android { targetSdkVersion 27 // Note: always bump BOTH versionCode and versionName! - versionName "0.35.2" - versionCode 154 + versionName "0.36.0" + versionCode 155 vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index bb136ae81..8de96c4ff 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,5 +1,20 @@ + + Initial Mijia LYWSD02 support (Smart Clock with Humidity and Temperature Sensor), just for setting the time + Mi Band 3/4: Allow enabling the NFC menu where supported (useless for now) + Mi Band 3/4, Amazfit Cor/Bip: Set language immediately when changing it (not only on connect) + Mi Band 3/4, Amazfir Cor/Bip: Add icons for "swimming" and "exercise" + Mi Band 4: Support flashing the V2 font + Mi Band 4: Fix weather location not being updated on the Band + Mi Band 4: remove unsupported DND setting from settings menu + Amazfit Bip/Cor: Fix resetting of last fetched date for sports activities + Amazfit Bip: Fix sharing GPX files for some Apps + Pebble: Use Rebble Store URI + Support LineageOS 16.0 weather provider + Add Averages to Charts + Allow togging between weekly and monthly charts + Mi Band 1/2: Crash when updating firmware while phone is set to Spanish Mi Band 4: Enable music info support (displays now on the band) diff --git a/fastlane/metadata/android/en-US/changelogs/155.txt b/fastlane/metadata/android/en-US/changelogs/155.txt new file mode 100644 index 000000000..e90ce4900 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/155.txt @@ -0,0 +1,13 @@ +* Initial Mijia LYWSD02 support (Smart Clock with Humidity and Temperature Sensor), just for setting the time +* Mi Band 3/4: Allow enabling the NFC menu where supported (useless for now) +* Mi Band 3/4, Amazfit Cor/Bip: Set language immediately when changing it (not only on connect) +* Mi Band 3/4, Amazfir Cor/Bip: Add icons for "swimming" and "exercise" +* Mi Band 4: Support flashing the V2 font +* Mi Band 4: Fix weather location not being updated on the Band +* Mi Band 4: remove unsupported DND setting from settings menu +* Amazfit Bip/Cor: Fix resetting of last fetched date for sports activities +* Amazfit Bip: Fix sharing GPX files for some Apps +* Pebble: Use Rebble Store URI +* Support LineageOS 16.0 weather provider +* Add Averages to Charts +* Allow togging between weekly and monthly charts From 759a04b5377394bad19fed3cbc91b2ea057bae05 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Thu, 22 Aug 2019 11:45:36 +0000 Subject: [PATCH 045/124] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (681 of 681 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pt_BR/ --- app/src/main/res/values-pt-rBR/strings.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 719b006fa..ad8214d42 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -728,4 +728,14 @@ Alarme de frequência cardíaca durante atividades esportivas Limite baixo Limite alto + Média: %1$s + Configurações dos gráficos + Mostrar médias nos gráficos + Intervalo de gráficos + O intervalo de gráficos está definido para um Mês + O intervalo de gráficos está definido para uma Semana + Passos por mês + Sono por mês + Relógio inteligente Mijia + NFC \ No newline at end of file From 94832e713514215fd9a0dcce8d23580eb34fe108 Mon Sep 17 00:00:00 2001 From: Full Name Date: Thu, 22 Aug 2019 19:43:47 +0000 Subject: [PATCH 046/124] Translated using Weblate (Czech) Currently translated at 100.0% (681 of 681 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/cs/ --- app/src/main/res/values-cs/strings.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 26cbd5288..3fe29dd98 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -721,4 +721,14 @@ Alarm měření tepu při sportovní aktivitě Spodní hodnota Horní limit + Průměr: %1$s + Grafy + Zobrazovat v grafech průměry + Časové období grafů + Rozsah nastaven na měsíc + Rozsah nastaven na týden + Kroky za měsíc + Spánek za měsíc + Mijia Smart Clock + NFC \ No newline at end of file From e25f1bf0010ca35a8cdc824c4262e6ecb5f865a3 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Thu, 22 Aug 2019 20:12:37 +0000 Subject: [PATCH 047/124] Translated using Weblate (Hebrew) Currently translated at 100.0% (681 of 681 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/he/ --- app/src/main/res/values-he/strings.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 2bf609b74..0867bcf5e 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -717,4 +717,14 @@ התראת דופק במהלך פעילות ספורטיבית גבול תחתון גבול עליון + ממוצע: %1$s + הגדרות תרשימים + הצגת ממוצעים בתרשימים + טווח התרשימים + טווח התרשימים מוגדר לחודש + טווח התרשימים מוגדר לשבוע + צעדים בחודש + שינה בחודש + שעון קיר חכם מבית Mijia + תקשורת קרבה \ No newline at end of file From ade5eb927f1438ccf20a69922e49ca16eede1895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=B0=91=E4=B8=BE?= Date: Thu, 22 Aug 2019 12:21:47 +0000 Subject: [PATCH 048/124] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (681 of 681 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/zh_Hans/ --- app/src/main/res/values-zh-rCN/strings.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 123d85ccb..46169ef76 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -722,4 +722,14 @@ 运动期间的心率警报 下限 上限 + 平均:%1$s + 图表设置 + 在图表中显示平均值 + 图表范围 + 图表范围已设置为按月 + 图表范围已设置为按周 + 每月步数 + 每月睡眠 + 米家智能闹钟 + NFC \ No newline at end of file From 5adbd68afa2d6d57c8f21e8a61d1e1a406668b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 22 Aug 2019 14:34:20 +0000 Subject: [PATCH 049/124] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.2% (669 of 681 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/nb_NO/ --- app/src/main/res/values-nb-rNO/strings.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 04b687a26..e0e5989d3 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -722,4 +722,14 @@ Pulsalarm under sportsaktiviteter Nedre grense Øvre grense + Gjennomsnitt: %1$s + Poengtavleinnstillinger + Vis gjennomsnitt i poengtavlene + Poengtavleområde + Poengtavleområde satt til én måned + Poengtavleområde satt til ei uke + Steg per måned + Søvn per måned + Mijia-smartklokke + NFC \ No newline at end of file From 4e133176096b8a84425a3adee997353d284c7ad4 Mon Sep 17 00:00:00 2001 From: Swann Martinet Date: Sat, 24 Aug 2019 00:08:42 +0000 Subject: [PATCH 050/124] Translated using Weblate (French) Currently translated at 99.4% (677 of 681 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/fr/ --- app/src/main/res/values-fr/strings.xml | 28 ++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index da61eb43b..fbad9976c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -333,7 +333,7 @@ Poids en kg Authentification Authentification requise - ZzZz + Zzz Ajouter un widget Temps de sommeil préféré en heures @@ -518,11 +518,17 @@ Temps de sommeil préféré en heures Mettre toutes les notifications en liste noire Mettre toutes les notifications en liste blanche "Vous allez installer le micrologiciel %s dans votre Mi Band 3. +\n \n +\n \nAssurez-vous d\'installer d\'abord le fichier .fw, et ensuite le fichiers .res. Votre bracelet redémarrera après l\'installation du fichiers .fw. +\n \n -\nRemarque: Vous n\'avez pas besoin d\'installer le fichier .res si c\'est exactement le même que celui déjà installé. +\n +\nRemarque : Vous n\'avez pas besoin d\'installer le fichier .res si c\'est exactement le même que celui déjà installé. +\n \n +\n \nÀ VOS RISQUES ET PÉRILS !" client GATT uniquement C\'est uniquement pour les Pebble 2 et expérimental, à essayer si vous avez des problèmes de connectivité @@ -707,4 +713,22 @@ Temps de sommeil préféré en heures Portugais Amazfit Cor 2 Allonge ou raccourcis les lignes dans les textes écrits de droite à gauche + Mouvement de la main + Mi Band 4 + Vous êtes sur le point d\'installer le firmware %s sur votre Mi Band 4. +\n +\nVeuillez vous assurez d\'installer le fichier .fw, et après que le fichier .res. Votre bracelet redémarrera après l\'installation du fichier .fw. +\n +\nRemarque : Vous n\'avez pas à installer .res s\'il est exactement le même que celui précédemment installé. +\n +\nÀ VOS RISQUES ET PÉRILS ! + Alarme de la fréquence cardiaque durant une activité sportive + Limite basse + Limite haute + Moyenne : %1$s + Paramètres graphiques + Afficher les moyennes dans les graphiques + Gamme des graphiques + Pas par mois + Sommeil par mois \ No newline at end of file From 243eec042d497ff47b7a8a7e68a42eb6d6e38e80 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 27 Aug 2019 11:13:45 +0200 Subject: [PATCH 051/124] Mi Band 3/4, Amazfit Bip/Cor: Add setting to expose the HR sensor to 3rd party apps Closes #1606 --- .../DeviceSpecificSettingsFragment.java | 2 ++ .../gadgetbridge/devices/huami/HuamiConst.java | 2 +- .../devices/huami/HuamiCoordinator.java | 5 +++++ .../devices/huami/HuamiService.java | 2 ++ .../amazfitbip/AmazfitBipCoordinator.java | 1 + .../amazfitcor/AmazfitCorCoordinator.java | 4 +++- .../huami/miband3/MiBand3Coordinator.java | 1 + .../huami/miband4/MiBand4Coordinator.java | 1 + .../service/devices/huami/HuamiSupport.java | 18 ++++++++++++++++++ app/src/main/res/values/strings.xml | 3 +++ .../devicesettings_expose_hr_thirdparty.xml | 9 +++++++++ 11 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/xml/devicesettings_expose_hr_thirdparty.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 83aa6ab2f..d18dcb9e8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -29,6 +29,7 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ITEMS; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ON_LIFT_END; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_DISPLAY_ON_LIFT_START; +import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_EXPOSE_HR_THIRDPARTY; import static nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst.PREF_LANGUAGE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_DO_NOT_DISTURB_END; @@ -287,6 +288,7 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat { addPreferenceHandlerFor(PREF_DATEFORMAT); addPreferenceHandlerFor(PREF_DISPLAY_ITEMS); addPreferenceHandlerFor(PREF_LANGUAGE); + addPreferenceHandlerFor(PREF_EXPOSE_HR_THIRDPARTY); String displayOnLiftState = prefs.getString(PREF_ACTIVATE_DISPLAY_ON_LIFT, PREF_DO_NOT_DISTURB_OFF); boolean displayOnLiftScheduled = displayOnLiftState.equals(PREF_DO_NOT_DISTURB_SCHEDULED); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java index d595f37f0..fe47cb21f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java @@ -61,7 +61,7 @@ public class HuamiConst { public static final String PREF_DISPLAY_ITEMS = "display_items"; public static final String PREF_LANGUAGE = "language"; public static final String PREF_DATEFORMAT = "dateformat"; - + public static final String PREF_EXPOSE_HR_THIRDPARTY = "expose_hr_thirdparty"; public static int toActivityKind(int rawType) { switch (rawType) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java index 0c1951c58..d7bf1d353 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java @@ -251,6 +251,11 @@ public abstract class HuamiCoordinator extends AbstractDeviceCoordinator { return prefs.getBoolean(MiBandConst.PREF_SWIPE_UNLOCK, false); } + public static boolean getExposeHRThirdParty(String deviceAddress) { + Prefs prefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(deviceAddress)); + return prefs.getBoolean(HuamiConst.PREF_EXPOSE_HR_THIRDPARTY, false); + } + protected static Date getTimePreference(String key, String defaultValue, String deviceAddress) { Prefs prefs; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java index 86fd89ff2..b18466afc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiService.java @@ -139,6 +139,8 @@ public class HuamiService { public static final byte[] DATEFORMAT_TIME_12_HOURS = new byte[] {ENDPOINT_DISPLAY, 0x02, 0x0, 0x0 }; public static final byte[] DATEFORMAT_TIME_24_HOURS = new byte[] {ENDPOINT_DISPLAY, 0x02, 0x0, 0x1 }; public static final byte[] DATEFORMAT_DATE_MM_DD_YYYY = new byte[]{ENDPOINT_DISPLAY, 30, 0x00, 'M', 'M', '/', 'd', 'd', '/', 'y', 'y', 'y', 'y'}; + public static final byte[] COMMAND_ENBALE_HR_CONNECTION = new byte[]{ENDPOINT_DISPLAY, 0x01, 0x00, 0x01}; + public static final byte[] COMMAND_DISABLE_HR_CONNECTION = new byte[]{ENDPOINT_DISPLAY, 0x01, 0x00, 0x00}; public static final byte[] COMMAND_ENABLE_DISPLAY_ON_LIFT_WRIST = new byte[]{ENDPOINT_DISPLAY, 0x05, 0x00, 0x01}; public static final byte[] COMMAND_DISABLE_DISPLAY_ON_LIFT_WRIST = new byte[]{ENDPOINT_DISPLAY, 0x05, 0x00, 0x00}; public static final byte[] COMMAND_SCHEDULE_DISPLAY_ON_LIFT_WRIST = new byte[]{ENDPOINT_DISPLAY, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java index 547a9be75..1971dd48c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java @@ -83,6 +83,7 @@ public class AmazfitBipCoordinator extends HuamiCoordinator { R.xml.devicesettings_amazfitbip, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_disconnectnotification, + R.xml.devicesettings_expose_hr_thirdparty, R.xml.devicesettings_pairingkey }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java index 0fa0fdbda..96ac2e9fc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java @@ -86,6 +86,8 @@ public class AmazfitCorCoordinator extends HuamiCoordinator { R.xml.devicesettings_amazfitcor, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_disconnectnotification, - R.xml.devicesettings_pairingkey}; + R.xml.devicesettings_expose_hr_thirdparty, + R.xml.devicesettings_pairingkey + }; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java index 4c2404159..ad757c876 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband3/MiBand3Coordinator.java @@ -108,6 +108,7 @@ public class MiBand3Coordinator extends HuamiCoordinator { R.xml.devicesettings_donotdisturb_withauto, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_swipeunlock, + R.xml.devicesettings_expose_hr_thirdparty, R.xml.devicesettings_pairingkey }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java index 31c0796d6..fba3a5856 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java @@ -92,6 +92,7 @@ public class MiBand4Coordinator extends HuamiCoordinator { R.xml.devicesettings_nightmode, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_swipeunlock, + R.xml.devicesettings_expose_hr_thirdparty, R.xml.devicesettings_pairingkey }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index b8f1f7624..8accd9e62 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -1568,6 +1568,9 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { case HuamiConst.PREF_LANGUAGE: setLanguage(builder); break; + case HuamiConst.PREF_EXPOSE_HR_THIRDPARTY: + setExposeHRThridParty(builder); + break; } builder.queue(getQueue()); } catch (IOException e) { @@ -2095,6 +2098,20 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { return this; } + + private HuamiSupport setExposeHRThridParty(TransactionBuilder builder) { + boolean enable = HuamiCoordinator.getExposeHRThirdParty(gbDevice.getAddress()); + LOG.info("Setting exposure of HR to third party apps to: " + enable); + + if (enable) { + builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_ENBALE_HR_CONNECTION); + } else { + builder.write(getCharacteristic(HuamiService.UUID_CHARACTERISTIC_3_CONFIGURATION), HuamiService.COMMAND_DISABLE_HR_CONNECTION); + } + + return this; + } + protected void writeToChunked(TransactionBuilder builder, int type, byte[] data) { final int MAX_CHUNKLENGTH = 17; int remaining = data.length; @@ -2145,6 +2162,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { setInactivityWarnings(builder); setHeartrateSleepSupport(builder); setDisconnectNotification(builder); + setExposeHRThridParty(builder); setHeartrateMeasurementInterval(builder, getHeartRateMeasurementInterval()); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a7eb31a4c..16289fdc8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -165,6 +165,9 @@ Enable background JS When enabled, allows watchfaces to show weather, battery info etc. Reconnection attempts + Allows other apps to access HR data in realtime while Gadgetbridge is connected + 3rd party realtime HR access + Units Time format diff --git a/app/src/main/res/xml/devicesettings_expose_hr_thirdparty.xml b/app/src/main/res/xml/devicesettings_expose_hr_thirdparty.xml new file mode 100644 index 000000000..4a5ab035c --- /dev/null +++ b/app/src/main/res/xml/devicesettings_expose_hr_thirdparty.xml @@ -0,0 +1,9 @@ + + + + From b38b83377cf1ffac6a74490488e8236d426f8281 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 28 Aug 2019 10:11:15 +0200 Subject: [PATCH 052/124] Mi Band 2: enable third party hr sensor access setting This works but since the Mi Band 2 has no "status" menu or activities, live activity has to be started (charts swipe to right), but that spams the database... --- .../gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java index add706c68..a8bd207a6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java @@ -87,6 +87,7 @@ public class MiBand2Coordinator extends HuamiCoordinator { R.xml.devicesettings_donotdisturb_withauto, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_rotatewrist_cycleinfo, + R.xml.devicesettings_expose_hr_thirdparty, R.xml.devicesettings_pairingkey }; } From 8f4489a21ca751195d90d5d749a378fe33f4f36b Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 29 Aug 2019 08:32:29 +0200 Subject: [PATCH 053/124] Mi Band 4: Fix call notifcation not stopping when call gets answered or rejected on the phone This changes the way to how to stop call notification for all Huami device back to Mi Band 2 Also clean up unused code Fixes #1612 --- .../service/devices/huami/HuamiSupport.java | 73 ++----------------- .../miband2/Mi2TextNotificationStrategy.java | 6 ++ 2 files changed, 12 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index 8accd9e62..c7560fcf2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -129,21 +129,9 @@ import nodomain.freeyourgadget.gadgetbridge.util.NotificationUtils; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.Version; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_FLASH_COLOUR; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_FLASH_COUNT; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_FLASH_DURATION; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_FLASH_ORIGINAL_COLOUR; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_COUNT; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_DURATION; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_PAUSE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_PROFILE; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.FLASH_COLOUR; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.FLASH_COUNT; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.FLASH_DURATION; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.FLASH_ORIGINAL_COLOUR; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_COUNT; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_DURATION; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_PAUSE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.VIBRATION_PROFILE; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.getNotificationPrefIntValue; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.getNotificationPrefStringValue; @@ -331,23 +319,6 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { return this; } - /** - * Adds a custom notification to the given transaction builder - * @param vibrationProfile specifies how and how often the Band shall vibrate. - * @param simpleNotification - * @param flashTimes - * @param flashColour - * @param originalColour - * @param flashDuration - * @param extraAction an extra action to be executed after every vibration and flash sequence. Allows to abort the repetition, for example. - * @param builder - */ - private HuamiSupport sendCustomNotification(VibrationProfile vibrationProfile, SimpleNotification simpleNotification, int flashTimes, int flashColour, int originalColour, long flashDuration, BtLEAction extraAction, TransactionBuilder builder) { - getNotificationStrategy().sendCustomNotification(vibrationProfile, simpleNotification, flashTimes, flashColour, originalColour, flashDuration, extraAction, builder); - LOG.info("Sending notification to MiBand"); - return this; - } - public NotificationStrategy getNotificationStrategy() { String firmwareVersion = gbDevice.getFirmwareVersion(); if (firmwareVersion != null) { @@ -567,58 +538,26 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { } } - protected void performPreferredNotification(String task, String notificationOrigin, SimpleNotification simpleNotification, int alertLevel, BtLEAction extraAction) { + private void performPreferredNotification(String task, String notificationOrigin, SimpleNotification simpleNotification, int alertLevel, BtLEAction extraAction) { try { TransactionBuilder builder = performInitialized(task); Prefs prefs = GBApplication.getPrefs(); - int vibrateDuration = getPreferredVibrateDuration(notificationOrigin, prefs); - int vibratePause = getPreferredVibratePause(notificationOrigin, prefs); short vibrateTimes = getPreferredVibrateCount(notificationOrigin, prefs); VibrationProfile profile = getPreferredVibrateProfile(notificationOrigin, prefs, vibrateTimes); profile.setAlertLevel(alertLevel); - int flashTimes = getPreferredFlashCount(notificationOrigin, prefs); - int flashColour = getPreferredFlashColour(notificationOrigin, prefs); - int originalColour = getPreferredOriginalColour(notificationOrigin, prefs); - int flashDuration = getPreferredFlashDuration(notificationOrigin, prefs); + getNotificationStrategy().sendCustomNotification(profile, simpleNotification, 0, 0, 0, 0, extraAction, builder); - sendCustomNotification(profile, simpleNotification, flashTimes, flashColour, originalColour, flashDuration, extraAction, builder); - -// sendCustomNotification(vibrateDuration, vibrateTimes, vibratePause, flashTimes, flashColour, originalColour, flashDuration, builder); builder.queue(getQueue()); } catch (IOException ex) { - LOG.error("Unable to send notification to MI device", ex); + LOG.error("Unable to send notification to device", ex); } } - private int getPreferredFlashDuration(String notificationOrigin, Prefs prefs) { - return getNotificationPrefIntValue(FLASH_DURATION, notificationOrigin, prefs, DEFAULT_VALUE_FLASH_DURATION); - } - - private int getPreferredOriginalColour(String notificationOrigin, Prefs prefs) { - return getNotificationPrefIntValue(FLASH_ORIGINAL_COLOUR, notificationOrigin, prefs, DEFAULT_VALUE_FLASH_ORIGINAL_COLOUR); - } - - private int getPreferredFlashColour(String notificationOrigin, Prefs prefs) { - return getNotificationPrefIntValue(FLASH_COLOUR, notificationOrigin, prefs, DEFAULT_VALUE_FLASH_COLOUR); - } - - private int getPreferredFlashCount(String notificationOrigin, Prefs prefs) { - return getNotificationPrefIntValue(FLASH_COUNT, notificationOrigin, prefs, DEFAULT_VALUE_FLASH_COUNT); - } - - private int getPreferredVibratePause(String notificationOrigin, Prefs prefs) { - return getNotificationPrefIntValue(VIBRATION_PAUSE, notificationOrigin, prefs, DEFAULT_VALUE_VIBRATION_PAUSE); - } - private short getPreferredVibrateCount(String notificationOrigin, Prefs prefs) { return (short) Math.min(Short.MAX_VALUE, getNotificationPrefIntValue(VIBRATION_COUNT, notificationOrigin, prefs, DEFAULT_VALUE_VIBRATION_COUNT)); } - private int getPreferredVibrateDuration(String notificationOrigin, Prefs prefs) { - return getNotificationPrefIntValue(VIBRATION_DURATION, notificationOrigin, prefs, DEFAULT_VALUE_VIBRATION_DURATION); - } - private VibrationProfile getPreferredVibrateProfile(String notificationOrigin, Prefs prefs, short repeat) { String profileId = getNotificationPrefStringValue(VIBRATION_PROFILE, notificationOrigin, prefs, DEFAULT_VALUE_VIBRATION_PROFILE); return VibrationProfile.getProfile(profileId, repeat); @@ -707,17 +646,17 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { performPreferredNotification("incoming call", MiBandConst.ORIGIN_INCOMING_CALL, simpleNotification, HuamiService.ALERT_LEVEL_PHONE_CALL, abortAction); } else if ((callSpec.command == CallSpec.CALL_START) || (callSpec.command == CallSpec.CALL_END)) { telephoneRinging = false; - stopCurrentNotification(); + stopCurrentCallNotification(); } } - private void stopCurrentNotification() { + private void stopCurrentCallNotification() { try { TransactionBuilder builder = performInitialized("stop notification"); getNotificationStrategy().stopCurrentNotification(builder); builder.queue(getQueue()); } catch (IOException e) { - LOG.error("Error stopping notification"); + LOG.error("Error stopping call notification"); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband2/Mi2TextNotificationStrategy.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband2/Mi2TextNotificationStrategy.java index 3abdad9e7..96291a9bd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband2/Mi2TextNotificationStrategy.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband2/Mi2TextNotificationStrategy.java @@ -86,4 +86,10 @@ public class Mi2TextNotificationStrategy extends Mi2NotificationStrategy { NewAlert alert = new NewAlert(category, 1, simpleNotification.getMessage()); profile.newAlert(builder, alert, OverflowStrategy.MAKE_MULTIPLE); } + + @Override + public void stopCurrentNotification(TransactionBuilder builder) { + BluetoothGattCharacteristic alert = getSupport().getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_NEW_ALERT); + builder.write(alert, new byte[]{(byte) AlertCategory.IncomingCall.getId(), 0}); + } } From 66314f0e4b2b53fa4a27c6a0cf6b4e3d848e4ec3 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 30 Aug 2019 22:10:23 +0200 Subject: [PATCH 054/124] update issue template, thanks @IzzySoft --- .github/ISSUE_TEMPLATE.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9c9c584ec..ec4f2168a 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -3,6 +3,12 @@ - [ ] I have searched the [issues](https://github.com/Freeyourgadget/Gadgetbridge/issues), and I didn't find a solution to my problem / an answer to my question. - [ ] If you upload an image or other content, please make sure you have read and understood the [github policies and terms of services](https://help.github.com/articles/github-terms-of-service/#1-responsibility-for-user-generated-content) +### I got Gadgetbridge from: +* [ ] F-Droid +* [ ] I built it myself from source code (specify tag / commit) + +If you got it from Google Play, please note [that version](https://github.com/TaaviE/Gadgetbridge) is unofficial and not supported here; it's also often quite outdated. Please switch to one of the above versions if you can. + #### Your issue is: *In case of a bug, do not forget to attach logs!* From 36010229ee975c8cbfac6bc3743d7af0b287e266 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 30 Aug 2019 22:13:10 +0200 Subject: [PATCH 055/124] fix the real bug report template --- .github/ISSUE_TEMPLATE.md | 25 ------------------------- .github/ISSUE_TEMPLATE/bug_report.md | 6 ++++++ 2 files changed, 6 insertions(+), 25 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index ec4f2168a..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,25 +0,0 @@ -#### Before opening an issue please confirm the following: -- [ ] I have read the [wiki](https://github.com/Freeyourgadget/Gadgetbridge/wiki), and I didn't find a solution to my problem / an answer to my question. -- [ ] I have searched the [issues](https://github.com/Freeyourgadget/Gadgetbridge/issues), and I didn't find a solution to my problem / an answer to my question. -- [ ] If you upload an image or other content, please make sure you have read and understood the [github policies and terms of services](https://help.github.com/articles/github-terms-of-service/#1-responsibility-for-user-generated-content) - -### I got Gadgetbridge from: -* [ ] F-Droid -* [ ] I built it myself from source code (specify tag / commit) - -If you got it from Google Play, please note [that version](https://github.com/TaaviE/Gadgetbridge) is unofficial and not supported here; it's also often quite outdated. Please switch to one of the above versions if you can. - -#### Your issue is: -*In case of a bug, do not forget to attach logs!* - -#### Your wearable device is: - -*Please specify model and firmware version if possible* - -#### Your android version is: - -#### Your Gadgetbridge version is: - - - -*New issues about already solved/documented topics could be closed without further comments. Same for too generic or incomplete reports.* diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 921bd9cc4..c027cfdfb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -9,6 +9,12 @@ about: Create a report to help us improve - [ ] I have searched the [issues](https://github.com/Freeyourgadget/Gadgetbridge/issues), and I didn't find a solution to my problem / an answer to my question. - [ ] If you upload an image or other content, please make sure you have read and understood the [github policies and terms of services](https://help.github.com/articles/github-terms-of-service/#1-responsibility-for-user-generated-content) +### I got Gadgetbridge from: +* [ ] F-Droid +* [ ] I built it myself from source code (specify tag / commit) + +If you got it from Google Play, please note [that version](https://github.com/TaaviE/Gadgetbridge) is unofficial and not supported here; it's also often quite outdated. Please switch to one of the above versions if you can. + #### Your issue is: *If possible, please attach [logs](https://github.com/Freeyourgadget/Gadgetbridge/wiki/Log-Files)! that might help identifying the problem.* From 42e237feb263a4ddcaf5b8a076ac3aa69d058009 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 31 Aug 2019 21:53:16 +0200 Subject: [PATCH 056/124] Fix crash when entering notification filter notification filter settings Fixes #1614 Thanks @Nephiel for pointing that out --- app/src/main/res/layout-land/activity_notification_filter.xml | 4 ++-- app/src/main/res/layout/activity_notification_filter.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout-land/activity_notification_filter.xml b/app/src/main/res/layout-land/activity_notification_filter.xml index 8c65b1efa..44e3e9ee2 100644 --- a/app/src/main/res/layout-land/activity_notification_filter.xml +++ b/app/src/main/res/layout-land/activity_notification_filter.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notification_filter.xml b/app/src/main/res/layout/activity_notification_filter.xml index 9200b0595..1fde27508 100644 --- a/app/src/main/res/layout/activity_notification_filter.xml +++ b/app/src/main/res/layout/activity_notification_filter.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file From ce9eab8def9b392dcdbfa0bc3e71b5b1d62c2913 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 31 Aug 2019 22:14:50 +0200 Subject: [PATCH 057/124] Mi Band 4: really fix sending weather location Really fixes #1609 --- .../gadgetbridge/service/devices/huami/HuamiSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index c7560fcf2..3b323dafa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -1704,7 +1704,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { if (characteristicChunked != null) { - writeToChunked(builder, 4, buf.array()); + writeToChunked(builder, 1, buf.array()); } else { builder.write(getCharacteristic(AmazfitBipService.UUID_CHARACTERISTIC_WEATHER), buf.array()); } From 42049095a2b407a58fd2c2642e4afb0d053b08d2 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 31 Aug 2019 22:18:33 +0200 Subject: [PATCH 058/124] collect changes to far into CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eabecee4..f5624de59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ ### Changelog +#### Next Version +* Mi Band 2/3/4, Amazfit Bip/Cor: dd setting to expose the HR sensor to 3rd party apps +* Mi Band 4: Really fix weather location not being updated on the Band +* Mi Band 4: Fix call notifcation not stopping when call gets answered or rejected on the phone +* Fix crash when entering notification filter notification filter settings + #### Version 0.36.0 * Initial Mijia LYWSD02 support (Smart Clock with Humidity and Temperature Sensor), just for setting the time * Mi Band 3/4: Allow enabling the NFC menu where supported (useless for now) From b40c3ade85d0836b62a73f47d4814111fabe4c26 Mon Sep 17 00:00:00 2001 From: Nephiel Date: Wed, 31 Jul 2019 20:22:38 +0200 Subject: [PATCH 059/124] Amazfit Bip: Add emoji support when using custom font firmware --- .../devices/AbstractDeviceCoordinator.java | 3 ++ .../devices/DeviceCoordinator.java | 5 +++ .../devices/huami/HuamiConst.java | 1 + .../devices/huami/HuamiCoordinator.java | 5 +++ .../amazfitbip/AmazfitBipCoordinator.java | 5 +++ .../service/DeviceCommunicationService.java | 19 ++++++++++- .../gadgetbridge/util/StringUtils.java | 32 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ .../res/xml/devicesettings_amazfitbip.xml | 6 ++++ 9 files changed, 77 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java index 9f155c76e..d1466f573 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java @@ -153,6 +153,9 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator { @Override public boolean supportsUnicodeEmojis() { return false; } + @Override + public boolean supportsCustomFont() { return false; } + @Override public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return null; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java index a9d7fd7e7..6b1049959 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java @@ -280,6 +280,11 @@ public interface DeviceCoordinator { */ boolean supportsUnicodeEmojis(); + /** + * Indicates whether the device supports using a custom font. + */ + boolean supportsCustomFont(); + /** * Indicates which device specific settings the device supports (not per device type or family, but unique per device). */ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java index fe47cb21f..c4ccca2bf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiConst.java @@ -62,6 +62,7 @@ public class HuamiConst { public static final String PREF_LANGUAGE = "language"; public static final String PREF_DATEFORMAT = "dateformat"; public static final String PREF_EXPOSE_HR_THIRDPARTY = "expose_hr_thirdparty"; + public static final String PREF_USE_CUSTOM_FONT = "use_custom_font"; public static int toActivityKind(int rawType) { switch (rawType) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java index d7bf1d353..2ec92bdf7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java @@ -197,6 +197,11 @@ public abstract class HuamiCoordinator extends AbstractDeviceCoordinator { return prefs.getStringSet(HuamiConst.PREF_DISPLAY_ITEMS, null); } + public static boolean getUseCustomFont(String deviceAddress) { + SharedPreferences prefs = GBApplication.getDeviceSpecificSharedPrefs(deviceAddress); + return prefs.getBoolean(HuamiConst.PREF_USE_CUSTOM_FONT, false); + } + public static boolean getGoalNotification() { Prefs prefs = GBApplication.getPrefs(); return prefs.getBoolean(MiBandConst.PREF_MI2_GOAL_NOTIFICATION, false); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java index 1971dd48c..73c82aded 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java @@ -77,6 +77,11 @@ public class AmazfitBipCoordinator extends HuamiCoordinator { return true; } + @Override + public boolean supportsCustomFont() { + return true; + } + @Override public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return new int[]{ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 152d457d1..4d3d439d0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -51,6 +51,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator; import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmClockReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver; @@ -80,6 +81,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.EmojiConverter; import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; +import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ADD_CALENDAREVENT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_APP_CONFIGURE; @@ -368,8 +370,23 @@ public class DeviceCommunicationService extends Service implements SharedPrefere if (text == null || text.length() == 0) return text; - if (!mCoordinator.supportsUnicodeEmojis()) + if (!mCoordinator.supportsUnicodeEmojis()) { + + // use custom font for emoji, if it is supported and enabled + if (mCoordinator.supportsCustomFont()) { + switch (mCoordinator.getDeviceType()) { + case AMAZFITBIP: + if (((HuamiCoordinator)mCoordinator).getUseCustomFont(mGBDevice.getAddress())) + return StringUtils.toCustomFont(text); + break; + // TODO: implement for Amazfit Cor + default: + break; + } + } + return EmojiConverter.convertUnicodeEmojiToAscii(text, getApplicationContext()); + } return text; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java index 007853deb..89dedbd24 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java @@ -96,4 +96,36 @@ public class StringUtils { } return ""; } + + /** + * @param str original text + * @return str with the emoticons in a format that can be displayed on an + * Amazfit Bip by using a custom font firmware with emoji support + */ + public static String toCustomFont(String str) { + StringBuilder sb = new StringBuilder(); + int i = 0; + while (i < str.length()) { + char charAt = str.charAt(i); + if (Character.isHighSurrogate(charAt)) { + int i2 = i + 1; + try { + int codePoint = Character.toCodePoint(charAt, str.charAt(i2)); + if (codePoint < 127744 || codePoint > 129510) { + sb.append(charAt); + } else { + sb.append(Character.toString((char) (codePoint - 83712))); + i = i2; + } + } catch (StringIndexOutOfBoundsException e) { + e.printStackTrace(); + sb.append(charAt); + } + } else { + sb.append(charAt); + } + i++; + } + return sb.toString(); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 16289fdc8..96cc3b117 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -167,6 +167,8 @@ Reconnection attempts Allows other apps to access HR data in realtime while Gadgetbridge is connected 3rd party realtime HR access + Use custom font + Enable this if your device has a custom font firmware for emoji support Units diff --git a/app/src/main/res/xml/devicesettings_amazfitbip.xml b/app/src/main/res/xml/devicesettings_amazfitbip.xml index d2133e176..e469798bd 100644 --- a/app/src/main/res/xml/devicesettings_amazfitbip.xml +++ b/app/src/main/res/xml/devicesettings_amazfitbip.xml @@ -17,4 +17,10 @@ android:key="language" android:summary="%s" android:title="@string/pref_title_language" /> + From 957d4418597418d3be205f43e459e0e93628ace5 Mon Sep 17 00:00:00 2001 From: vanous Date: Tue, 13 Aug 2019 19:54:18 +0200 Subject: [PATCH 060/124] Add Status and Alarms widget Squashed commits from #1604 --- app/src/main/AndroidManifest.xml | 23 +- .../freeyourgadget/gadgetbridge/Widget.java | 226 ++++++++++++++++++ .../activities/WidgetAlarmsActivity.java | 127 ++++++++++ .../activities/charts/ActivityAnalysis.java | 6 +- .../gadgetbridge/model/DailyTotals.java | 155 ++++++++++++ .../operations/AbstractFetchOperation.java | 3 + app/src/main/res/drawable/widget_preview.png | Bin 0 -> 55080 bytes app/src/main/res/layout/widget.xml | 121 ++++++++++ .../layout/widget_alarms_activity_list.xml | 103 ++++++++ app/src/main/res/values/strings.xml | 21 +- app/src/main/res/xml/widget_info.xml | 14 ++ 11 files changed, 792 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WidgetAlarmsActivity.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java create mode 100644 app/src/main/res/drawable/widget_preview.png create mode 100644 app/src/main/res/layout/widget.xml create mode 100644 app/src/main/res/layout/widget_alarms_activity_list.xml create mode 100644 app/src/main/res/xml/widget_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6e962b68c..dadfcfa39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -445,7 +445,8 @@ android:resource="@xml/shared_paths" /> - + @@ -456,6 +457,26 @@ android:resource="@xml/sleep_alarm_widget_info" /> + + + + + + + + + + + + . */ +package nodomain.freeyourgadget.gadgetbridge; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.widget.RemoteViews; +import android.widget.Toast; + +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.concurrent.TimeUnit; + +import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenterv2; +import nodomain.freeyourgadget.gadgetbridge.activities.WidgetAlarmsActivity; +import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.DailyTotals; +import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes; +import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + + +public class Widget extends AppWidgetProvider { + public static final String WIDGET_CLICK = "nodomain.freeyourgadget.gadgetbridge.WidgetClick"; + public static final String NEW_DATA_ACTION = "nodomain.freeyourgadget.gadgetbridge.NewDataTrigger"; + public static final String APPWIDGET_DELETED = "nodomain.freeyourgadget.gadgetbridge.APPWIDGET_DELETED"; + public static final String ACTION_DEVICE_CHANGED = "nodomain.freeyourgadget.gadgetbridge.gbdevice.action.device_changed"; + private static final Logger LOG = LoggerFactory.getLogger(Widget.class); + static BroadcastReceiver broadcastReceiver = null; + + private GBDevice getSelectedDevice() { + + Context context = GBApplication.getContext(); + + if (!(context instanceof GBApplication)) { + return null; + } + + GBApplication gbApp = (GBApplication) context; + + return gbApp.getDeviceManager().getSelectedDevice(); + } + + private float[] getSteps() { + Context context = GBApplication.getContext(); + Calendar day = GregorianCalendar.getInstance(); + + if (!(context instanceof GBApplication)) { + return new float[]{0, 0, 0}; + } + DailyTotals ds = new DailyTotals(); + return ds.getDailyTotalsForAllDevices(day); + } + + private String getHM(long value) { + return DateTimeUtils.formatDurationHoursMinutes(value, TimeUnit.MINUTES); + } + + private void updateAppWidget(Context context, AppWidgetManager appWidgetManager, + int appWidgetId) { + + GBDevice device = getSelectedDevice(); + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); + + //onclick refresh + Intent intent = new Intent(context, Widget.class); + intent.setAction(WIDGET_CLICK); + PendingIntent refreshDataIntent = PendingIntent.getBroadcast( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + //views.setOnClickPendingIntent(R.id.todaywidget_bottom_layout, refreshDataIntent); + views.setOnClickPendingIntent(R.id.todaywidget_header_bar, refreshDataIntent); + + //open GB main window + Intent startMainIntent = new Intent(context, ControlCenterv2.class); + PendingIntent startMainPIntent = PendingIntent.getActivity(context, 0, startMainIntent, 0); + views.setOnClickPendingIntent(R.id.todaywidget_header_icon, startMainPIntent); + + //alarms popup menu + Intent startAlarmListIntent = new Intent(context, WidgetAlarmsActivity.class); + PendingIntent startAlarmListPIntent = PendingIntent.getActivity(context, 0, startAlarmListIntent, 0); + views.setOnClickPendingIntent(R.id.todaywidget_header_plus, startAlarmListPIntent); + + //charts, requires device + if (device != null) { + Intent startChartsIntent = new Intent(context, ChartsActivity.class); + startChartsIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + PendingIntent startChartsPIntent = PendingIntent.getActivity(context, 0, startChartsIntent, 0); + views.setOnClickPendingIntent(R.id.todaywidget_bottom_layout, startChartsPIntent); + } + + + float[] DailyTotals = getSteps(); + + views.setTextViewText(R.id.todaywidget_steps, context.getString(R.string.widget_steps_label, (int) DailyTotals[0])); + views.setTextViewText(R.id.todaywidget_sleep, context.getString(R.string.widget_sleep_label, getHM((long) DailyTotals[1]))); + + if (device != null) { + String status = String.format("%1s", device.getStateString()); + if (device.isConnected()) { + if (device.getBatteryLevel() > 1) { + status = String.format("Battery %1s%%", device.getBatteryLevel()); + } + } + + views.setTextViewText(R.id.todaywidget_device_status, status); + views.setTextViewText(R.id.todaywidget_device_name, device.getName()); + + } + + // Instruct the widget manager to update the widget + appWidgetManager.updateAppWidget(appWidgetId, views); + } + + public void refreshData() { + Context context = GBApplication.getContext(); + GBDevice device = getSelectedDevice(); + + if (device == null || !device.isInitialized()) { + GB.toast(context, + context.getString(R.string.device_not_connected), + Toast.LENGTH_SHORT, GB.ERROR); + GBApplication.deviceService().connect(); + GB.toast(context, + context.getString(R.string.connecting), + Toast.LENGTH_SHORT, GB.INFO); + + return; + } + GB.toast(context, + context.getString(R.string.busy_task_fetch_activity_data), + Toast.LENGTH_SHORT, GB.INFO); + + GBApplication.deviceService().onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY); + } + + public void updateWidget() { + Context context = GBApplication.getContext(); + + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); + ComponentName thisAppWidget = new ComponentName(context.getPackageName(), Widget.class.getName()); + int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); + + onUpdate(context, appWidgetManager, appWidgetIds); + + } + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // There may be multiple widgets active, so update all of them + for (int appWidgetId : appWidgetIds) { + updateAppWidget(context, appWidgetManager, appWidgetId); + } + } + + + @Override + public void onEnabled(Context context) { + if (this.broadcastReceiver == null) { + LOG.debug("gbwidget BROADCAST receiver initialized."); + this.broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + LOG.debug("gbwidget BROADCAST, action" + intent.getAction()); + updateWidget(); + } + }; + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(NEW_DATA_ACTION); + intentFilter.addAction(ACTION_DEVICE_CHANGED); + LocalBroadcastManager.getInstance(context).registerReceiver(this.broadcastReceiver, intentFilter); + } + } + + @Override + public void onDisabled(Context context) { + + if (this.broadcastReceiver != null) { + LocalBroadcastManager.getInstance(context).unregisterReceiver(this.broadcastReceiver); + this.broadcastReceiver=null; + } + } + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + LOG.debug("gbwidget LOCAL onReceive, action: " + intent.getAction()); + //this handles widget re-connection after apk updates + if (WIDGET_CLICK.equals(intent.getAction())) { + if (this.broadcastReceiver == null) { + onEnabled(context); + } + refreshData(); + //updateWidget(); + } else if (APPWIDGET_DELETED.equals(intent.getAction())) { + onDisabled(context); + } + } + +} + diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WidgetAlarmsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WidgetAlarmsActivity.java new file mode 100644 index 000000000..a58924d2a --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WidgetAlarmsActivity.java @@ -0,0 +1,127 @@ +package nodomain.freeyourgadget.gadgetbridge.activities; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; +import nodomain.freeyourgadget.gadgetbridge.model.Alarm; +import nodomain.freeyourgadget.gadgetbridge.util.AlarmUtils; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + +public class WidgetAlarmsActivity extends Activity implements View.OnClickListener { + + TextView textView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Context appContext = this.getApplicationContext(); + if (appContext instanceof GBApplication) { + GBApplication gbApp = (GBApplication) appContext; + GBDevice selectedDevice = gbApp.getDeviceManager().getSelectedDevice(); + if (selectedDevice == null || !selectedDevice.isInitialized()) { + GB.toast(this, + this.getString(R.string.not_connected), + Toast.LENGTH_LONG, GB.WARN); + + } else { + setContentView(R.layout.widget_alarms_activity_list); + int userSleepDuration = new ActivityUser().getSleepDuration(); + textView = findViewById(R.id.alarm5); + if (userSleepDuration > 0) { + textView.setText(String.format(this.getString(R.string.widget_alarm_target_hours), userSleepDuration)); + } else { + textView.setVisibility(View.GONE); + } + } + } + } + + @Override + public void onClick(View v) { + + switch (v.getId()) { + case R.id.alarm1: + setAlarm(5); + break; + case R.id.alarm2: + setAlarm(10); + break; + case R.id.alarm3: + setAlarm(20); + break; + case R.id.alarm4: + setAlarm(60); + break; + case R.id.alarm5: + setAlarm(0); + break; + default: + break; + } + //this is to prevent screen flashing during closing + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + finish(); + } + }, 150); + } + + public void setAlarm(int duration) { + // current timestamp + GregorianCalendar calendar = new GregorianCalendar(); + if (duration > 0) { + calendar.add(Calendar.MINUTE, duration); + } else { + int userSleepDuration = new ActivityUser().getSleepDuration(); + // add preferred sleep duration + if (userSleepDuration > 0) { + calendar.add(Calendar.HOUR_OF_DAY, userSleepDuration); + } else { // probably testing + calendar.add(Calendar.MINUTE, 1); + } + } + + // overwrite the first alarm and activate it, without + + Context appContext = this.getApplicationContext(); + if (appContext instanceof GBApplication) { + GBApplication gbApp = (GBApplication) appContext; + GBDevice selectedDevice = gbApp.getDeviceManager().getSelectedDevice(); + if (selectedDevice == null || !selectedDevice.isInitialized()) { + GB.toast(this, + this.getString(R.string.appwidget_not_connected), + Toast.LENGTH_LONG, GB.WARN); + return; + } + } + + int hours = calendar.get(Calendar.HOUR_OF_DAY); + int minutes = calendar.get(Calendar.MINUTE); + + GB.toast(this, + this.getString(R.string.appwidget_setting_alarm, hours, minutes), + Toast.LENGTH_SHORT, GB.INFO); + + Alarm alarm = AlarmUtils.createSingleShot(0, true, calendar); + ArrayList alarms = new ArrayList<>(1); + alarms.add(alarm); + GBApplication.deviceService().onSetAlarms(alarms); + + + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java index 155dcf7b2..25e7d342e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java @@ -28,15 +28,15 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmounts; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; -class ActivityAnalysis { - private static final Logger LOG = LoggerFactory.getLogger(ActivityAnalysis.class); +public class ActivityAnalysis { + public static final Logger LOG = LoggerFactory.getLogger(ActivityAnalysis.class); // store raw steps and duration protected HashMap stats = new HashMap(); // max speed determined from samples private int maxSpeed = 0; - ActivityAmounts calculateActivityAmounts(List samples) { + public ActivityAmounts calculateActivityAmounts(List samples) { ActivityAmount deepSleep = new ActivityAmount(ActivityKind.TYPE_DEEP_SLEEP); ActivityAmount lightSleep = new ActivityAmount(ActivityKind.TYPE_LIGHT_SLEEP); ActivityAmount notWorn = new ActivityAmount(ActivityKind.TYPE_NOT_WORN); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java new file mode 100644 index 000000000..bcd8ff73e --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java @@ -0,0 +1,155 @@ +/* Copyright (C) 2017-2019 Carsten Pfeiffer, Daniele Gobbetti + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.model; + +import android.content.Context; +import android.widget.Toast; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Calendar; +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.activities.charts.ActivityAnalysis; +import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; +import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; +import nodomain.freeyourgadget.gadgetbridge.entities.AbstractActivitySample; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + + + +public class DailyTotals { + Logger LOG = LoggerFactory.getLogger(DailyTotals.class); + + + public float[] getDailyTotalsForAllDevices(Calendar day) { + Context context = GBApplication.getContext(); + //get today's steps for all devices in GB + float all_steps = 0; + float all_sleep = 0; + + + if (context instanceof GBApplication) { + GBApplication gbApp = (GBApplication) context; + List devices = gbApp.getDeviceManager().getDevices(); + for (GBDevice device : devices) { + float[] all_daily = getDailyTotalsForDevice(device, day); + all_steps += all_daily[0]; + all_sleep += all_daily[1] + all_daily[2]; + } + } + LOG.debug("gbwidget daily totals, all steps:" + all_steps); + LOG.debug("gbwidget daily totals, all sleep:" + all_sleep); + return new float[]{all_steps, all_sleep}; + } + + + public float[] getDailyTotalsForDevice(GBDevice device, Calendar day + ) { + + try (DBHandler handler = GBApplication.acquireDB()) { + ActivityAnalysis analysis = new ActivityAnalysis(); + ActivityAmounts amountsSteps = null; + ActivityAmounts amountsSleep = null; + + amountsSteps = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, 0, device)); + amountsSleep = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, -12, device)); + + float[] Sleep = getTotalsSleepForActivityAmounts(amountsSleep); + float Steps = getTotalsStepsForActivityAmounts(amountsSteps); + + return new float[]{Steps, Sleep[0], Sleep[1]}; + + } catch (Exception e) { + + GB.toast("Error loading activity summaries.", Toast.LENGTH_SHORT, GB.ERROR, e); + return new float[]{0, 0, 0}; + } + } + + private float[] getTotalsSleepForActivityAmounts(ActivityAmounts activityAmounts) { + long totalSecondsDeepSleep = 0; + long totalSecondsLightSleep = 0; + for (ActivityAmount amount : activityAmounts.getAmounts()) { + if (amount.getActivityKind() == ActivityKind.TYPE_DEEP_SLEEP) { + totalSecondsDeepSleep += amount.getTotalSeconds(); + } else if (amount.getActivityKind() == ActivityKind.TYPE_LIGHT_SLEEP) { + totalSecondsLightSleep += amount.getTotalSeconds(); + } + } + int totalMinutesDeepSleep = (int) (totalSecondsDeepSleep / 60); + int totalMinutesLightSleep = (int) (totalSecondsLightSleep / 60); + return new float[]{totalMinutesDeepSleep, totalMinutesLightSleep}; + } + + + private float getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) { + long totalSteps = 0; + float totalValue = 0; + + for (ActivityAmount amount : activityAmounts.getAmounts()) { + totalSteps += amount.getTotalSteps(); + } + + float[] totalValues = new float[]{totalSteps}; + + for (int i = 0; i < totalValues.length; i++) { + float value = totalValues[i]; + totalValue += value; + } + return totalValue; + } + + + private List getSamplesOfDay(DBHandler db, Calendar day, int offsetHours, GBDevice device) { + int startTs; + int endTs; + + day = (Calendar) day.clone(); // do not modify the caller's argument + day.set(Calendar.HOUR_OF_DAY, 0); + day.set(Calendar.MINUTE, 0); + day.set(Calendar.SECOND, 0); + day.add(Calendar.HOUR, offsetHours); + + startTs = (int) (day.getTimeInMillis() / 1000); + endTs = startTs + 24 * 60 * 60 - 1; + + return getSamples(db, device, startTs, endTs); + } + + + protected List getSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) { + return getAllSamples(db, device, tsFrom, tsTo); + } + + + protected SampleProvider getProvider(DBHandler db, GBDevice device) { + DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); + return coordinator.getSampleProvider(device, db.getDaoSession()); + } + + + protected List getAllSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) { + SampleProvider provider = getProvider(db, device); + return provider.getAllActivitySamples(tsFrom, tsTo); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java index 915db7cd7..1c9d7691b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java @@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; +import android.content.Intent; import android.content.SharedPreferences; import android.widget.Toast; @@ -126,6 +127,8 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation { GB.updateTransferNotification(null, "", false, 100, getContext()); operationFinished(); unsetBusy(); + Intent intent = new Intent("nodomain.freeyourgadget.gadgetbridge.NewDataTrigger"); + getContext().sendBroadcast(intent); } /** diff --git a/app/src/main/res/drawable/widget_preview.png b/app/src/main/res/drawable/widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad18604198964b29419757963de0f401aa837ee GIT binary patch literal 55080 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/widget.xml b/app/src/main/res/layout/widget.xml new file mode 100644 index 000000000..e6aca5181 --- /dev/null +++ b/app/src/main/res/layout/widget.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/widget_alarms_activity_list.xml b/app/src/main/res/layout/widget_alarms_activity_list.xml new file mode 100644 index 000000000..c646f189a --- /dev/null +++ b/app/src/main/res/layout/widget_alarms_activity_list.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 96cc3b117..47fd8a23b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -527,10 +527,7 @@ Authenticating Authentication required - Zzz - Add widget Preferred sleep duration in hours - Setting alarm for %1$02d:%2$02d Hardware revision: %1$s Firmware version: %1$s Error creating directory for log files: %1$s @@ -715,5 +712,23 @@ Filter Mode Mode Configuration Save Configuration + Not connected, alarm not set. + Zzz + Add widget + Setting alarm for %1$02d:%2$02d + Sleep Alarm + + Steps: %1$02d + Sleep: %1$s + Status and Alarms + Set alarm after: + 5 minutes + 10 minutes + 20 minutes + 1 hour + Icon + %d hours + + diff --git a/app/src/main/res/xml/widget_info.xml b/app/src/main/res/xml/widget_info.xml new file mode 100644 index 000000000..9bc0b9b98 --- /dev/null +++ b/app/src/main/res/xml/widget_info.xml @@ -0,0 +1,14 @@ + + + + From 8eb494ab85d2124cb82f520fc31dfec9777f1b27 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 1 Sep 2019 22:09:09 +0200 Subject: [PATCH 061/124] Widget: some cleanups - use LocalBroadcastManager when broadcasting new data event - use constants for actions everywhere and move them --- .../gadgetbridge/GBApplication.java | 1 + .../freeyourgadget/gadgetbridge/Widget.java | 21 +++++++++---------- .../operations/AbstractFetchOperation.java | 6 ++++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index 94a980ce5..8c3e8dfff 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -112,6 +112,7 @@ public class GBApplication extends Application { public static final String ACTION_QUIT = "nodomain.freeyourgadget.gadgetbridge.gbapplication.action.quit"; public static final String ACTION_LANGUAGE_CHANGE = "nodomain.freeyourgadget.gadgetbridge.gbapplication.action.language_change"; + public static final String ACTION_NEW_DATA = "nodomain.freeyourgadget.gadgetbridge.action.new_data"; private static GBApplication app; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java index f9cf13dc1..a9a0a42f4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java @@ -42,15 +42,14 @@ import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DailyTotals; import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes; +import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; public class Widget extends AppWidgetProvider { public static final String WIDGET_CLICK = "nodomain.freeyourgadget.gadgetbridge.WidgetClick"; - public static final String NEW_DATA_ACTION = "nodomain.freeyourgadget.gadgetbridge.NewDataTrigger"; public static final String APPWIDGET_DELETED = "nodomain.freeyourgadget.gadgetbridge.APPWIDGET_DELETED"; - public static final String ACTION_DEVICE_CHANGED = "nodomain.freeyourgadget.gadgetbridge.gbdevice.action.device_changed"; private static final Logger LOG = LoggerFactory.getLogger(Widget.class); static BroadcastReceiver broadcastReceiver = null; @@ -181,9 +180,9 @@ public class Widget extends AppWidgetProvider { @Override public void onEnabled(Context context) { - if (this.broadcastReceiver == null) { + if (broadcastReceiver == null) { LOG.debug("gbwidget BROADCAST receiver initialized."); - this.broadcastReceiver = new BroadcastReceiver() { + broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { LOG.debug("gbwidget BROADCAST, action" + intent.getAction()); @@ -191,18 +190,18 @@ public class Widget extends AppWidgetProvider { } }; IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(NEW_DATA_ACTION); - intentFilter.addAction(ACTION_DEVICE_CHANGED); - LocalBroadcastManager.getInstance(context).registerReceiver(this.broadcastReceiver, intentFilter); + intentFilter.addAction(GBApplication.ACTION_NEW_DATA); + intentFilter.addAction(GBDevice.ACTION_DEVICE_CHANGED); + LocalBroadcastManager.getInstance(context).registerReceiver(broadcastReceiver, intentFilter); } } @Override public void onDisabled(Context context) { - if (this.broadcastReceiver != null) { - LocalBroadcastManager.getInstance(context).unregisterReceiver(this.broadcastReceiver); - this.broadcastReceiver=null; + if (broadcastReceiver != null) { + AndroidUtils.safeUnregisterBroadcastReceiver(context,broadcastReceiver); + broadcastReceiver = null; } } @@ -212,7 +211,7 @@ public class Widget extends AppWidgetProvider { LOG.debug("gbwidget LOCAL onReceive, action: " + intent.getAction()); //this handles widget re-connection after apk updates if (WIDGET_CLICK.equals(intent.getAction())) { - if (this.broadcastReceiver == null) { + if (broadcastReceiver == null) { onEnabled(context); } refreshData(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java index 1c9d7691b..1da7f98b0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/AbstractFetchOperation.java @@ -25,6 +25,7 @@ import android.widget.Toast; import androidx.annotation.CallSuper; import androidx.annotation.NonNull; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -127,8 +128,9 @@ public abstract class AbstractFetchOperation extends AbstractHuamiOperation { GB.updateTransferNotification(null, "", false, 100, getContext()); operationFinished(); unsetBusy(); - Intent intent = new Intent("nodomain.freeyourgadget.gadgetbridge.NewDataTrigger"); - getContext().sendBroadcast(intent); + + Intent intent = new Intent(GBApplication.ACTION_NEW_DATA); + LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); } /** From 3389fcdfdd64b69aef27911c0f9f08a88550e684 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 1 Sep 2019 22:35:02 +0200 Subject: [PATCH 062/124] Widget: Fix null pointer exception when a device which has no activity database is used in Gadgetbridge For example a vibratissimo :D --- .../gadgetbridge/model/DailyTotals.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java index bcd8ff73e..c92773351 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java @@ -36,9 +36,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.GB; - public class DailyTotals { - Logger LOG = LoggerFactory.getLogger(DailyTotals.class); + private static final Logger LOG = LoggerFactory.getLogger(DailyTotals.class); public float[] getDailyTotalsForAllDevices(Calendar day) { @@ -52,6 +51,10 @@ public class DailyTotals { GBApplication gbApp = (GBApplication) context; List devices = gbApp.getDeviceManager().getDevices(); for (GBDevice device : devices) { + DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); + if (!coordinator.supportsActivityDataFetching()) { + continue; + } float[] all_daily = getDailyTotalsForDevice(device, day); all_steps += all_daily[0]; all_sleep += all_daily[1] + all_daily[2]; @@ -63,13 +66,12 @@ public class DailyTotals { } - public float[] getDailyTotalsForDevice(GBDevice device, Calendar day - ) { + public float[] getDailyTotalsForDevice(GBDevice device, Calendar day) { try (DBHandler handler = GBApplication.acquireDB()) { ActivityAnalysis analysis = new ActivityAnalysis(); - ActivityAmounts amountsSteps = null; - ActivityAmounts amountsSleep = null; + ActivityAmounts amountsSteps; + ActivityAmounts amountsSleep; amountsSteps = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, 0, device)); amountsSleep = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, -12, device)); From 4780c26dd893ff6a22fd527028c2edc307b74087 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sun, 1 Sep 2019 22:48:52 +0200 Subject: [PATCH 063/124] Widget: change float to int where appropriate, remove code that did nothing from getTotalsStepsForActivityAmounts() --- .../freeyourgadget/gadgetbridge/Widget.java | 6 +-- .../gadgetbridge/model/DailyTotals.java | 38 ++++++++----------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java index a9a0a42f4..bed0d9a3f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/Widget.java @@ -66,12 +66,12 @@ public class Widget extends AppWidgetProvider { return gbApp.getDeviceManager().getSelectedDevice(); } - private float[] getSteps() { + private int[] getSteps() { Context context = GBApplication.getContext(); Calendar day = GregorianCalendar.getInstance(); if (!(context instanceof GBApplication)) { - return new float[]{0, 0, 0}; + return new int[]{0, 0, 0}; } DailyTotals ds = new DailyTotals(); return ds.getDailyTotalsForAllDevices(day); @@ -114,7 +114,7 @@ public class Widget extends AppWidgetProvider { } - float[] DailyTotals = getSteps(); + int[] DailyTotals = getSteps(); views.setTextViewText(R.id.todaywidget_steps, context.getString(R.string.widget_steps_label, (int) DailyTotals[0])); views.setTextViewText(R.id.todaywidget_sleep, context.getString(R.string.widget_sleep_label, getHM((long) DailyTotals[1]))); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java index c92773351..703e64736 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DailyTotals.java @@ -40,11 +40,11 @@ public class DailyTotals { private static final Logger LOG = LoggerFactory.getLogger(DailyTotals.class); - public float[] getDailyTotalsForAllDevices(Calendar day) { + public int[] getDailyTotalsForAllDevices(Calendar day) { Context context = GBApplication.getContext(); //get today's steps for all devices in GB - float all_steps = 0; - float all_sleep = 0; + int all_steps = 0; + int all_sleep = 0; if (context instanceof GBApplication) { @@ -55,18 +55,18 @@ public class DailyTotals { if (!coordinator.supportsActivityDataFetching()) { continue; } - float[] all_daily = getDailyTotalsForDevice(device, day); + int[] all_daily = getDailyTotalsForDevice(device, day); all_steps += all_daily[0]; all_sleep += all_daily[1] + all_daily[2]; } } LOG.debug("gbwidget daily totals, all steps:" + all_steps); LOG.debug("gbwidget daily totals, all sleep:" + all_sleep); - return new float[]{all_steps, all_sleep}; + return new int[]{all_steps, all_sleep}; } - public float[] getDailyTotalsForDevice(GBDevice device, Calendar day) { + public int[] getDailyTotalsForDevice(GBDevice device, Calendar day) { try (DBHandler handler = GBApplication.acquireDB()) { ActivityAnalysis analysis = new ActivityAnalysis(); @@ -76,19 +76,19 @@ public class DailyTotals { amountsSteps = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, 0, device)); amountsSleep = analysis.calculateActivityAmounts(getSamplesOfDay(handler, day, -12, device)); - float[] Sleep = getTotalsSleepForActivityAmounts(amountsSleep); - float Steps = getTotalsStepsForActivityAmounts(amountsSteps); + int[] Sleep = getTotalsSleepForActivityAmounts(amountsSleep); + int Steps = getTotalsStepsForActivityAmounts(amountsSteps); - return new float[]{Steps, Sleep[0], Sleep[1]}; + return new int[]{Steps, Sleep[0], Sleep[1]}; } catch (Exception e) { GB.toast("Error loading activity summaries.", Toast.LENGTH_SHORT, GB.ERROR, e); - return new float[]{0, 0, 0}; + return new int[]{0, 0, 0}; } } - private float[] getTotalsSleepForActivityAmounts(ActivityAmounts activityAmounts) { + private int[] getTotalsSleepForActivityAmounts(ActivityAmounts activityAmounts) { long totalSecondsDeepSleep = 0; long totalSecondsLightSleep = 0; for (ActivityAmount amount : activityAmounts.getAmounts()) { @@ -100,25 +100,17 @@ public class DailyTotals { } int totalMinutesDeepSleep = (int) (totalSecondsDeepSleep / 60); int totalMinutesLightSleep = (int) (totalSecondsLightSleep / 60); - return new float[]{totalMinutesDeepSleep, totalMinutesLightSleep}; + return new int[]{totalMinutesDeepSleep, totalMinutesLightSleep}; } - private float getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) { - long totalSteps = 0; - float totalValue = 0; + private int getTotalsStepsForActivityAmounts(ActivityAmounts activityAmounts) { + int totalSteps = 0; for (ActivityAmount amount : activityAmounts.getAmounts()) { totalSteps += amount.getTotalSteps(); } - - float[] totalValues = new float[]{totalSteps}; - - for (int i = 0; i < totalValues.length; i++) { - float value = totalValues[i]; - totalValue += value; - } - return totalValue; + return totalSteps; } From 503fe854eb175674a0a926226805a7a1555de49c Mon Sep 17 00:00:00 2001 From: vanous Date: Mon, 2 Sep 2019 23:06:39 +0200 Subject: [PATCH 064/124] Add test button, @stringify strings, add headers --- .../activities/DbManagementActivity.java | 30 +++++++ .../res/layout/activity_db_management.xml | 78 ++++++++++++++++--- app/src/main/res/values/strings.xml | 12 ++- 3 files changed, 108 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java index 66b022626..3a0765db2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java @@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.app.AlertDialog; import android.content.DialogInterface; +import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; @@ -42,10 +43,13 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; +import nodomain.freeyourgadget.gadgetbridge.database.PeriodicExporter; import nodomain.freeyourgadget.gadgetbridge.entities.Device; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; +import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; import nodomain.freeyourgadget.gadgetbridge.util.ImportExportSharedPreferences; +import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class DbManagementActivity extends AbstractGBActivity { @@ -97,6 +101,32 @@ public class DbManagementActivity extends AbstractGBActivity { } }); + Prefs prefs = GBApplication.getPrefs(); + boolean autoExportEnabled = prefs.getBoolean(GBPrefs.AUTO_EXPORT_ENABLED, false); + Integer autoExportInterval = prefs.getInt(GBPrefs.AUTO_EXPORT_INTERVAL, 0); + String autoExportLocation = prefs.getString(GBPrefs.AUTO_EXPORT_LOCATION, ""); + + int testExportVisibility = (autoExportInterval > 0 && autoExportEnabled) ? View.VISIBLE : View.GONE; + + TextView autoExportLocation_label = findViewById(R.id.autoExportLocation_label); + autoExportLocation_label.setVisibility(testExportVisibility); + + TextView autoExportLocation_intro = findViewById(R.id.autoExportLocation_intro); + autoExportLocation_intro.setVisibility(testExportVisibility); + + TextView autoExportLocationview = findViewById(R.id.autoExportLocationview); + autoExportLocationview.setVisibility(testExportVisibility); + autoExportLocationview.setText(autoExportLocation); + + Button testExportDBButton = findViewById(R.id.testExportDBButton); + testExportDBButton.setVisibility(testExportVisibility); + testExportDBButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sendBroadcast(new Intent(getApplicationContext(), PeriodicExporter.class)); + } + }); + sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); } diff --git a/app/src/main/res/layout/activity_db_management.xml b/app/src/main/res/layout/activity_db_management.xml index c61aa993f..912a642c9 100644 --- a/app/src/main/res/layout/activity_db_management.xml +++ b/app/src/main/res/layout/activity_db_management.xml @@ -1,4 +1,5 @@ - + +

^hyD zovvpCyq);0HjG}_cPDNy{Xk2Csdgj{&d-1P%kR*&^6v%JU6O3`)br=h0U00I>iT#- z${s8=FImq_oygZKP-r}5i#+`brANec@m z2(`gdtpfux2Jvz=-}~O=qp;t_dVR+$?NLcdSmiSqp`Bl$b5;BpDb-dpG~P0~s!SN9 zJpE8ouhw)XGCx@bwA#YS)R>I)vK^{54J*a4hXl#kUyo!aEsO%H9vG?G6ceV}H%$5sHZckR!VcP3$mcCIRmX=ym_jz0rf{$_J9k@=E|fPi2Hyy4TGv;KH)xjWb! zVhq=d35^5yBSN-MjF-enNJuLSE=$o!Ly+NANfgi9oous(y2=`>lhsZ}Mn>DYAkl|w z$xDB29gDrQYYk&kd~y-b>76Mm9nPp`vlcBHVYtPqRoB&a;9!2UE zcZ1uq!gLXRhliCu{N+=QS*>t6(z8h@dgtYC12$-+*1`1T;rnxj{UTZYCeIh$5tKwn zF8kA^lb<0G@Md!jHE+X6_&>3~e2EB@guh<#H@)I3CKUQ%K&OmyNRe5@_8){4WHZ_i>J7q@@i{ z*Z=A1el5ti@_%JsLPzl8#dqt4I%*mkcp&JV8Pt+Uc&y^~Id}eL_STt<=P1{#g$s7T zV3!AH76#$tb2iPauochk)NlJ;Y@eDuwRpCzr%McL9&Y!@4~v1GjT3Ona}^a8r4+q8 z_8;4dO*$V+7S;a{ox@sr?{=5JGn|T$mX_85D|&daYThEx+@1&mo%6l<0MG>QysiIr z+<_*U4(MS%m&3oV%>acI*1m#i%(#4f`!+~dCQ5Xo`pV?`cxBZlZN{o=vQWo3!e*vS zdVhG_qOx)lhT%#qHs?H3FF=~`#u&|HAU;s5++-y;JL$B@36B0iIEKDws&Z|mAhGfv z&!f^U!p;XzPa$9}I$*JEx<7@zSK5$H9!JYf_If@so0m`!5p8MtBkW(FtUUpntA6p+ zm(h&(A;|HQ3{~dbqw^ni&r#6lRV=q~o_ z*DquK-bRnBF2GLa)r$b0jg}bF--g-OF6mg;N?*3KkQW$P4yTB(?)CQew$0Z%2wOL^ zBd&s~qm^Il8yu{Hd7}hyQS4lK0@*pgSq2L|4=4lZxjj>!ZDrL4=<%<$$7;v3nG|uC zo9ctvO35d;0c13n&Elt+ubQO0V;;|mh`t>z)Q4V0P>Ql;Ih&Z8t^w>={i0j%Ed7gK z-l7mnfiw(==eMr?bhQm7A*=RF!L>TV_cEn&&(HT}Pi!X#XN_PeagmYBBhI6~8u2I? zs#~I@7|0kDLYf%8&}6xIQQZU|A#T7UfyR9?-_x_WNicylT&^&7l?14^WlE zX;(E{&B{~U{qu&oTW4LC+u3H>Imb?fv^+lO*o!HBB80W$W7~$?-F&R6=&ZlMRA7*B z^&C9tRG3jeJf822DNI?8W;}aRos0UF76esRGpo*zO?bgWYx?rVdW}X`3{~$l>Vy6)< zK+nwb#rt3XUV3X-fy%lg$3#QRn^-h$X%`O=NW|h@bft}9*Jq;`1}cn}l@;^Zvu9>= zRjhR`M~8O9>&!rr+Vex`sHw%3Z(iiy!>;{vXP`Pc1jGcK!XoSB)Kp25Mlc6P7Z+S&}bNQ}A77m!jHDG+R` zc@qWzQ-9z8xd05Mg%D##)9~I!9KQqoh7;Md|9KWb&wYpP_0{>+l2142l9AFcGB4@q zR0Vi!|3(?Gj)d|Coq{F<@}xUJ92o)33!zz+))oW7Jl zLPbN9P*RFq^S_vkGWm_&}~o4(kec@Fpi z>@p!cuOh;NGaH2UfS=c_wa;{IE-1jLt*tHNbSYHdvpp~5WYwwaIBI^x66=xc z2kyqvv4VxYj|86=I*SiBiz8v+oxHsCQj-^;RyI9>u^mTixzBDM7!3;#JyEpI8=bqB z?tUtuXk^UH7#CgFFi%EP0ECUC%h;W7D|-Tqu|1Jbbl7;M7vYU~c6N3G!1iAZ0Y1I~ zxTj{NMf7zoNNd7Of3Je%IgDELtChpO@v93k)P_mYamJs2KupTl4q;ODtmd zVpA-(de1;=H#OPQ^G@jge9ZOXX3G$my`-dYAc$}{P5O_wYcniPDXwqN-d#SC3$i&- zSUtVHc*O!SF)_W1oGur^a7WEPiBWnpQ4c|mdy|-8o!=@eM`^N6ju>%{4#lSP)9%vf zH}gI`wRlEG22k5+d3k6{URQ~(bOQz)1^}!p7wM%5x&Z|RgZ483Ds;Npr+MGss#Mb! z7=XV(%f5Q`3aFRQiOFT7x6(U$ArYI~e!=entGo zC|Gfp5_R+hF`VA?xC5A#V<0_3;NAi`GB%EBlhpUC6kDZw-X8r)+$Tx-0B!eV-Uz(D zxwgk9%al#kyVw9IK>`*8_;3_#3Ves1k18rg{Fi=pXbgo{m|`(D=%{d&7cLCk+-f6M zVNP0Jt~MDG5)vE+EfA~Oif0fb4LjJy-qwkljlPPIaRks}K*PQEytd8A%31|qzEf0; z)h&{fm+y?#_x_&yG5fYMO$?aG#Bel}<%{urV7`cjTub`4a?rcme>uZH2UOtb{qOhg1Ccmb1ZH51Vmu{Q2;C1Jiu5g5eb>03Utwc6#~v zr~U#n0V~I>Q6yDvGO&C1KAU~}!d>X$dd>Cjq`TC7jJ`m(p72R^oS_!_Z)7PXhS)US zWOXI?O;2kI-5s~Hu^%9`RZJC4+Qo_<99$m0W1s*rS?-94$xssOLm@~sfyQq)Zgia6 zI(4)yJ4YNDgOg!zIEKGGT8e0EllcAn_wtjxGovAVWwYo%dn@!nAT1+9`}(yq*|ir) z*j~T;m4({T)#c8W8ZPSHo*@kZ%46SM2e=ltqF+Fd(#nLV0Q@O)$|$E~`osM?((`_C zJP0I4PYqXgUIwyMX^lp&fBF3EPo*19F4$)D#t2Rq*-fw?#tmc(AUzgj|}`p|I-T!3puVRZ2#f{jSTx+VyCI;mJejR5!r zl<_O`!OeYRoM@?81!(fJQaqsbn(t0S+qWu{q_Q$Hrjdq6kN%vV+JnG!GSoh!${wOac#y$fb0p_7w@eV|fcGG;hq5 zM&Ow9Nd_!b=epCg4$dp%;)rK5kAYEI1J+DJO^u-6gcBgpdR6sMR7Z!@{%j?>FAmGQ zv*b)TJSxP00Qmum^EqxuY7VJos!aU(zo>f;u&A7t3bQ^Tu=A8_q+dl@9&TAwC$m) z_Fj9fImaAh%vlNNsivS;t;B=5et4g{9szg61D@^MIHp@yr#4bXCT<~$Re9M({rH&?wsuho51C-MZM ztv!~^yGU~rzs2u3-k*Ddjy+za(A_Fv^*ukfS0Qg#st0O3a2x4LJGy!H;Kl%{3rczr z9L~+@S+I0Nvw=ZSc4f;@?)th@aaUL;I!>-n-*5coGzh6u;u@A`x&EQ~* zGh=J)`~7uZUcr3P0RGGG^qvH72ivf{c!Ru(3hVcUII-yuTtimTcGV?IEm?xY)^XT2 zh*N@o$Bu=on8e*wCzaF9Vxsf{HHK^?~7@=Csb(yEa_hdLP=1CV+q6eB^k1Elk~_ah~Cl zS15~fqV`TcFVX1Uy>7|Vp6*rKCG%~!15%ypq{)a5k=?{EtEQ$mRFmj`E3du>AFv?) zLJ4i(n(%l&(~-=G<@}2ts!EuhIX-%xW8zz;XRn3KMp6s8Hu!vs6H!p`W<8vv z`CwM3ODnXN0_b~Gj_q+M4GsSb+@(h-ze0(F68Ch74o8`P79ct-f>OTK$ zb48%H_m0J!%jpEW5*JB8HHf~Xf|_G??TGZ+2H(+_!IWCFDjzz#@v_E>yNGXY^X?Ug zK8^0N;E&9C{W||hn;M9imO`guo<;VXmm0lmH(6G4tA6RN$bwv__4EY|g2rFOoh3y& z_GooTf#?me`nvySIXB6DPwjI9z4|&MksCgN!hbC-CBUerwrtt5T-<=b$2>51y>GS$ z-Wmc#a|WHKW~fYS*|v4}MOF@uyuBs-^m2ty-WC<*Bx;qP^9spx-Y6fecpywF@N1dE zeEq(Dg>=jBUCduz%gf5%4%C6RA!su?H$=kfd)Er--LgArjySEmvQaPPMZ1J0<7e=i zPb+o`r$nBSRZzIqlQmY%&W@Be+#VKqPGjC|)y5$9Ebc*vqpCqT(|I@=uTOp;Ocyxo zQbcfwXAhq~UAce%{-+DB?0mc+e)|A?75JzpOJ~FHglQzULi$b!g13j`l&5zSXEL^m@UCF=z7gj zQ=e#}n|h9Ns%ZJB_6}i*WdHmbW|`G`f@KP1jmch!eDXt?AdcJ!VmHAq@QQY@+=Ge$vZfa zOXtrao5Omj-ut)k+CS2a46t<`#>3xzb|Cl5|I>D zS?^(aa!PGi#{ti@#)oUd7;S`PBc7IAPAjRGT4mf`X8d)p##H}3)JFR_IpN016|9G-4``8(7z+RQVh=2272+0r0*9JQU`zeVohYi z#K_cWb#`pS_!sUM27+8%p^$`1Mr{EUEWbRs5cK&4i~F#iXAocQ%dPd}%R3!8vclu6 zTUa0%_?imotEl*CYikeG_t-i0~n~8~uVMBYV z*$m3s^jJ0QeRRy2k&%%ZmySSJDl}0pqy>m~<5j=)@J+kn1rv4I6TYYqxH^aA)YM|L z@!yp=Ib7Yj?dgLhQ{yFIWqkU_uD=S*vx-Vfv#iZz$0yvdlU~n^u(WJ4p;9}uiC3>a ztKEPnG}G0jzh|6;HTB__Yh_NH*wuN>0jeO>KlX{q?DgsYCJ%5 zQqREPgtN2rhIQ*s96NSr=gysLa-=y&`frJLc6LfjNxA0c=HB!64j&&MKb-LC+Wxs0 zF+T7#b6OMICj5c25TgYt_FJic`@UQv5 zKb(bs&6$4LtpC5g?AE??3gye4DZ5viUX)L30_Ze-RA<}Qou2oL8+u~FA7Ec|7Ia|bj`jO>Gi`PD0-bjezoePA9uhg`NH<_hZ*4M{8eYyt+=EDWlV)aSb6J!uZAZ%kwNIZG237k1lPZR?>&FP0!A^j^!jG)$&ynOg7~b@ ztNJLa($Y}TLljFU@RnXBt z&vVhb9$j`*gLda^3gx(Jg?VF&{xNB3yaM0fYb2<(UJx34;3pY&?AWmZXMJmW3u`>FsXn@?tzxzD8aHw72B5=6 zCME6TNd{?Mn_?I&I95|4X;p$q)W)4X;>@50y5q&DUQ3_FK-|=5oJR`k{>!P)p7^z?^hWo0b~%8uUm^yKPnrQNit0zlQYe~lapv#swx9F zw>-h6Nt$>9!9l#jba|@!|T|Zt}L> zjUqP=(v_*Xc_##1A>?j%P*pUz2odGd;GW~=!VeSw}0Em#npj=TwYPJ#!oQJ zy{GAOj-zF(zd7gr{SjSVmjs4CU5ku}C~IpAmkbn)0j+o9(4j+?oiWJ+nLRf8wWhXH zV+{p3n%YU)z+y^JF-}QKSAP5$3u0IuM<>mqF9;?Ef$z8GQ0({LeoN^d8oSnroT}I` zQfwYt@9pj76^6>2ib;ltQ@*2aTT+Tl@5O0zelH{AVHUY)Z!_ntEJ4*Y6EP1NWo16y zs6)VM=%&!`AjhY+uC5Zt+uhy$mTrrip5Fc87t3vT#dLx#b;eOP0iQcEVTZRtF& zQZLzV#LI4d*Mb0d_eUNcD=+g0eA-F81v0X-jA9)f9q&*}Gl-d*np#5ZyVjF>sbf)^u8wh$3z{~(uzR5U~T{M?3$F|$m`O5 zpn3-2mFT>^J)jhil&8}h#kd%EGSk5K?;9+q>LOxd{FBZ%RJ@I50OujGxJ0@tPCf4Z zdtae3@$SKW2)BAl76DH!2Rl9qHFR4wI74BcKPKN`H#LzUD1HI^>Zwx9i$3YlXV*l1 zOzj3BoFv+enN?O+&dZiY?oOw<&r%u_6XU_)m=iQQI_lQc(b;JV3GtIo=sLw=6l-riQW zMHhFO_6O#iE$guzN_T4t)f3Ga%zfS5e2(mEOJM#Mv-H8y&Nv+$+nvnJ@T)w4n331i zIEy0uTI9TafRe1Ut7~@m`|H=|rq+K=S7OuE)vfG|%cfn@u*UH)Smis8j(1J=s@&}0 zxsvbGF@NR4xfSK*#&vyxU&X(H!isqKP#9|dNd)2}M~|AqCZURw8sRh+Fm>=ji8WKo z_Kg(EC%wb?u-b;Pb~jGnh~3hUh9pz#^)kQL>TFoQ{^Z%SK`4YCqv{i{J2ZyVN@CEB zk892I&c=(5W>+@XrJ7n5-K(utLd1$pPL^NGu5!Z4Dm_*`n;r2Ob#i!SrmFhLTlqxW ziBVCnfxMXun3o{1?$8gWmrAup3cV(!>fi#tx+1#o;a0M~eU%J3O_&Tk| zkJof(id4RYa+ z@%;Q-@Q0Y1)16)cTbQDOjzqY?Tgc$cM@H*x=-`A{lr>dx$Vd~S|N6|qD&=yQrAwBy zK^WyV?YPIw$9KV|zG6r>USWwo!7C}UGV|N+-CM2OkfrKT(a;d5KKae7oHn^0VTb$? z0K>z?*kLy_vsSGYgr@mZsWCAUddbSR*+MCnmYvu5Nd)v4wBfZV{{&lHc;M7{Ye!Gd zau>t&diSY^i$zsbR1EH?;6-+m{ejoG^}Y`cbpjVvfe$#CHEGsxR8LRu$@#|8Qa9T^ zNA)(usTb8LD(v0$>GDKF6C7=$&qTm_VGQ{0Ua2j+<@ZvugPHd%HjRbQQO4P(U?#bNZAj4P@=^-Lpg z*~Ir`?9b*9mreVFa9Eky+1ZCTUWGs+AufIqR>fQ${UICCcMz^48XM1$vr%7PZwVX4 zeIK7lF!}rai$A?JJ%9c&4gigH5At01$4q79(yaOO=MTWI)jpIxl?l%S4l+idf}9T= z`_THu)P(@nwTNNT)I4DvIHqDSXk=o-xh`Pu-o1nGHC)>})u$};tI2{d|2{Q1Ht}Mz zSURiESw9@P<~_T9hYAWGf?fsSIDHYndGluX34_HaR8{@6##=ZRWG@Fo?CUc`UID^x zPi+lYTxZ#fCnYZK6ks=bSzxp+_=OISzvR;8%L`ijnc3JR5cuBVYA4oLU&iJge9U1Z z1_Ik71X&o^E5CE_Es|)?9h%W%^Q>T`lUv0A!3vhFw63imh1izw4H_F2cTUAx9> z{KZL0Nr`jUu7|AwRxT7aQu~v?9JjUWeGkG;MqWNFEWq;Z>$gF#CMU*FXtZnf8^ebQ z3#IIG!QqFO9S##AzY`w;?5Of>)+kODFPw4t{QyGp$Bw2^w;Nw`!;s0gG@DAZHz4 z&fg1R;9JEQbIp<;UVzHV$H7Nk3HB@nkih+3Fne&a3E?yi{<)g-B1^pr7{$m_QBtaP z>Nhkr97+ob?}x}4iR6t3222nGJFTpW$|WZrV?t% z*S2bn<1g@s)vHzob0CPKwDKU(2@y$>te?rqw-(0D523oS0P%2GH!glL!n|XLTSHHE zdQVoA<64fD52w6Wta`lV^4c>wnBp#QQMGud-Q2%O4J$0;JwifV|+L z?i}cG|2~b;yeup_{)r3^KVfS-DGFMj2IA)QM@I%$##`kKARsvrIBf8Yu;NaPf^-%=`B3d#b=%ZY%I?H40gv?_%%3 z2zB4IdcD1G?;L}m6acs}I8ZJ{(g;_&U-+)UR{HJR^O}zZmArm^9eme4504-YoA%?^ zTlogCl~{gXcoFZd>2=m8VoJT`%NI#LHAO{cG2p7~)_rHrY!Tl0T3syx3UH;X?Le?% z$>6}ij^7vV5D=K4m8VfX*!{S(z1=;8F;l8vj*X3t*KRT+GAb&`tXpaJz?4yX{T)|V zd4xuYn&F6=cra`uY>PZhAibxmun2rS)P*OK|mowGGJW$BX z%HGc!c+A1f<(d6eZxE2L*yE_!PAMt*U_(_P3Zc@^$<5WqgVpr9 zwIj#wsQlF_AapLRBqUlE>bSueK#9N4405-)N%}j zT{|QYZ7r=bxD5tyu6CZ2`f9DWPDuEI7cd?@4j(N!4oQh!DgvBz6jB zg8<8ph);6MK9w&l_2!0O?H$?cK0X`1v-dt`+Pha8w18W6r>weqAWGUKIMQsob<~yL z)$yPNGX;`DB8>0Y>xc`y33MY5duQ)^SW*Yorv}wKkZ%A<5y~Z^OZlZ)zTwSES4r`& z;8(*&x0@QWt9Dqtb^vzF9b31)h+Y}|7Kfh!5Px*kGU52{dQuwpG;nwoz!A9zC3}9O zL3mPTQstKwN~Q zxYaSced|=TF#TsNA%Lg;o7VnzkP;cFI`z!NPU<3v^FqM~bk{Ru4&4tS2uu^H-toId zJVHsy`#|9|4Ciu-hwrkK7`(3bwtjY~oM#wqfKe3c8Zqu6w?l*=P+|8%MM&r8`#2iV z4Ydm5_VdIhx)?0F3_O5)(nG>O0b{>q ziE9H#QtxEk*Vl)N(Z|n^^U>3`)A0&2GBP1>;W2OBdZu=Y;SI=RIMVP-O!C?;5PU?5 zFn}nd>F3+AJoDbGQW^7*j~_p-Zw1-Kz}D`|s&5Ks4i^21M28&?n_^6rBAp1QX;XW} zRGz(Z{A}l254^og!IHq0zLlWSX-e($MsHCr$ujF#1CtR4q?WPge%e zJtiuu@NP=?$i=xAMG7It$9(;&hprYaP*HXWFq%%N5EY-+^Pr#&L1f4r`QodDk9}8O zz7NDZk_sT-({0z?VC)HooJ^8)_Go1sz}Hp)Jg`a#jxj2!M!9n=Jw4#(h*3_K#08Ya z*$%SAsAVc4glL^kCkiFall7T1n4kbqtad-%?1TDJb>sL82Nmzb%m6R=k zC1HqO<+E2Le3qKGEi^7p%7YUu8rE7dPh3)xy@rx$+$ss0xg9=#0uZj|B_t#y0nh{U z`zUMeMMJKLz&-libaVntc}hvl1LBo<4Xo`7K7w*z~CV zHNCFQd)?F*j>Q)YlyY!zIBwa~e~M9TzJL6lqka{peWve)8Xk@d7c4=)P3 z#N`Wvi-y_ylW#N=#Q2J0Aw_I?`hVcb$7`w%=iKlrOfwOQITc^Sh>QG0d-hkN)XXY* zo2_bO;j_C`^_c#x*-K5T#FBDz=E`>IQeRmHl~)!WrN<;B{0FU(>6Mg~QCi=J)(4Un zX3;|4surV&)KtY~HxEIiREj_A04}dJVchB}sS2OGUb<{q2U-LP2zmb89=45C#W@3j zBPIX{BNLOK;)$#h8!IU#Fj$cYgG@jr@EIo;*BX8^Fts2gIv?Gn^~qjtyqu~EdWO5W zECaVr0(1GnzDq>T07Xiw-dgl7kxHbzJQ%T+gmLnhkWCog=q2l*2m?(|RZ&=2D(mW^ z@H;lcjW^$dy2N|+WeiK$PR5eBhUG3#zErXUx=L^=r5Pux{FPbXvlJ>lLvuA--FCM$#D-}&D zXV#ObJpqOn>s2qLx#TYy_CYTh=BH3Nn6z2}-Oj};aPHo{f?qSaj!_IE``%bDU~|xA zqP9*}#fg-OKW|6QFHHPjwnxh@%3L&?a?8oj&yR0|7q}9-iMFE&0l?rVL4jIYTK0Mu zw0M9CI&-GcsSjDGqr3b5t48ndJ`UHZQ7c6U)|_|-JPCG-!p^~+OiY?peevLA;Vh9D z7{k0(56V2Pxl|~zu29ONQ0k(imfqK#<+K05l98|keCX|DTT{RN(o}Cpo%|NcWE*2(Kr{6q7${3iE#HI>MB8?> z1`HQTdiA`xvd$>=iAcboFhcX9{_!BCaDBRYNt(Xp)~#g!3407ce7ng%ByTq;f8%2m zC~5dyucDm7xe5Vjq*=@15>~j9#J64gAmzReyEiU&(3&;+BfPx(JS;}OIneyZuQKT` zGagsMalGKU!0Sc-P4z!?@QQ7GBO~&r;-F(&g2)ErRaHA_d{q%fQx;Rt)4%Zxln*^R39$R+f*ioyF9IRW-$^n<=3W!KmFRH z#d#`~96=>3wFWiU;sw87zSM|+{Tt(gNuxKtZ&4`q92_C%;GJYb6n^^_YnnkJjVjN< zVDhO7*KxG)x4-s4w7uMY)TD8tGg;`^wF|AxzguSC@x?-p?Fl0E&!~*vuMHTu=oP*LhcxtFYS`lE z;PfAY=ls6QJak^$;c|yy+Z8sRqWEj2$7iXJ+x*JkAR>GAO~$Y5KR(*c-DtR-AO46{ zsyturNUnNR>8pz65N?jAMuT5FL`oerT-rESplSH7nUCr`{Q9{v2aVXamn*P8X#2^} zhRu4E=Q4lyd}fR#@(RF<6Q5!l;eSEdw!(4NFd`(2=xvu_4a)t7x5m)gw^POa>iz! zz|X_RYJ{`E^7Y1YEQ6yY)__&~?;Z>}IMcuEI{nKt*WmqZHZX;KTX}75WJU)6ds2!d15xXk6;h8CbckvLiql@g}lbvZB#_*84lwO(Or{ut}lKDMw6;>HwmC30-t0~ zey@D?!1PnQrS!N|C<31;l0XtaZKqM{xg;exPkEY%T7ipfG2pou5TJLl>)`7(FbGjT z;38zj#S5cb&uZw$z5ze@3UBz#K*YW%ch2sEXa0J&sfYZ_7c=f{AG_aQJY?@e33$fM z7a+3k=kuNZL+x3gjS05D!*$0aiN6YDkYwJ!?ERmtBM!K}0cD zy3ozhJJ)saz*?8opv6Zo7D@ml5u8*gp%9hGBbP!E;XrW0KfjL1Gfq02hpiV8$7|m^ z2s>sI3`9M^Kth*L#h!N8_?sGF#%U+s`LgeAF`chz`>oG<`Z!{bbN(yN{LfPkmoKqL z?@o6LfBoV5(FMqqYnVvN^Jh93#SQZu#Xeu-pAxRtHcsCnrf$x3gg*QHKN25sCxM>4 zA1L+_|5@srF4LWtaZ^sS<0{H#&;#Y`)_;h@?lVY%Vz8Vf7i#%8jkj6x@suE%e~8EV znh9DE5H!73+@Hp#Z3c5Fx8z7D6 zDHkDio+&#&n_};9`ycYG$aV*W^xn2TvnbDBijdt_E^_g2A&hw49AeD;5b@@X7_@Lg zv0yX+@kF44h}PK7#MBJiUH`~EKfh>5;fgWt%G{v@PyPA1Jt-Zr79?UaDFF5L;l?P1 z9K~~<79i9jEEqoC-fj$vF>(+B!a-g^^*#xy&aZPC)&-#<@fPeUL=xNyoe;b< ztgZ55Vs8=+5ny35d530>^GQngeSM>#lkNAH1j>g#uLJ^Vd0h%yt5~C zbfTb?%EhV05S48E_6xO(2Ea%YYadit!hHdKS9DZHkwO`YmA{ak8ay`Ts6u3wlp^5~ zDvn^Hp57o2L@@}CsEtv(Cc>bjn0y+h9_UoWF#sj07TsT17=+ViEVrB6mYc60LG~Q{ z{=Im=aCt6?>L=mm(?J-6V+I<@+me#N-AunPB+m@$9XLsnv0zNWTQG>l$H%{L*^Fli zC&>e2RcZtiVN9-L!w+gKCnqPxA$C50$(n96tOLl)h$l}@+`fIgJU1jPjAgnOLgF-z zb!6LQoY*0eu|SChY02)TliLyB(BlPa7AiFKdvp~%EG#Ts-_vBk(`>+lIt>L9XKUK@ zLpTN_CLDJspdf(`N1hAwr-L;af&!8W%=q^M1LIOsQnWPSivx8Yi>pAzx09Y;qu6vB zR-RPPFw*y-dQ@rlg>%ob75}FPn8i=!3UY>=K@qBG3 zX4#+(F0`UT202XyUQpO!?}$sRxa^hQ`!77hkNCglI{X^MS@i7LcNg^p+X>4Uv{|Ti zOdqy2&R8#;dEBKzuCs&t!Hs;_p{yIQXVMHBuVS!Qba8R<<<$99lzPh&h7{~`!9b2K z>3K(w9tF7s>nff&^cW5?Y+6UrGWSS(aXhiXOmcT=+HG7djJrYW=>*MSDInd4F)ZUzKex~ zIXu5EF*${+_NK$7!EgYvYT>gOG+X&p^^BB5Exd8#Mzc{W9t4eb%CQ3n4!rJ|j^IHa z%}MqNBE zrY;?Ltzp(=#c71&68J?VgMB(yoPs)te+b5dY1FLc^09*luR66)14fzTl7F*gVBvC(Vz5D57uVp68x)q2za3VGjjUo8a(9y*uCUQdR-MMd{ z>BmlL*-J{W)3#u+NDcs-fLIGLs~nms7zgsAwQIxRc7`HJoGJ)Y(ndz#GUC2H&ZAJa zP{c$I$W*?f0#A{B>GiRMEP@w}v>uRXjkiT?fRH;nS^&fSnyMWqXQbZ5vi+|pjH4|w6R^n z!B1kR096yD4$W~NKYuiIB%Eh041!TY`#m|HC=2k*Z7&@b!$xuftmkW;ZNgZ9Ej!^( zBGDAE4yV1!W~e?4&LgN*bCZokPXWThD{>z`Ziw~}XmBOypWuk4NFcXUDA)JGwvP|P z-I9!A8?ln0~JhCW>G9M)sR6UAOq7%fL=|uk-(=x z{=*}KSkn5Ky)z?&1s}5OC|nePu*6%Hq1Ll`-e-6B6^L3aTwHQUV*RJqPH#14IB3y! z3MLc;VCAPzr}N`+09930p|!)O;e~K;Q3Ire{bNSNN0LksWf4|Mbb~@9WmWqSRZNmj zHL^cxKEQE=0Z#{ARZww!ywa$Zv#<=j2nhMruo~?X6pTgMjm*xrt6ev(VG(OQcEQ4D z>2>h06SnvFK8shU5y_Aw zkjNinaufU@;ZL6Ix|HXVicPChCbo5kq<1`EXc<G0gk|@sK2x2ZVohLi$3t4TVf3@#ovLU|ESD}a*$55|0v zlf%fsP&i79mK^Zscu*vnn3;Xgs5thsBv6Qwu^u~s5W3><;lqT#hMhLCiPW`L-=kr* zl#5k~0HCKj{2B7P<(m*mXv{{=@>YXwjmVF0PJ_(s*1z zK_(ck26%%=xAU_psAN)8W22Fh9VZ{Qxl?E_McyaeKL#=|Lx_bj^)3S-%Rf}5 z8BDi9tsU78R_w_M^iTZBDHEc_J%|W}*o%l=Y!L{&gN1(EXaL`iz}Z3aIbeff)POu( zwSdn0AsTof^31KPLG&Wg68=IE;iP(orV64V9Gd^(Xiw$%1!#UceVee?1ZV>YVXG5M z7A(RjuutH;KEq(kO`U_5G^w5e}xrb6u2qhF$;;$Fn)!tr4ZKJ!9 z4yP#OBx$_HwD*1XctJK=h1%%QNOK`0kHc={IEs&UhqY=a3=PjElp$ndwP#3ouxrOk<2KW@g`@IE_$~QV||DQ545YoF5mlz1&5ztQE2i2J#fCE zs=9ZpdXEEDMH3;?I&qR<5hGz-Vz9_SCsI#FzY8oRQTldcbsl;*nojt$g;LcKT)v?h;_1+0*P0RZ~ewI-nNP0Ma#OloV4t{(&TPXx^9 zSSVuPl#`R|^@E!ZPy)Y(-vRy*(l-^Q#%G16AX-{Xc!`Thx8^CMMFz4j{1q>JzcEB$ zIw)WW5|-bZhf)Fj%*ZN4-BI>OOe7E!RTwL@fcftngvrcp9L$LV$>%({+xXSbdax$j8TLiqSKu(Fm%* z+rSUu5fU5APHIiGlAuhM0X25y$PtVM*+;4$78aeV1=)qvymk6FG8_T3J)@wL5uCux zEQTGK;KH_JN9kgYjE9qxw(z*~f37&2&CSyK~% z@(O=X#>t|Oo}dFNlrl5JCUB%e_Yrq5ueBd~toiVMSl|b(cNox!0CO8mtmN_$=~Ln^ zTUZREaauoHx86K$ijJ1i-6OpJwg(~%W8h}KryKL$K9abwAx!J8INy$4>qFM9o~6nD z-C_2?*-86i*_10UKF;B6qhvP>oGtxr=S-@$JK2;5v^%%i=a0r1ok0P`oi=A&to+R z0-7cB_j)+)He*(jI#gX=)Y>oBtr>=c;2JeDa+!^l6?9KTNXWSy?+nlzK#cIIM4)?j zWWQ@3JxpOaIfsi%N-i*X?W6A@bbd(w*?885`dw=rV^Z7;Fq>lalKEbX`#nS%feEwW0K}YJv~XXpE)?ZLTJWe=ju=sc zF+~xiKolY{q8N!B1Vp3H5YM_3yaW<2BEfysgy3XwZimMLl%uyaQSU2!yk=J5eDllvQ!81 ziI2ZOtk(g^d4zO_drz#vsc{UpczP5S29|1G$|Z z7npWS3G0q+bUhE4JM!sMBZ+UjX0#>pX;9v#eK-%vB~#{me`kDYUfaOcS)m1j3$3DO z%$%YT3_{Ej&*y5U( zkhN$a?ZHdK+zV!)ubm7{{O;VjBPYPUcW?0NT|1C#fKgBa3iJvbeB^fZ#X}go zfDMs~_ITW9-V~v&d^C`;zP6AQB(!Uh{&=m2pR8HCR-RuFo>H9O!`oJX;6{nZc;-r$ zc~1awg`uMXXlziPYzBKqq+#UU9F0B;6?o3&cddgX*&qJvhq&bHJu7aD;K`a|4ib*^ zylV%*Bs>;i(dfeGx!uR`KT>f$c(5MUKA?35fsfPz9tiIkq93S%^=}T7`xln;dGJ7S z^3n$1|{V_INl>Z;sWjc{KQOKC%yPV^R9Aczc>f4*1)>o{r3$ zn87EaVBf`eL=JyCm0p9q_q^#X4kJ!;yn;CRyVB>+h2L?kC@w6#h~86hH6$USj6Y(u z+kswIyiwGN8FK5Ec>t++I;d>kq14P8|8|_zfuW(Am;F@vX{$ec@WX(^FyP~MR0WXe zPvNQHoe(6*%PINCz&_v~v zTjX%CfLqm&*MBD~s|*eqwgY}X=$Ys4nLgfwcn4zP>wX{qs%r=Cnns#urN$y6NxOQ# zbl(|jz>vEd8^-O3yQl~tCrH*(+;dP_c(hy;_7^swjG|%$#sxaHo~9DmPnEDNu##ttw1|(vb83#gP3_ zm<2gF%$v3V97U4UDiNV>wJOpD14k210SQ_NNa6AEfS}SSj#2UfT|1IC4p<^^Jc#cT z*af=*xI^5EDbyh37W1atyGa-cIeX^J0n}c29f&Aii{6Kr5Q*shEaU#6QO#v0Fb(4z zqF}}*#no)fZpg-owtS#cHWNgu9=Eq^0bu7e84@-Cc5-+HeseYF*;M=F%rz4AP-z2N zIW<4kY*rY|<6Pq)!qF>kafxAN8KO1TmK<9&Bj>)yr*27Z z2K|D*e*7}G{zn-YD`COT{;YQm`vXqs>cT=N0yjFV*pTRSfN7Bb3q;wmR{7>L!OQf` z*?6+dGc5s7140o#Wap(JD0*?I%Q37xi4g)={=wI)q{3nCrccFI+!jhiuyc~2S&6g7 zf|Ga8E`aU@4?qqFI8*|0dE@D6s7O*+uHQ2Ao29&3VsuM7= z3;V)Uq`a)r4whGOEa(i$Yf@CFDs2|)s5bS{o3v{kb2tSAVi5Nbn&BJ1voQi6yk!U@ z_S)U=7_hD(bT4Uv06?5>Aa*)8lQ$6q!h?c7ySwOun87b%+DHTvw1kw@1%_4Bu=<1@ z9e+r#=vuf4z>eNR`c~?3I$dwTvk6UjcSN=+DJbOU@1NF1P09BiAduXH0*nWJr1*@| z72AYR9|4dg71z9e(Y*QB z4v@xh0ASKxgZy!1&jY!K4O(_}(b8e}(M@vn=*^nlPl@VMTSUwSv={JfTve_ImxUvy zk${eYecGCuN5B?pm7G($qQ)KEP+L`YL5#bKDMIdYkqgpE+S!B}88G`;E!9j*vYhK{ z<`hvOz!N>5P0Ij_(3r1<@%i+v)D=8k@BQFG84k$jzLc}^3P*}xcrC<-_bNE%HQ^zZ zq6USEfdL;ovDGj|#mSEf80@1-`GBtIo3z|QLUGt85R*uDm6zY^K(CB!wY!RGf5ZAf z0!H#J2`OYdK1@%i53#7vB9ZvBtE;hLuxE2ZZoi(%|K@N?qYAm)W{87}_D5_KKuCFM z=~djPa8be}MxgDw@sO*d$TrX*X_)gA8Wsk^5lJTM>eZ`1A11OqwsnWQ%TkAfXzC%| zvSd4hvLL8N;O9oI*Ta9~H%Yet%SKIA0o9t{<}5=_IgoU?cElh=d`*VfgQ1-W}PX<{dfEj-Xq~!?61cKCOTFC=GQcp&-IwCo{ zS3z$lkoWmyJ84s0E??|o{A^lwwBx}kTXHD393r9%=8c67&_c|>y-G-LTeWz=*I)mE zX~)2yp`n|tcq3jxSu&H)#xord#hqRIiMsO8h`-{@>7RbZpBJI zt@`wdY{kjaCQRXiA%@@)tk;YbKtG*o6uu0N(JY)xdi=n^%a+_cxOH%Fka^vbNW?*3 zZhblEu({t<5IT`n_YU}gN(Q|lfu5;+Q6>^{ge7=M)#DNI^e z&~m|&`^pA;6;PraU!fD|ehGv#&hB!7V(lcbf8i-93P3pc`iQzYQ?uQcka7P0RPl#6}VQi@=&`^keu;f(Wp_5)L7%jJV*PwNbnJ{o#b`3Jr z++p+{PTy$IiNw2&Mzgzh-L{_$Ng)BOVV>2$nY2}VgaE{$plwI{zpS~r`H@8?T-3DD z91aMliXKTo6?775zx>8(V?0mE0~h@4b06u8sn-Kkyuca701$-&4CVNaHI9q|RS=__ z`pz-j)S5S1RGeJMYigMk6I|kG}C{5IA%>-NuCu2hrdJ zETK9mh)=~$VnZMnNLm$R&mjy`>zo%Y`%B)Ss~c`>p<`BSZc|0g{hg>;J;-C2z`!zK z8ux*s$~uf|XseW0zh6Hoq3R^E4G?d+b>L$S6ffm!55vO3$S?>Z9igERc(Tu8{1Jf_ z4~3ihPU!##+Q6Aaq&@&Dpr&%ndD(}?W72*57~jFv zJcMnbRl)-hi}~3X!Bi1W6Z1}NZL?U{9Di30K`l(6VC5ptJ$KSMnQ~QG?`qhr)X??N zu))ttWhtHhaJv-?Z@%&f0YTA$v5^I?+}zxqWYQ4w)gbIn{NFZD(8_5$lTU|J8RRv{ zA~HLKXnFWFETWkD*b|I~BC#X?2n zRQeJIM4Np`9`Kof#ai&QNWv_1}59)aPUd=39z}w)`5Y>dy?@@nfTHx!n}ju zLGg*&yt2x3a-%T732qLCbZs!}#2HZDZr!{wgw?tFI5#zrEaNk3z6Ih3Jp%)nf+{+y zsXu_ePm{LNM=eb#scgU94QxZ3ILTU6!5xx=C5DM7;S0W;nit=E1vG(^f_ViHJ1jyJ z%YmsICcc`_)T(YxlcRA{N@Nrgq1s&YpumIZmER2b5sX>)hs=9EVqAq=L5q@U-b<5> zw6s;wbP#yS03x_1j#{eXt7NEA`N7@5z^QzBcb1(yt1kKZffYe_Zez6}{e9M|YO@RV z;;Y5dpAGKSWnAU`X*T8gD?;$1Ka`U%chPkA+=!{?X+RBRS|Mm?_x3GL@u=sXr|stE z4g)XhkJfp79oO6Z{VCJL!`j;-oP2yysAI1uulCAHjrt5S3^@1di%;LWF5Z0Am*3Pw zdt>@{_u)OTU9@1!d2#xLyC{R!70ksXU7y?BZxOHk?%i9-=%I?Ctf9=rbJQ@mg$2>8 zKI5`9(O677J@K25s_}g)M=}4zodE}`uaBd&Cox+WEZ5uC{)ph zYjHua4`6dKfEvS$AnZ@@j11NioExyLCw8nprKQ#WO+p?)?j3gO>`b*>-`#ge=l))# zUQVDk96A!JFlp!n#{9mUEdYuM!=IH%$%mR4de~OxOyfs2#I$Z7ZDMya7T^Q}0nR1V zcw}iB8J&XUL-b!37C2me-_fe7=HlI{UVwlZ0!IeI5k3Ppp-3o2?e|+55h%zoGtfVXFOnKW##$O)Y7)s`##{0=1CppXJQXI|roKGm7@hx0?kD~vhb;#F`zo*&s= zwvKm{wcWF(A%JAVM)W3PMj7O?o$Hny^FRQhLV0fnqLyH7DiEm#P_$k|17-nz*SqOv zzKQ*mTb z;=b-40<}Y40F>dQaI<(z@HRI>xKA1WWG43EI8d31vx|=2fsO+kMWKuPef+6H&kQVg zZwjeGRa9U=lE-`>1WDS_4JdIyWg%!0VBh?C=2^oOf?r}?Bh9e#a>zmJo{s|H&d|A4 z&~Bp1uyz`~lc{x0eLHAfb-==alKRcnS!CM=T3XUgLj*|~nb+%x-Kg0UBr$42BKv_p zBD6IoZODJn-L>*I=^O*gScW^rxZB4lF+hMF0u*2WCTE%vV1)AqeiIdyPsovM8bpsa|*B>l}B1#6de0SZ>xsEp-8TdrH(PN$d{uDwG%jKWxH(^S(~;$5#aBQ<0B2=5M)f2e)zS6)8_E#%mkD~Of2kIDMy~e*R(ci7Q_(qK(%~oYif8H3SmVGltBXtM;cOEafOWn@4 zgpiFocUP}cp-?RNe>BYe>WPzz1r{ibEz-=(KNc-vByKQ^@~Q9jYM0f!Nek4Li>(G91{9)M9I(W*M zx)-0kBtvANZlVPvdS@x18JT~8Kg& zqRJsg71DYFp4;4fXv20clB|A^2*OI6_{_x1%gf2s*TKe{bg`BndxnnxYq=9ACYkVa z8z}qM;4wZA#)#fh_EeT#6Hx_FNlL-l&z$1V#IxA{8sU%;%VWWWp z8IuC$Rn4N&;d&m}<(f;+76@KQwlh`*>BdFBKH)d@Z6ZfTtS=dg-54at6~_zziyv0` z>MxkrMQjv!^*pR=$beeeMNWx`r-<6?b5u91YGU`q3B5giPVtABu%zAJ)?Ptj3u5Cq znf!q)e@ZYp=d9R>z|+mtI^GE129XC$F))FzPI;84#JVP@sc(T`@<0j%HJz+WugSBw z-!wSV8iD2soD z)8ghYn;o%rjqd-fm6eiqCflCJwsPxCp|-A`p2+}z4R7R>dlNY5ru>tvZ(cLgT=B~c zFfE_p!%`joMVxfA{X60r!N>g<9Il(%-{p*72JT>96pKtilS@UnR z(*^4vzloIegXd>vN&ynF_{SIj1iWBns6}SeZS3c>??lcXq{{YPTn8$%UWt(+jkg7wD07NRH< z+EZG(|GCDYM{clAz;r@dEx<}g!5HDZ%J(KY8E#F4;zJY!LT|~F^y7Ji32W^)g~l82 zXjoZVnqclG3Me+A?-;5?2Vp~?hwZtC|{C539rB?hPbIH_#NNMj8cO% zTn-lQErH=(4PPQz?oNLctPJ#1-KsnVY3z&@cbQiHi8O-xLChtXUI4;Ejz1ab9Qgt4 zA*&E5Sw=Bv?aGFiFfI!-8bEFBrQ=-;EJU>kB>h0FMk;7svc)iA!QNEN7XEnT>pHK=n5b$S_>K-By$K-3xUiO4p|}@vMp3`cpGL85=Fy?3LMB{QhHyE(-)j-iuIcQ3h zr}J%=S-auQSMGg&n!#i<34;b5{d8?PSnzQ274NXsshB#Ua^&1liToPb3Ni$ZQHvHY zuHF)piW~I~iR)e_eaz#`o#QwXM$uBI#3?VY&AoPj7#gwimCJ2==U{@PU~kGFITprb zHCt;#!;=6iAfKTl=+M-0QbTW>~BK!Y#oPe2`t z0lmKkp6;e{4My+Z)z6tj{JhWSxZch=TMPHa-!NfxDf*TI)3o&yyU{SaJto#D$jLYG z5$y&afqPQZ*Xxc6BTM@H2?nX4aP{8&YIP`0+l=ujDd0wI7?Ay@PV$3zfdBRDSz=y0 z=hS&3Nz&g~=XFm(&)OA1u6Z3*o~O+JYyO&v6Ffj#arMwu<^{SUCQJS3^A|F&-%A`Og^tL-YQJySRl9 zLa`cA-?bW_-HxS~AqCA(HJLIw`|qH^%yT@>v&qHR@NDQ_-0Y=S-m3hIV#)UTH&1K*>X*P3l<&rt0=)*S+p>vCf($Bzz6BTT#6-iCz&xdQD9J%! zg0)T?e~+)Y{_(XpoVyjxhTDQ&O(w@jXgZDIOC;?hB?3c!mtQ=s_=5vzw!V^uZU#Uc z_udguxR{n4r}~f;d@}Je5-SNV#3N*_y7lg`#RHhPH!#*PHTftHX71KYXZVqDBm?*( zkXiwg@CTxjk*{aD{l=|mN9lY*%VHoeY%OXhuWtEIa8ZJW&lgCv)hHB6r!e^@EUXJC z&Z-N6HlY}~eG1ef`Ldy!-3hsv;!UI;DC*89b})#MPT~KjvMYh6at+tp*r1bnPKHc{ zND5IXWTQfnB$T;9l0=yjr)^3|NRuH-nL?&yPBKMh$V@_H$dGy8=Wm^L?>cMUVcor) zRh_l%{r`J^-}}Aq`wZ_NR_KJYQp+Br77q;F0vd>h_EWS1Qc)>dWVDW%CZ~c41$a1S zaslcYf)56q;#9@4_5swlL^lMz?MEKpc?ro2_!^JB=3)s=2M9`DLn=KxRK#DgFnoOi zNZ0`o64<|hjpOjWY#wQ~E_m`^c^VR`Kf@0|p;$x>p8-YmH`g2EaD|2cKJ1+a24^8( zHALnB`*VAs=drXaYX8+W0r-7iKtf8Ia~S3EIY0^GDK+~Dk1BvppTPodwYV-bl<`iM zaME^X@CM9+lNFX+Mpv%P@=4TgM2j{^I}u0q?_WNTft+DY?pvNb0DbP!CsXPi4mYtv zk$j~O{^UbxE-vw5wwRa@6WKtC znf+BOI|>gl1(m}lri%-ZOUWsd=T3moL+A(40zhxb=#gL(Qa1FBW(fyYfhq+(ss-A{ z>3=jF5ejN*CEsHw-Jifv*XPaVmmsN@z))Opz7tRpy6zxpwkjFBk#nM*0N+NqTzmX| zh2U4hDVM+lfHrUpQ+KGSNTqz*3bP>?M4v;`8f!+mL`#G4$OY>#$A{_-9t|OpL{^2? z)ypHadX{$S7~}zJblq+1`}lIn%|w@5)f>c3asl zziz_r9&IgI%>}e23N9ewF-+LI+vZI_E?R;`ziyMmF|ZVOsRTU-xiABkn1mLKpx~l# zQGl2bLNMsOu$fE8DDRDy1N}nwcrE4-8V|JWp_}L!Q#uik_<K+(g>AgHE))@sR8QOQn~1jl=GHI`6bV1E!J zQqUztIPri)hyXyZjXaIkKODOk%K#)R32@Y)7>E_9K8D`f;>Z!7R7~HYHp7I32qa`e zmB$QY>A|#3rFn)=!gs* zNQoVm1J-Q%qH3wy>VVo0Fx3F>ntGo{7P}Zmoo7a@8Nu}f9a7j4?{P2v{RE}~pv8E? z`wir;B^ZzL8LoHS7Vd@Bvrb8~KlHy~p2Zj~U%ebnX4U~(X+j=;IibauJ9+XP=F zF$_Umw9Z0rXZ&Rkv(o0M!KZO4osEMoWuc#DgJ%{S+q4eufhllZH>T+lT5^-_YA28FPGV#Y#HIUl(whzir>#q1455wpeqk>(QX(v^JL&>SLAU7sjU!6}Wo zM*D_Jy1dj-sumO|Gtk~JzHTfF)vu0dM0Q?NR1ymLk&p2Qm_5gjmn=r19QMYfgp3Q% zq>W5XC7~1;A0OxZbe@RcNDM&cc<{F10~iXkv#pjdfJ`1yovQq0yny2fr=XM-wa9JNn*SQq7eW9l((qk2aEpu`jA zy{(o$#mnyCHWM^G!n8hSWBd5U)$bQ)fEN&UCg31Mh+_ZXg1oA}1)5)hk{17jqR{hyrCZLLr% zzJP<+@@SSLiL$FMvliX75p+0B@LkZ?sUInBWCjnj#Pj#jjMlhp*y(m6G$kh|Z&sRO zoZtNqMg-DHt=i*(jEEbEKHu`_36}ag9uP7Aj%iotair` zgm04WQ3T=c1oUCQvK zkZdB|vBtTK)ze+V)kGZ$ZBn~)X>ft-g7n?h*28hDcG*YWiuR5KsG?%Cm}M_G_6XGC zZh@HA#v|H0H*cDMO{FRqt-77NK`bXjK&_H|p+8E}>qbJ^gY6D#Y+R&1${I;IIc=NW z&USCu*iz&T^|(0pFEuZ^WU6cv_1Yyvd^^iuH6}KfmOrdC@_tud-8}PM@>8)|v%3W{+N;qNjqr zAQ&9l{*r8B6;%_UG{{SGsWVy=Yu?-F9b@gH0SI6Jt44%VAEj!(L$EG)W?CnZ(RVgX zZ8}_L{PDhMSElL}wHyuyo8ToM#sxY~QcK1XH6+ES^nB0uk3HL)ncvVB&(M1Np5C3V z4T5oRqbHtOG`Ynq(0RnCfHw4esbCV|gZayX?Y$j}ES^cStlRt6@Sp}N_LfsJx_80&g8olIS2}% z%w;Mx)}J8@0qPhNvu#OVUw;_Z+!0{?ta5V?6OOpVBpW21F#RF&26PKk!MQ_T=&1i- zANV|lXR_K3gpE#2w1T)P2EFX-*ROZ!FbcJz`%v>lk=2teG87}jN$PBtA_@VY?A&NeJqfOv zC|<@9&K(g+#H<=H%^7P(iWa!IrhGFf{|;cq_HtpV2xZoDjnCQxeH{%0{#me zqKJ|SyNCE(38s~Q#u7$K9U&9Eq8T)bU+xh{enCtm5F-<31VNkq5kt%oLnQ--3301H zk>62UyNemMu6%bS`814tI?j@Faxhu)$zcu+n_WBpzH4`2d*mUbs5`ZyJAT)lH#UkL zJ67-6zVN1<`D9dTyJ*8<+q|=`5qJ6QkMe~&$(l8GE(1aIse7oxP3XSUt*;kbY})6^ zb2x<^!e~;0EiV(7v^qSkD3?KN;oSF_IViy)4vxV<_$ZpT;{r%Kr`R9<(>WlU;;S&#kZWUu-9CrMk zNtwS8$eGb?t!-g8W7~hcp;x*w$iWTyFUCmfMEJv&NLWVZFQ|Nn$H%qx^lI~I%wMExw;7xgJOK?YX%**1V+^@0{G+vO$+Jr@V@RsZN9IDqpgS3JWIz z>-J>+fPAT`qazqxJZN3sVEh>=;q>(xCD5FRJoNicUf>QpNu_6V&p>;;r2#{t_B_Ab znGT<+a`PiS1Kt=_9aFL6nU*I&OS>`^^>ku zLN8#PW)I8SUgQq6B=`vR!nycwR5Ih1Z#|W{WGzCF;vO)b^8TJ%u(XA zDDhDPv3Lpw#XUd5lm-fmiuzpl(2zhfmE$p8t6THD@Zh`0aVzd;p0CsUu1Qss)xOHrCRKDC}H)ioDR;nvO0Jx?Ne6r z*}hfj)ucg+PqNBx&%{`opL6iQ!X&%+;$i`0WjCa2<@iDiL$8Cwkv8Od>CzNsa??>W zvmnerF~?Z4yh}6=w%jB+Je7YOoaMIsOItdf6ajuX4O}a>knt_*a>9myr;`=TabgrN zZU!~Z8HpP#ec)~`0?#a$QC?!zIwAkx;#T8_I_a#L2-+qtE%*u2Q?FL3VHu$-C_5V(UhqN%(4HYydQ#a56V z7KRE~-e(o;JjhPJqLT0C8!WpS59EU`r8=6umk zifg2=qR9z^th$iDVzqg+get`Qi_b{OUl4h;r)K$;(0tAhD*F9g~te<3GYlG(9q9KeLmk*4^K9_=zt*y5h zn7D@J-K6tRLcrP({p{A}Yir?MuXJrj(tJBNs&FD~z#a=UBM~(QKHb+tiS6cC~FrQeLXm48i=!?dwvJ(s+cY02D z?H&1!5BTHoM(c&$va3%kgJgc2-cgY#RIAr5qLKQ!d)X76wGF;BOy zBa9_R*RpP4yfi=Aw@y$nP}9KDGECx;`~K)DYe9J?M*ED=Z%{&K!Qw2x%PHse>xArV zb~M)ztNlKWXxiILppWC)5xV2;p)Sn}6KGbXcuh<%xbj{v1o{1()M%$tz;I#8^r5z2 zOiY_kxfHJ|+nJhV^>CI;NUS`2`(B&znw4)0`LUXx+Nx3r@!!?pH1~5+4Ae}y#nD}e z1QF-Tw-kskcf8|xb9|RSb#JxB$GheP>vBTE>@S9dL9Td%wU9s+G7Ou>gv?%k+rBCJ z6WU8z&VBoT_Ta2ka-S5kIq~jlk5|e`UyDpDnhlI}99m^S2;X^`dp4fUZhu+Z_DRE# zjPUd=qvr<r<3YRyX=wq~0~+v{ zd|hGgc`K;KNt7)TPFGP|LC+2?I#KJMEbnG(D~51WXSb7>sK7t&Gg-E#sj2A(76}5( z2FzSAk~*JddM7F>00$VRi=FPQChF3jo(3^iRIO%AnobY)b400B%ZaGIApMZNHPzZe zTJ5Ym6_&yj*{Se#Vtrp=F-v-8Q&W$C)*5N&~N&vODCS)2iAXj8KM>*|3rG(nr%+LY|N6rGDJ zHCg;wyU3bTi=SMT9=IQTY?|>CHevnfFer8kuBFf6=DIx8pyllir}4VG1Jz-46sHF+ z=;<~5I!|$uUCj*2Xk?gr-%6K%aftKpA;)*5y>y4?ZcW(@3VCOB1^cLtANbAEqaFXP zxwCTv>1#`uB67K#u+t;?LRwLt*W~co>1u(wl5;Owz=(3*bDw08{D|@7p}5_SgCa=1pS^s!sfqs@hzVxvs(-$TgYyA#Xpo4n zBBMvJ?D73&)0HYt)gmh2+le!4GGj~GZu7dfbC;F0Y;2rUpxD8RLl6;xWCa&0og+sc zf4&6dVR&RjLyo5sbh%8AX*-fS?8!jVzo8@Q2N_U8ax$ZKqG5+<)!AGTo(&>w1ycb( zFir0^u`G~gpnqH;@z|3#xQh0~y?Dv>nuh*g&I&ZG%5?B)3$F63-hBOhWfl|n_DZlXntFPeqiX{YoLEScAEYw$3mNC(u~dpigq)HR z1!A#8Tnkq)17Y2_DBp9raqriOc{l9*HA0Ijh3t6(68E?F6z)GCr^1v^dr0$BDmWZW zcX5M}`;gIIG22>!6_nc%927K(VOnRUvV#&ZxLcit9(h&#n+Y8sB$ImP2Egb7lJ3F&5Eag|Q*FUN)F*=>yE<|S2G<W-U7$COSRVTfJvXY(05SNRncnQ8dkATloFoHQ`Kgzf$p!Qt(EDA>>Q6n@lt3WB~ea~J`Q!`JBk@y8vZ}L#y z24Zwn`G_lix+h~m?SC`hADk_xA|g_FR8F1Uuvv#pE<1U#H~_s}1x3ZgygY8)rFJ6g z##?j{j+vq-d;Ulyh2nI1!$-}#uDJO4+BLr@6iMZ&1OA%CW1W?+xCkD)Bsv9FJPc`h zo&-|xU@IjZBA#%UgzLd0fgW#2JVVTv=05QRNgBK+@%Vqdgg(y`28~kH$UR3d3-gsZ z-L|-iH!!Ey@al z_Fi^flVF*?xbI=>jz7^dtQ;+i^4(d z$CdTiySA>S^^WD#RvN3C8$af{AZ8wQV)vm>_USwP%wPCf%0^BdOAp7bNv>Px=bPd} zqdZnYeV|yeOIpt7W6u3^Awt#C1EHO#m*tsQ`~%NXkRB${`lhBD7;|DfZrXU@o~{3W zVR~AcpU_nbvz;cd89Bm2uM>exk{(|+ezMy);P2!JDW4rCP=ynhb0G;S@E#m8_1qC<<(^R zn58lx+ufuAko9LtxQ>4Yt>cF?+;(Gp{G$oB?&2c4o2>`$n8t9?pVnkNy)phdrKE*k zBVYJt<*$5;v$9DLoMF( zOWmsUyZrL=O`7}3+xFe8w0IWUAZ*Q>?Z3ra%fQ%JMzuO)&rbEo&HcxD&)~+GVx+LD zYV2Lz854qKP|4dSWd*1*I^0ifl4_hfVUw^)By=BntR#y`(c~h>Qcxd8p9T8F*(Bs0 zp-_g$xvr;&<+211hBrwyNQ;T>4Q&t@h;pvv$J?!v3^{UNh0ZfYy=Y8IX}Y2_MHLrG z_$I$cy?WnG&Wc6*<_^=RiR@RXe0Z|BN%@YJfDcU3GYTd@PcHw>o$|vA)=iLtjWRy29$P&ovA(Z1O9HOF* zIF1AaF6#IXZmzESW9k+Ajl1(WYQGsIu&q?ZaB|RsN8ig)Qne_UZ{Dr*&}_*I|NJ@l zdZ}%1joNuL&V9JrV(F}Tq=?TIj**i3`4ycHw+MOuC95$Qh64w@zQdwtM1+GEz7a%0 z9K3!*;4GhyphkEhg7P0 zj1)2P-{D_Ac;exx*iCTS1R=8cz(dO82wzK!h0ew|p)v(u6<=kj7Q~jA-O%O5rOTmX(vkucDjz!nW zmNYA^5Jo()#}FG~#Kq5hvyT$qK9-C*!N{K#q4fE!5DEl)zLg>CFd4;UT1IVONviJ;0c#@RU9sSjYM2D2 z{iSYsT*9@fe`pF~hjFp^P3wXEjJj3zXdcFU%O+-JlFpCx{Zc)df_{q{>GLGFDTrcZ zgn@+&+O*nj@VR?40)9TSJIS@BW4>vsR@JQMWKl70`We$h8B0b#a8*mQy})wt6brZr3`UkreM!7Kr0tB7Ns~*Z6js`7ZdCPrKF&FRZ{?74~Q^ zjhb)CRBpFtqi>-|-wCAr{#-TV zIu8d$zL(_Y}xmTc7MUAWQ->u zuj`?Ax=+VpbE@2nXEfLI`xNe*61ouhx8g(Qc-Y*crt1yqsj%l%nP$y%C99PDKpfpb z8qYk^S$uUs4{`fLETGGa+T9f4_&Bxhnqidfch1n0VhWR561Hqc$6mbN_^w@>I1`!=FLtno!`@KUI4M-N!fcd=Ye zzt%74LrPFlB!b$Wu;wL)U?A#qL`MBXp`|it`Pu6*$Yq&(M=dK=c2le0r9C{!C%?1N z-Z;|HD^a}f{@avkvxJ!gZI$ZyT(=R;ME6o%vl2fQ3nG1cM4yko`lSvocxEfU?dyf5 z{;GfvvR$@0Brdh9ytNBQ@PbYx2T@*~)qoF8PJ-7(LFbDd3$zC2CcP#1noV5E6Zd0X zlv7J=5M+MT8`=2KU()i&9Q=C7M0p&(D73!e+M}?NWo7=?OGSTtk4QRFadCX*HzWz! zKK_j_ASAcwaFFOAOW!&U?PGMv*bnmzWBBzoU zt)uP=L2rd{3d@nZ<-HLz=?cheBxZ^+j4fJUUs5JJRegWD+56&!G6W(oXBb_1enC4| zPpb06obvS>g5>Mh-NFwEYXL%9;tD=5KEnMG%R$2-)M5;f-59I=`2GkVZlyAv`_VE-+HRpomf&hzEMIGi;H6PC0;$VeQ(fP>R%NN4PLEq!)I`*V+s%8M@TWF+ocS9` z00-O{;^&ij%GKv4akkn8+s%_49*8R^SfV1^qP2)4wOdq&5i=P!-`9=>@;P+Gzy3tc zpDd3{q<%W%?smblQ+>Dgc#6t_k<$KY9Rj)obG<=cB3hJ;90kHk^pDE_QJ36-i1)B{ zm&^B*z8~ul_loE)Q4?pp@l|z%0*=tO8-Cf1tV)VN4?T$SKkj5i8O!V2nNd#XG&ppK z+0GtluY_4$(`|P71eycc!H1D~rVk+!l)I%r-3FM<-q7mZ!#Jg-e(iKv3ZvsDNxl}h zT*Ld=KP0)zeS~(!^e8g!ydgCDjKbG>%eX-ndu+Br7B(B-XQiGZ>cKlt5>X9Ap+fJ? z2xPu)DN(y0GM+SR!Fj!(XN?|~V;y@_7b;5xD`&>re`PQFn0VyTTtZdD4QbcY3GOUg zCP++)L{q8$_nz$q_X1D51=Jch1rkuK*>F0kk|Ya3$4;lV9nUU0EcZh6}g72CGIo ze{h~2mwAPK;;T`6MZ@NS2yvFd`J(AZB|r|zBx_`_|B*Kf2WZO=v?jKee`Az1t7>7kXevqCb zq72h6C(!7@RCY;H@mL@xS@-RV+f6xCPiHe`K~#c$O$oU^aTL--(O7DEa$4SV4Axc| zIed(;pt{r5;Mw%szQleTP^tXLE8j4O+>)6n1ufvvu}rCjg}hLr2x|B(?dET``7z0< zOk^Sh$7N{#)*iYHXBt_dx|BixDq~uNz&aqO5;oMYP83jLJPoEN2Q~|~>DKC?5SPM39*1}A}x?h2uGrbaJFQR_Mu}!WK30K zjUznaa$5&(^_U6|o6{<^>*77sUBdFNlveLtNS3QqInMbP2;(S+bS%QJ?r3iS4W{(#_Pw00_iVVJc6{-NwXpZmy zRMRP?;qAgSubz%X<2k?PS&qWPfO+_tZVMNZ@oqg}(QWgy-ibrJhK0NTxuCzO))O1x z^wrxZ1F;Rq8=>MOC1}PHfvXk|;~&&^W6`M|cFY;JM0`;)0<_2;|E~LIviQFI&;OB+ z{vBp`OCF9%t{7lX^S<`9(Mx?ZQFHZax_`r|8;%)T-yPczPaVzvh~k$dAF)1ZH7=jR z?X2-p(G{%u4RVrtm|}2|VZ3FWs}|dbaTlMU+_}P!E>M2i`Ei>a{rRAkj(K_u3yd`V z_@yGI`QTjx1?LXeusy9HZC9<=YN4OlF8-w0ecMumV0-bG40PRMhS5(_BHH0}(TJwZ z;sb7#>~U!GIAeW~oyhopT{nKF?72%zuSDkB=uq-|Ybnmba7k&I2}8Lc12g(_t8TJB z#Ljm_S5^=!qs*V9_ka(8CPd7>rtLpL*G4aAh$Uym1{gsD9X;pw#{M&yubgq?BSeDM zIe@j)B%m&~dYv$CtX(M47rJ4*R8x165BL)s;EIfZyI@1Ejixdve;`3#`TT_!|Jq6f zFkDee^`@UOegkvnd#<)+ma)o(_wm+HEr9E1ly)iM%j&3l zlAPK&GoF{(xvWtR38uDP;b~Xfs1vnrT^sWJM6;iO({|MU`LsoNZqe|kC;Y9!!$&ra zjMG`arn{+Wa=#kH3U_i-(d*yE$+>WH|R4bK3F#}dNJ5KM=SHmqQNvTTssg9PP z^78+<%!*`Ir|0yCS03yMEGg1G>vlDUXOQ2T>kChRs9iM0T$0Z)W@eI{8>TQb+okT6 zmw4PNYg*LEZ>RdFuSSB!2exG zRc|oG4(7#(+1l>el_*fayMJH27_sOCftbWmK|T^DCNwb{y%K^`_90gz{x)$J`&d`n zh`)N&e{}?c@#NU}t%~AB@^$wv2_ZXZwvJzka0<3?AH}F@5UCCtDS^6Eso#c+o-aM} zLpyKNG@x6qTeLcCVtKCDES+rB$bcTKGk1cLWEQjx4Bt>xSF1&I*y2H+@Xj8JaR0l= zn!(g6dQt$-Kx+qOj<81i$pa$qNvzecVH(A&hG)0>$pHy}!TWMIUn}ll9+ExuHP)Yp z5KS!;G5?i`5i_$|bpfE(9R6w1nPw*0x?-`N+M}L3bl*^F^Lbm597(P8kF>XL%vfYZNU1pJA0huAB`Gm5^j!yrchZ<2SMgi7DE@zCIqlSC%O^5-~ z!}M17#LI)vY24~W0<#);P)KNN*T(|d_b0n7nd6o?LZ-0QCH!J$T-j^KBeaXFZPkJE zMr62!imCDrr2!I7wXRM+nl>mYLAYc2yzVOs!lGn^5#uFAD)G)Zj#Wz{pqtko zZpj}qY<_b=uy)Xwv}l+lDkX7&?Yhn=N|(4W0b@8^D&Hxa`Pn#3o*TB>lMw( z!ftYn<4X~#ufG^KO*BatLck(?rZFve@ThQbZq)zH769|~wHT?^!_}2(duJB`72 zhNFAPPfnw4?!)G|v7Y}Ef;LMMsHtwj0}ua`s%6RXCI%ePE^8)JzwH{FEgIzGS@oN! z<*xxd0}^Z8w9AZ$AUaA!9MPEX&J}C5#Mo})O`m0YgoYcOT__%Tzb< z?JhP~6xW#IfrhyG`g_-U;RRymZ%vn9_43f_H=z5C+hLL85rNP(3v~0P9x8IZ^ujKZ zOj2Ma(wO1BG}o1)mQ)I)7mo%IWz^`0ahp~L3ju!j^Ela_^69#2+`$~WWwo378(5j! zu691xTBeH0)H(Rblru`RMn44shuv9tZW{&@X6AhR^dEuWKm&^}-@OJ}Q|l|i-}I*h z=+>C#e@t$e-$k8q*D@cPQw)D|w)834!8X-ugjn2W?FaTe)6i<;Vce0D)T4msd?-C5 zEZdcEWN4ZHHy{itcbPrsnw|r&5)zHgyJ;{P3KUVsQS#g0KY4x}{-5Fx#`cwOOEbG%Ioh87vJ(93L)7r9Dq+$;t7ScJCfMxU zqcvzczVbzdG1(~CrN>imGyDhyRpqiwz>AUeVj(QW&w8$L>u1<(PVd&zlOwP5Hu*4O zm);z48w*1X&HD;Yp=^Z9F(hoF`68RT5#t z{DIYKupqlKP2Jfsvp1*FdOVxLGIznYLP}+(I)3q?Fh<#ugp+8x<|W7GP;G6e)C0=s zu5zPm&1|-ff_FJ$jL1ds>)MGKzjAu3-mr3x4-Dyho!Un9-lLAYO z94vbVdHcBV7FG3fEX5iPze&fSA_r7EQzxfTWKrDqTNpp z;88xt5@_e39$8b8jHGu@CFU{^n_AE@;COdD6aef2h5etR7kT$rg$yTTl$jeYd6(@G z)bQwAu8UodMsquC-zRp1gICJMRee?|wYU~=)u>Ib)k&eN+n%62i(+b1KT029d@#WL zGQ)(MsEg!fon_o(wuV2BdKzx?USTBYWYF=%q3hdapuN^Im}8+>QT;jli5XoI^)*n| z#IUM!{;h%@HL#emi+SUgnMa%=^(to7cZ|Ro5K&7i5+1g?5Z<6Ixp~<78$VCpU!bdaPj9gjk+LmL9f@w4yB= zsbcI*-tV`B4k7~)S+1f0GdUD6q5^!0&9&_&uIQsRJFOKl&Q!D?MdCYR7;}C3j>E^B zPRuWTzO_+dxy!g1qDC*S-~}Jbk@+>7tAfs$+*35E09%aAeusbr(7!lfneB}_AdkH9 z&KJjxw%I3Fg{|W84UJ#&Q&XeT`p)b^x>H`F=+phLi2>_xjQ4Z~g#ug-2~eU{ zy@9e+%97BRU?$MNqQ^W)*vOSV%g`^t%h_GX=cy#hfzD9xPmewG;9=iP2wi=NFfH&F zC6Bnddz!wDCF*^lW~}C^)dOWrbLULwg7&~gj44a?iV_q`S>_qACgNwAPSgo`-?u6| znzG2&l}OB%Wb36NRSkKTt7&8$r(9v5tt@Atj=cirC>X1mEI{H{C=fZoy25}-i(4<4 zxxuN?=XYgifYBv?n0n%HmdA#VxS|IHAla(axvvtOa>T}^yeBWM&SQa3y8c9=^Srus z9`B?^eD7uE+ICr5IwRJ9@*mcc zc>&`_)V=CeB#=Wl@XO#sQomgQChg5Yq}}<>+pxPrCZMFm_%8$a-Vv)e@a79N=V{cs zN;?RLk_0tHpJBZ1NPAntCpjiu@;zU^0&q5cR9L zXy?iWXubR+!UcN%XPU0D`rl0ce@)T<9~i{{pD!_5`vt=V?|Et;zKePJ|J5A-|9txY zkB|gkcBZZGn!vR_+QUJ{!uhyQ(kDS41CzW9e(4~Q_lOrZq zpV+2!3K$LLwPT$Hp1lm1`#1B}EBg^~^wlBUBcIZ>_aYH`*7M_;`yp(Yg)3Or6~&B? z>>?$f>Qj4Q|LMbwYr;KwBhu0xEAh9e3By@h9oyFI3%55Z!T;tJS9||W7v;u@=JJ6p zN={r&vp`M63HA6qtaHlWkmr*9c(bd$4^GU8Onlc6azN|BOb2-!r}!&?9Zopq;4X;4 zA)mm~Hk`x@?oCyaO_$RX5 znZ07Qk$wi%b6gw*P$t} zO$owxfoSdvsovJ|HOzG?S%kRR0Xcqt;5|0cQm}Jmq%?h zKSiD4<$$Eo%+*rOx6i#puLAOfW1sf;r*Cex zv`?Y6FCSqW!zl$>Fqq`TY@Qe?Q6a`?tXd|(3fwo2$`HZt`ayT*%&kPZV$?#4$xcuOnpIjaUp98Czgw*_wz{42( z_{{6*Qe6eH*{MvKNT+c5pgpE<=>RIV>-Kzg4<2HUBrZft&!D}7w?mbN39YC+)m_{N zS&e&DL;-YUfifil{)(k79lrzl{=2LOx@qdM!oy~#09CkbUM=vv`+v~d&+!$_t2 zux_O|%pKlY`tF%aWs?p~deMZ62S}E$9a6u%yZiEr$pL%b%#020&L8*DJ_#K?1(w4a zC26R=lvAw3!+}!{#tRcBxfaJSHASH_Y@{!!)2zI6A^AX)h&t|t_0-F7E6BE3VAh^k znaHj6mS8paIgXz=%&GH7fva;CA^yKJZEh+_KT)v{BOPA1J)OSv z^n5J^s*l=aV_=vJ&WXj_Z6R48catojT>8dKbGVTLc_N1;1LHdjv~KQ#OI-Y7$e}49 z+q-Zea?Y#$U{T^%<>5NROM_lfuTHhp8j3j<;4UX)xU z5g*q7a8sx}=^UTcFBdz2&zKAD=UoUrIaH&5X~r8Gz+Cq?QQ-jn7w?)+3I*y0jLN0w ziekzx1`7+`X;TR!p;5U(ev04*?!)+BN30o;`ynbPQr>*{+~6E2tu)j;+(&;KIApAJEsueO2Kbq0`FB%Iai&~R6awbbXOVgpp!HAt4|impS9(kcqpl1gK^@M=DNmKG$ja93sUooo z0iH7xmn|d0gYIMky|0mBjt03?kwyYo?JQ-nsKQepDk?AUB4rWe?~smH7*1DSV#7Wr zd!5@E4Lhw$1r&YnTODgZE@`!z(-1ACN4=3)MAGsh1-(y$IMUtYfd_BC+4i=r+A>=mDC1XuBdZY88_T^3Q)^Ea#g3uEuISjaMsU>X050?0*#y#Ay z20ClEaAjsRD;pdAUOMZzfo;C4LagWUdvom{QvxbQO^~XzWzWeh+KRbk-`L-2)XP#4 z{Geno&rm1A^d(J70&2k(79`m4Q|1tJy{PN$NFtN>*<^Tz?P(w)Vs1Me9PKlp!!uB{`z zOE{e7_6snrR?KV76a#Z`Qn%;rO)1r_h)kB6WQg6 z5@_=>lYJz2W=|v!=hWuBMqidp3)elT8+iT?kLDD%=7(3MYyHuNXuR{|PLjjpAB^!1 zESdyrdml31>vHzf$g z>KR_}h^XP;K3uOXi$MfL{`?1@Q^@fx91KcYU}IdTsOtbIixzX$_fPQhzDun%Za4n= zNVV?wJ*~Z7LwUn2bImv9tj3!3%qU66Nfvfji3}Ejy+{xW0VcH`9(Vb_HYI&w3aZW@ zA?X)D0<7ySK+5-p#mbqXts%agsO>_3;exluRm|epr2?YUs|?e)=IzdWvwlNn>m*u> zC8VejdZybW#4fN4Qf=;MxODIQVTZ{QS!^c99ozlaS?|pFThHXGz}}gNFK}tM%0ff6 z>e&hHNIN1&P#TbYFr!y)qGLpGza2Cuhgy0JGa{QPJxxFf_BX^^+bzQ=dvx{ zaX;L9I?@1aak$F@(w-Z!XmTVR#5@)Q!hUxN?oX}5S={>0ukodI7l}5Bu+DlS+c~vwhE$M(PlIX+#4z)kgbfWJ#nI75dic)|vL6-`YR4gJKiSbI)3)P2vjX)YS{Ul47O7!MUAT1s4Yf+bgbD z7poXqP2hL|mXZ-w>ny^d)tR9`IEwuPfwK17e?mxFi^v%;y`nDSUzLR-MO{8M zrZN52zTYW}IvQCx^807IH+(suNO8G;y~Q3d91G!N#I>9scKx>1SU5tPF=CnN_el&- zgo61uqgGIjGS)5{DJ{MZ~X4z#R< zWBy6XM5P_TGa%I>mS%zHGzTmeIu?iW_7=jB)5LEz6M!l#Do4fuIXYe=YSQsu@103<&=M+zNzS;?~DEn%+m68Z((`LUN%HvE4Hhek~ zf)NnHP8!Flr;)g}&@Ji2f&P4eP>%O726uGVUY=q220x{^V?W9?q%19_GpFNN$I9iL zW52E6@eh00P`MPsQz_TEsAzs)w64&35Anx#We-4nA^xPogW4*XO2xu8=BG`Gbb2$s z$n_yJWvE>@8aZ(^;Q?v3O(OsLyQ|o>#kvpZu?Zqr|&AC zFlOt^-Js?JTu(YgsOXIYt*X+OH}gz2QsTe6`+~%n%!`!aj%V9Kl1Kd^uH66K7svG8 zxNUH(T}-zTdo{LR?PHqnV^#LcACsbwwU(2(mZ|iHZl-xxAAY9snYI*LEi{7Y-{}P^j-C5~t;ktT zSnx}?DoGdW^B?hFe-=V8spV|l@G zWJK|A>(`ZEo3}qc;;fA8?txI=L1b4um)u2LG@M$>gxj%f-Q%UG6{}h`?H~fC{STHs zHtBraS3UD1;`sZQ_Yfa;%~r;Wm#h{Dtma-rZ`D+6g6*Cvq?0(WrjCMRYejPpkw%{v zGVBKX1zV8yKw@iePb}E0sg`u3m2h*OMXsgC@8?wb9jvgl*!l__T}8v$MM@6jpwYYb z$dJ3wAxwfVEp?Q>hGMkyZSU;Z`K)=>!@H8h3vJgtDK=>N(zoymLVvGOj)JHYCx+>l#<*uxQLv@z1>Cf>PyH~L`4UG0O{;Cqq8 z*2@8hbeQ{%<-oQ$m)me(x^$9T9!wW+Oqiwn4#%>_gSg#*Pf@lLI=T1HUfXZc9xfP* z4@w@Io&YV=)v;_Vw&T7tTl#xFs#m4~E{ZbXkyXwc0-^(qfjO0V%SK z3{+l>rq4mvF|qZO_B8=1I&(Tq)D!hrk6P7&fH?}Z0){R2Lg#k=rG0@set~|!xipI4 zG_M`}2{x2=o1(yFHx$8aLbTE9lF<(iB*7H(n6}!+ZOapw)(*=&=t=(KNtc2Gs9L8{ zS9rhnwP^-gC^lh(Qa>%7h!gDwr~~dtxuj{x^zPgy0;In22^zty&Nq!DCCa{wddyp?Bcv?)Pz!C?E0%qBXx| z&0*Ad5mMfIg?##tcdve%T>Yn1$#HTB0{pp2`m^z)*k1T}1+aH}&W+}rbWmZ#xoKp&a zWLM^(!K4~e@$97bAE@AykA|FDmZ0pxLEIKZgv!srEy4Snq^X=+S>8*C<{dDp9;dF6t zKM~9}5dO$g#hY9ruk5UL)+aaHjtJ2Vz0IsLnV?>IEN!P5L9jbUpX?>KWUy)DiS{=SU2bO{ETcd|$bH)zk-U_R0q~so?n_8W<%GYZ3uj4&MkpBj0uWNKR zgv;Ryc~p+T?G*WPo4KZ_ts=?UX2lGv#4!95x419#F>J)nxUv(8j1nu9_?UM5e(Ty` zxtbH(`Zj5^IA&zQ^`6Mci)CvM>{3;Jp1tBDtDLm2O`LZ8Ix~RXe0XJ~0Jd9?OpcIR zf z$rR$XLFIMB$M8gyR14;`#?L#!?wJHo>(5ZOuAUnE>L$K|ZBK@5Awl7^G2oLp=OHx` z{O`NLvqZ|Zf*bRc(2Wn-aa72<@G+^W{hQLjsE8wGfp9bw(vTQZ{mnN8Zt)#8bs@}j z;Qzio{CV#vc>Q1Zi~qlBNc{hC@4Q-XG)0}7x_XD{yNIVjbM`@V=M1Rib2RW-t!s$E zKjLqa_jyy+nN!v^5J={hRpM)tPw|^PZP(KX6LG&mQLSWf!b){)GxV^|K9$f^Gy`8kgXu;m#r4NrThD~`1ttkMy!-nR4`sGLZb?& z#D>xTY$UUB@)T3W+}yabva&{-J)OIIdJr15|GoMGw;hCpwYHV+|0e{ENLgE(ju}ke zrKP1s5}EZ!%M69LUHDE~hf=sr?k*2F?M-!bh!L^K(IH9f7MSvHfAm7FYjgyz7M$1Y zG@(Um^ufWwl#Gn%-$=M6%M4ncZH^~;nl9N3gaHslgsW1ys^ypNKF@&m6gXgTj`O#-lu&uIOOE^b!q3Exf(?$|9&Wa zu{+t~Rc`dXI$UJ)I=2jinwgp!%~hJ^7Z$=of|Ed7a6SlIByjgF44ey_BNbjkf>P2&E1LW#%s zmP1xfu4hB1gis-wLv$ofaIDHgDeo>pXfqUpWbL~Yx#L^{2pTmzJ01iZ4=<>f!hd1s zQQ+epsn*RNdo%O)ViWgQ$yX4gg?dMi$D1v|rOU&nBf|9b$w@Vz%Q*{3Kwg>`s&1V< z!HoA-s{5w_rn>rtnFi-AR>w8*lbij~Ot{wjQ@JKCFKP}B{GFX0@-m0Lwxyi{Lbg=2@zGKXB=~9#>dP-=D(+r-evnSLoK|Zgt_cTIaQmXv)Z- zoSvS3I{hcJKVO6PN-9dc&VF%$JkM+(A-}j7|H}7pfj121JOYo#v@CVKHyW&*+-*<4 z{*$O4i;$23;orMEQrfwtIU-R|;|WZVV(j4XlH=)cR#g(k+wXO@>^ z&&|#8xNKv)?av0PWJ_kM7io}Fph2EjfBusJgEFVq4jKwdn9t`yLtTA!p~0EQ{g5<@ zl=pMfVdKEZ=<0K}bYXvT5^j5Ze#u`oJ-07N1qmI};o95MS6xLve$2f7Meo~!Pehar z?iFw>Xf&0lL{V(eqSO4a9xdF6F|JW&@NI9VEV3>~m^8=kT-?$!zju$X(teTe#1W>` z#`JQ3j@;p?pP_7}sI1lLdVScE12j6^%a<>&K|YQ_5oL)6Awq)BSOiN|$G6IA(?~3O zPkKy#3V6P&wVk7G?G=8ycTTi>0Nv892p2CK(sb0?^r!bKt{3LKP`${Mf`j-Q;x}SW zF;mmmph8Ra8mRql44XZ04E-NC&4+)XhBj!(CTFnhFVFTQ; z_eRiLJhHs|@&&a5Y1FvF2viU&@wX%nt5{n>hv6{QrRs@AKU+Fp!`cx;M@Ke|Vl9}U zj)2PpXp?{j`uiaHuV|$}JaB|9CzJcoLYjl#r5oMNf}PKtNCr?&V=9DT(;pUjo-FLH5xt zCcT(0hYK$wA|lcRUME_gl1^?~TvPNVv6-;CAL{+v*nok!9n5dIrI7Kvh5LsE2d_l& zAAYJg(9(K=juxn0F1WK1iDJ_l(T5a_Mg!&h+b2(VsNv&kIXp`FkHW5)+W#v0l zbMvhHd}PS+085(@NOcmo136?>kc5K5p>CwGkRAYdcwKgOHre9~bTl+)sF1%9w`!{g zW8H!i+U?~*q#d*tEahnFo1pjQN^XjMrS8-5YF8y=Sc*gI%OFGyC#a%>C%y;~xQzZz zz$ae2(|>)HOKjO=;XRQ=>vhY1aFplB_Rw04hue$yPmd2{ZT|jE4~Nh?EWj-U4$&{! zCC3uQt*z<*L{l7{+@{$&y!-j-cty0>u+88e!F8n_#$|sNCzanFapmDAzr@X}lEMM% zc(JQ)yVU#=36m5;*(}OsH~)_-05Mo(hFC=Rsm^t0{LS0}8WHns$p;OMw|3f`S4?!>w$|Z=E2;KFiz7G83pJis?e%N_6Yi zrga@$8xC?6Qp!KAik-OaO_!YP7M1mv{@vWzSatBfBjIvbLWf8zDfM=Sps{(LnhKnc zzW3P91mBdnTXbJu{b`Ygy+;KUkr!Q928@qprC*b#!cq5dCT17agrr_310tQ4uOh3~TP@HHpFe>m>KQk>DRv5wy_9EhQMe?QHv2`=5U zq$uJ+q2qhC=x$&4v|lySJ);J&ZOQvcu*u~Q5FE|7yG53><(c)iH>Vp*T>9S|&lgHI{=xqSt$m`Cnn4iM~zKPK=S{2@oE*+F0*%>wjN6YiDoMJ-eM#zzJ;dwIa+$n z9xBa?K!r60sv;mDR1VCM@wtcqC?P!@F=G8&`Ys_peidl9%X}ulM%8zj`wkuFFAXRz zj+PBCgSyoV1J1|20p!}ZJ-D^i4*eux&pg zauid^uE%}l8$)F*nXX3KnY@Tc*-qPlwgVtaeE@S_&`>3cCTYtEtm zY*r~?%yy}uAE()tGn<9w|^KP{{p2|*3!N$l%8HvF30kD`v+o(#|xbB+vk z?dGdHb|&&Za;2zfX@$G)O;7E{CmP+MmqpvRTxj@QOld-bi-M)1NGrTC0E1v4VUgoI zEW1o7ghxe{PPysGcpH0P9e!go`Li;_y)5qMCxnWIR^fBwwBWw%i&?i=VG_1apWk#3 z^?SHo-Jh#kJ18z@3|q&#&tVqiKA5lRva4GR1u_N(;&;14Ln`Qn4+x~Y;6q-yBWltp1Tdu46LkM}n~b^KZ;CPe?8Eu900_xZqw$Hu}g_R<`t z(@bAU8qUCqoK-pX$(HrSvrcEDtrJY(@Nbm)@ivW{Po%P{>UoWGIVT`g^vv;UiSTQJ zc<2C8dwP2ZJ_|zGU}WPH6HTTH)s2mcXZG0a7kI+<3|f7(?{#xjGZj*}?5|ibV1L7T z+x7hU)2}LuNy-xdz@_f)D*k^350umiJE-|*@T}9dxY(UCCdQ$J7YY1yxv#B_bqY8s zb7pU>$=$*6XLVOs!uf82Mp4fk_l=}f}hyQ`_J#7*}( zMS)~q&3UQQ3J5e$Bi(pS!j(+yuo`zG7i(3B-LDAx-SfPA_ii*_nJDBO=RmTEkF%AT zaZEgX{s_<9pOFDEuX+i(O9C(yX#%>d)Q&T@eERBz`qpsjSgWr$n}ZMd&23NGISLOK zm(_gmMdIB;i+A0CXdY5`BwYB049~%AblrofJ^lTW%b+7O!4L3C zpfDUq`q9JwzQA$)&kJF{X03E@fcvve?q&N@L$ehoV_6cBI(CV@X8Yh=#1?~SPMhg) z0xU*CG-mzAXP5aAT5D&y)XeJziXXgnUDBcI>FHUyi&ncpFvr5gMD{Xa@_+UM)C}Y? zF){T3>tY(QOCR5FA7^cshUG9%w{dXO2nZb5kvB`sEG$w625H4Jl0{Q|#r13Q0|`tg z6H3A`*iOu6r>8(2(cDQmV0-~l`2zGIupp%TZs;vu7oB}SXnIg#_)--UG!Me-w%VZw z(WJc8cj{Ok6!=pFt$ri$19zR!gGIn$I8T>v2{xYfkU=ewYncwqt%@^= z?hfaP2?;|p--msPPXdVsS|OBJJ)@w{8T;$9)x}T%3|u$m0dS#z2M6(mv(ZpdP0ir- zTL?>r(}f*0=hb9oS}f^o)X_zxQ!0tsjNuJDHwgay``2#z?&HpQ4kk^?_eZT_1`{ox zhlOkC;7|4n^C9AYo0|anU;%8_U%wK5`}Qs6o3{iCzsG^k1zd*+qTJQ$duK|aMHqi_%ZlIun^!=vMg)=7-X&D&+IxSz+sU^0@84XuV!TlTQ~~ENlCt`r(8Au>86u7vu8`>KPCddyzxW zR%Q5Mp3=&$uRY{bxQ0HSxM%{oM9gJNi^)^D>7jGR0(5qdlRIG50LkpYK2ux<2kEn1 z!G?w11K#5)Ufc2CD4_P?BYR-0=Dq@-NX5&0gLQ(SuY2@!-pla%&RKf?hwg;lVLXFo z|6A4B0A&M%sQ!N0V*RG+>6+wGmK7WtyRdWHkA~yO8&MpJqRd@qLMQQ1?i3tK_K0{MWkgKj#}@^fu^ZIJiOSOsc_nml}{6xEApM;Txz!Xyy3eVITOq< z?&IlRRnA)pSYBJn7mT1thc~U{yoygxo#Nu-8w6YJma1t$89yiZ{(3zc5*)!G@RLfR zUvoq>qite0yCVoGQgnVSTk3m!d<9ty~8bQ zxlCU40;@JIT-=>10$&)lS~1Yk`2ucL=Fc;OXeh*8BU(1I4&3%1U5A!8%qcvMS-mEu zK111%#>z@n#<8r4oqa@4Aga#~7fDKVYC6Lx{Adw{fr7!>#YzE~H)V-fF)u{HX_r^_ z%(_eRV94b0^l+u3u8sie36SiRr3S!=ktRH{-!s{zBCn_KayrOW>4znA@%C0|!m;O_bdH44|0B^q3#ba7G z0gwA43AWQrS&5}r7KuoQk?@y*=lG6ol*V{1J>3AOQ9I=R66#mO9Hi1M-s;d)B7i$Lv2g6r{8D@{c@B22p?5NJg{{-Wgwe7KN=DN8C=R6*b zUfEkgGY;Yk|0h3f1T0-3!2SRr=!SmCl}C|I)@Bvv9+sx5hl%rldmAhDpD*r~b6#w8 z?E+9sR+^ZU6#nNMN#u?A_&e1Ll#wt>Iyw~nMi-p3Sax=HN1&d28k&KU3eqVFowJp6 zbga;de-A_o7$a4>g7Fy>A{5N6ijpQ?l923O#=5Y^6oL?>bN57FvfM72rVhP`uuen`|fw;H^O1Wla17+N%k3kJ* z&E?cox_Xn(^=U;!`*8+%Nc0;G!Uy*>5J;<5EU8k}>nH_~RC)iu zvG?ZTT<&kX@NEc9h6W8XBt=v-kj#=w$~^;c+WYxE&-3nm?EUU%AIH1?SnD{Judn<5+@H^No!5Du*LA=8@Y?n(-aM5>=W>DR@#d#`qe6zG@t zErP59{VNOE%pPRCDhC~VFgZl}sqO?%>8Od3Lq zUv^`P4)?Rgue^Kr%3@8O@&K>>J}Al3bSdIQ!2^+4AjC2r4O zUAga$lSC4EB1|_MfWgz?txyf5G(5r1D-!X!bLV3zcjBrUcz{>)LkBN^uIuwXDbVdw zYKx-r>x*+#%=>hCCPP3w=jF?5f+v3W`;MnIn^oSB(0hxVp8GoQ#&3W`*`uBDA=ScgGwU0Em(ih&v~%;oh)y1Xk&Pfs6xw_fqxFQ1i}`N!y?uYWA@@qn%8@I1RhlR&?;yG^lzAwA1qerd&+%dYCQm6|POrKLvi z{Fp3hN19#@&G7EoGtT4DsNAz=aAzApR7d0_tBX6@MS~j)`ORB>)qKkR6pUvZ9)A_G2xX-?XISc>lJy= zWSBM5M~K+36LpT;Ew5o!II}C#scYpGqx)W7luftYRZt?7VN&RNZ}Gc%b9B}T)c*LK-3M3khSZFVL(qX#@>!vsph{U0 zxA#kP6+%F_!^z7{mB1EQvWruL6V9&Foxam$l8e_uLpOkk-mZbuFxuhGV1y!u&2fHO zM?n0r{mmoD%-*LBF54A8>n7;GbSCkrv0G3DuMz&s-&jo zQ(djZ#l=OP5gMBIYvN>~!;eo}E?l?}4cb09c$p80QQNc1Qjq?SnPXT>g+IEWKs7F_ znEuP7DE^u)_NQjpx73t3m5?y(vb2=ec|hc#pQoqp#{HYC{b*#*92NMn?}zr8GquNC zY-i<*&LB0r*4A=e&Rj^boi+PXTOF5u=$Rb%1f)F4X>My6 zqbcwoDr#f=`@iOoj;+YUCH^XU9<+_#VKq@mocI@)YzTZjN|Uz|chR9+%=BO5Zj|H4 zo@HeTSs-HIpI0qIVFxby15eXFx6f-$N=tiC(Gya6srLKFyZ1sv?Mk7X6H)?N&d$#H zyR4iRCK}aMRbvYaCEB&r)IveA#a8Ug`;?ZIm8F5SG%zsmJ9+P(J#}6yRx9K&<5%gJ zV|P>oM5iVtCvRkDPm|x5a}0GsbGB7f+tpsyf~Cc|t%ohcpD9M|lQT6jQNDULCtp7e z2_Q5gBBh~0LtR57DJkg`isZ2U=Wkrui?3unecUYC%*^cKOD((ZfWy2{LIF{Ed3dU2 zH|cSuH6|nd%$k~+ntmU3I^;5GzH!qgz8yPcKt=NI-W}XHc(1l!EJYh%#PRTUpp;_R zAvq}X5KYHe6crTibJ;sM%$90vYjeqgIdIQBa^#4O@HSI3Gts|(hjKi#QD3xU8jK3p z$C0B)vs+TYyF7jNY%d1 z4BO6A>PX6tY81?2M{J(~Z$10|{Q|4Fvl>|)h=_>X{_#?44+V^@7?IeM5hxYJE~&qB z=gz`LJfY?n=e!$I^^&2g$cr#J6|`Nm+V5r~CL+@O+JOg);H$fuFu3sEe`B%bxpzE! z_xALz>R?8IK9F;1GIrAb5jbwGKvxxirYpXp%LK^yMnw6E6?wJJz1vWXl*oLo~ z%>UeMYmZ2YZlkxiw>Lq-(41-Zpgk)$SLCV~+fFX7>CyuS5AIBCmr=ro>KS#KAKv-r z!riS|7l>?v4Py#gFHFQf31oGBTU#o&125pH?T=5R^`FB8!N2H>#fq%&}cBJr^LM%UvOpW1YS4fZIjhJRHAx=rCH5x5e_9fOyA@%bcY#Xu(4<{6UaIabn}Pq(KXsGAYC?Y z*kC-`_1?W3X-_oeAD;(6kA`&CZ)PwT7J2o@7I8pQ?}n`G>_LCN)M_Y6ZskXOwg0-F zPbCbJKj+%3#Kt~F+e63KynHzxq>18@cBMg2sjhw7a0z|j2zJRi!;295;6XgtUhMMz z_nQpF@JH_~Ut}LtTyD8$aNhe0r;T6>QPjyYuK}Tx3NCVUBgM6M>*x_y?6O-O9z*81 z_xN!#2m<*KeW%V9t~?2@36&;Sa&+=a;&+BMZEsOy0r#rwq0o;{0r9TL~vtPPPgAvw7s z+YOpA@GY5?ZY&%mq!M;WQN5vi;WA}O1`EV9{I$8a&e<({<;Yx!g{-x5!QtmheEL)t zRmX4V0$yHT6$ghbZ5YuOT(bQe&gVqcGs*=U04u*s7te zz=bwNa!d5(%CM)9IM!-ws;cfl+`l^ZBk}cXt&q^*;3qgUs9H`d#NQ>>a{L7FF{J+R z@na2`Q@0AiaE0F8gQB9MJLRD8$3HhSF$w0v1x>U>m2@iU=(O}_ts#2%U`yU63^w>k zrlqH=BFq8?HbbGz&C9zN9{zlM+^$IEpE>GrNvCx}W~TbS2l6jpzPwx~NrcPelrY}N z&CRWAY>aPTTAUgHYza^d7glaG@F?JCbP;1K%DdvKp;mV@?at@V3Y3RDU%YjTrr=nE zn9M5auDhOFK@C*Hs#UALTMGl~?<;`tecX0!PmCZhIy2Ic5DW!iPL!KHDEx{@4_`6Nz088Mql5C(HvWSle== zmmdZv=!MHZj^54AXGwy*R%_-gaJ@v7)$`5f$#yq6Z1&BQM|{1AwZyL@R~7q^rQ|~D zP4Be~X*fD&lN6<9OKt6rTkj8acxx+Md|mWwI3eFmtCxy#bMdOYYj3do=?=08nO8%q zPQ|LYwFF7-Tp@nz)~#w98qctPh#v{5sS3)<%Dj6nP#p05 zh1B3FkO7^iV4^_>5N>L3mEY~#b#;lV>MAN-$>}Xa+HhS#ajvhciz_WXE~lca8;&A3 z?fLWPh8YZmv@E`W$rub!{5J_GH?7tsYjY=?%`!oaO-xSm3JTU|PtK&PsHkK>o?{hr zQetIgMao`?)S@FgeX!8yKAC3H&$w4%o0bNxq4f;*yG8f^IfPd(w&Y+`X|k& zQ9<|_;Wd=QS*2>oZMCd#Y^><9`FJVa1Rfp~wyQ485sa@8V+6c1va`*`epCWA)qyFp zn;Xhz*c@F^Q9%auiHV7s(l+-wi!)IYdX0LH5e60(7AXk4b@lZf@o!-G9^u$lL(-3%HpSoKFVsSvA!6O(38bg4qmv9j1(1PU z2%x>1zWzSc2{AF87cXBr#6Wl^GLYHSIg1p9s3vrgY{kw4L2E$elu;K zRK#TWhV4XnA>>2cdTX|BNxvPvmg9JzGD;Cs*f0x!xqborasl-Y)TDMTdHGvhyZQOk z+84Lc`vOPY7(0*rTg)RxJCMO1Pe;-5i3|8Kao?_8$0g@G8EC&bK$^Q+pbt%awiICn zT2p9PSaVw2Uzwm{M4S-#vZb|jI6Zy=JW(P@4&b*wxR)Mq2_8B$ZK@bK`51V?|JJR0 z$XS5ds0|T@XIWYIqt2i%rDb>JkP8ESZ1t&ol;^+!n>Vuw3G2%Yu|25Tx8VeC$BjlV z-zaq>J{7x>p_ssQT7!SnOs9^k+_c}G0jR+En<`|sg3L0XrL%|mYC#)CyUTK6V;qHN6W{pL zaFws42yt!y&!V{y*!%YXw55N)g|;uPH`tchdaV?V zoK{PFM@KUlQ{7uo1>-5uxP9p~yfL?W1c>K`y##TM>G=y5y5pOe+}oPOmUql%38dF# z%`^?*)zrdS)1Dtc=(RSnu<&8m{rGXIXtb?OKSy_8(~v`xc~*MO0dl)ZP>P4gFMPg< zYkAvnQpA)~t}KwX*0xGKJ}{7euht7G(8}8~gbp556?GgAt?gG+Pzbcj&&}0l3%dL! zwgC??Lc^17xYoV*E%xl@-TKb`JBQkf3`R#sO|7gN`O@;gr0qf-j3tN6@to(B*01-S|6omQ{&<_xE?Qykia#TQb?>TJg7rhKdpKF)yvZ@t ziaa(gd-|`RKKXf@EsiY5d{{`#P8fP3PZ7js4k;@9hlZ}Yxpb5dPhM#T9 z2*$0;sI(!?APsOEC}cJOoajlopxra^Pf|jHlBVVZ0}D8pnfGW}H#pOHDix!SqdUm% zG5@m7ZA$NKiiV!sL_K!fBV-PH#8VQM+T^tsHs8O`jD1?sJql;$NjN%c!RRDIs0Ok> zr4WD6FN&J*@+M);B~-6~|G6;Y34%(3X}>QiIrR%X5Z@j0NQ?UPe?TpN9F8OAgs%GWlLye!f^yGvfY{ZS=UO6|Z#&I`QRSU<*2d3Vrx+WJn0y z4Lok}DirSjCx|DBCK0F%y8ASx=2l=Z4+#LzXKIr-iN##|y0Uw8S|7Mw_V{snVMPG< z!D;|fs#+exhlhmMk3dSp(RI4MzTUkXwzEP6YPVvi1e#S{gh0p@7ExR@{F4pCt$Ad@ z1OA%_oDI^Tx{QqX9_9+q3Q>jkMlY!oR0+B>%U2AwzHndByiEaA*g{duujWE}E<>5l zaH=g(X1q57@5X8!dAA#4#_>5Aal|V>(<%$+*HX~kKDX5RAOmpgT$C-(@-zSOIU*UF zFtYjyH#fI1ShQh!e**tJ-~RnInwK-RdmQrWTU%R4KG-QL2JK`1$=7Sx@-UEGocUmnqk+wWV zsXeO!^NBTbMn*C1tRe)5?iHr(IL?2?MZ=Y}$HSq+@FBx!B-_6k5)>3fEupEc9R{&q zuuq0#D+@~|6rBK8Q4LMqEAOMnC5J^i!aTOz0yv}h0(YE%NLt03DD9cd<-A^i;J3QG-%wL{q2BZB_um_W#uQ} z_xj+V(7@j&p`F`^OM7j6lzY-4X){hN^K z_T9JUFkcw5@~B`^q zS_(qH$BP!!JH3pQhu$ja=|#YX^(-!qOMGFx7LmEo0%}+=7pndI_PN>F+1HzpQ#qt| zL|0m@1J*fF2-^72D4Ruv5aa`@l8sqEsC*FKFU1xY29OfFUSs^ zf%`g^H4tYJBTPZDTD-}{4zOs;KPxUSUby2kf5CVN*KSG4rRNji#gDG1*m|y;&tS%1 zV*Zzm+tOTnBd(8pyzN3bFt8uZ47g91u$zK%Tz=BuzCEX9bCQA?J{L8ycfADuG!wP4 zPe7(wWBK63z!P7#fozLU5BC=m3*PMWQXm%_q1>sXGFT>o+!qE7%;3eioOu~f)0wV% zv-09EU&%fOkLeQ67Emj`VpUWOV$tjieJ7gpucmi(b=h@Z-$bu@3tG>%6P`3QaQml0 znWjc1N-!F|UQPSAv-S@R^6#e8*9_x~t;$z5QNIdM^YOb0d<7kRTsZJA@bd5eA|mMj zA}r%4QoB-O=KK1c+}wcSm);Eht4#fRS>(BaVhNNYxey2vFq&^~b)OreqUrl53wJon zeZd(VyJ@l4ig>+cspFQiCm6D9)MuHnP9bkayvq7d8Mi+*f-Nc6+Wtwnnc@rrII?GC zJ$rT>xf7{N1B4VDw`xjC(IFx0Q2iW<_*|PrY9d}A`{?X&w4pf->!e;uGHm(sg;Ngf z$lzh$KWMeTXnZ?rk^TFxRNq=5SvBOq2Mqz|Z6OQEnoOPh9#s5s^Upk6OF#cv^;jq? zbJM#zIyh`?Tvh@$)XhnG)Li$A*IB;fQ%Y3Gg)2{z)IKB6<#~>K#ae&VD%la+f&v4D zQdvQ0sl?9mtNr)6aXn!@yh_V6OFIP!W?*=@0iJ+`tcmgQ4@NJi_nkbH$ePr-_%<*0 zcj~za1}Q^E2MXdE^NXF^5GMd&Of4-ZSw@D2AWem|T0W?}bTD;!DRvuDh#=mpEV;;P zYH9)yLGl^G@NsM*!&P6`1)fd6^s(PA>B$pmG{nKUt_IK#f*M9SvcKTZ^~9He9y9wG zvJ=E7D9*ds13TqNc}miw5M`7?^71Bmc5qcSg1u5vDmy6TU` zyzj|+ZSnbkD}k(-kmkjLy~(-p2Z9&oL&hbZq+qXrhuVse1o?8#!tvkAmm7Q(C^)7` zQ1J{gD+9f1ZsRp4L~OqMahV{PE>PP2Yl_&WU_|-lx>g#>J#x9%E_FC?O({TvB{W)I7&l;mrvnq z%E|PEjK&*Owu8(SA|v@@cF-00cn97!dIRlTxbWR`Ec|&t@Qu0o&$E4Kg`X4Su^Hw#CMKn)-=8KGdM+lk)Sw85iOosf?Ax_FJd|87~2eaLJ*NRfEmNN{pNP zgvWe0`^0D&`yd(zfnZ{9973n&{$>volSJi(O}yLM`oS)|SQ?hsMzigUsv{eg!6tXm zW{<_;Eyy$FA3jv0l{5nukO+^(8C*GbJJn~~KPvyFl7;JzCwlZsMA$vw&}n>KOAV1m z>fw>A7iPYfs7h3jr0&R*-QdgtG;yeg|73<^9zJ|XK-PcaOD^oL{riOizuwLl-+ z`O#6?@Sgy3z}dxxlq#}YE~Yn8e%nv@FfRja^h%JbBVfJzi6;zDz0fxDq0`zJF5!?k zkhpRowf*CdW0&jq6G&5+)2<*xk@ASZ-N?vP;9oKqDoV`6JyVECg5Yk^^hy?2Ng8!p zb1mU;#9lEqHb(dJBkZmEnwlpNNdbfsU)a;Rpb`BL&#BgZs!D{r?7I$A5k6$^U{Y{FBi= zp`-IS%c?y!HI<~I&OACGixc%PIb4wnRw^lDz!s^^&VTcOe1&`O5NIhqho*~vFUzgW z|0%hB)~FyD50EkV5?PhQLO_=P4|HvAhTOfIiRS78AaiG^rh@3^A-Ug>x-Va1U}#3p z24TBfR8%J=B_-+kbBubp2YT-ifGCFtCn21tMTNr&FN+4e2k6U>1qpQzwGY@yJ-ZrN z!~s$TOZ$%@0f+lKf{q@rO6uVw6q+P8djI~9!;#_Pd*o2djR$0AWSk5^m-oD>t&I)j zt-6K=<_=2=j`3x^M;A3NRUo^twN%LbJ}$ewR)0S~B~w$=B4w zJWaN~4D1@n24s(4leti3glJVtN$0ya#}+|I)pY$WD`W1L{QnJ2gDMVQt1&|amHKkjWXH+C~7qnQ>>lh zp>UNf=JAuIQi(*b5_t!w1O8oeNFe$KJx3&uu(7gQWVHVsTu}4C>N@%-0iMfn*$gH{@W}Q-04GQv~KL(zR2tR@KN< zZs-4rQIdfo|AA3fJGB#xr^wqp4x$@M92w=|?5nWSL45)#4ZFehJbEod>PD{Z29@#K zNo-+w=USrE6Cyd|CFqfAATN-?%?9cc{R0BjQITX>wkE-@Q~Bs%nWiY*!ABw#z;Kfi zEWQZ!vJ$=;tuJa?A2zxYZyCs7_UY*Z{iMD=V~cOEl~Jht4&dhE0&(owe(gAf|`~50*sXSe{Tla+2T${8!OYPO0pS z4AMaZ6A&_1`RC6X;7mxJMqT|Wz(eK3{X4!|kO2D0OPbvO5YiiF)8S($R|ONTf1>y? zma2~*gO`E4jzBZ{C9^AU5O_9mo?cH3_IOP>l9 z!k9P$Ys|mdymHWYYUgLhAct-IMne_>OHAu1v_t+CNzdS*gYWSqpEft_O5`s6YJvYl zP_4STyiq-ESCF2f|HYn8sSmS#u|cFXL`uBGJn6&as3T8imE=-Bw7t+fccL*8MF9>S zT;jQN=$t-v@?`bJ2YL?8w)3DzHQnOV8a<8}3Kw`Wd z`R(Z2o9$*_;z7Vg?%u1Db-HN2hhJS+_c_Khh<&w~?6wn`$SztqGlfKB;@jT&u=}() z{&*O=feI%x(;{lbtO_RXqbbBUk&h6zeLtl?G&TG2dQqc~{I105HnZEkrtNLdhOFw$ zN*h;Inci93;4Xv5x%nN*^1=4p4<;+%dBge>E6jx+yH6w=n1CWA1H1i9&x64elC#06 zu2a+SlftRR-w%rF5a%aK*cX*T?BGR*c&SKo$=JNZ1ylO4RwcE6y}n65VRqJ;Gz@|r z*Fa}R;Y5m+2_kplRb=*!Tec)_(szza*qRdBo{(H8xlLT&wO^I znRi7cMKaGw2~W`+)=w)reGMG3!jZB>XR;T9ge=JG(?HPR1IhBdnkpV-QTU;g;>Fm4`F5$l|Be%;nFP%$w zcy9LPWr?1@+?LpHkADm9vVUGv=$PM{AkN~DG@_N(^{UjQdG99PW@fkY1^3)My$OD+ z;JhBcpEviH7o5xOdZn;Uj{Wn@TOUK>z{y;RVC|k9DG>!c>xaO8N_~h#;w1+4(QU2V)mB%4T6z3EZMf5Vw zuee1r7Ah@f<6@*67YF3GKHef3=Vs;nQ`}-^&iB+O)->bC>h_A7W|}n-({+`zcmgUz^b84U-(ElEi81UzH_!1jrrkGZhB2KTvGdps6JhFq!n^ z!X!ZYg}EZM@?0^H>12pTs&4=4;Hary$)&Tf&jCHxK>&_HOPLlJ1?L}+F4IJu=P3ZS zmyGn9RhV#UL>SDHVeH9~d^nK|GUUKUXx)-TwE_EGm{q@!2)CUE%%BUo}PxUE$ z9u5Vs_K7Nn*nMo(O!&35K`tb#NI7lgrptq~C+-jUFTGaKT=Zy69<+`R({B;^?sm9v z^5uaamrQD`ENkkEUMr6kIzAGSIFg{qo3%E#oq;W}uFomYQupfP)W!D!+SAoWtW)EO z!;cu;#^@WTj=f-tzD8kZZ!Z^urWiqUTTs%PkRQDRaWnnciVX-RNz>EoPtaj|k)~aw zlbWeW(y9)@;w~4OzRXaz!`Ur3fK+#!MCAwv+vR3U4;MZm_59erD8afm92>V5^a^L7 z-Einzjw-wRbmyI^xjI!v6G-{9y&j9b?rx_a9eD4!m0wU$9ab+D(2)CbzOOT=#N05_ zM6c?;*g3t0Qi@|Jt!YPNWJ#E-dg?Yg?#1D=tQtM7;c1^`EQgw2*j7)qO_#M~bS&*v zZhxuIYHF-*pcoZnp^?)PNPl&yMkrarVz|0+pfw~e{JLtUUA?5)Z}l9ihHN)iDPPAd zzPaDKUj-f+ZQb&iDLyVSQADe~E14y5etyY|9GEenWMB|gQ^@Arw_WzwF;e~jVemz>XjUC20fyYtpLQ;faj4tpd|$OA z&!$249Jmws>%_5RD05!5e?=-N`c)9+5!8>ZLfQYJP;uwSZ1?H7xcm)r-1imMTxx%I zso-~k`s~QyVszuMv%Z-}{_)6EHo3O#BOb#=8!FbFs~KFHj9Fal;m#PAG`O2L;TK~; zWe~d1zx3^X+K(#r*|Cj9qYEv0S03atIIhi&s-20XTLEf?MgS!y_PiM$2bE)}5`4duzUE8v zg+*~DUbrvUKtetVLnB$*v`>FD=(~GjkD~sa$+K)hWlkRO#e>|7Lub`f#G&@0w{MTe z(q@Ox?+|(jdvxCo7Rze#eqokc_<32fR&sHa0hSoJlP|qFa-+GWH)y_aX>ra!Ft7o0 zb8cj`pJ2Os49L>)+m*6AlKhm|)f#-7scI;Z+B}xrQuOjPJOG%+VI^OYCusO?tEBiD zrkY@pUytTwvy}AioX9ICgvO+-SY4UJ#!C2MfGS0mfu!Vd7_ZD=!O#5>W(GRqSzlkD z>Tq^)vOLJU7&z*nrU}PJu~NqWr#y7A<@(K6j8u#SUmCvx%1|*so_~NpGVXq^Tarhj zLU(-pZi`83xi1M{YeM2$N8DrTyiNy1Jd8HZQx|PBRdaQS37leUJdtc#*D|CWb=g?H zzBDeNzW9cQ+jKndS7HSb8BRL zBFJO@JSjC}0#;+s1B29o0n_$^;4|XD|JtvupP*O89)jBdx|JJVU+K215}#UgH4s>i z4{|;ENEaszmNMHXAz_k`G9n@(cQ|*@u6V_!zM2#4^+od)MWo@?`}6+LwtcTVC>Iu| ziZtEb3rE@-xktK2W#`=HN6YG)o6Bo@8CCzV@nOgXT!dPfXoqGaB{10V5QHmSexXBs z{Q0d#`)j*&56OKlvZ#}H6iZ=n&(^=0)2;5>z9eD2Gui2tk;-}Xg5P=;(?cS%EivlT z9{zRpZHbwZ`my#)Ghy3q?)R4qsIQ?qffH17MM&?rN1BpV_6e)`K3ValiKT|D2Lqu~ zPq&DSgymCA@yR`yZ|4g=a#&uc+;qI_aFojXqN3-@FJlF}&C=a$qdra@<9RtgKEB3H zcIHUTKm7ljrAY-JQ^DYRG{d%~YCt(`4D8@-dAJ6g+l?DEXc3vryVs(GY)QHtQJG8h z+@*Ge{Q_iGPj7F6oflckHX{--~9HjE+fPtwA_529^?Ppm%-*2;aRp;K{W{-Us`qjN< zE^uN%N%b-I+l2VWUrtt0^nw{CcKMal6ueRP7nb4&hWk|Bem^D~_}k#MK(+hM#N=4j z)E^}_TxHV}b8ox2tNL6xLtpq%ZT5n!-1Gf=_^Tgd@;g7jLl;g}A5*i?<1?GU5^icB zovX;i2f_e{+!h_&WST}WFrp}0huV8tH91!FYY#*l8E}yBC>5^uB-Ti_2>Y6MZ^Qh( zZ5t;Z3D$5QJ0?4s_i)7Swj8UdF~M$J6oR_VqqDm}vGYzppS@5HkBi3c100-FT1I59XiDj9dnGgU5(F z#~Y^J`K_tem7*g`N=O$x>$LXR-R@@$vnWZ$y9*`wH2V#7sX6*i9i|@{Dcq3%=`bhN zA;QqUF5%1xVYz+`!bEP@KZ6Vv$U? z(u~AII7SFVrSwackTTTZ3jz!Xee@_1c109kyLov}UB7<4*pi9(oXa%Bb(DDX>j>Pq ziyo81VlM&)3pXt|64vdG{#~3mV;oMs;wsPLlF#aLOJhCkV9x#W?k)>UE35VG53;f? zYxUzznkC{ZEW(A|u5=ZCub0n1_R8EW(|m8;zEiK5Rk&n>V|ey)yr!h~E6$gU-m>Bo_t0PO_oE=c8vm>%-<11*<5#@ctVgj*;lv4A4BVuYW_*FdkZb48EqXgS{r8J0 zFfz%Og;Hej_=6)W>FD4<)uoIc<=eM!8`lS@Ni0sE&&bM(dHs4b20`AcslT}!q}TKV zkC{!x8=!7~6eM3ewkq#gFUxc({cNr6?A+YBOzm?owUks;ywJH4VY(^uBpdf78&M{v z>lIc+Yg=1jfy-1(O3GTC$tKGKkH`CWSq$D?RC}NG|Y~PM;M{JJG%;oe(%77{Ob#Isde$3|~$D3Kt{J!W4cL~G55np=N zqi$~EP%J|&Fy#n^(Ch9%Q2~#|`RK`mA|n3q=fz}ZZq!KLc>etPgv7*R7@M|yaT(v8SP1FR2v!8-&Wes9x0}ZVI&E^SF$I@+gKLsu zJ6c;^&1grsVPfu@HEVpvMK)Y@c1`8nsWIsA{R0!83N`ZdcJU#i;1E%dMl9mcsA|82Rr!c;E|Rr%)&kzE;`mzVbv%}FOie6X|7X=fk}MM*_KQj(pVQVKOQ&|_)J!?*HM2_6Tz&ymu~ z{BpT{Nc*GsfzI0|=4NIk0RGAv8bTIlb4~>F=wqnCsg*Ikh^g|T`yqZ)*G(4tptM38T(|HkcA=VgCVp1_RIob8)sXP%KzQ!Bs z$AyzDXLi;t=?F(Xux{S|u*!z(^puG65`W2pgaY^8y=x(Hkh}Y)e^a=QVgiO$P&#Cy0_6WREeB|3E}iAI<&I-!0<^)z|FV&Q>3^{ zxzI#BK7B;G70uXTQ4CHlnAVb1-OzBuw)ZnRaV65`+bkMdIQ%)OrQcviU3E(f%Zukc z{^$wh$D~MaTx-ul?~fnkfJAcQXz<;;v7y=8Dbo{p5Blin6-?Oc8Z=m%jXMNoOV0^i z?f5Dd9_%=KEQtE|8|GrIj!v?(_Q* z!&5g5p!UZ_ooma#>eO|U`WkcHVfW^eBRtVt@7V)K=k;sXFyCiN(fKE~ zIhy2X2=nHQmB{9+awKY3_6i4|9Ks}hIp#Mk)AS4sR8nsuFAHM+6Gnj;85+LfCbqJ( z`_`MT@RVCGeF2uM-8+hQ5#SRq&SA-~AdL2O?2%i?CFjNCUwc0otX4OQ;@^)vIpx;T z(9n=$(K0eJIzW3&t$bZ?Z;XRQYBCdFpo)SWqg_~7nEvvhkowKzT$8Rj)-79#KYZ}} zvhT?qtDs95M+nwC&do2z4{km(7a$g4=*rj7^|!xY2?b@T8W_6`zk-pJfv7!CJD;}f zhVz^}^2(Hn(1$-oNwUN7hwFcj&~XKn`kdGl%$jPKep^9Gu*EB0waNLnG!q`Gt9!=Q znTis{Zf!e8b5{MZKYEoxdyx6moPUfT=xPKLbUzvbD`Q+ZUZ&zJ&)Rop!WlMof{3rZ zxwz>5y|SW~yNQ@n zd?~#X6M@SP7mltivd1W&4Nz`gz;}niLUhPs5Bi;Rqnv9U4TW~nI5 zVSOa_8e`GE4o!N_xsgrSo@PkBufeS#O5VV8A}73K)=e=YKgn;pg3?uqB*(7Cch1L`E>2cGIh9?!Nq8BH`{QQlWI_!e;c_B8bk`~|9x0>%QTQO?Pc_8_#c z-VO=^e8vEMc2J=R2r^ps0d-e6H;mSi0rwI`N3G7``fCE(XhishqW{d+)$#PvRQD*N z!=KmI){f%H>K!rc{r(-1bsMC){t41t_c&IqZ3#KuPA%5=c6}R2(9!>YcXlN z+c64SgR!|eHL*uO|10+iGbFh}$UWVcCFiz~zl8Q2fLz|}C9DQ1gv<|U7I{_lyv3kt zA4nDS^uAP>zDwC*k>|_i%o8`2+_SW6^~BgZ1<~o`v3FIkTxmH}qWC=0)(^N;BZ&0Q zO;=jEuSX_^88AS*{PcuN81KEuxe^NTwY~eV_SL?5L%5?Gefk@#ZC-0%e}6F|c{M4u z7?&Rl7E$owjBLK?$MfYh;c6qHv!^s|xWKOeiwSoKHLvaLxJge#7m(jTZOir+^u5}= zk;I(E_JziVhFR)!ui(7qDPo|fS2$Z{9gd-p1jd+uyW{-g;_uD% z#z&sJv^|l}rS9hA-5;dl@Xcds;WgU97w!l9Qo;}s^?oA}4S!X?o~5bjQRG6>>N4)$ zeziBkeaWi0de&og@7Ov^(GOlT`6s-J8gJIQ&~bemId5Zg04ai{ezl7|(EG}^U6Tf%|PEP+rs~MZGDJd3* z@1eRE>{3gR?|E>qfM;_1;lrB{*eIyH;D9V@A=|<)WLERZ7o&M15IKT)=rDS%|AVwO zhW(IP3T-MycULm7ORNbhqmpI}-OjeiTuYI^do2csW$iXN3=(;!)j;&4%n_i}7w9(b z8GegBSaPZ{eqxFFbMMY|L&UL>)Sy4_O{KleiIe{rrIRQZo5%c>=b%NJG%#Km9hCW? z`mJ+xg`IvGp5)6r{#*E*k1=9XFxwu_k-b9Vs`9elu1d_*6qwv}>5a{A>IA8~tN~o{ zGu*NH78i4tN0;&r&C0Cg_R|)?tobfBFql6}tO2!E5h%YZE_j#jt;j zu*uPQNjW(=r(eaiqwoy!iB}=QIbmLsjC0fz|98DR!yWuKIv4ml%}cEEVr;Ojlj%bC za`QTR77KHK&si@p6~J1$g|0^uR(>-L7Q>#?$DTXMz)VOqF~6;(x`Iew#6(L&a` z`Bh%z@ZgKGyDhN&t^=pA-XUJ{|08#9BdR5q0m)96OMut)tWXdlbz53e_BkEuRJUApV zGYeyWZ~6Kd1W+%pw`K0D)r)9IC*;kr;`VELr<_9EoEc$ERefT@(O|MoM%r!S2 z8sS&#bk*mqp+8tfzC6aua4>++mz){W|Hqh}iyjk8T$YCnIUNLp5i3RlVI?H-_5!z28Q#hOTQSL(8ONi zo~Hf5-a#aSOq{W6Y$@}L7m*VQC*KXzI{R%QB9nq89kV)=?AL*v$5VolR8v!g4-{#>&c#nF~7uf;_B8u%9S!DV}Ta5$&#N>~7=1HWV6~n!b4BN|eZ6yoU!7 zSM`R?vGZPP31poqeal)xvv%c_IJIiFQj6vWS-28pLb$?(uTY|`KJtK$3>Rp`P7F&D z#_)7>+>n5rQ&f}%Z74Z@0*_9UZ$1M1)8)usv@}-~gzj(Fl9H0I>6aPEWCQYK&DyoQ zhw^YHqIYSQ$GDNZG7G!1ZC6UsEZ)e_4fgsiYK`r5l*g2P&?cu~gOmRn{fo;OPtNwK zhK|myGB%gf{g2kkGGT2QsYyWR1e;4R2CED{KJd7b)bG8>Ba~S7;R78i8^C08iZ9Bf zE{4Sp22TA4r0D)gcZYvWh`b{&zJ+`*4>4j>UZbVejUFiFMUN+O#m)%U%21#(qUPBS z9yss<0};d~>Qqmi%_)11gaq3tO-F<$*OYK_D_~CfTsy{Mt$W?SJG@GsXNb{XNkX%D z)s*;YO)O=jxe%XY2F#B!5@&~Dz2Jm1fbHVU1fJ7Qo;{d&ju}KxcXKPjvdLnwFrc{~ ziZ{3cY&(Pp)H7)QH~;#AV!3Rb*xx10bX&`en={6k5v;`FAluB z!V{1k-JYO0o*+bk@?}cQAmTA_Wyep;*!#M?ng%fVKJRX?9 zR=R~AK^aEs`A+u5?XdsZC+ozay9OM}Tg&Vne0;0P6q03e$mjRfo5w|s7j#WFes-x= zIlOmh&?bij{jj#mP?Z8dKPf6=2R4M6rTlxg;aTu7+1VvS4m&V06PqY($#K*=-0wOG z&Tj0cGWHJyqp%5)nP<jfu{*&SLmOKB)07V{w|8cH&&v8x9 zXN{oRAcvr~pLHW`d}pQiAwMIn$f6Xio4B_(el72UIvtuT~{+w zL!`x|7;=~-B8V6WC^%Igs#(IZhLX*b$G==inh~ReZea+6b#r6W%k#7-9{a~!Z@u?I zG2KNP>j<YOMce`PVco$q| zYdiI}-m-Wune}qlv)Xdm|PqDUiOH46zp1M-mpp-*S*^N*5RAFllHdX4!V(;N3LV z>AU{7D<1Twu)7WWb;^`R-(OyUcO=`Vu6`Z5Vl2*2N6G>+FNXY!L4`zLFcpCT-`f#* zv0Acde5#^t?Xe*Vo0&Nba6-5U68r7%Y30mb1u3rX&WIpj-r(`q%CWh4ftT$BuDLcgKof5;gAHvP*a&I7 zPl>Fs+S>Gg;)OzwzK5Lr+kK5*SQCBuAz0sNP!uo;X%)KWRGq&j@f}kwoJfwN2qV5n z;X_q;^y-q6(`L-4Ctt#W;prP6m6xr=9gUlIL-7~Ga66~Llb%ud^yP%qM0ZDQ=fpcrR6@jxNah1lJW^M_B2MvFXP)@46DVW zYGs+9rxD+)XEYDY8E-1Zuca5MjH%XTNeq;;ktSp%3Y z$O?y~_`#X1H1i;X4QhGlOkGo>s3VQ+>^6Y>KZfE~D{Uh`?(^1hmh8+-X+~87tj+AD}Ov>?_l4JKq8wQP*zrU?!covp`nKo^U=;Qd1U?HZ>0mL z@4Q0%di2WCLpa0``bm?6f(fdX@Lj&?w2lTdiMMY}?smkQfOVQH&?8Hpi^@Sab675O zVw=P?mBNU|D9eP>OyXi*Zmwabc5q0@fu7sHo!5*gbM>~1$U0q)M-MN%ky&!%l+ zYz&Z0h7WhnknakD&4PSO5MCponbq6dd%onxT4)(Bs|sN`sA+8t0Ga(zk$?U2vZe=s zh(xhQzA*%;=6F+NaPT!)ZO#KI2fMrMzxMY(tB9Q*Qgbi54_juXlW1Ie`g%M+jL4G) zgAi&aWJ}&nqR=ol6nH5F03|f=pHS~+{>S-x@WJBKU$U(NCl@Kk{%?_MNugAH9wVQH za#xXqmhD;{i{|uVlNpr{9`K~O)Fz337e5}h%6EZh=>M3={J-Tg{%;eWwQi>pq%i(o zveS1)ZM*WsBO?Bw6pO&RX0wTJ zq8qnQpg3cxb3m#>oq*>vAIBGSJXsllF!Kw|o0RW_T(%Ctq8o*qG5)yW;hks}RU^2c zx=c#-t=S9r)cH2yYIDOg?Z?OR#^0LNi2BcClF)5!uVBp01th9aF?er;r z@Av_Ir=($uU2CsjAkG|$J-zMKIme(aYRlhwQDVWvFgK%qC*`hy4psKiLx#6X|x9L#`H0O0?UTm9R zP3OIdTb!$B?+uq$1`7Eb6dMn+Q5l~yX5FFbx|k(mK~wL8z2`u;aQWPk-|ITUzrFmv zyI`YH>n+dSA3ej~)BFK(zwZnzb{(zsyt_iYK1fD)GKEKzck&O1!zpX8AqDH^@k4zDr)zAj@O13nc>?R|Jo8a)w>;xweaLp_gNgo|k~l3Tt{P z>j27BlOIbDYdccsVpSke9}H+nwOBN4Wp>tQOZSAW-I#@Q+p4~NcG zeuoQ)-34mCx$pV^xW0qI!ZZ~%>{5LaF*AuOmsW_aj`WG|`hTeU3aF}|s9Qn->F!3l zyF&@-?nb)1JEgl@QbLfFM!HLo?gl9dY50b}-+Sx5wYY1c>oWKLX6BqZbI#uTFcHyV zKmVJ#F%EeG2H0o9?#bfyJPOTq+9imIWmqyShPi4xc8LFw7zG(7KA5S#Yk@3YzfOCU zwco_^5-3|i#;bcgnxhGLMm;d}$UVJmCAXcsE=p=jl;BZFIk4Rnf_4ViZjf>XcMJlW zE(t`e0wJ$5wPZn{KPdV4cbQiz_AlBcJ}BK9fb!_$yU56Ux6jXMQ~^uh z!@KH`|2qFIe zR0y`>ykG@S@{4D(@ctbWuP+Q`{dKzdu1p4oCX!pu<616#TADx?tU} z|7;v$c?7msWBNoJl*-blfB~!~MP=;e-+r%XE9ktiWEB5_Vm_wtOh$phWVIxQ%Y&Lu zPRWX~CCbzzV*bOx`44 zeH|~YE~@(=5T8l1lZgiQxhC>2lP*=6%s@^uu#rZ6{t8psV%R?sc)+VeNa4ZEgoA*N z*2pzlSILigh=%(c6>uOOFHcr!?$hYGD+Hx*z!z*KW;F^8mKxZU?AKF;#odhOCP+>) ze=z%c8VM>$5KU~u9ByJ_CZyLivd8?sTvC0m@jqpd%2DNdAu=tXT9=Gmu)s6~W>g*J zB%dy@?+F>xiTeHT`jD0UJ?<<2{MpOhhf7%_~nR@ zNEd!?K85K*oM`(LQ-=7um%}aj8()Da+^L`$azXGD&GUJ`{#0&YE}t>7*o<5%-KCtKp{LN6HJE+r1;A zPFZxREcsf7%ryB!XAmaGKa=KT&+{L%KRe2}hwJS#c%8_G^aU$4^1ls{5G#93(lc|} zUv#`F$NWRZGY*ooz=0Lz1!$EZA96y$lK1eZ=om3~i{Kx|iU_Vy!;tsRJ*m-~?$q>* za1S`9ZYz8nNC?$!RRUe$b~7D&S<_LTm_=M}Y*N|i$*OKnVbmhYL;r2Sx4gFBj=Uj* z9y3qfWcYerg^&*AQzqE5ZTKI;XZXL(|EP#AR%B;sb3hDkfGl?sCPR zuJHKEVWEV9n(5itV^;vRSX+tX-}d-9ICICJKJj33_Gu=5^3dYGYGgs!zsZ4l z|J-aDY_70CXGQxhwl?y*Nn{X=$aSu@e|O}VKdQ{2P{g@y~VMq5zx_;97Y*WZyy+Um`%^J z175s*Z5)3IGq8}NkB9SbcQ0PlHEV3Hc zqPQK1Jg{U|=)6WNf*$Oh%Zs!r zxAyD19p=SL=(Q^_EG+~&pDi9;<|lyOIcix;HrF-v5S%gNWVfTOLttG%OeT& zRRk8v`u>)74E}Fz$0Xlh8)?e7AvVE4r6wpNkYQB^s@CG?lEVyP68;;mj>ndT`+;6| z4jG1Fv#bRr*E3FJI2Wfca!U5!gP9>trwFp-J-HkD^qy|zmfx>y-Eb7uZvv|~L;r6K z%u~|KJTuc8$YTFTd(*;x5~vU2$h*~$%ubbfG6#s4f%m2 zg!R^3m}M5$XcQ*;%KO=EA!sp8^&8=4ISy&@#Lwp0-%Jw&t4U5y0auvA z(qI=@W^Dc=8c$nN%XwYvLCwSLYn;e&cu7BqI1*QmiI~%@q_~@?#Qszm*JG64jeop2 zT8g)m0)Ztawd~xXk(DR6VI$(#qHKH*s}8t{BYyH);R3_|%yJBbqWVIQD)TGI^>O-L z-_r!_T~cUff#=A6=p=I?L9!Pf;yuG$c~w?~oV&?KO3BT3Me#4rx10r0rAdY5x7^TQ zmZI;ZbGsS}G))f|Q7(o^tntgqiqjzRiot_d{(Ueg+5$7{g=XAsHx_9vL|zJ`)6 z>}2y~#|KKKWKQJ9yN4Cl#Ww(}ddo)gj3%q`_r`a$Zk^V{Yz>*#+b-D}tCdfJzoylh z1ccc=!$GDJ8lOr)n6^2a_4U-)eNRZ$BzdD+z1`5oH5@(CwQ_CmG!|`3{j{FX_FL=m zm%(&fO(Kh+KT4X&&seX1@BJ6NlFdFcGudqpRO7FS4D72B9tlO_SUtlbIPVeYQNjl- z^wBbDldfgg7SUyHcX!M|VuZwF6-ExIY z4GkzvWW$ny`1@a++)>iC`^NwK{$Fj_*0@cD-v%5<-uxIKT5OtO-B@4dFcP3bI~Wl1 z+d7f;oQ=^L#pq0%%17qAMC7TT_jMIMvis0|MVguEk1(?O4ATTdEl9=WN4yy+%$l$M z$9S_1s$#lCC!qD}+zo86qr(T)v`11>&`Bpzk5$nm5*qL?(GX z__uS-#OZrQ+n+zj_2jQABR8YLxg1km)3?C*d z`XNtiOtt=KXCDe%Tj*Vq^0bg$=7yBn5{#BUAxV)u3XM|xBO0A;Zg&qYIM_dEc$nFS z`-yMGFE0rQcd9RNIck1*JGeJoEbiL!*J;9KwELZ-)QRb)^0HVz-4Kn2pFO@!tko<; zp?B6}0`v{0GaWEAFkiaG3z#sOq~N30_g`m2qv{5)=8eDm!HIh5SF{|83SvCTve$gG zZo7)^5Nc)<1AmxKJ^We^?G%bM2in>fv9vBAj|`EoQGvs5DioTmq+JS$m9URf09&!- zfh-d0N=oq8kM&6d`?{$C$lKW_<-COPc_F6eFvCM3sLy-2vVsGTu?Dll?5AkqBTuNP zqiA0YH>J3W3&<<*iFz1Yiaup?%z81L_lThbq<5tCP>Je}`==#4a3-LC@=>lHjBF=U zlpul4gwat-(KrF{suBqmhYjxg z4rzUSvvHWt<>z>|gf@MmX#Ob~aloR9uF_eqj*ZFL!j^Tgk1-r8V^&mAXcL%EVvzT# z(fhrO_^$b6iTKIudbSBY=uX4TS9{`rN|V=3yec|*JuWr$L45p*czF#eG%Sal3oSYgrGJIw*;BtaO{Gnr*7^WbyDZ2fU zY-|!WCIKGe;KAd}@kjR$e(34yL67*O15d<3#}COnMMqZPYPe3Tk5p!eN6I1=j_s*i zE5IP_>)zl<>XhV6UD7uqHPo|yB}@2Ppwz0{9=4C@_EkpCXf6sl#bA56INmCzTVF=q z6zg(9QCc*%C!293uWM%F6j|vt{V zdKkb`cHk3 za&Hw_JYvx>aITe6HWZn4i*QP6r(*>tG2ORCcxONs7iO`B%R84wy*S;T!NO#wo9z70 zkHOq}k!qqL)=CvLFNN;qvkBCrxd$A{@lfwy2=UT(v+YcnSyXO_L+%b&n%_)Ij3MOS zd=OMwZAHgGdtG6C*?;}vgi?ihk7z7ZbbEF8D0w~;B_RoY<=6E~sKfj~4MK3p5f8eP z5Y77!BFgHR))E_%tfk$wvErBG{k>9O&qGUz5gJEbz}>6rhTn5!Bw;vC!=!iBL$V;F zTS$m^u10B_crANoKK3iF8k-`Nl24ycYG*zk&dw=V>*G9mQ?%VRz=SsTvrD(@Yg zF50b^qSy_8HRNi|BQQR~Ji@}4ZJTkj{nalU*qaw_gc21pN)kIE2NH~M2)N-w#tOk1 zKL!-y1WoTgE-j$EL=nU!Z>$VJ!1P}CTws8Apvgi%c^JnNt4FecbC-whEu0`VNY-GLSbu`>=w2->bs-Xv$qi0c!}7ZtWbvxRPyo zN#HRp3eCB~eVXd|wuuLv2>qcd|GAWopjotWU-)J5Ntv=gU_5{$?p6?+3i@8BU&qtt z{b}x`KlZM%aM1cb@^8-K=!JOc!!~+Y?5bCzv_{8q(Ni2ATXnj{TYVEQIGz%wlMxzV z8BWSD#@W*-6FO!DM{DYn-5D})UzM?wqzn6Fm880ttVQs?R=#5(ZHH5KLXJ=L-ZBTb z2SHe6ZK}KnR>`8Xr9m^b5pNt^WK?l^bOz zV8qZsiz&{nx0!+*F@J{cc39emO>!n<@+8hZ=jVAv@eXf_^({*0Pv^nGf9qt1NkPR{ zK2TGx7J=+@JWP!$P$d=TiNk%%6`x$@enk`3Cq00=hiYle)&eD#030w9gax4ulD7dN z@q5hs0?t2lgjf`5e{g~s2hT7BqUfJqZI++1dXxmr8C9fYUX=8rK1-XT~3U!i@y^CfUpxzjpQ!^%gN#s_2mQ96ZnsBR z^j1m_EOk_(&g{Hs^&R*(gl)(ok;i{WFuYtxFdI##V?5vdb$lFnH_~nz=rv6~%nLCR zczQdrMfk(x&W5n!7Jl{kMx@hgDw>+vV^i|1`E^bB%f!64E&r3rp0d*`3_~Q~UWDCM zzn_Jh>q-FgiRnOxHPZXg2!oe4Nh6P8n5IX3X|JW~Y)I{m=zrh+P9$l>)GmSs9^`XK zF9{LAnE(rtf%0Ag9s}7SylN=Mq6_XU~-9baM^itBrfgzgdYI*XH`!mXbWC7DB$^~-IZh41wtAV!r^Vt&2Wr>QZ8 z8;zxlMJQz4capl z`$)+vEr3D27bg0ozg>hsJuNs5LQlMRf`L-LGST5?RJ^!~acjvq&Ji=>^<}P6r(s15 zAOwgV?1%_L8yadp(v1Xjjmf<&g$eH2*0WMIG#2WWs+yf}{_LH^HZzvQ1od`%#SY5o-#OZRMlHx%h#s=G3UmZK2fC z%RN4yDtU0mU6YXSYpqs-t8vHsCJ-3C0ja__@e6zdo!8k{`b;Nc;fPz0Qw!f^N}uD-kp%iEz`Q2KRQ-j3K3$ zsqt>qD7?RMjbioKVp~K9*H$Qg#(Dyf2MvhF+&n%GS4T!KsHEaZERrGWLlL&4_E-KO zc-8cOu>k2<-G=lbH9~n#xu*W0pI6~<@;W}O4y3Fguh2h(({x5i&!Ibi$s8z&i5V{# z0dLdfm?kB-%kw4KAlEUy>LmE!=d6?#*Fyrl)kelx%4;bD6}i|6`SF4L>5`>y@2d(? z@xc<|%orSIV=`^YiQ#+dvT#4*$fh+yRefI1HI@!*y7Ru9jT$sOlqEUD^0%}CbHwz; zUf7hH-Jd-HZN{>GhI&Pl8YD}7jy|9s;d}Kb)opa_z=9yKgt6QX=PGemjKet;Qv`5; zUifQntwcc8_CFAU%p9t(&17RQf7~~~@eN0VGLI9|!Euf3NV9Q>x>v^@M3VHoNc7DTQ88-?bt@1us zRUrd0fe(YG5f5d9=foyp&i}+urI1OB94ZdV9P64JCR4qS%a{CJ! z5&(8|TiuWVT&4%`>j0}M3LxzuAOQTV2H>j!Itu*L5RhwL3fQ0{%nPy=5Il?l0*B*1)mkNvo{TYnCdqQ>0A_sC`1~|Te@zK%V>yAC)oCyFsB9%f13JfW>pt1|9 z)#;qpPEKb41q>+cFB=h%X)=eEKPF-f?w$R3hgmm+v0spbOkaI0n5=ul`%1X0u4z+Y zJ>w!j&m6EssmLvl{)36UU}73$0NKNa>)u}}>e>_lrNO6grWE(Sy*4wY-cwLX3`dW! z^uaVOeL~X`gnbZVssh(#Guz1qhl|I5u$jjg_e}5LcUdIE8%bI{V zIbHp1N$jIL7&Ttb;ZwQbF~|`mm(X9(D*#XouovV2rg^>Mp0~S)5R@;YB`tf-uKx929hu>3JW*iQe^Y5!jgNXO|{*LSF-Qi*GO!%F}I%aI1= zYESX&;0B{|fhHB~oXXWO%*f0W>!`UuWD|^UqXH+!rlvBN{s`Sb&Jf}G2h7TXXg1w? zU*ai*wG5^rGD3i8e`(qcn5TbU(5Qe6mo)sAnpzZ7JUT{BD7;0N36S^z`EkrNBHUt^ zo%0EQH%T}bQ$S&7F;Tc*p|*TI;F*_G?2mM=$OHtpn+0I zq>hY_hrN{oG8tzJCvL5*92_qU&!XaDOC}kRA*M(F9u%5u%wljekv|++cDw)84PKyzhMpQh|q&>*CqZh%_U2ena=AKZ?KFB{XR1M#t=-nby`dbT2t2O@EUX zV?#)3-7Fkvfbw?`I14q66a{~6i_lQJp6}Z*WyuCwXc?s?J$#HSfzZ}Rn>4HIGQ041 zJp~vefK)3gE!}znn*x%}3yDj&%>xZ09=Ok!?y1pPv&yM7@tcJ8`q4WtTQp^fUH|9r`_OwW98 z{zZ=@5ycluti*#~3A#dzM9x8-`8A@rk>se#`+BRNFeVN>!yZk=Kwb6rEB4>P`qTe;44dL{TPTagZEVHGSsN394v=nxnMu5@{Ih?G5;%(z?VpBxms;s2KB(dZtoE-lYMjZRdH4>%z3NmR>gV|ID9 zr)lLZO6&J?YiCe)7t3Zk^BcB2kc}ceZ+_1Pg)&-e!y{D<6>|S_;*{=MD zEkd!;$!F01i~*Fgnl?K{rQ@ELPXr{C>OoXUkF)9(zh{oitICk;00(<;I5vCz=R6~C z6Qun6t20+8AAGKGw++3bOLHC-Ody(Jwe=Cdye-r{C{7uWfbO72E%(-l!F?u)jjX&) z|J}H?)N`Cfe35J)c0Wrp9=?tTcY=#`ygVcJIsVkEZz;4z30EY^4!<(*rJ%8M8octM zrs9HK?miych?gZ--tGJf0}BNLQ*@iy;_9Qw#RX`FAXon8-QmPnK7wekhfXgZ$x3PW ztF6$_TyNiI+}M~N&=##rpI`N1c$YsaDeOjxQ^g^;?iq-~ zh~*tCn^E>=bpX}{>tpE^^XATUHOrTx5KQSX+N;odKF$@F`qiOg07azI)6C)G&^LfE zm0O@%7GC48TRm}GAKSeSTAR4i$z7lY2IzM?Lb$P{a`;#^DEKR-nN!I07q#Gr=xQ_W z`|UL{Ta)fdBxm?u9RsLW?3MBae!nhZfSrPX`>dk>nXRNi3?|Ygj5ZSFZi=FSW1#Dt z+x|sPO-Uky(2h}ze>VZ+Ypr&YlV~4^-bZj1kKj6)Z6zftx5@^={c~Zc!ft#*Z?_I* zZKthzUwy9Z3$(j`yJpZp%mR}Cr_mE=43faslj>yF37tiuzn=Au-$L6b#onFqBJXn~ z#0P=AoXeC;`v*DV7DxyJx)U`j`5_s61N11XUDt*F+^4fG2MynylHMOuC*^+Uwnr;MKiyV z=RX@>m^;Jy;AeQFdGTG_|C8`nf7T<%W$@-!e&Hy|r=$Krv(Dy`hA*c=giM0=Ld8EJS5)gVNkx+rpiYpVME?HkZwvZ-0{neg-a&6VV9Yk?$VgWB-JmP@r?B zp@pqR;I1vsJ!(yGG`YzBkW#aHPR_0^?j>LzeC5oc+u1bl<>{?Bq4X13p4Cn;+3To< z_%bZ9UGn&)f;Kk0Mw?fy2+VeChh4ajIcxQ-HOPzw*^T7o_aF3oet7H{0$-m}v*V1M zsFR5^O15V*j#iM7K}wS6mWzYM^K)>ER#x)TEYhQSsjNM>TAT*ywBEbljV^M0E|{RY8gGms}hxRAMPm`|~*H9eH_$tvSMBtBmy_0}tzX z_+xJE>;9U~jccBMBQX0vX1}*r(RdXn(U0WaUlWZE#nL2hPt{=pg0uQ(wvbX}s7&tRIqbr3#?=b`54n7M9B88} zY_SH}x&(d#^)%{>HDjocc>XJ8HW@;#F{?fjcesxT)3;Bx@?XpGHH}c$W&S?s2sbMS z3v%`~>j}R>+}hPQC!#CMcQKk69r$p>i!y)lTAs(I!J10Xruq}=Z?giyiP27`9@5i> zbqaA?K|ZJMeB4(O6O~i#lTZC{1X$a88I#zbW8Gu6ZT+suSw6>>s(;_>jY_ddVi(5( zC#KRO!^|~d)F96vLpjcRYr6Aql8na#u@r!WP!gVm^3?YZu@%hMh#xg}Idz6CAq+Z_ z)0zFHRL-VBkus~qN6yv=$c^4yc@jHVhEMt-2j?Fkqa;gAqDxb{b2|}p=nZ;{m;7RD zmP3cPcIG-;!67(2nUL9LD$U&5@?B6lsbHo{@|)mMfW0);1SKJ_|(W6gwS}LAG1KvjHd(LR#h2%^@+vsU=6o? z<4d}i&EJy9XNqXZ!G?ZQopvp)*WpABulDcz@-sqy-Z?W61xP;2dtMnTw%G@J9(H;% zsy+GUI8$*~o~6BG&(t^sr(HBHadnXT)|up)kNgx=rRTEGs$|WVKsbypvw-<~@hXUU~~f6OKpx?W_jL9Ywabh>N;F^{(0I}?h6=gxM1l(@r|pP|pG zZ&fp?-?B=LLK(-)L2UGvkgb1yGcT3RbHEeqn3#1k?r^`_k-;a=cOc*4(owYKl9<)V zA5rSYcMKWV72Cz-7GP)`JZ7WwQ34TL5>6@^hGXWjaK2dYB4a|Rban0Grp85;&Q`VD zd3FIbS!k1N(B9QHQ*}lbjL6=Kpj_6k)Cpv~Rhvqt|7w@}=*f_GZuIh67P!B7V}Qe( zqdi^RTdt_p;hV*HHPeH|P1Zm;JNjz46IKcQ|FSMUv{?HAqa7!NbP1;m+Z}(7@@l|C z_TUkt$#0+B$AxV5AUp%n@MK6_#=>H?clu9 z>cX94e7e1jOeuO-;ZJGuA!1&Gv`X62pDigZ_nv`I~d_GItOGRY#3NwjYhJB-G<-Eec6p1yGIvu0eI=S@*hENd%HsnnEN0~W$UyY*RGQ~6?u`9sR; zYJ}gSnlRFIqA?c4kp)yGKky|KeSZIL|J6CyvmlhOEo&T7+Klm+1LUOv%vP(Sekvw@ zZmVXa`ttbeXGV3@=3{a-*l*@LT}&S<_2)15&B35-<+kbM1)Agm<;bbVhl(V22syo@ zM9)x&y}we4RU$Vko?j2rH~NBPO1_TF-H-jT&?W9U@+SI0dJb1-vWcSdMi+ZE9k0Tl zk4!80N${#|8ESaHMUqS_ms!NOVV#63w4CxSO)!kc{~+DCU6aiqqvRhgug;*1R`*UO zl2GXKj1RKNP1U~rN-0-a;s7=NH)j^>)nHxSpR6Y{jkor@Z~f!ihNhz}mUcEHQde}- zAMY`$W#l$q&7{h{x1Jzd!J_Z|tsbut?uTREy>lI#ZOrtfNB3)7Ui?8X-LgFS#1qop z-mE={ebNNavp<-9Qfzj&Zupc|kg^x*k!bLK8YiLkLVlF+P+ZG{XUDjwScRqjVGWHb z$I9$WO9Y-2qs&k3pS`18?|-%&Oh~SHa}V;aNc`mK{jD6YVZwupQ=OH~wGpOD;Lz7O zg1}zA>Avrlb8Z9tfz4;9X1W3!w0+*lwzSUZfUt$`vw3=!`pZ2y994c6HdigqB*F=c z#h@u9V>aH>rQt(D{i5N1{ZcyP`5Ni>XfI1ccT}6I5Z=aLTFJ#0zHGbpnyJKK_n3w- zZllB>%wAs6m}jc9^H-{$td;tSv(ijx)Mkla;dIBMMT>B7S6F58 zuFf9cFxkPPV88RS>h?BG>5WQhn8CBZPrG4aXYOudIP}}lA%cUAc@Dym;rMMzy3kPHuPP`>tL#^zeqc__cEFy6D z;z0Nwa{RNR*`~y|Mw7(P=>9`yvnz>K#mSbR(A2qx|L}uim!*f%2QE{Tub%bI_A6Nq zm8Eym0=ku}PD1N;Tj(j5QU~PfFfLA3I(dP~n2r?tdlH1_RC>R%%6e5tzVY-8S`=p6 z0KhQ=*#yfM?Lbk594pqSlTe}sv09O9v{&ODc-}14a9``@n%GH^>c_1X)vWdX@)T(8 z!=t4{^&202)uT(Vx+6mNF!spXO}DnQ{COMXp70h1$Li@SdS|T1&*!G)z>+zY&jy&~ zSUDvM1XE0WTV&i@-+D6;Mj#YutXzkQ_7-YY+qCAlV0NWyPHLOY?LFHVE`PgHty)4q z%TRB!iHk=GyPkH63c&|8X-l##aOI+`%#9#B=WAZA6zH+4_^iL3?Zf+5)9zm8O+;VYBfDGZjTyqw-Up=IkS6k(UIBDh^Wa* z7hk7>8|LC2$c2`GF^)x=Xhs^u+xi(^KegB-MxSDbe2KbO=_Fo3hx?Txn}M?r$*mZo z`JMFzSxVKIABfc%$e2{=vTynrg67P*!n7;Ru$*5B-Rj?I9L_nw%ry!L6anC1$wx|vH!b_KT6H%Mt18x3mG|oaK!A4Xo z|2HWVj<#`ZjBE!a+_v_4-SMv3ZKVn0+z!OZSj!Lf7*P(@jbUA@g8t??b*9SRwLp*_ z8AAVPjF<+pM%xlX>Wnz0^c1PncOScJ5)Mdat_aI`YA%oa&b5Zjs?_3-uF#RxRBs+z zTyx@`8+UZ=O0|@#6qjZ54D)}30+PuaN9D#s89X#oba}Y^9;`al)Rx|e#i@^}YE_7d zv|p5qgJS3)dCty_$zKQFAk!^55dO`8V zjqtW(HO&(_+nAgilspnQvxUQ_psJ3vM~?||36D_kp?ueu%pEyW-;-{?RIfm_q#%#! zWz2x`YcA3)pBuDRT}wYS1&_#4JyS0`%Mdt-g3g5k1%{`1&oI_o#xe=aguTBIgZHZR zGbd?buf_gsn&YTNVX)EZ(^pH}9R`iy5OA8{ZJ_6`;~p40bpsFa2bu?bE(>w>e61p&XGXPS56{PluvjV4cry zdhlHqGK1J@{Of|($Pg80Z*LIY&QMVEYh2uu@9nmYvMDJrDR)#~tbo+ae4{NvSXkJ{ zSkOWjACRfzJdbh(y}vnbNnBoC^$9eVmAwHv%HM6HWj9EtRT+20w%vJQNuXi8KY}f) zmvdP|UM!W|nRvyE+gnsnyjn9mW}(e>WSLM_pPL&nIyCgUm7241{_LQyaY4PNz&=R2 z`H#9cV77h(%@{!aYYV7^|9GJR0+qEF*(;!DB1(f9DbxrUkbu+u0|aHwDs}xIuU_h#??0pJgJ1WJfuz)n)WM4=+KcoSVA6vQ;sHQkg^UoHJ%GvygIhTs z%`NS1h5aoNDz~$M@^`3jMq2Zc{U{l|s_hOgT5C^KtPAp?=RVphCcR@B>6Cx@u>7vQ zK-VKc*~d*Y@bet~0~q7b5Pm#2KsahXz9bs!V&=V14F8{ z0wFmvsLU+Xh5}>PqThZ29PGg_4;!dL?i;V{js|OD7 zYin>Sr@U)$VZgQ(8cQy;5Ak_C+IKJQQugx`V$y92*x1-8G9Vx%jP?`a;R#<}UM`wQ zO2a8jnp(0}c%!4fL8`LNT}4!!7A@I;H#Bmalq?9(?^f94jM9JUPI|q0JLnIsH%M^Q zogFn~uG}q-!76ZCO+;+zmNen(q~n71_O}oY2Cg1mV7lD4T8s<(gM9KkwPO76a?oEp z?xh?9wEUZZW_rPZ0T7tE1V!y8O@o+wlfWh{aOluFLAuu!r-eVfSJ1cBHz1InXbVgH zOGI-xA3@lD02QcjlB36#zM)KbFLXd{Hb!Fxvn=UJCv2RUWQ}is6E*}Rnhb}OK;Aca5s<6F~y}db~ z~D46_nu{kCus(g4tbK&O8YxCA4d_vFV`nWyir zK7ZmAXFYG`@jdPmeg<;3Wda-A&p3-}vJ^9Wg zRF;S*M;R!ag@sM|TmjKoGE}(r+7YHGVjvFR)9k!AxwwdbF%JYCT-@CYzkGoU4gK3o z1ZNa1JL-a31*-7l+{QnvNXR<5T|FBUvY|ry871a!Oq&$FvASu^(pHC}Z1O$h z7%5!S2BYK}-hNf{k!rg&-pe4;p51yC!MTm+Sy$2MR-6^CN~fk?0(|q?W)$-#=n;|5 z=SpWbimN9M)GP*of@=*xKcqu=fo+USNZ315reaHg^Rg=2=cd}&&gjg!+gu5Yn7we= zjY3hGTN6b-M}6H9`{`GfE($)v5>U7DNC~ou({q(ymKeC;%CWyhX5m$9M58{(%09wx z@=GjcbQ`&a_Q)Jic>##Q1^`ru+uQ#qN~%Z`0y;Svfj$GQaXL*7WI!(?1}M%|>a}76 zN%#Guqh8RRIRQxN0;j(8vM9A-^T&DyRr22yo@TgbqMAi<&K7bpaJ}vPe-0pGM-MD4 zSWj{uczya%nx|>$R5#m7Ku|yjFEKLRH_<*%~#71jT)t0Par-L>#QqzQNkv$=OpCK-7eh5DCkwftkuWhqIZbCDEl5_6` zNoggzf)0+X zB{G=eZAH-`aeAd*qf+^dG!>MDihugwbigxiMMNRpJ0cLdW_=|QwoDwuXm!tjw$Z@_ z@neVD03;G3Vy&=s*xACX0-bS}?$Di>|3ZkkR9@Lu7qpzpE}oLGJ22hdEEZ0XYG~6H zGO*7>gOh<}^37$AsNp(c{zktIDrB3kBky7LQz&%s<)`|rzq*U4DdpaVwQdU;$*{)H zz7mU;<`*y`g_m3pKbQDcc>^zCHg_J2Y|7NzB=c`TKJ(q z-#1pkbmZKw6tsxd?tojyECu+g>a+9m5~|aaPOGrdrHf5nv5|OwCk_^XFo!*~;;+zM zvoRtZmk`$JWW+J<;V_|RaljXH_Y<$l^+aQtSU#FM>$ER$+!vRivNsOfANIpINpFrf zMFq4!=blXFFzlnr(i${`U8awqU1sgi**}S$MZf9xU|6?s4Orh>f8wVmpfZJbT0RP+ zVONG0F3FJES5<#SrJwG2RqKMq-di3q*MjQx+Bu&Qbzdk*WXYO!K;p3K%Jr<053R|= z2m>x*r8l}THxi8v3!f@NWOM{c;p3vEj^_8YpBQy@+V&9BYQcXJEe<2exzE96a}kPn z?3u`$v>LTX<0*$f*fD;PsFLx|$?KT#nZy|0Rc$AiKE$e~1k&T)qsmzVkyh;{=)2%s z*=-+FX4rfEUWmn_A0n_$^0u+OTx^!S@!~R6e%)QQVOjmpWgQ<9fPp_y}REynb`Rn)gYjRLpJf zKHI01ehsoB{8(~G%4Wm{CE=&hjzs?~LSa{mifgPm@^`&5T&Ll8%|mM`B$;zX^uN<$ z=b1^>VcSGHHds|qbe~#{s{8s5t}Bs!8mMZMi2H{_|a8H{?Imjp~|ntyAE)C>y{S<(<%hxrMBsx-qKV%o&(a zWANIX5~Y4g2GJ0NYjIFq86Io8$qyh9q;F>-wPU~)m^Q(MG(7oFJafY-5wPQg7 zT})d`>-D?W^343yOFy>%_RI1Iy+KQM)LPRAAe8>^b&WwuYI37?R9JJ;YRavuV2kC8 z+@FLPQy3G-3GU^1pL9o2b8l5WUeo&zRPga5Y+w`{n_|7H1$h}n7z~rw!m6B~l@Rlh z;Io%VE-BrlR(X-3DtU0hmW%fkA&_u9s&@zYVV^rRNqVHA|+-gVhppvH9n( zCnZG%HuN=OMeu6YXOV`ZvU@*nKnF$*4s=@jAv?^rL<++8g{h2ZW>`=g2+cleps;2M z;36$G2A<^G&}Ga@npwSuY&)LFc1V4NabDS8ebjVTWOU*M_OV5`h}d|%Ou~@qPByvO z%~5)UYI8w?q?VLhVLs&tp6Q0}SY=0bbPR3vosOuz8t04lo19Yb<9by8D5A%`O1yLw zu+F5DHNqS7l4IV8!Uop+CYNy?pKDpY2AV32t2g%QlQg*62R)-OEvr|?`w&-6) zbmFAWtH$M&@vBF6(n3e?`6Yp*mMeUSJQM|vacn5Pd6w6>Ma-rQHK?de`5f*tZBhT` zzg`agfGixNvDo;s*D~-6Wp}a#wQ6&Q^pQxzquH{Yc1(`7$%G8C-Ua58s@T0*V}_;dQSFu+BG@MB;V_C>Jw~ajWN~-pL3EHAID5Btc=hT z-2IuyfhByth#2bc5D>fS+#8221P~Ae3XcnCJf?28A*AF`=-kqg`IBGi_*mI}uwP*e zosWObj7OaqD)zRf_TEmx#ftdt_&Zc3)#h@d(Z`blSL8S5J|8NuG7EA;@;Rj^(X=$e z9RZ7WUiUa+FTT4!iFYX$mCf)XZ#DfXr4XFj+iE{|$E0?Ondm=ANTFf2Xo-J#W#pvA zTvylTl#(E;M*h){8vd2@d1YHUZ?_rv$i#?q>1Z@3;tnEu-p$h<`Z;r9Lx`^`>kkR( z6Fn)rKe@N@;BG@yi7O+y&L>sI?KB32I1IGW+geUwl3^>D9yQADo0ZY1WhyS3ve$Rf zFWCoj2Y?HyE$XdbB~^32 z^L;GMF1;zAxFLA`@QX3qmP2vU%7gMUjSUtQp~N2C)AsKp7v;awP({-k?MkE@Dxp*( z(Gn}DpID=KlXXS-27$mh>{l?;Fy2)n&ePDAywZgg0a8d@)l_A`AK4>&M#}Q8n)ES)`QO&z`3ZC&2jX_Sb9OFqwu(j6~55&U9r#$J3FlURckoB6Wu zL{P~i0;?Wg|&zRhP4 zGaaF_f$7_RuLBwLteRb{lqQTV+SoCg?^H8pAm|X)vt)8=hp60{ILRJK%NbV{D)mAG zho-+J*WFFQBDAz*NlNab-tt!zT?o}HLtoW!0#Mdh z^FMpkdf2+)T-Vus?h~ccvs|*Jzl}GC024RPHXd5>zDq(l_C4MFLA#hjRp@QzH#0F~ z@5Y~B=BiR*cBftq93GW@UkE;ZY_+9M_4dsBCO~H4!F%su@fUMWPRr_cmxyN9IxHTE zqnKEY%jN+1#1x<0JLLiNAq?OHTY=ge2SVO4LuXHKFNot=-&x4)id0VJ6k5v;9eVrS z{2hA}_AqmMyM0@sqhPY*q6*cRQ79*VL1^>ExdDyZ7>pXj^|+_qUL<9Ve4130&iduV z>Kx#u;QhIEAN3M7c_2lmduqyt@(IOzR%2^7)}hCR9*EP**f>`G{XrTLL+3T@Od-p2 zHw`@bpD{&9FK*2vMWTxPxM)fUmsb9$2;MBTPECwK2bVLsY)_!=Vq253)RT4FmOmX)6?k4>z3k4w5?W)`U|Z56 zE9vZfC3DuhKLRY!4eryLjSfcKEALum9#j*O$;j7BaRr(Nc;w8K{JLpjWdZWl&ZObV zy1rR=hL;#u6iM3t3OY}wf-{cfjVSyTXAs(DPE*t23*L!8&W;jdvLKI_~v)`3} zxiI0F-b~ z_HVU`1k+bpq5>nb>$D-J^tPT8`8gsLgTGW8k~g_N z#7@amtJ4F9;IYf*+u@c)q5}DhA)9_)PS%uFL%?F8qgUAv1?$zQvTF0Ek%me&vlh1?}k=MX^%svT4%-RC0A4yVI(PO=NU5ZuA$A&a8Jxz z!TIHhMxB0r5cid%aGP#bKATG+GfOdDCR6FZ++(DP3)hpc z6vqUec{a?TCmsUpp}4P3>=RT|dL- z$@pGGV=9~j)xL#<3Cj}j%8YuX3$2QA)Qmu-AF~R$u0 z6n?Vc_S{f9bYg?qOdLUnyJ`gsy%9d>W}1rR8DD7j)t=KPHL7?$OW*9^XI1Pl&h;9_ z;nA>+IG?KmYhvcNR-#^2h^Pj~MhuR%RfagfH203E>+76`|UoC_oIMa4LzPzmKBYBd-I>Y^UkvW1=^!sb8v4*uay!b7O`uKefpb5c6nGH{8G zhIO31sb@Vg+z2o6FmB(4N83SS=UP&bawd88mD}y9AsovFxNz>ziT%NX*RQ}s+yDMy zahMH@%E?9S_wm!%|KS3fr2*=AvsF0aTnky#176ZT+2M$Xdixcd6dZfuO`{e=N1bAWpr1Q<4F<>Vk` z-VK|_pp3&kV|ydO6LUPC=ZioATS`g_yg;NY%0($_SK}~X8L>U6F$U6nEALmuRPCle zUAa-2?@o!~d_1)r$)~9rb${MJf~C!0+)-Mo>snEqld9b974G#yQqyBJWZ?}df9SnY zja5+7gm{m_CQs8Cxq!ml&4Z7NtUAaCcIyDg2EeH-r>FLdeYG_;hFw3=Uj}z+RGPfX zSICS63T6y|pfNmQ3NXCvx8v0hd`q@Ad9V`XoXkn^+1Z)8xL5DzD>m45RWX$UwN0B2 zH(fvTD5b)9D4t6}6+HU#dK{2c8lIHDEJ{qfbES8N5tex6`pYa z|797CZ;n@fl0mCQ-E=^@T6O~$jSCD6%4c5e3d6^_&{h0Q%1XcYMy&9aJ%i^Nt7lWyOo^@rG$yxi(Z zS&1X!QHoKvVKV0Vf3t!5LqlP*-axe}FwU`W`LPiFk@0w!%_Q6?q~)wv|4!s{4@=Mt z%AZ3d8fOq$zZundmiR99L%Ap1L@z0_6w7770^ULdF9$h3`|vp(Fj?;^B z6-S!pxw5@`y}62djQv4ghNZ%rIeJV{)JF73C66INn}%)yUli_@3phwWK86N#04Zba zmoKuxZ?6Pr*}9NI@pz>R_ytgcZu4RjaV~A--*Vg={mcyM$AtJVqQ&QjTvjssvoJA< z@sdbdTOUd`|L^&%phj|NoT$z{3Mgy&K~Cibn*d|NK09_*(bYDG4LDZ+-!Y3v#G00# zwZrBlAG2<$t4Pen#Ws<)$ZvJoddv>uO@7)kYtF%1P-Cm`q&;=3+9iM!0j&E&05l@8 zXNfZ6N~nN*sqBXR1BBV^^J50&1VxAxsRo5*xw}x9CzUEWK4K(ZT)uj4RoM&*Hka`g zF1FVY)9E8*qMn@jA`u0k)Qy0L03Zg!>4A#+`fxJW;Yt&MhldA%m1MuvDCpi5q55sD ziHytMCRbPDZu9OMG5fmHUR7Qj-TjYdqBWJ!fOu#eN|KpFda%T zJeV#7p2@gdqP>4(N(6)7RYk`r-TtfjyXCL6BJ`Ol+1HA&A{0%2_Aq;4qWY8b&cL_;j zk4gbz>y@%*XL4xO)r$#k8BVXFL((V{6`f-=5R?Owur?bK(+rm0RF^b15(E5#1d&-5 zK+N`^6{(uq`gYjq_@9^deogvzU{_v*@5GBWB;df`(IZB?8>a3Jc(8;+p>NZq9 zO#{pd!~{lk=BYJ#j}Nu19U3_M1e;uDICzfViz8H2@I)ToXry-jS**0mM?qR%DACRL z9F?qSO1Q7)%s3^+{*4RqxRBIu-7p#P@(R6t^|9J_^s-JlLFC>yT6z8Q8FpCsZj1UZ zg|*-nHqu@$5TAP0*BM`>Lm27<(J>Q3N8v?E$>_f;Vs&9L*Hdxii6RWTv|m+wSsF(P4{4A3?Rh4em4CBQqNJFwS#GIkv&Fj}qNEZd zQyenB^;7L{>$1&ivvSj$bxkaGGIM{DGCzw0*0^-oyf?1HyBn`hYW~$Iar(69c>I=s zOF&wB)lyTfYCbB6-6P}HbyUL-Q9Jcq0?=y@a)d~Gya8yX?fpGT#)jxK1eag`Y9Z~`eH97A0(q~HnOc?9q;##;UFkw0h;x!`@yx{Xv%ci`LGT5?~)J;8q=lwE`Tw(voH>w$0*y$>Psv^W08EdLwslGE=#9~U0GG5t1_5xV)lMoXv?M)gS(j8B4LEU25T)!DjETsi~ z`3(l;$uLK^%_brjiZkX;5Ye0jer-69oHE7{QE*GktXw)D zQs-onDm}$|!G#XOX>=$m77tP~x8t;mFNPL_jy0@X~!|+YNH3Tugsy>n8HTw)Y za_$OJ=`K-j^vssL@RSmmb+{H@wTNL%v)MEWN}9p6>=DOo2&7=bEBqKq+N@@+%Y-r> zBih&c!+4{p0f_b!8CBuP5NV24m(_R@)c+lgX2et--QeU86x*ry$XVzEvwrtd^;W4j z9R68N#Zv*bbbON)6t)sd`m%VpiIdQ!A0c^;dr9Nt@J`6O23ku~`!-FVN!55ZfAF3l zfx>@VTBRxi&$~=@qX@4WNqm<6s30w#50<1$IN7eI;#RE4h}Ttk{DE*u!}qP6h6GGB z2kHDWO^Irvw`8-0cOH{N?npd94x4PJTObRRE#_x*GNSCVkQT3GPw~}lr85HgNUdKM z15Xd&Tz+09K3cJ~?Rp^d8LG{bY3}p6sv9~eNi2TwrMBXp@$;UQUo0yymc8?}WdHgOWygb+{Is=qm_ zk~K}s=3%q6t*;*l95&K*_Zy$Q8?y_@C+9c2k4UsGweA5Ci^@ZLfiyy_oxLITs8N_a zmxf|*XsRGR5$o=K4A0*WO?$zS$&5I2^lGrs9+2lhR6e?ATqk-RHt+`JjuJw1)!eTj zn3RN>qYp>TZ@QY?;$6D}*{U#C^^MXZj^Owb&0j@Vu$pCW zA_fA+{#`xp2TD3qH;_*SS_A4_FBw?*SG3giw#ZQ49|$9%?M5#JS4dj-ZCIAKg8?7C zi$l48BP2_@IkUMsT7Y!sTChI)b$|R@M;SHLaSuBfAz?F?la2dzL4fErOl$HRNsP>r zhX=~9{*w}o1!*~Z6$HH5mo>uu0P|8VvN)MSijc>_lwcP5I!;% z;;3jMo+eJl8i(sCJtGFb71{{rDyGc`BA5xL2lCJ_6v2T5n%J9qhcZ_V7X~mQ7wcOd zw}HtB7$p>OuUYOHr=i@B9Ikt{a9MC-~d&k}~XhYg7O=m*X~ z@CJZ1p8)&oQjTA_C~Q;4ZlUxIN+9!SDdf%kcBmW=B=vcAyfDd`fC|q^C70*#nX>L$ zLYWvy!zw;4kqg0jeOO*pSo1~k2X@0(Kh53{Fqr$XN?6|3)8O*X^Dk(Co z|I@T+rMFt!2x5#UWI;n!COdh%4lmt==UPh*t+WivRAzc+%A4M;R1B#WtV3OoOH)qG zAqNtiMixDGIwTP(o~Xv=RNWGBc@6AUP&2VAWzW%BT$2)PQ zD2*1CZOMZFZezkC3ugYH=$z+9C9Zivu(w(e^_UL-HR)AVXl_caFq$(b;+0urV zZgfDkaziwdKWM2dW7)oVdMcXm4Q!Oh8B?ZtQiuyDP~=(;my ziIik^By;sX8ntmp`uoW?IJM*_W3j+*Y%~7QUk1H)9d(&Ef84nuIxLFPVD9oL(NmRF z{;l?c*P{PA(*q2u&GOV0oFVVAyKf5{kvsxl%ERo--qMT$LE5;bU?cG&hdKNPr>ZTr zd-2cDdk0Z#wm(&3Y_pkDO+SNHNWr4Pef2y@%vNfRF4;1YHeX}WCWqXv1=;w-bRfzt z7`e1{W}MsA9yan(y7QTqhTsJQqOmr!1jS9KZs1#x^r%c36`9e~TBnOOd zv}<0A#LCP!knYXv9&=>;!cmG7s-*PCxa=MgJy;oQMvXS7^# zJnz};?#KZI%r}5MQHwxzmjxsJT3c8@chI*_^U3}@ZJ_vYzoqImp77* z<18=;Anx66f3c+u$6jft7$NKD&=P#bFV>8a-4GyH6;~)7tn)B)w5=oJ0Ynxrw;}`N z4-e)OPYJPYZY_y4^^niRs<0ad1HWvYdIk~-422z(GOCcdU9fVOFACjtMjTtkl@PuNgmy!9y>W{wAzFR{g&EdiO zQrv81^yuYYt^QnMk@AdtVW9stbR{Osu~6LL3g>?po?tdM7qcmT4`7+#z;)M30E}y~iy)$E@AoDHFJDDDvSn?Thrz{^wTj<_NNJgN_E%-2^mApC= zZ9Dnm_9hYEH)C5R$X)1BX`uIYD`pnbS=0B6p%tQ#P9P$RW5y?8t696YF!cPSGSueS z^OoZ-`y4thFi%kWBWu!1f}4+Gr9BsV`PWL67L`&f@j4dS!1oLJ`Ig6f%}`#R=k)B2 z$a%V~-DaAxG;2BX81qk$uCbq2*B?N{4j(a_uxNQ2-aE2KW*SyCMHU=DlF|9T)`lg0 zO9;GLG#V9c`lyoy9Wr;XjP@r9vCv&qKca1C95ADA(bJ`VGW%@Z^QI{z)o)_C`&d=2 zVLF@K_PpQAn_LtXWweiM{f)EIX6FLWG`Qt-7FYhOk<^D&@eASyfozXGE%O=)jO<%s zb{1jgf_LQ~h_m`R^wsiC{tg~x4a@75vryU|NM2;Fpi^$qX&+{w-xyzk+w6-Q;-=1* z$^4IakxHc?kQ+hZ=FT})DpM|vdOlUf^HYqAigt?0+m72-|6`qnLpo_~ta=}*c$LR7 zzUb6n86k95NM?&_s&)qT`U})6@dJCNNtc&sbnjhU-k(|GYN-o_pDP0=swiqu0c5Qy zsi|;CG#sCu#D)Zjou$aZuY*oU1x~V>n!o_~4N#P#SXo)UdA4DOcY54AS21cBiyh;6m_>Y+aN&34HX9RLz1v zqfn=Qlu|2|^gVh!^$mS~xKfs{PK(@3G=0`I2IufN8Kb1W=tc0N6IbaSa48YT1Ai6#(qg0@`?d9~*#@%55|64;QKf z@I*Kp366s@_z(gZ_80-cm8B@Q^H1Zs0iJE!CX{z=Z6j=fvpfYTxa5k^ zM_$jQaW0pdJ?6{L-N=(hGV01-k)ujeQRm0eMOp$fcA{c=eu#gPRU>%E8(8lv$bpI2 z?5YwjkR_`7IVkCE&|6x&c3TzttL^GqQVq1_lmz&PVSx5d$mKMxt*wzj0NkE#rvi|^ z(zCGiE>uZ*255AzAzZEpbsN9QngU8KDyV-WhU?&3$Id4X}EoGh)?@Z}}CNb}(k`e&uY(=V9_4?0VnNBn}jn z+G2L$`#!oQQ>ZB~Q!6Z55Ji!g6th3b=fsq*?^oDwe1h|!;NEJMmJIoFsXu|r10x{x z3Fqo<_T=zb0@DT{TjlNrJv^eZ>gwv|5-(lyu3neje>Y4VCTr7pcVee5shsG~a0_UqOamd`)5#aE_ zy`!TZ08>gRw>@sMmgIiYlZGB ze#!Acz^)>BMp)4o5J^6*rBd+B+FBF<$tL^r^<^xbLN7qI`{1-A8y+6Mo|mWxCwvt{ z?+^q0nYV@;aWP&jg#NCMMT%-Qw6;2mS%l2-37^K9JMv^K$6VIOimwV-Zz^%Kr5ejv zdEIR%!ij(YSe2G7LYuj4ReecJlg!d-?!jlKacJ+HsfAE#P2sI+J`#c z@bTR`)C;9DiG;95k9TA9OFzRoH0}Kd+rMc97Y(T+w&IJwe~svd92#-=B}}_s?kT=N zM9^^>;bQ9pgTZj1pmKrypJFDZY+e9E4}cxn;`x36cx+0nmsz>F-M}#M`(t#gZW!F7 z+-b`GBd>G|Wlo*xnZYs}@}kTJGQ->rL?k5Q^78VN$;K6IA8=nIgg|71y9@zzX0M?u_{s2(5DrNzMi!1)mM)87--wwBT|-*z@>R^`K(!!=e!lg@kG$Hb(0=qH zTVcEzyUiil7~)}D_L9GUf%y3cAhwU^1OrHhfU}n92SRbcqYsn?Km(qbX$7zAz$Ez)1W@cuM zCRgSIC={-`hI^y|9$A1F7VsLJLvS{r7Y+)PQ|b52KGc+}@Qf$?B2q!Yx`M7KW|~vp zc&T{J0MFI`Nw_Rb!Hp({Og1s=qOvs^nWcONFvz1M@ahDhW(mOW*=3`# z=GGbm@P{w!mL1XHZ{k2y%+2-yBoJlQJn$5C{YR-^P>y8r#<|Bg!%l&c5Bu&jXHX!I zIK35g`mfv0$1Kh$x8tpm~Bsvo2P?8Lx@$*yVOK|n=;ZNOEHGpVSwG-5}s|i6}Ga+flxG)4L;D6~S|tygWH;O(3C~3;ndmWi;jJQ|PxCjuX8IA@Rfm%W4kH zA#iTGeQ(qW5(7Z7#!$t|faOUwTNjzdJm{yt+0HWaMpNw3nf*Ks=eY>cQ!uco{%bYk zdQwq+&#gp)zkY_a-ypFKctff{0lLim`7ma*{y;3!c3LW@iWb4*+~p z!Ja4kS2A2Z*Bh&$rw+lnleY6+6IRTXR->d$upEP(y#uvL5PZ7|;}Yl-4V*mF8vH@X z%7e|XkVeqs!M=3I>mSK%Okf7KqdZS`=K1FHhBKs}X2E{->>DWkD=L5g4vjcO|J>?j zdql1{M9^V%;3p$PD|!|iR%Yjh9x{eMI&nXdjuD6aF{Ce|Rs3MXOT}lQI$)&@!P)zD z@DKtgm=g;-TAjD$1uJTI>7Q6jGO1jYHI(syTe%;|fch7pfb|wG^Uy`1gswE@1b zzkCmCMhaX{O+o3I9B+OE8$~+cP!Q1+5jtOH%G{=W8DTJwY}p;)>z1v`wwYNix9wAH z0KZpvOb1Gm*zPNqmngOG*!@}h8N5bez79$buM><_<_>-py=?oZdYlA)B^FSeUc(-cb~q9 zAFMkHYSN?@J>LRn7$glB`jC(Nvi?BB}H7(l8>?zHQN9 znIt9&@u%5k7v6ieA^+$(6jp;+(=+NA~ORdEn5VTqHp&%WplDUs(NrZ1Y=a_ z%v1)^>IG$~2i@LU#(!hd2d)r!HOmy#bH*q(^Ty)j$MJ}ZBtVIAu=h8d={_;@V&~P` zXy2Wif^^g9P{$Ey5G^Q`64S=$+?FWMneNP%n0T=z7|+Z>=>k}fygFQ{qU|jmzjrHY zE1w5wo*}l{dhIZ;N+p>&in?IY*UAp2oy@=~Wt<*z$fIO6Hh~WpriOO1N&>_4Y8Xd^ zcy2yW3vb)3b48bI!+QdZ`sff*s4q#G_Ri)PN{FV62X}19^f=FQ=G{ke;XLUZUbd!% zRLEmL^zVJ;x1iZXgz69MPc1-5dQDs+qbAOrV_+#|EXsCLxzHqPPqtuCVggNzH7&&V za3&e2qT|<>^433kb-^G5XVv9{fb_o zze;3*8%KP0%Se4jMz&&{(yr^MC@*=y|Rt;%n-Atk#tBh|SW6|WE6fPRt- ztpJ5}&UL{b#mOkRyQdRJ?LDZ)M;S0Z>F_@3sTyt*-ApHb9*y2t>g{Iyy9UggTEz0W zk&Z)p7;wL|Z72y4sV1DH|D--IdR?A#ER#SxyPBz62rL{)dj-rZQ-96B37b^w3oFb(Jgul{=s2A0IeT`wJ_fa%g(MolVBb-o!| z)|$xjdx9LOhB(m)Qsp;~c{yCbXF0AXc9$+ALNs^#EX=-Tm(0#nb)3z}Gg~ ze0Q}b@kFcc{##ucA{xQeaEw#z;wYWd{O5x^7b(@ zZ~ATHWn#a^8GbxS-bPnu=k2U_mhZP=OPW6@>c(*f{ZBe@A-@2?* zpMRYAY}=iw%dCYt9hv7ud2Q^|onbz2xjLs=$~<@%epeL9#$2|(yRdqE zOwDtH$wx401M`Ztbl{ojesnKb$$4CJ)+nJzoB%Zk6kPtnyCi;ha{{fQX=x;a*SmA4 z(@=r4<>R`uEw5)ByOV{8%+<4zy{*-SDzKmXUfcN8O8oWRCY_7Q2q1vsD=C|K(r0~o zbptbO$s2oR@%*22szu1y$m1W)1RO5gb>U)AqFeo^vaNLwS+cAw+emlv_Dsp~eA2!F z)68K@->%H_Zs@EF)!|5vyz_FwDZ5Y252hw~wvOcPHD(Kne&_W(N(%CScsi0F&X@~P z@Ht}w`FD-jZEbk@22PdsvDt1?dvBuofqgRUe4yIALdPT+nY`bHM(oxLE1x^B$eW4$ z?xMAgdQX>)ql_+o?vAgm1t&Z0Y*zW*+|V;JNb#>``aY1`OH3I7V+jnkp5$s0n^dMU znfgPLa#F1){-QNi>SXKVk=>TX00RlXFJVjYr~0R0^1khhwb)aDf}9z(ibimHFa$;b z&8=QilswJToo#O8BZyKhk&2@A=*q7mr}8wj9O^Y9D(#!x(Pe zd=1%wZ1%V)!0TNf$u%No$lJK?g`NR83tLkKHhJ^a)P(WP(^4B8^{an-z~l1#WIoy; zxPK!50Mk{U=ZD6VZcPYiPrXCYF%z2?scvoZQwIY`*5hbM7!CK+nvI3bI+b zMQp9zQKo;-(tD{{Rk1P9SMhXKqj6o%ljZG*=j$|Phc$|BOpW?ClZ~|e2!@m4b*Q*J zac#>vehei(T_R}MY<<#(s_^*qF`S44MHx(N ze|l7hlfmJugX-22xRZEocwk3|R22YF<}rQ59troLpEbXk$`<{CIrTzzsWiU&GjNz~ zjtkfsci}{BDEN7!XzP0;RPBt2c`Xr@_<1wSlZyN-e;!f*fuLkhLPb_q*$8{U0~NM8 zsr19s^TPvB7Y!SyfH@pd?Lm)vnCtw=K&N{?Z5=f{zVx*Ide667z^-HqP5&|fctrS;UwR3UZJ{5|2=E&ZzS3=Vetsel4xS z!H#GZX;}^WeU(wwrS5l1_2%+sYif?UXU*H4i|l@6<<-!co5&Mt39P>l1bSXuX^TJ! z6M5R1`%vpjlHqwIw_If_P+jmR0bP z8bGw*xUV-vxbKX#Sm;du*v<5$JUY4EYzI9#b;;B}FA$tUYI(jYa^ZtB+}|JF^j|(b zojfimC=1W^_lJ~Kuh)N75qR?WQ6z-u3QNqRRTm?z4~Jucq$j+XUwGCh5|I2nY( zKhD3?)F|sZX#8TJLOhuwNjuRHQzl#3yV<8ZF7LhA%#TA)KDQlf&kD=-9!S1tV{38` zK23T{KLhPf`VOM}5KZx-@u~_r%nhGZPbAcb_U`_eExJPzQ4l~|wDO%r+E1_PBFQ?Q z(xcxs)mP(w#;7)c_7Z?Vedj1p zFa%zu*-+;RPngCbvwJzZOb56lmDsCGn zQz6cg=1gE#KA0bAu#oG!=nR{BZUM8B^Zv|yeo`E^wdpSRJ7)!^r!Dc^E0QdH824$7 z+#55IU{~UK>AVx=2fvq+?^?BHl~L<+WabkIA0OXsC#s15%~)D^dD$Jcd|hq+aKPwg z+CcABV9zs{u8v%6Z+Wl&XJ;4aGEWQH(eZaI7`zFAK;8+mXW#L4UxdGbK4iG>`#$eF zzt~Og&Az$f^W}AXvJM&QYR$G}1FhRTISpoVU8SHnliBvol9sQZ^^t#;*TdLZyVVep})0^pOcY#dWMeN~Vf;}7Bu>;QrPb7(38dR+WIns_w zU}EhyN7SFfw~OsQtxQ{j{K3L7?B&yqsP$gt2#x1%E!c|NGvEHr4n!PrpzW@gv>q5{ zHvJ{f`-UHVVNP0q>E3oH#3dkr5=wP~OqtX-B1-*w^RN86FBC)qmeh5F^+nEPhx4nP zA-jhMf{7o>>K519mq-PoQ+G4(TAbUS+3xNV9!Xlt75=?*Tx}YkB6Vu65@O$H2i$Ms zM4$($)Vg&K0Z5GT4DWcy`G@Io02NgYAKz zQGI+`ZlUFmV#9ONgVGL-HC*=|@32Dd?(yWp;0y=lzNig9pOc4)t=+}3&CNT#Ln}XI z(6|6$p)}Q~r9fTFuVyx5`vp98qZ?@XMj81dC=-^-YPc|{ssY^B%Z?AbrvXg6>)Rsv z7+G89-rKu}P;{DbrW0|D#hdg`zEafxNM1$xw!Ln6lIWq?L)Q)AI!+%AnpM&Pn-FF2!N-JOv3vPAQs>Wnh}N0M|k{DCvdiu`9$dRN3Yqg zr{-l;xWOY%l;KI_QT;wnCg9rB%pTKOB)@>v_4#h%tg?IR2%^Ruh zcGpkbR*#HUF8O=kaT@{9A&wpDa!LeHYNmeF+T#PO!-&fqogkh64~HWUV}aS{y;mwD zB?t+Coe%H5j$>JycK%pK#2gPmOOJx_(9SA!GzR-cB|LhuHJ$z1Groj9?dtH6i!_{k zoZ2eN6c*Zo#@gu2`R$pN_!%(+D$~wiGdzZUv&`;$b#BHRTr&0}HFE_pk8R}mB<~UD z!`l%xTzovE9rQ#~IV7@=pN zcH5T~79O7DwmRd4g^ykfB;JpofjTwS8Lr!ol{N`Kee$P!vEqN8Pdb8^OV8~EZI>br z7X@>xVU%*8xQyt8fyOclgSA%?dDI(L>8bV95;fc@o|5EuaYK|s&O-c zrooi-Mb|OHRpgL_b*TK)oT&L_uRqVx6Gv+q+4FT%@PyX}qSp0^n4zNL@NmHgU~LXF z>?3P#@gkswXL$bpB@WXUz9i%yt={+|gVsAY^9LAD5-7hvm0cS;h`x-u$DHhzy=<@v zAL$V($!Qyww5!{CAo*V3g-R=mq_?5U9Jp^@PhmG=+9!x)>#ryk(^atbCCuwV= zFzD^BCh)!xY|PUsZ({Zq~snQp?F%DP5T^~63}QtasYA0>?+_9|eq)6!#k#?qc3pJLV3jFs}cpwINkg3VuoJQA`9qUmP%*9A)?Pl6hU-HO;j4Rd%1@XyW?3~rW^xubzd9LU z;iKL(GFh+K$4anoL!-X<+gw~l?LUQP5=cENKxUgmxHqg9U&YWS1rJg2*T4Mv#|SC4 zBprM{0+-87Wlz%|)5^-c2y?I%M~LdScBA5nfXD-~72N^T2IJaojWg+Gx0QZvL-s!7 z^8K8?_{QP8#(bBoZ5YM0y4jkf%h-$Yvu*WBK3`1%-^N`Q@Mn&qR(Hx)&z{7uanz!= zCs8_Cnw^o$?_9+TpyKs_6a}d7{H`qKxID9!V*gO0KuvO^{7S%3$AJ_mY1#uS8-X&t z6*3Hu{^rGEd)FSzI8-KP-G<*xfrLFX!dLJe4G<=%4w7FNxmgW`7d0pO7B6)<>Z}8J zo{eG5sySA_I~l;8ZVSA2E7>`B-1h97ChSA3f7?kQxTX>WFtS6M6+%h&U@&iBlabRV zQnAtXU-kLd>>O2k0I-f7tsD0;YiMu~3nO@f(M1W-|9?}L6G?Al!H?nl7z*ga|G)Vl z@>Fm53Hl%6=Edv(57`@A%xL(rFa0S~Um~opxUKcTmDxZk#Shk*9C#M0(sbwpP)YG- zO%8~@i$mU+B3k@uX(3HdPY2Rlow-u?2cO@)kcT)Mfd12LE)v}05crV-3v&1o`vCO#KaHXO-)y4m8EN=N WD@|Yp8Q3&}KvEL&;$@! Date: Wed, 7 Aug 2019 13:02:01 +0200 Subject: [PATCH 007/124] Fix SleepPerWeek shot text alignment --- .../phoneScreenshots/3-SleepPerWeek.png | Bin 88742 -> 90524 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3-SleepPerWeek.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3-SleepPerWeek.png index 1c6293a499452e5efee42b90d31b21f2c7264146..e11cc01d0c27e21e2ac721cf151f71d543c88345 100644 GIT binary patch literal 90524 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%0D)VCNQzR>CC7?h@#;~i?E~?gZ{hxjf`~9tY z@guHcJb%Degp&K?OXza&ObfoVxFKUIim*}_6%`b8pqR}4RQK=;IM+@<9e}8AH~QcN zo;O~OS(y=pp2uViqMsrYlt6Sm8|3^pw6tMt3fb1|Ms$qeEEh1QYJ>6{uj?#Nciy>s z_r#CE3kXYKmLgFcr2<-|w?iE5An&zpzmk+*Ma7W@{y6{|e;I3w|MUpMbO#Cps@RLC zi54oZ6?V|0;v-Xr&bG}=`$H|C!)Tubr4*b(O|Vvy5ycL`znZ^u+-f4M zZZ&memk#~Z-GIy^V2xxl3mF1-A&jjQ9b+T9gKO#G;|IdeXtmMU;KQWt_d^VuDvU$e z66#lcceZ;PRM=X}Yk?{@B5#9D?DGqvFB1iA2F$KWQ3RpaLFu`I^D;`Nw+6>yHr2J~ zEUd)5XHb3+5I06YA5ST4I55co1GOpO;OvDqgQM5MAx{CZjfL$`9@krs!pd(aNhTOs ziLS;ehSQ7*%Zxq_w zc`u>oSRgoDTvoxAiFOPXakB@!X#_}#_tv02q%>$eQ+sTsmR8G}Qf^@jxn~0td66X` z1qS`A@VCUy+er%##f5-47M(mvgjH_ z>XaM*lrYAH1GmbFArr)I0-EvGW>@7-(XQ_EB|a*PPK=JGu-;{)zpp}RJvs*?^k*_!RAU#vwS&E6w~aEk+h4Jr#9S2&$upoxhb zzmxq)*dYvRB(4nE!DPPycw2hcd~obi!Cej-Hy+hcJ$n~FMaaK&ABR4CU#y828Q*U7gc;T zT|PQB?m4v;nTOz3kOK7DF|T<11fpa7;9nV;#YWBA3%#aHoPvW7LFBBfuiso>e-6u^ zUtnN{%JYK!{9AK#p)%6aN2f71-LB2Ll-@fqILQC=tR6+zW~|ywfwE;`fd+(HA(zHN zQ4#Fy>+sFr5fL!#r9|+%DQXid>r#9%-L#1fUlwtr0RF#tQB+&RhT2}|A=!SL2r0W= z<=2fUda;Dln8)M3EV}j67jp+@x?kZ(p4nt+HU6kj<13EWYVfI;Cai zOP$7s{4yTSZcAl`WtU&s&CIsGR$CQ#u{pU>Idt0n&g5up1ZRY>Ms4q$txaOm^jv(# z{1f#tu4V7e-+v$QHqqdf+SpLxpJq&fi%Nf0?z}W<*A~2g|DA^_g*FfNiJi&L&Q3mL zA(rWBrK_&z6novLVbnJNgBkw5?b{ca@?7UGGJtfsD7_hM%^`eczxH;EFsZYGmw8-Au9JPrVao1K!(k2GWEQ>c5(()Tw@MmfN){+PpTp zNaju3%y*~5Eqc7wA1f>PT<`b47HOo^mmQW7ar`LZbIYh#=>Bp8&)Tbp_(cLtOSkC; zq;+rfeU*{j|9#~It@)H|r1b%s10Pqj&gvf9o_|-~X6fkj5d8UAcg1NR>v6fXyzFA5 zO3_09Xx~2D&Y0CvZ8NJh+&;JUhK9ThvGa%=-`lE&>@jP{vtOu3_0 zbp?I+`Zwy&mg6@}eAPLAu}r{waN{D`stW!YlTL9jueFz_oG+CnnNyVcA=-UG!_6vV zromk=l$FlD8@f`-q9}%A@Bg~hrv$erKVZx4a-GG0Qroxg-jco9 HA?m*X+S^vD literal 88742 zcmdqIbyQW+-#&N&0qO1rMLHy<8v#KYBrc&ygGe`sw170y4bt5$h|*n`lJ2fc{x;ut z-dStbtXVVb{cnEf58xj5+2`y}JJSLx2n2!*d5Qwg z*bSM9f?rP@r4%%ug2U_ShY$#a7NQ^{sp*!wx8Ulfv3`$w^j15?X`FZtJx-ZS>c`8l zKZG)p$b{ucve6mY)5RgXO=W+acb)&8H%Y3gArRq8eyrSU#V|XRQqpM}d)6*a?U)=p znaXIXe$`@B-e#dP4U`Ed$0)ve}_v>p>~ zg$&tW76|F-Wi?a#QbIy@k~wPm@Qto$ART&oUs~#^gSXvOzUvbS?u0OXb=}7BuJ=*h zX2^>C_NC0y8shirkgaGa0~w-eGb{zasO2&eq!`%n$c+q1wCj8RV#6MX z?(>mF;xJj_@aiiZx;bM3zmO0P@#`|OvBRPere|-wDUglY{7-D(IZp*u)Hr=D$m>tg z`fw;=c7fea_3Jw~X0)`NQfC!w^4AX*_%R5OfBQ|e8+F0PLeT+Xw(qz&Qc#sFLzm`O zS)FAFS2ElvrqpwcF3h+1NVPSd_tlsEbTEvU!|?vi^|gKD8gzCjd7b>=k9btT$w_#p6Dh!xJtVH-&1QCnU(j~Y{x=nJ9OzK>n!jK z{KwIUqp$uxG|XGydV$(7+~ukLbkC`xHmjmf#_9>P@-ISC4;=r4unpC~T@!BNoR{VT ziaMMn&M7TD)W8!(j-vvL5rxsKX$d4=aFo8PgbAyRpl>E2DM!!xrZ^-!N$eX8;MOD)csXAw$X52!7Vx&%HHXwb8p6v$x?VN zl_V`;&(1D+T+U-+z+bMte^ejD>4RuHu3b2==-(nxFkwZ*BK?dWb@8cmM%GAvuE%6` zk+OnpfWojOY~oc&$xJIA$%6pZ)XQl}Z`=9^N-rMM-=a?o`Nm$J2J-yzJatGq9hy9Q z*_wTrjF4v7j7jz@b&+SR@^q;0o<64!fCXH0QT8k==K3liEx#M@IBEFQlnH z^m3Rff#|iEOhm&1uolM9y!b?;vUD%~_3!4aF?m5z9p?>FbTRMenXa|}iPW@eoXq}u zbIGN=CiyuH$X+D7Tb%<@h&(n`z*h9?0?JTiN#1j&)YIr}KPVMmV8dU|zaEn;)vlRN z`}mq44-2{Zq`~QUBa%&Lz4ArO88_tVV+RS{4J9Z4dnZ6XSpgFJ&`?X$mQm&yxp0V zp#!y85dU)`zbZ%4QF}qtLmx`jp9qdbZwjKi^wh8oSBceO{Zn`TUxtk|Zplp#Juva6 z=a=1|lOWV&4Xbu9+~ius_F#_x{Z&C8p4FQD| zEWD158Nz=?g#v-1j)Ih{S|)>-_A1Nu)Uo|UeRZ%{K#4f!$h4Fmcv9-C*czJr_1RYQ zc|e;I3NM<1s;ms1U03YWw@Q~q>`fC>7DppW>Nwf24k^*w+ziz?v+`=5n7va{O{jhH z+sqM<$L?j<*cgaExvq(NBGj`i`i&`6T<#;eLMIbb|4H;hO{gt}!#=w@#GuXr8C?u6 z0Fj^~3P5>qBQjy1lgwBo`KNOs({rHgGpoH+OEbZZWh~S}A}bzd;H}h&{7mFdtV`JN zxo}X{G;R0donV;n?UUc}?MyMey2Y=_od(AZ(oy5(!VA@0 zky!Xj*7KOIRy8mwr)^>1`J?PX?9XGVTQf#{;2s&Sp#me+^3 zZKv<>dtamXxt7FUOfN_4;7%1G)hHw?+4Jge=V+xcr8SNz;|`voZ5q}Nc^ z;@74^=>Z^_UvKshk5Ie}a(9MGg_c>e0&7=jC**jID-wF$(UjNonSE33bUd_QN=p`OD~vgGEiJXQ@1RO)94jtWpD!FDuhn=b!Z zwk>>#vV1KZQ-Snsz zzrgekQuH-9OVL*7tTYgvmSduzSbY+Hz+Tf;sBgN{whSTxD&1H_0N}YLqI1@ z@M{r^5?+orTZ0t?fasp*pSApC)N{Yj^o|ST zxA;aj7z2t>OOcl`7;&<1opqS(|AiBph!u3kcsM7vp5x`2;N+DlWY{&;4^@*#VxI&U zC@TZcqYr_vxRWLh1|CN>K04tlUbJ;iC2v#;mirvi;p9fc_S08Ye)Q0{8N1~lZ7C2N`lDFueJ&?=zdyyx`vMhXYb647RvQ!=vVYz`ml6$UDf8^ zX&x)ip3_`Cvw756bN(n1M^t%aWI%1r6K%(MN0<#l&6i3PlhX1yAI_zgxovn@tG+Qa zho4YB0xuSR>teb3BbGDKvgJK56mrl-S6^imL9>;@5A#i1uPG}&L$ybewf-?`i)*`- zV~z2ZAvjWUpy4maG>-i=GC<1Ats61`kp)bf4a?!vSqg6wkW(MA=TB#jnSV9Nz{Za`2iuwHI`j^j&#jI#-!gYL;lBNHv%ONnWEOLxK8ctPTmJCGk&86W|2}G zJthW9j#HzG)`6u3zD8!G{Z_p#yDTy!wLSIc86JqiU+Qe>QRFVH#r2IO>`rR(PM2{%Y47QxIv!X;0MNS>?6U>Bj~%j<4sF9{gsCOF{nRSrh*wv9jilCn z;9@qu8Ih8$FLpv+>naoZO@8i#0GF9*T70RhVPW4>B(*8E_f=!Y8cThEX|Ha=i{LS07%0P8rWey2#*>SUA?9n z8YOmA>e(;KIss@A{hJD+%Vie$u@8#J4HN({F};K7*w_upMRax6_iQ?=3&uR1WnmRf zI^*hYqw7L-#@bYPSn+h~imk_H`s0;I5E=UdTX&iEf2x5LxtZ)%SArI?$(g2?a+-Uy zd;R^GOvx@SjV&2%)+m|kl2l|!-qV-`khu#1d-iiN zzqYIPZN9Rc$S?%j&&5cAk6aH~^W7A_u96ZiC^YKE7Q=0+hVTnELZ9QHY~#w8p1~TB z{hv}_*(193^yrmpx$e1j`kF6lsh!tGxYdtrSVMI*-j>0;-jO~eg;$k451|x7QDf+p zj{W{E$syL-@MRf)jk12A%n>GpMcO&^rL|dOzw_QW8!tDO>bcI*W`7+~vp}bl8>bVy zFzxYAS2gF2hBz1XrVW9@t}Z<8EyfN5q6$f?`;~t8LWSAPAa);@vK&mL_j%XV9y z*nX3m{(auC)N~z~$JHb`uiMu1t>juF=Ozq}Os^ZgxZB(K{t2A7UBXU@MJ<}tE;P3{ zVgFgR0l>Aj)>p`AZ(COR7qaVkO5@Gg9Tfk5dXx95Ho~^`>x=HK2Mo@;j3vg;%=c!D zyl8(xddnVj@}#9t=hY>oq28o_RA6~uWR;@;o#mp%XUnC4OgEXH|K$SBe-S!0S(#39KX@~!U(6VpSl;DC&X(4sPjr8@BFQ?6#rWV5 z>i-aS)e;1t$pv_e^pXkG`-iG!O_;r{r(EY?HY0=One0 zs`s^0pcD%UVJF1U%cdls4rQGU_l)pa2aLtHXY)EnpQUCU)&hS0BvYLs`;d!p_yK<^ z>}AxA2AE`^0aeC(3xM;cuUc{98vCQH(tII;9IeR6=FsEyk4=$yAZA^oSH%qxZZ8IX zFIEfiqE;v$pL>;2sk|AuBhH?Hpg~trDHqLv{u(==4>z=s?)`_@4ncLxnx}6Mk-{tg zY-TQ9_^#}KbDIZKsi=s=i zwrT3UvV7m5^ zi|DKtVv#H2RfW+u4|jax<8Ixn)`=sPX7#4|FE`WyKZGS^(iF%s>~*0r@vp`sSn2k zE(=7VzIOYpe!>{OLF)0B5|V)tSJIV&rbVMJfc?AC-ZIH?NyGGSWMbJ zX}`Hr*F%gKLu~qJn;EL~J-r?$-4+l)nKlddt>&hTndh3i{Yu3&f@_O&Gn;F3(*zf0 z`Z{2M@fHtZ!k8%_i70qFQ4+vU6@(jEN5%E3XTN#@C^BR(IX|^t7+r1Ki5WXJ)>e&e zbUP@h(Eb6r@||ig;_1y>nvCYQo5naCp;BWwd;&=t&d}z4-oW{v?CAi^KaQ<5`_UBv zyDS&>@{1`NpcIS!1d99_zz03#(frj{DmRbl9|28a?~le-Qj!PI#=Gu%J5g_)YB!(3 z8~WGc=!h2#7f~Kuo>1df??4PuM4HQGtdh7%suOM%E8X!TK;CHBT_l=~#^Te}lexXa`I2Wgu`+Vgg7MliXOi!uQ;TPX8*BSyZ`B z_sJh?Y?f=Gfb%Iq7|6TXv!bY-&k&f)2A&)_sek>?#OjqjZbs*NI z=3C!pjqX=Cdj_2B z#WRi6@w399JfBvW-I)nFyzWz;>K6Fi7`ai-Nw(4DHQS+RROg&)J%tiPJ>8-1ga-oh zW?D?PL)X2qsZVCo$dwcrbVwKtfBZOg=X9Czk5+Gk7>*i)oqX4-J^jC9fd!O5Q|M~? za~kK^Ix7d>_{ULgVOyh@jb704!pgJeya{JJ=lQQMazjl){n_SKQ=oN&?}H(GBF~UR?jycOOp09 z6D zIx0n}+IGVpYUfoLr4_dRp|*pJ^K6yIQH^(#A&xC6P^wuna;K2=tLp)lMN#ina9*Bt z%0zd;>bAN*!^PqY?>YI3nUAsK{FcmvC>8_`gRhyfeoa1rdNcR6cKeC62TjtcqgvIK zr)8sUW&vZqf6bd@DLqMQ2gAaBcP^?~&O5t?zE>j=TLP3jPos%Vg?vWVD;wrz zLYj##oWI^xmPVAhlN;A|HF&kz$cdabYCvd}AFv@N`^|{oar`il!32of;k&0t(-0BR zJ^F^dnPszz4lIKJxu(9uJFO4Sv`j*DcA}(5S^Bo6PlF3fW>IT8(J5H{y?FdIW)Y4S zu?WXA@m01pTF93L`3Z?f=U%1$N+%uXFu}+tIUm3o@&lc2=M!wHa+LSA%-$7qcH)wi zQR+wF+L_}zjEzxz(p=JuBccN^ahv=Pbuij$k3FfUaru18oueY zy^#V9Cb!OME+dh{X5p$o#aDgDA8y6n)_6 z`LV%ik;S0rRj8>d|65{-Puc~$ScOLRFDDP4=tp|cu;@_m=ZON|)Q z8fwkBpPBkSxm?qiy1)eRKD(?P>H6RfA>`6wH1%QX-Sel<(cABF*nZO&oEkF^NFRT( zpHB}4RkY!%(=mivRPF3{u_ojm{gdO{EVq9Gfay-G*8%k_z2pcf$w${bfNh+4{XKLv z=HQSx`_tTQEYY0VLhtz^Y}4y&(Y!`m`xQi$s_7-fu?Qaz&mA`*A@b`BnZ;~&XZo4e z_AHsaQTmeiI7!%tS|WlNpQuD0H5kCJ++H9^+2ct?cq)ZZC+{B^fljMxnTZ=tXr9+G zR3oFuTg(!k7_BVq>z7?G!*Z@FeK98&@yLW!wE|Dlc8QROv8dA-n~`#4fc7!CJwon* z&1RrF-n*9{euS9fW|z6^OO#4ZZoe-am<3eSq*S=e;QI@uU!NMG%^V|)0)e&Jl=%!d zYR(s5r}xoO9@!ruA!wG3 z<2xFr5lpoXQBDYwJpy?iqE+Cp{Ss~32e$9EkgLO3ze+By{j%*PNlH77Bs$c3peFZjMA{4UE;>J&m z7=;PJw!@JN=di6;MkeQr=WPCjeszImcC+m$I&!KP9H_m#tK%QO>19PfDILVL9G~HT z5YV%#5$w0^ir_hAnB4oEzUa^ciXj4L{vNk;I}g|B*bw*IFZSn=FG_sDkD}*{Sk^}N zTG_F6>9oL4;1G3+6Z=iG_4XKgCYi`|>+vumK|z1wyMYdA9aan>u_ct6ZF-|RPj;?X zzb^UJ?;MwSmk&1A`}sMM@-bU^qm*PcGiuw>-F%5~?FymVX7~X}n{7C3H)R{0{#2ew zuA&&ZMp!bx`!b4|2#zJ5p34{sX$g{wp!T}jBQhKi)wkGAkS|}n@He-=u%nSa{Dhre z`nbZ|X%+M`enbBY(e?hS`VbnOnB-TS)-&A?`zPxSibe!@qj@`B%+YoxN(+TdNMi5; z(g1DsPskrft6J(2q=mb72)9Z_-s3 z-qC)DLQREfW3U2iW9jqrjUsW*+COh6BlT#uzqyFLrjp=s!=@@j!TR_OQO{u8z1cw{ zHPP%2eeZT$d_Vho_msr1SqQSKhd6Fm-rSknDa3)N=B=ZRm@2rOaXlytrwsNuxb@xfd)wnSs$8)2`@)UqNUdCxSGTYKeV#~qH7kxI3~ud4>#zbM8acpjwZ zg1CZ@U?`~SrFMq?f&J4GV9`d$&(XhUV5H2*WWq9cdT;o(eP1)?LI&shr`ta%4!l7Q z*~C|08_sw|&l$C*m{KO;gaog8f8*D}vq)9XU;gu*CoR2R+v02vAI{h9d7P1;zlpYn z|J*6)vy}$ZojVq>Cf8-p@j40>PQqyXLJ+VI%c^HFc8$n{fo1m7#QmtH*ZPUQ5n6mQ zyxt94``7yV{M3}SPigw^6zu<7Cv!;O9g)5M!^ zq%bgHdop#4>2+N~y7w=lA*dr)#}DCsTKk6?&4lo{6wdqg+dQ)aG_!af>OBo_lJ^tO zxS56*yN3M)4oKRU?sG}snA)%7bcC;p(7Ycqf#3W#MPbZElD}|sou6yT*QZ8Cc~!&e z*hczkRmF;&%R1`zp*kCrl>DC$Fv@kA$@}Hdw`l>ZjHTB1d)_`J4MUS^5W{wLko>`I zKRClB{Vq@z5uXV^NvcqRhISCjmD$j`v^0{QhK~8oc1F0ZCtImswRtZ zSG(WM13OMS0^ZT|)UQLx_+}UGH}_~)roG!oo9-{I#muDf zlE%y*Vfxdp_!TcZ@%;`TYXn;kIa_W5kFf9m(a@lekcwhNQtUmG+d> z#7Wto-2?Cyj=YNs^Z|2Uat-q*?uh!u1_jw)8Q1Zq)12u`bv>))QKYVvEf}vLH z_FEh#!9$-6--oC_I(6o?VJ#~Q@919$R8~IC)DzOYCv_pIa1}i|_4W36C+0}9HT6+D z@9e%qH~4y1yO@dUtk)*G8dk{sX|lG%nLviRTGJ|uz~Mx>NPjl&O;GRu_ho1 zA&_pLXZBoc83aU1b!r9I=Ew(GH`Oz$(imY(WD!&!b z(7++xy?t;z5Ih=S+U!gdzeRPku52l2GJHE)-Q-c`^(C$Oew)&UdVWK{CqA!QHnPt9 z6@%+GGgeHhdGmaI)`nzoq}5IGebPRq1nlG9XI|rPq=eS?Fcyd22w;F1b^pzF1k;t` z#M*YnTmmrxIWO#M=>xP;0#UfKaY*>w@GF@A^b3^dZYVn%=%|yNMy=002KNj-UwpcB z91^W`6hESziS+Jn?DhC(eqcY_a_&c3Y0W7{MtbUcI7iK79) zor@SzU#BmT?~qnql@hB-OB1KE-o<2jZo>k`vOMDhuZklsL%J^xdc}Ejy6MLo9`ZUm z$!+;KYJJ=WmRkc6>qERYIBcIqh8nz!2XDvHdJT$mg+d>@)Z%2ft;qGaF zS1-UpQlhkr>U|c%+_s-4xGZ*5T^V0i$;?Ug{8R+KExKtI*;{74)UxC4-kK~jPeW>2 zcuz)-klN?ae&6_hsGqz(K^$8^a5ITyJ)GLnHDLgeW1}z8aJ0`6cK5fkFHCP=sD9>H zR8x%+g?=gzD?BZ+(P}rI?4(x~ZYn23pKXjT5VG7j{b_htM0mWt8ku+r~I# zeQJBPbvPRP`^ejW5E)!7!Gh0mgh0<>(_<=wAnbGPVQezmyr~yC%;{C#Odo5du;S>c z+Y?@DAWeuC=BQo3Ub< z4kU8)`)mK#`lTz)UaH(bL6hMj@m-&w&L#7(7Ux>ScG-IW6Xzxz7wY9kXW0=uHGDh- zT+zN98kDkQRiAN2Mg%t(Vq82Vw%ZBu>G`miqYfX-5Lxw^X-JW8lp668?RI+`crE%%S>VCyOMJX3}c#S;QCd-S7ad{s_u7V1eZad%K zTT09R*t9ZqF1dd)0twi<-rCiXA;Q#oKHBD9yRo0MnwGepaegop`4buPee4zx0HL2z}39K0qFkDO#Na7dlSfnfFLgTCXZ~#?KD?oi;)W z73?@mo0FD5cIa-xa`wC#vsKS`Uz}ib?DHOp`SMUbOmi$7qrw||y_XL2^GyBHS|h!!hAeNaNWNQ^-ou~0u6;#?TJA)(Oc@s>B^#bCVl1EU z_3pAWTk)Idln*d-{Xf^`W`Xs7007&kermB+0$E{t40U(Ym!?zmIzGhDZKdDb;XJxN zQK%PZy-ZD-J> zNaGYKidnoNRIabL)>5LZvuW1$XK_UctLL{vW>&eEyK;XU0et4*NfRLbk)z)-)2mKj3VkO1%g}aZ zjFPc!kT<-aeoIkreUpdZIuc+{P|F+1f9c zjk&`&A-rV;qoCWf(Co!AyC7leE5yAeHaQVkp=Jj`M#x0`>g?pJWh#&6;qAz84$!)P zuA>_E;yq3V(#y5T9qG>5<`Y)P$u)SQ=aG_ELwp^5G^v-KGqU^p#X$%>uHlwT4DbDD z?pJS~yr3WsCwpP|?q9ZH+tE6oR$Qppo`1cNxOpw2?|=(bMTW5G^IOPp1ToJq>=s#{ z0{)lUYci~Z;dQ!x1hXBimruOs>~uIv0TR&2)E{&~n#69_$VQ88ihqDjdW=2*WxX%g zJ0i`Iew@nE+Px)V{A?jTS+Wh-udJ}GCJQ%S@ahN31B21A^Aj9u0wdBrRFj=9tHsON zoNW9MR^gYjT4=qTbnHUf(_+w-Y-oczKzF;89m<)ESBNDKgO_)(({sMkt4?Q#_XpS4 zP_~c|5f&g^eIzED+gB|!r;n2Bk3U>kXBWj4D~w8YMx2eqVig^AN>F!Rl<;1Ls{@o5^awwVo)6pzoMF{JLkTAMDjd z(#U(g?zSRiyz_~>jPW7WH6xa|dTUSjUi6ba$?~|lG`|}P2iR;%apU)+^E9th6RpLq z_%$b~fb1IylMD}&_iXq-pH$}~c}@w79~NHGA6?#eJhW~!d7#pMF7&<2Nb;E=IRrSW3gCIj0JW#o2rs zBK0QVnc6)oovfxlQyWuXqwUqg&2}4AAVs%rLB6GgZbQR!=TFT~|47dgvG+8Fyd|a) z*^ESbhjA-l=Dh249GE8=^LmqMfZ)~WtbW{~5(&y#Belh%WUe0JdN`-hjR3r$v{Mx} z&Fh`+wNZAL;;$gOQ2tg%hRz@CK~dxCeg<*G?nia>f#V;ow||*>2KH(X<^4cXmLc4+ z^VXymNnyF;`5qGzf*AQY-f&k4(qLKTHCx7}b{`oMBDI(&9P%CPJ(dx`MSA%QOF|Jt ztz6^{r_pBO14@A{*t1Ov-Y#WJgnvV@bDy|7)lax_O?CjUo0#%H;o>2WH?9Ir^ko5T z693PxZ#6F6((HrnoPZyo-=aCp6&L_|j~p9_Jo$*qFvuJi?culAu$dR{h}r$G!3rwZ0EN)>>Lb10So;-dE}xSL%LQ;D6jCpPi{zJgHhd zIby*(7NuPrs9ijX2+?GTKl`=(~sUh#Q&MX9!R1x)eLfP_wUg0plXQ!m~A zvl0LEFR>7C6}?}bE*qE#GyOli@eL}5XGZ4eEm4LaFOfNz{f%K&tH&N-{&-V*&i~%T zFOjD%S*-2ILG+)~_Lh9)$`vq)$161LEwos){?8BpeSsg^|LAJ~|37fE1jQc8*D%M; zp{$AuT$BI=EDHXw&~hA?Sj68p{Htf%<4o-AvbwsY_yh!aR8&-ZAJwRMe!Q8fx2NHN zwmf=@*M5-_T!iUT4Zgx~d`;JT>HseyK{zXUSN&=24<5u%F|W(Eej%vN7S?3=ur->K z#Ai)hqRk4S<>MnFV0`mQ?{MO$hHkAD5jKt3x3MvG%SP>D+11|>qdD?8XIrDc*17p@ z=e{oa+$ei^ZKkKDYNFm=75`tiM&B`8j*Js;YDT5sK;}*P6ad70l zyhQYBEc}bhn$XqM)a;^G|3*>?S2(Q7rHZ)Y$H&KyeU4WQ48o$w25aA1Y8Q7BN*k}c zu-%&~rI3rH+&*^@Z57k0(PK~dzL*u7h32W#v9VzShc>K)v5r)mzvZ=_8rXe5DUU(I z(VhCrvBG+qWA+A`Gn(msy3ufdz02*eB9mxDe{;5t6#MrHq+vThDG?X*8Px%(b|L+bBUDwKu|?r1Sr!|ZXf7wWM3 zn~s}%w0M;b+Cn-k{?KxEbv|v>yWAO&HU(>Rd~wiv35Bd29@j7VNPBs;jC;^{pW(G# ztzbY_?&>W@>3_0ko%tM}L5*5H_|n}s$hLX-UcSVq@j5~fay{5PuiOooGZ5D<(e>xE zo|?E$A|oRsefi<3-$*m|)o0Q3Zlit7HTcPMj@epkl8wQX7ou(FQ~INA-kt^LDyf2W zH#Tm2mA$xRWZO0Acb;!bwO1>9sblBxw`OvnPexijFMr?P-Q@YX4JPwZBW(=~yormC z|6Au;J5*)XZ{X9Rt)=yErt-a@%O0uA;bH`E=^%4bVNsEkyL;nVL;geV$;oF+?;CM` z2oo!7K#!?IbLpssjE|4l=g*%j>=uN+k#b8N_uK{3_;i3sGY~Vc)r(F^2{-FcFj;Ez zZa5th#v>uwtcy_OP>h6mNEgSqvm>>7zk5f9j)CE@F+gUs&_pEaan=zbu=q4WZuOjd zH~dA07k>NgN%&d)hhdNlBU#dJ4|kW9rakChSO0<^&j-nodqk3?_J?V!S_Bn(?88Igm~+SU?#~zZR_2+*I<~7Z z#O!*RRaNS9mzD2(4NyixxUS&Styj;BV}U=(IF;QM<{a_;KH%oyp?L4}bCB;o?zHgeN7D zYHDgO-@;GF9A{@|uda8?9f0*vSMpw=VPM1>zF{X0-|Lr9P(TB*gc{K4=dwTNUOQ~$ zd#82LTQ+L(JtpSM)|N%m8^%;oPvYm#pF?EIZ-HfxN2GD!+eCj~wTbD7h|+}Yv$C+{ z`gK^EExeKMbQkaRFMg5O^CRQmf*mF}k>6A{k-{R+-o z8Xp^L@xdy4a&ot#XktQ_|K`V+)6HR}enyql5a0=xxwnO<>(`(#98^t@95;RBBF)qm z#`*jC(ieYVSHckb_RhKWn6wFc3Qpn3+1|PDo~Wnl+!k;G$;eX%!-B;kejcVIx~ z;r{OKIOc;vYn!pXJ%0*VJvQ6BDw!QDSev)7kkgi*N}AB*wQknhzz?3Q<6fG)-UteT z-=2r9FLs$(IXQa)UQ{}5t3y`!Z_P8jgF*>jT(^n}%zr}4f15$A4oi8%$fj5G)V}?$ z?kua#xDyeR?B$bR!8kZ`+=$0|QIxN~knwz61}jCT<>=%2I8ey#hw>PH3J5j(M)IDQ z2l1kdt)BJcLSQ+9?kBltGviBo6-%6DBKKFTRh+mCa^E^uqr?xU-#L6LNV^} zLr}R{XmT#zJGGc7RNETM3kUlgrkpd&$_wtBpvWs;aQwt)FJ379=N1KTGZIAW9!e^h zSy`oheA><$6k-{}paJ-0b>#wDg6bL?qm}RFw~s+srM6{(7(}_bJWQmnw_jRh{sV3G zsCCkRoil1Y-{A20Wg~TUbuN>xC$oM<0EYjxIZWmOR5Jzte66e;pO7ZxjE;BtN@xEps zKPrl5Kt6%o6<+u_wR@f<=H0Z%e+_)UQxegcKfe8GTv^~>ULrKc<5!7xF`H4j809Yt zcD#|kha7jGrtrMu%E_UAW=3rx! zQBjFJYw*6guyg#0g%Yrr;s}6%-)?>@DpAe)qF%66yBMZVbFqgSiXf3A7hzClPNA7Q zy_+??>)oecTs~KC&)JN;HV7}}1n6NFwSeUo5gsnRIh2M6iUFv61vqv6otcsWAAGG3 zJl;v)kuFvo67i%A3c4K`N5DRO`0%IhUAS*)DS5u?gstgNi8>Mc7_rOM08 zqhn@PXi`0xtwseFjY(gsd>?#vQ>d16v|qo3h#MdN`x_a9sJUHvrtk}<6`P}N$(2V_c4*oQ7SIc%KW^L_5cX#(|W~Ks_v>0#yx~SSFr|mBw z4IsEb%`eCxcI-p_aCWqCcxgSdY?sakKk{goL$M^%lktd&HzsZ{LkMvw02Q1n z)t`0~xd~5QE$wS^*_mLTU5$&2Bd@nyYHKZFTu)%v=K>y~6m}Un+;1kF(ZN;~DrAbo zBIkWQrT^0Pz~D_X@8A8`C;e%6sE)S%azS0(R;C##CF(z0sFQ4Hj^4z_g)W$31%S!X=y>)4RdVyAp+IQK}8l zNk$HYHH5?2YIC#US@pk|C`i|rhn&dkk-b&J87_NVr5NW$sN}dbeGAR5i95~!;Yj2o zDWeUaHo5HYRF(a_+b40&380!SCm4XK13Zj5-{Z9$>n=9k2PAXa(3R?u(w(;*F16DD zxPGmmAeq8%`#nAV;5=nfCm5S5#!9#;24M1TSu=+*%(KdQSNol+hR$X#$JV)r2z)Kp z?PAtE&tMC%b2=U#f_+%Myqp}0UBf?=awI0BQloZg5y74!xbe|i>{}EY&$o~C=pBnR z?NDgU`zJfKKuwT_6SK!qyY5W<-3@gTa@k|bvzl4*8SLxp>Io;wa|U1%1|Cu=K9<9v z!LPepW^Hq`pCc%8Rh1I?=1yHpEAXdALEq=*7jM%`3aNd(39Y7aQj85zrMA788llKL zUX%PB2r?bkH<&etsUmJinS{lBcJrji$Hx{k6?6biANgWT48Dx4Y^MdUVg?_?ssu(A zGLy52JmR;d{D@88t27tL=SrmC~-;*s|a{C zo8aNv{sHls$dIzIJy*+m<{?VVVZem7R;gDi=zYzrk|7oWDjkp!nBLcCXl{37x3^ve zoiZ0zMFso27a(I)+%>^Zz=)H0lSy$~9Yj4Z&KkJo%7QW^@M`!!`# z+}E-5UyMo9{!Jn@02kpNZHRb@H5Q|Y#oDEav|=Qur>A%{G@Lh5b{JtPyp~_)=M5@o zZ=?TvFMuu^@gA%m2N>c%6&#*7zWu>{vg`@{MPVX>lZ?z0kIRFI_5MU8zrBF{qT;fX zUEbuywbQF{5E-d<8Z+a&=cL@GUsv?gALA1sT=b70p`fnyEk4yQCX$b$?g65+5>T3N zWIVr%7va}`h}ouc?U&l9cgLo50#I?}Kun80+&T`V2)s?O{#dD70jjFaY!x!l2^diK zb)v-TUPJT*4nvms-O~@ZSH}$-$<|UAq>D4P)`>P9={bPXirk%zH(bnFw=S9=F1F$k z5d{K!>y~QU%v2x%o*i#EVM{WeF6wD|e+!4m1V#dj_T8iC*IESvwH;VqWcLbX7;?1W zxqzA?x9evu4+{%&;#(lJBwskYlbha$U&%Qrk zx<~o?&Xb(qCZwW*OSb$k&5juaE98V5L`HP{o6ykE<14H`Z345fZK{1w#yFL~+xBQ^ zXh~cqi1_&UR<*4v1-}5TasR0*Go@Kb8VD)HdfvxQ3aG7ms3RAET10_)f7$TA2Q8340|Rkw-yRzl#X9A` zztc&3iAClBpJl|{c`u03(RDJ5gJshR36U!&^GX5`{Bke*lVg?xQn&Ju;eGMrOtQ{# zQ^o6gyWr|(>EYmVl^hc#10@pP@tH=bf*hxDRcHSF}g| z+qK?bXco8z?*c`k%`WUyWri3MXKd@6o2=NG2*+fm7@0Vff`0L=I*OeE-lbcBv(#9Q zqj+BIbpo;D0QlG}qzf37Jc?-V5`$JP=9x z8?0Pth>GYeb~~wJG^~@k62n^7AcdYeoF*K6cXO%qesGUfURF+y9#DuPVIuG3JIi7$wqDY@Qr|vmrahphNX;=;vy18OVY(*TvAs29xg%Y$;d5V!baO0WCA26bLMzj2|4N zy+?9ZRz+;>@MP<>4*Gf|?KK2MZK{g~(qXEFAAu4>uW>+rsLq(uG{d zOVsb;LB9@3gZQIDGoiR4RW_u*jdV2kum%XAg-!<106GhyT|Zo*i84# z?Iq!ab_4EA(}IHhw4CO%2+gEdsFF=~cJ>F?3tKZdD9~Gkgg_Li2&LbpQY)@9`!d-NWvqQS)1~!9jmk3M>I})GJg9dmlfnzIfDCz* z@ouA4mVPwzZ&~=-C^n2u_kl6^%xz};>#a+~ZOXN*D>g(x+fUMSkn0xigm8{~?pS?i7Dxvi8 zP}=_7niSKKvwW}$z3?Sz>D@Z#9$@$5K&pT`wA)@`5faj+mB5Z}?v@MuQ$N2BKYWno z_ZqY|!3TH&)dHv+SrX&-B$X`c+Dv87_PeGlt-_D)L5VxL^WNz)D5r61@wE8`1?T`D z(u&0H*P6_^^)WafHvlZ4l@|tiEt)IGx4>u?y&dEXGo9V#?O#8y=b3MZUy_SPh}Nck z?xRCI=hhQD)rZ>?uTz|^P@$YlqW3-)5xjSrVZCdY`(^q1t5yqy8cXliD@#Rz%Etp$ ziY?Q*UXGyqXBShL7X$9(5B(H{Y@}KJdI88OTiWMCdP63oteDv3rdR#lDSarGgMy%R zK!L_UUAcPIs@4Sly8YTQF4<&96VW_++qCQM$JYc+6cMW{K{(kY@?7r3%8(6!?F8ts z2h_g@liy%|W(eaN8XBNIAzF^Cv%N5l>tf*X@~lf+n)}g*!NDRl;isasL~mPunIsey z0c?&_E9_fsAqZlZ}uwY;B2-{q>`_d5ND<~}s3a~2p5!H+(`T`(fSSJ`o!DRP}AWRjx? z^Fm=TUBK)c7Y94LWq%^eGa0|CzAZ)sgJWEh2{}6Q%-}cx3jx7n2djOnkLjHEUk_v8 z5T|NOSjuN+a6v4E9k z57wI7w4Vtp{(A1W)Q;AC_<>K+DJl4$S;KOBw!WKFQqnk`F*7S`=Y6v)Y)PP)!M`xW z-&9q7H2L9}aSaL#Y%j!bSzcZSwq#YlUL_AQFg`xM<+V)kh2nvjMVabGj5~A#)YdaJ z!~{kSLI{{cXH{>4Zxq~ihKeNNvr9kWC`K#h7y+#=V(v68S_$W0;mZ*EpZ9E;zUP6r zzQCW_j{mb)aQ*+_y^UW~`z#*lr=NUjudp|<`xv0X5|4R(0~a?e>=id|&aETa`g9xP zpF50GUb2l_=?0I?77J(R%zVtIyeN~X3HDjqY^`P=soc?_SQ?JmN5#LO-Kd(GG(I>vt|lc;I_d(BvL`+u()Tf@Ts z&sP=_{_jm?exYdp-c;64K=_|U`M+@qMUG=sbZ7Rrc%6nQ1r_~56I#o?rDK#$L0U?JDSuJcW`tBBpRhtqO7TjUt>}(-%F`y9&~b#h7f!0 z+qV^vfinUmsvMl0RBqpOjIMF-#`SauV z@2@5FeigE-zDz_!)IT!v*rYr?Kmr!lnhgf_MsYFcqm!>0KnfyeoV+dG8kHucrA0od zXrW5s)IOYLzRu|1!YJ*%)862*ZYfGTpTS3g|FWdS2Fm`kYY$)W+suLs_7tS#&!3Hs z?`am18524=gX?G9iv?lmAGzaj7r^Od{%jOh#fO7es;1tC3Iy5n5lAJKGfwBu zPIa^Tpj!acGY$MXSr730?1~00yljL3yh>~oHz<`L505f7y?%|i*K*AGWp;Kx13HWZ zJu&>9n3`IJN~!eV0iSc@CTFf}1=m9GMIh+Kz2`n@nph>D@Jc?#ym&!t+USV~M4y0) z|IX5s8(IjsXKi-c+S)OKG?CUC@&{Me3?e&mqHjv03XH{7Kjx|5S7dnI<|(6&SUN; zh*|XBWsx{@_%U=OR(biwlF>l;Esov&ENJx{TIrUZ5qK~di1`I(kkd6f@15yT7&f4A zpM_Sp@;_}>f_G`!>`R)$rTc5!1K!V<6kLztX>ZSkc$*U0I#8$Q0*~j<(G|c~u^Y{a z2MsE}q2V$#WYzzimX+hsPaBe8EpBaXp-{m5dH}g^w(5Y0zR>LFDwX|vC01z3y+O~! zWUCHkW@Ln&*Oax96R@jjXUB_TJdGsy?jaDc7iL zuae>}qd-f#q`uk$QcA;x%pIC$@Q>#SGy|qsF7?=6QKaaxN+^fXMkPLfzDYdVG7P>9 zd@rg|%T(r`C~ef4_*L5Y%GvMcai2Zd0?lBh^#{*g9Ro`d3k7_^X1O!+cC&%E_ciFP z`sU_OzkD%)wZjH79o(DR{rfzqrKi%n?e%V}*v%K$nrIS*&`%aFIoxrQz4pvl;sb2sOypb!%AinshTHR)A{D-Mj zw)5ERhNslD)BB)RNBAswnP{HD*W&=AfRw6#`!236YxQkGBVbyr$EGsK2yi? z9A)#g`=&6=bxH`+!}Jo^PhG<7H=OOSrG$^78Q=0Jv$w5J5p%I3BX~^OJ;!V7{Jw+A16Tw!FOO zbgymE<@3z4YhHdn8q~vAZ{PL;L=j#a-5V5Pl6yo0frwo<^pL@?N;WoZNZuknJzcJR z2?~zYmFIurKoD&lWj>07HM|03CXpSl?P;Yj8IP(e%F)RXqQo?l(Mla4rmE|lF06uzpdL9|iO=pffc#bXw2bi{4{D2uP zEH1_t%oq%8VZZL+?A#035Dk1`kQNYujX0`sbhW0g&SvVZ8LX`y*zi*>gx|k^7p5UR zZx#I+^ml8^(P{SmuzdvqvL_SpQ7{B^)Gv#Q{5<;>YKvq`J^(pLOiBuc)dkixp>G>t zntI(^!A+FrFkpy6QEw{9&dF&F`-Mh6NCq@^kWin3MpFQfK_~9qecXE7g2vR=*hmY2 z7~DZ{*dk%bY;D<5ODVc?iqM%T@UgxPJrCzGC}sv(Modf$$TpYB-Mh%XW03atHSODq z6}fF_$P5-KY@#tgoE)6AK zv(H3qP@Z*O+b73>@fxkietrfx4=^4Lb=%BqGOtcL_^%AqbYYhTnH$f9(cm_z1x?#Q zn6s>&aRqCCC|jBu^nFIzz3v$DcRqXOqGDppFr(*o>*6j8J2`$ik{;jk5)7a#fw_Ww z+NSSmWRGU9i6BCBRcUo{2g6v0j*$hYDj}TIq>J(g7f)jburN!&6y7O=pa6 zse?W7=g12=+IyjowsAFcb5o6?#oi!bw1ASDy0EpC5$3Pn_rSWX=N|aUIAei-g107K z2fp3LD@aO8@?A?(2iqPO6%FPZY$g?b&(RGdL&H4yvsmv>l|e~K`Lp5d@ay2KiV7Um zjU1WFASU`)WI$ud%A!Bp)C~@UI|o22Lp;_>HavT`Cdld~(@^3J#&`_XR zx#4Vp(2Ux+y2=2EVkz#zCPDTwtP(^8F1$*R1F?eXmH_d8i6z7rKYA~F!Puhg?d&WF z(+&L!?Rv87?wn*o_zJ{FqG2IUOio&XGznYUwQU4$bGIh}%zkw%tL40el*Gi4KBi#$ z@$vE9!QKR>J;5S3sch)0J_~;KxvEtsCnsRPbl@;OLgk$jOt_-gR9H~M5FRpNg~-Kb z_)}RDsg_PE;q$Cl`sOK7{$ZG6P=Kt z9uOe?A~O@GdDv1>gpZE^B-;Y+6;R#aDf(b0|IGEy{<3MMt!Bmzm+OnbBOeG54z3Vc1$Szqd6foEZ zo?c#x$?S*#4h~Y6W5sk+wfbH)|6=jD!;-7STLXLZii%At zYhS-E!>aFw#Yzl>6DgJq|H#kd0`x!L6EtN*OSAq|576fC;kUe=bflo7Du6{kA75Bj zM#!0h7shktE^qEv||B2Pg-!OAl98R*m4^} zMeHV!YlG_co?}s~l7a|N`!gi{#fvAv{*M=rLG=~5`@Y?|&IUL*BbEaUT8X@P2pV-u z{Cg-WWq0d{y_*=opQ*q2dx~Qkv3Usqz^=T-Yq^HwvOr~JjDMu@BsG94N|hr0E*b zD%ya|%vC6ks?jJTYs^(B9b?JueoO_@FF?5h4xxDC1|bqTG^Q5$^|rR{rmXLtae$=V z2MFSF*EC=p!B(2HDzq=%4u!V%a~rBi5oiDbV>o+wFJVc+*oA2p(RzBsLK>%DivnQY zr;_icF5oS;gMb+Ir{T~22M@X+G~%{1Ei&=>GqG=G4wfxU^IaOr7dE?Q#Gmdyd|2M( zEF&N=Jpb{nx^94sr7wUpYhjv77+A2S0nkC>QWhgea=&EZJC<&igvioE$fz_)KLMI) zWRz~vs|JK{xhuOJGB<8NhQ*ahFu{o{GjE{74^jXi(2prMOAaB}jb2pd%6+C^4cm6*eYiepB&}_B&u?TEo6$67$c^5?QYu^jS zGs!Q^+wDSH3Mne5sa}S+Z?EnJUo-{q8x-HLx=n;Ml?J)ekBCeMc-v{Qm7##!8uWi8 z6VxR1&;=k4qEx^Ay#(~OzrVj7yj8TL`Ipwrb@SeIQqs~0s(JhvyZQXrZ1mHokAd(Y zkgn?6`uZva{*JeB1h~1|!E8pf*cw2EKvz2LWbb*6=q>g&4jGho~uM<(D@&hy%Z>#!KZb>bcfz-UXUTS22prpX9pk1eam!b^@lC z^$#m3U^Q)hbQu^#`z~DzPnxF8eme#N`ZTq)#sO-%;B>$mzSMNF4=@SL?F2A43W|!b zu4N9JJt@%RPJ~D(B4ACwmcof2{=x=2+_;Nj(U z>|fuRVKu9mVw00&1XQ!TPN7Qr^XE^Rt9Eg^bw7wP;p4zN#_u45q-O%ix z1>(Xo7}C7}_SNpcR6flJKA}b;z90isIN31ctIQ$)4nRMSpjl%Curem_2R3}>fe7!z z?5wsOhdbDF8vw(&2)@=#>{;j1z#RD!sp(ppbZ7Bw+BtE5ro~ z-N1{fRlrKM0R)Z!1X!(K8Hx23tPn+#HXkxrbPxkVM>QXP)IwRWhJkX0;D69mUoX5Hy6PTc6zdxpgy){EaTQ8iveJ?w8fXEj zN$VrYzdz(J$lHGR2w}HqL*gF=D%H;>XD}r|q{e7Ho!|5S*^G$g;2cF7SK9%PUHO_} zf%HPeX##Euu`N9Li<8m$y2VB>KIf+I*KFE;vpW6dE1q;ypKTw+xdmX_lWeh6OYUK6^bW%&= ze&TyLzy-lY(#w}))R_W34RcCrYAEE-mM^(MWEjA`4On{hTW?BHD1_mT2K~AUlzADH z3?*%CB4p{57 z5|FI91a$#F68*vFGPk;MEkN(36|GO8CPDs~2;;NerLUjwy7a(~nF|I8BLWJFh)pjc zU<_awWq00LugTNvhx}W$hb$=r6E4?o7mhDM$Lv7ZyMDj|?3>!fdyxB8083raqBZV0 ztl{Z!{|~7=$f5yMj_hP!E`gqBqcA3<=ge%XX;Mbg0&>lwyw-#Pcq}%rpqwz}z8gJ&|T^WRKRt z^X9Vj(5%!7`9174`-?%)in3mwz$`#WXi2@Q)uh3K=kS zDn-tzFjTFut_8((Dw&$nF9ht#9xukLu|d>OwHa329f)`!I|PhMrCw69aSai;BfoYY zw1-A`!**OI0%RuqvKK!2Ju6D3Jy_vpw0}aIC+>L^41PNru(^K=e~rUYKanEFZ6Jvz zikee*O*Zf{pfF<1wp7nHFusk%ygK>2xxIUI7?BW7*C!M8&g;4w! z^0aK73EFIjYYk&8f8^*-Gbfjo{Hia19sU+H^_mjhovdcpQdW?M3~NAYjZ2kPULU76 zdD;JEu}=0ANMsn^x-}q6!Ai>l*TlbT7ZvfrCCoi?A@qX|*H)Y$X0YL}oOzD?g5j_y z*Rb?yWZn)uRaQLQ|3ek^2He>E=4N_e>U}`aWtJX-0)$c^`F$^f zdm8Ro|Bi4p8SfFXp{LY*enZDja=;zM4jwcvK{~gUDpD85odrU6NzM2fn^jkBZ~nIf zFd=-r)03E5_y-NqhIReB|b`Fl8P1>X1*!=wb{xUL>p3netk7Tb_Rx&On z=Q7!m7`Il>PO_TGFwypY6!exdH}?S+iW@UeLIB^RYSm3!hyL4Ix78ze_Rf1%KZDOJ zE+PSN=DmAIiq!YNMzr(cD2ay-jNXXFy7Q%$0AhNb z(Ak7x!+|NIRBnWjJ|H2e5a>7I1h_Fu3JyWZr273SC_^7fx8|A9lyc%M=jtx?VO|I3 zhhpu^3C)dKI3eYWXE-SIkW_A>suecjYv!@s+LjrQkYwDmEBBuC)dg>t*9kxTB6=%=`0~%2M-g4h-e$9h0`ryE4v#dNmG)IR$9#cGQ(8WQp^Xp?fzp zdl*t~iinFd&MihpqZ7gWV_~*%Tlus^n|ZO0cvU`=%sax|ptz{9Xqvd+#q{g*%B6q@ zNwno1-+Op|kG!Oq(@X3pGJ}7$0E$PFQ<)ClDc#QWE&D#0R?~d5kMzwZt$1StfA=ir zoG1?JKKh@P*D$)7P&)Hz_A;axxOrHyvSK_UWhIRige`N}6dq5!^QL;)vXH^s$N}?O zAe-e?bp4q5ivdZBQjCjZU$(z{2WqJH3M2DyEMt=!TFd!y(Py!_QYvfI+1K!Ljb`^% z(*)L<>?2Z*PV90kY^~MM-%m+ZwtS9`)h@|fMfb0p zl2ul8Jk_Qy=XO~SYtQ4fIsaivfj-8w8RGI??7k10^!CoQvAw!Z9J?Gb1 zP4Xlc*uY7nG~dZuU%g+h=A|czhpa`6k;-E8INsC>7Kq%O(Z`aXe zUw$XKw8Q6+E%DW@-}fWn$T3*44&6{roXTpf?X&y8*C@x#<9kk^g|X&oN>qJJ)_Zuk z^PVayf{5~()0-MAt90xO8S~g9ZtVN4w3lI&X{qqqlQ?m%nboZL#wzbFk2!1@T+q|p zBiVG5nt0ZHsht>aTA$Bay*&Cs@2hw2%~X*GPT|zJ{8R)%zq^>wQM=7Qbok904Zo3+ z5+R$p+1g8U+MLbWAdQG<&P2Kf%kun(c1rcQXy;a*a=bUaV@;uieq6&2vm%0dWvqSBa*by8$Nl&S zy+4abMWURnxbEAaVqJnRM&3*BuduKkTBrHu-HA1Ry+ta!@TK;__}G~6#!t}f5N>wB zbaB80GBxeE2We6>jNZl*b`*z~ck^v$wb+C(0<0L+11oW9q07UC`_gwNzjg;RiRLq# z$MkV->dACc`2ySN0x*n10UiLM7>?qwLqu!8m(B%28h5Jgh@Qm828ujlO-6(5L$r0L znqe=iw%|=HA4b>BkTlmD!=noEUPp{=1)pMacf_pypWt7j+7=dc_7(dGf}$@F!9Qky z4+n)-ga57vyMnNbP&aNK9;@p(`iUzyZCSTU-VDa9A74IT!qFxiU4HZ93iFH54O`|b z=DXtxg@$=O`3Hj@3@&a<>P>{cuP36V3ir0o5CXe$+;$<0si*+QN{}9#D|?Ofgc@$L zLF_L3+14vOd47>4Pde!b5n?{)9&gLKHs0AfUK z3j{M0L2^bsuWTvGHYll4KRwb@QxVTk0b*WYZa`iw8XSuy2o@@;t4B>GQ14XWL^3K; zs8WfMMM{R7b>djuJups-pM8jv`0(`UhvPMzDHP5Ej@>-bQ1G2rw@0hvJy-Q?k}J}3 zZlYSR>cj@TeG+0Mxi0~yGeKuXGH3{T3zz%cwAUKj#~46}so^>e0CR zJA~APFyq3xG{8kD#A7ToYodblNCvrm^zhDu-%A+C{GdX>CMO1E>#}Pza>fiESp0YF z4}rbrAH+dNg-jie-{02hzczH0_8RL z=jBHsPWH$2`0U514aD7n!1}JlaDi2h2kH-qU2Njw)bM?}vOf*mo^LNNRP=#1i=17w z0&d~}xE{`E34_FnYDcKw?Bd_gg}LS6%>iAYhr`jZu#s4EL3K4ba?tKl&^`v(uE6J4 z0QCRdI0!rcnK#yh(xxc>V8Y;grX{-|ZU6K1wHrP<))e~HJ^W}?U|07$+|^DkuFx$A!lJB2gqqRk`)6p0~1FGbU_8^9cl@VL;TvXhx03=b1juf6xJGyVK~_j zx_u9*1CNnFKC1QXaFB(GkHY*Cz8Q2%t6s~D{p~`|Gtai9hno(rs<9#4jCj$s4yC*| zcUg`+TDxMnvRhhX`~aG zOoR*}ak~t8Q;%UW zOdB5v) zoxk#3_EoIs8nt9Z1+=)&@HhB8g02op6_OL<=@C`!x`7G2>r4V7*X|%3s|wlGlbtYH zloe}XYslpSEiX@x8$uO-JU`Ya15rY#{O?t!i)b)3R(~I?f@#+WF2p;CJ|oo%SvbPZ zbM<_3Ie|p~|JlaIMz+<$(^J&kcNwdBzmots`ZSPz zs2ovnuoMwIku8ApkbH_Q71pP$sfq@L^^TzBtp-YY{!MG&;=J_4MDAmf$KR7XB1?QO z?>je8w(v->kbxGMb3lz;~(ANyUqpYT)Folv2L;1?<$hc z0X|qS6#MjPFLHPmN}kNom@+B^D2yrCOHUFg@uBbnBr70sFCGpJKG#f05W2IB-x?#$ zTDQ9}3Tx8V6!qDxa%Hh~tMi1I3mPJlyv&Dm2ypaKnIAWDXN8QbFi{BQKKmx#c6na} z2}n(~{hj1G-YzdLwrd}hKigMEA?)|tXs-Omc>qGreBns@!O85+iYUvLmn2qZW)00q3 zyL5I1SNn-|n;5eR@2Y>IbSaE^(sOn6g7D(!Tmnw>U+@D#BESOC6b*$WSfL=oSrjn0 zmprAA6fvx(W8(<%tka(hjZ%>N0s9L?aIhEqinKDurl)aH+`PO>5L5yazU+uRRJSMG#8gwN$G1JY6jK^eh%2VnbbiSM(N zfkQ(+H`_+%4@=A<+O21p-A^+gXWhGaBH1<*nL^IgX+Mb}UY8?cgN^v7h@c0iIHG<- zD?wga07@*fd!^y!4O1P~^~c)>QSxVKh|hfQ9tWa6!|j3+c-OfB3uMH734TXWTBn8P z%MkdMfY*79FDyKTBrTX|gkUZJAo{&+aj``_s*Lvwsfr*Vg(c2oHG6#t8^w{tHE_V4 zy1dcnob$xdV?#XVMOtxh^=)-l_rxG@E*asJggOMW;FzfhDA);MnI*^Dva3*+jpkgt zh@dcbLck1#0`HNoYI05wGWy8+gd@iwzr7wUxb6~()E>4Y`FwcgP_=4jFoWn)a>oyC zy67;~GNX9^2fp+#h{b0P!Ydm0e>^C_aq^*tw>g-Ttj8}eT-w;R9RJkQNe##AHmd)t z={Q;v(P0|81K3?xBj0cscvxO4wAeE$jR;6KL+$vL5ucPO1o=KSALC$eX%U{36JSQA&(Lfoc z-F1UbYHzQm*cGN#5Yk!4u8+De+O$6*hkWagwDcOG0 zs$I=pGgDIy_N%~;E}u6Hg^iYWHM>v~aho=>=niSL-+OFdQN~+WFwDDb!L_}{h_63w zjfay&xFfh!q|Eu)9zS48r$0FWS8?+bFI|waqxB|1(hX=GXG4H5I^{5kug$;+C6$S4 zVo9;5vl32)s!0dAwfD!TN819=SyLCF!h;8GZy;toh^Es0V7<3a%KN};X{H5x<6+hl z&OVIh{@fx&t}zk5!W8Ui#7HR zcC6O)_12}P^-Yg;m;e|MUqBm9AhdI}^Fz_0N}$FUhlVJU{>-c66<$*1Y9nNQ3EeI>5|ypM*F~{o%f2Od9%e| zE6WBFjus;}Xfc#UlZ4<7Pc*8F0HOdj6;Zd>VAr>+WR%u!;o8)Jn)ePj&OntzcEZZhk_(fdTBYwvCf?2 z1Io$#RvJ4+9O?#S@zF!7zZ0M3c5&{f#5(+j!FaqGOq{7V-=j>D#P!6ZuU{5(>#JTN zLz}E!asZ8rBH$he8rU!TUu-jw|7W>b-hD4qbJuFDE_Gt&-J3byW8vs9G8mN%@5$MN z11v_*Xc@2BBh%?D{zf7dCW}hzSq}YOD-tXQSTRCb+pdQ-TuB+$tE*ob(ak!xxrVr1 zeEMYx3-UT)+2vm=jku6J{}*z zAWRacy73`B0Cx?o(5!Rxn67?UDk%ziB4)IIq?1kBnZ!>SWf`HfYn2!!2xgWJ^*AS&hk!oG*IAQD?jc3#*?QCsN zT)?+fLN|`09Tq%0W^wk?I>h_6*i!V#-RjaWCe}Dfj-?)D&KhImFlA8^fHp2}*V~1( zv@2c3qz1UB<+Hp*MBFchs`bN;z4@9{Fo=TeC;3k9xQbleo4F@%1WSaNc+UI)+j)BXK?=ugVI;!Fp2(2rnOt|`;;J(QT}_ID^)fI(^<=g|Bu zUo>|m-hmyFiSB=8#6Fp>NN_Jv`tRolA4tiirmNE(RH$@mV+E5+ag^hGSeApCuDDxq zkBh@4#^#TYZ25Hc$>I&Y{j27b^Ym|mSdlw8{Urq#*00j7400E@bpd?g4vFy$`f}CU zn5Z8xQWj_R|r!83y1 zQ3uvszrvw7Yy;tupQKofk%A`3C#JL7OVuS06qZ5o>HOTGhV$NR<+TQ@#j~W82sI<6 z$oNBVoNE>}1E4_82rC%efg(puMQ>Agn`ukQux`>?w0e#b&97nc|1F3ZTNH}KJKN?tQHOT4(~iWi4^5G+wioW z$J$-cTvkU;3Y@*}`qp{6e&^NozeTt3qKycm$GJ)JDe`WjG!;W`qP@aYc)ihj}A?sY|Y27j38V)H{NB#3h)g;u)E$TvGhrp3lAu$NW7HdzO-!pXObH&$Pt>|UP7 zO+zQ;Md|rJ(#`CO)QM$au#1v5^trPmJWZeYNJc-4u|zrEc>jC&O+7b_`6Bu@3la>h zU`p;AFkI6TpPl+b)tctI@<>SYDH00|m=$NwEy_4u?G{-L@n80+Fbfn1o4J?jtHfUK zzSlzZ(|?9z@LgQawHZ4`*R8MPc(;XMZtAMLzBS#QesdO?F)h zi}hBA;8QPXrwNz4F0DW=% zl}$)-;%ygqw=@Yql@hYV%jGI+HCOU9ubgephBi)egLQM6vYeCVVPMzMTC=C2hqmC) zss@rk_iK~33yV#$6^+I%3W;;zxKfxFoq#(!_J~84gUQ2vW!#}M zzhE-%2^Bd-SO~U$d`{0(71_V8oe^#PPr_fgaN%3Q&42X%JmdB@oGZpc+;WaoTpPMmPmX%2&ZkdOfj`@5XQ37ML?P;T zLR&(Nq4kZIWd7rkPl$17wRNbxBP5#$5c%Q4i-?-yrURKu5?;8{XrvBTQ1dMFv9N}n zzkKi!km zua~+d0L|yo)2m|?$$%)?k4ZE*c~yN}M`8^WOHm^Bx!c5c}Ce4 zP0iN$-FCG0@!nIIb|TTQs4IB;>4{dhQOz?I4Y{%-?^moLd^^`EipYe;RKrWjI81ju z^NI)2xJn#5KQ4~m5oWtJ?1fF?4)Pd_{V7LMW^qJ5EQw|bN_U%EU2{?azAK{W_~eHD z@wZs@OBEvIbLR-uGBLcejk26Y3wEl|%D*jt{~#$ShW%m#vtrlA=lZM9(r)^DA=w1P zT_Xu4>MOnPXrVZ+8Nh;Wk5A5;5C#6SUx_ zn1|oFYha^moRoceEdHUsTDe|hj8~Y$IR2TwDLoBus2{grMub{8QQuZ$Wm_?MHkEqY ztivsQiZ$C#p7YAY(GLD?{pCbpgir^j-IaP04{uUbetr^tISr zA7;Ok7&9{*vfe^pXqBWA+1h_3ufJghJNaNhm2N?5cxGLXGcO=?=~fKys}}P_@opP} z_6b`tPOegtihH>m3sM5CPba+dyC_4|VqGkJnzT9_e(gp+rufo&RSE!B%2QHrVRz}*63f<~8)8B3V&b>+m-@hC82yI1yZ9z*CWQ)} z!jP;M-!!{eF(QF#mj?^a;|i;=n6YeJ&X6cc#>D(~Lye+J=CJslVx~doI49|MQ(Kzk zzy3D-R|Xy{1il9qv;55)wJv6r?^&FL>;T$w9}9RVl0$UcerINnNe5=*`tAy|7bR_EQQYOVD|0 z?MuvR{Ek;fLWHck?-dJSb=zYT7Rz7Ha4CMj(jpj8_Vfx)C&ywNQ83UmIf-QKB^A8E zdU8Y4h)vx4_c9ke)1jM5x4P@#cS}1GvuVTom-XwO^0r{uf7y|vr#wk9;#tb>c^9qk z0dqxQpU1P|)W&{A28Rc&J#Hc?a^1}hf9@_t&pti6wJ83hI&OS&vd0%Ll~;|#@S zDX@7;4La>j2bC0~(O!g&eB%w8#%3!*4e3lVv-#IA8+QsckluO0gy+mkBZY|)U*D>f zv4~yXeUn34-nrvR6f6`rQF7}&sgDE8p*Xe!KJU6zR{g8>w>%wc<*09V4v7VH3pZ?< zjoQ0XSViO%zpp0g=k>=MEa%7QcP%Jzsg`tS9VJapq{v9A;+@jod92(K3Agc~`y}wL4l6kcTa=VE+>s0mF<1EQwafzu8ohRh5D93 z#n@7m!S}-ko?pXpjCaz~=m>{<=v^;MA>cJB3h{eR8cnZeRjP(2bB8|0lxgRNMh6d< zQ6$b2w*1Sz`n)%b+G{VcpByR3%K2>XtL9c5wogTkV65 z9t3$Ze0)n)AG6c;4}?~kxq1k=0F0+mey+$S9L}3O#RvtMfFSDCtvR@ zknzh|UBlMB=*8gVtgerfMzZ9{_Cy>x5QZ#L-!~)>MvuPjTbmE*cJORJ^lpS zCApJ?fzYI!j9A?5odlK~e5-G+Vbw258q>5_N_I8J%YMIT#GFUs=_5(?xnE?GhDvTO zL@n>oKtEh6n6Rv@eVltj0bG_RZziifqqZ!Dz*F*_CPi-mlOxsB$)y)Z(fTx`kyXYv ztgdE{kK0@#@f_pgt>h0BeCh|#3bP-Wb5{ZsQkeC4URs4=rdC6ik|Jil2wS|na#tM_ z_30yPC41kgkcEMPs78WyG_kD?-n7|h3^~3N%+Z+U)^8TterqxO8+2+9H-8$_uJyj- zOj9dn){m#_^}pb7GI>KQ(zQXR{I@zK_ncx0?$dJfAsO{0Y~eJe_8}3+in|foy0@$x z@$GX4#5p-02n&5`TI4EXw){pzR6nY@#OvY%=&d?|q8|Cxw0#P5h0OFfzx*>g!hAWt z**mJ=SD|=o_tH^VWS|KvOy3c!xaz99!s(OhF^YENH@>e#*|&d)xdlkh$LpnyP3oQG z61pN%{rbD9<*LqQK2bGs4wO|5uY@hX*LUZP{rehbvF99Fd!8R;327C|)IwvfFAUEW zsq!4?uF~Y(_Y@dRPp59lVSIY5)g-fT{TPm z+wgdAptln^FldCp6kZ!)Zzv??-LiCwTW4VfF#O;OtD2jNN|!jx^>7&>Z{DG&`Ydu` zQT+-BUQy)VjndupmX=B|u;Nw)2uDM0-K*A%=>9MhO5iq z)2P3=oQDxwM}V`+O2K_tr7oIeicdD7k#N}jHkSY&qwo1OuIa)UbS$`kSXDZnF=q~h zm_6o#^rq>fjrRD0S{_~`GI7?XdNdM*-guCXgGvQy(HH35ZX9SP`Edn$nZu;*-f-8r4)h^e?q7 zP!M6$j<3fZReFa)!#c={B*x^rD~X{U3c8@}dNOEdgk$cXUSry-1Td00)09TOpexo( zyornM{NdLlDk(lSEP)64_k7+=5>uC+bEEb*)T>S#yYQrE13tWEHvf9y{P4h3LW6~w z%_K6;VU#!=J;W_5GCg}9E7hYj5*>vhI-8p$Da`#QzCtT?^(aB}H1>1uXG6o$`@SA&XA+bYj6s_($K6`P`-qc) z$qsB0-ZmKIB;wM;KR(Ar;yJBym*6{ZYF~lpo2i*)f5uQ2oUZjmXZfI)WIzh*X5n;T zh|=8~5o9xrBm582(38DnB0dyN@+!Kl9)z!T`N$6x-yEH>m%OJEVE)vt>yGn`_Og|E z@w&aql@{MiNqgDrA`!L_BCmSAv&19Oz>PVI;hAjIPBS8B@J!<~4=K~~%=70*+#K~y zb&p0oh=>LN{@5B!_MikZMD#Ti?oRoAV$0yBFx^|`uhC>-7J!=U{(7SNvgkk*^1+Tz zE>#1EuD^`Y@GgtMbL}THl!SfkDzxFmsBvnw zwPTzqrAX3jlBm^sYqG}%Zvcvst^NRG4%|T{yK*_|W4&);r(v>AjK-zl^O<;MxmvTb za85sAg%tk!5Ix2uUbF+!oR;q;MZz)$zL{&wBM~ts9G<*X(gXRQ`~T;950;{G=&P({ za(VbP*K{6GEXd4%q1%6CC3s?#opg1K{SvG!)s*K<{_Yw-Tn{X3u%ka+A<^@Vjn`xT z+$9?^J)*;S%U`EAQHCaOU~lK`?&PO63r8%Hb*q!!IKy2T4d})1 zO_spLPJr!j*rYZhH^{2LeKLFg1~c7-1WiG)+1`Q^3w2$J@#a^(zGQ`Dw8ighKH8i? z(*rEm*JpUXX;9{U4dZ4-DWsb0*N=K6Q(N2|@PRVrzSNX`_I9B2lC&gyfP}OW$*74= z!2-VQBVG1@-yCU=N}py+XkZhLt@#Ykg^umPb~0L>nUxiK`h7dvpD+4&N0xL@%E8zb z`vpQVf~IW0Ifb_Q8DvU6p2ysPH>a#G>!%vew(o5TWM{KSu#+(FFq7bt5lXXW3gs2{ zm$FF+h6M2nUS(t3k_cy8$$L6dAR#1$%Ue(tJ(!34fmQ1c8>W)Ron(dnR-qQ3z+l^t z%FLl#FAZ+Z2VT78%lNo$kp1>eiov?%B{3GSTuX+UEBMA#8u&{&I#qn%*p+5fuRC3* zeu+V7!blY@NS*hId4gG>mcQ2UiA>4RQ0WVH`Q1%+>0cq~xf5k~gkmz@#GJ)XNIAR? zE=yjYm{q;=EQ0g72o#fdI5lT;uY-3lkEF=!do)J9BQ_b<9KJD>*i564QZ|iY5|rfZ ziJjPZlO?GwCcWMT*HWCABlTSq`9K_+=)e=%ysy*+8R^6X6L`2|2Z;(3S*Y@(ps^0J zW64AM&x$E?zVF$MDX(fVH<85HpPTb9GB*|r=70Q^L=rI)w3Ew_UWq`FNo+EPIXa`N8%`)b)gP`&a&xZ{0AJJDyVp6=}3KB7i zw!JM`wmpnvhad5YYBO&};Ox69cnTzuUGx)<;g1R93GiY6udAd{F~a-vbOef%GO}ad z@@Q0qPPC|Ot(hIh@e*iBXqXe`T{m*_77}_*j{B2Vp)d9FxY&JB^iB-+bT^HMGm4B> zRaZke{oF47U(CH_SXEopKe`D4B?Jj+=@3CmO1h+_yQHOCKvGab8bOc_m5>H$0YO4h z5a~uxknWEESm(X(m;2@3`|Y0R@od4p*IqH_m}89j3swW3;FQ-x-iAM=L`eu0e@a=P zX!_KstBU`kn=tWZ-BZ-H!M^V9p6Ev*oPt|OsCa|kt;pH?cl_&!7s<|%i=R<%tU5x| z&kDTfB5ZK)Gbk2#mn1Z9CM*q&r{>TfyIyA<=RUn7QACXKcEsz(aTCFfreSigby32` zYpXemYH*eU5FfKU3B3DKh!jbfD(^%kx&P7YhQoHYCMXJ!+2mNW?lYC`h8~TBlpKJ) zK~I$6S!gJa-=5tb2uh51a{5!{eGSpX1&HHI%aBR6uo@dKm$M7lch> z0l5J>Vsn5*k^=Rq2VG16x$_T+k0%69wZX?jZN8%QK?=!lfBJfZ2xc(y~tmvK%ILAnO83V?@Z$SOnB#8c?TS_N(d&I$C@Jb7a_9LtwR4@Pw7}?pc0y`7*N^c^l1K?(w z13m^A_zt6P05U{FJ$v@d&_DWb)oce4JS)JP0Cw>an*&7k3Pi3Fva({~RA}KefQn~7 z%7cxKEdxF+baZoX77kc9&MJ$3p$JmSdf&zJ4J*ojdOE^1%(E-Y!1084z`1k6^exER zA@=}fKJvjp$ZLf}{CJTVF=s${LLelD*gg0k?|9RM58ETGaMTg-n)2RC@hR{ZfFN-V0nT_$UtFASS^}>M zLHf8MQV?l;*ocxYBFhSrmjKG_OTKamP%$3suOyw_-TA=$BL~sFKw!0+?VExrMF;5r zzzkVtA*MqhL|{rm2_gqF0CLUp`F$01$y$fA+VQqez(GL0QDJK~wv-pTd$-@q2t+l2w-w&p zEDBoMHxX$eb#+9b7?Ifk;0!`=0{<99d+~bH^hRSVKwuC_V^GKuKV9P+bx3*r+7d=R zit?*EB+w?4)h@H*;PmkbMD+nNWcO=n!3o_H-JaRge=B@L!2Y-E4zS0k$e2m@!a@IJTuvnDZ!3VxmAL zNY2g8EnVW4Oa5pDmSK#~3wmK#`NmzDrF|7mWSJ$GCR<+v=oq|bh=8q#;GAAuzZDB= ziRLhoKz;?$K?D@*$eIT}76vHAzPy4<)@II4Cn`z}@^~^JKaZM&nUL6p=)$3TdVAXe zSc_81;L&wFz{L9Vcpf_rqm?ZjJ!x z5I_+s7({UWFOHW$C<6_(2YRE3)eSgDpnwZ}EAU8aPyj9K)W11K?e_;Go18yiF!_5U zn*@8ixOk};S&PQYC2wUrkpmYOxL~9ZsfLG#5gi>+FTu#kEuDs8ZshL_;A-Gpx(~0% zFy8`pS7H~pRSzL}I3NT`L{kD$L;;K`XwKk+Smbli=>cf4hLI62svfv(AQpsN8Q|_} zdmUPUA6?exEGgNhvq=g>yfTv}Q?IAxrY*n2Mho)4aMn#dL!jU=9Rc5_4~ibBIb=#e zP((wup0B$gTs%Zo3-J4&5jH1iPorGV^#DeTLIHmA`^@ZE=!CP&sXfU?p!kfu{kvc7 z5o)@ArGt!gL9l%HJWwo6trYSXR6YP%F>{y*IM=RyMp)FqCnrF}$Pl$Q;JcF{6>&lJle$-x@1C_=wfNN8OAJKoTf;NonC=}>!e&~!p&l<`) za4ccDn?KZekKwvGN_FRvfV{3i!N>qzbstt>8)T(mj39*5xVYD4<)*(AfA&d!;|OM@fMUolF(wOJ&_I!M zzT#xd;8W$M`$9oG$2yoNNXneMc$}w-(E~UUM4?|yJ9h)P*n7C331J>jHF%&Xb_OugQ8EHH@+6n#JBOr+1g#Yvx}9j$h-6Z<{%5JG?fHEXZN-(|$@z|H4FGpv z&BS_)jT8 zyBj3cJ3vP4KXr0AK|qY#G)2D_?GC>b&|yw-jn7C8VHw|=W4Zf8ZAMKatP9)7`8zB_ zAaL{ zyc}!h+8CMvLXxAEyvGO&_T}AA5unnHf+1IS)d%p6pcI7wJ$c+0d%S5nfJe3sp!eSZ zsqTQOjCkOT2EbB^aHcEG+n<$W>49m`vuEhQv^U?HYezIb19#JB>y@+=0yk>jdDz}6 z_-J{PATi0j*03Qw>CT|invYvh>0rke6(!nHHf=~E?P*WEIl2G6XP;DnmJb|PB69MG zbmzvaphH|0mkYeLqM{*eHt1HO$~KpdS*#Sl#IHYVy!i*ERL~yW1yJ29Z!7KTE`(NwHx8l6%tkH>-W@_(qtV zMU!XIv`deN#WR>(zW?)mzVS&$&lOJ?*yX(Naw6Yo>9aaX+@Q}J>N{6({s|>zA5y#u zMXCqtvZ`}#C+;-d9+4uxx8$E(gKC^$_}u<(rE0~FBxkZ$A)xea(?L_NgrQBJB^A`vRu4COV7+lh=fS>x*3? zc6lR~=hcms&uQ30WbdKHXHc+6^`!|c5pZKdG7P2W8A4)e)Mjza;N z|Bd5%%9k?k@U;?}z10xkl#mm%#4@DV7?R4qZA*bogtB_2IC)bxf(?$&U=ix0Mt{6* z^q}e`zdd2W0<&O4gBJF=M`UT{1DQpdf(_gcLAvr*sHc)iyl}@Dgc8&#kPL!2Q}?kzrnGC?$h%Ga|zy8cd1oP5+W z<=47W4L&9_MsRlDf=1xmL35&jcQXc%YOOUX>`f4cYZEyh{oMq}K zBGDuEFYHR?lXvb3Yuu>};!mjKD6UpEO}yVaLZB+jDq{a;tQnef;n;A`LIYe?3I5MNE!v~d5t7M~){QS>D583%D< z96TJRhZXnk%f3nzeyYw+6NAp0my`#$I`2e|7q_&aI(cw%X#IyR*&F}Khp!8Qy8E>& zzT_vK>`qBtvxGZuK@ncHQ%qAK{MI^mw>Yz~u5vEPU#oODvf2JIg>|}C=am!}HhXoF zewu%ob{Hfbi zV9UkEgf67jyV*P#ZHU$)Qn42Is=MMj$@@_hhW@X2^&;sJ=z_YeQ*Xc^&jMGJq1G*e z;gc8RsejQ3K~m=IlehR$gCV;=6!GB!-DcWJ%($IVR?*I0$r%0xZLQaq9ozSPHdiY1 zLoClI2DR6GrysB|@>2s?ykL$Lb2Gg`tDzhkm(6&R&%fYPgmF(-t(aj`)7p)pMdjr1 zz%iL-zfZhGT9Z{xg!R8q4BVB*&QH1dcZjZOu*J0hQoNt}Q*V>Mm+nb2arJa0A1S-fH64EBbi_ zWP)EPU(uo`;KDtQStQ3Auun9#c+OT?nb~pmLqBirZbZa{O@OXg!9^x(6az#Pv&h_o zx5U8(YRyWDDKN&kfUoeGpC@{ys=7|H226K-JNH+e{EH0K5FP~#YjlDazW5tCpDt? z!fxt1iIzUjbY73(PV;_L4jz=r`8Jk;FI972Ae*Pd#`bUQQ2PpDzEkSn zKcaVX1qn-6G;annDtc-D7W!rAG#K^4mG!-`@n&ZT`aw90_4?h4oI=wR!BP4sA;Z4N zPt(bi8JTdaA80W@vMP!p#@4a3 z&`UW;I6)o|1!0j~YRIqBVV1gy`2);$e1m=NCXe%s9t@Z)pM(}nr#&9EVEEpdR?nQF zsfoDy`#5+ALS50|7}uQz_55t*wZbQs&vHyiDg>&th^rI?1j4K5@3SghZ(LbdJL?<7 z*P$FuTSC`_6sSOnc)@o-n-PZ3ymU$DA05h}$&mhsqoF+fwSw<){Ijg(Tc~a-W#mP4 zJYQ?f)vfdV(-1rq316n!ievgwtHiz}Ld$x?di84`gFt4H!+Rp4dt^$uP0nTgoWVxb|pyT z4k}Nt5-_3*8C!WdgpekV4ygHsEgO82`tLhqh!uuPr`BZsB2TArz0GQV`;#`&s!wJV zRXj2aIi1b7WY*O-Bo`|g_epVy{|X6?4%MjKb?U+LR03~@CL#%9s4^?Z}P*TF&$V=r1w;m;8%^Kg1fn@X6VkcNE+vtSb) zO42?T|Nc(jIyb|PoW$ZAw}J1>jc9bOBOyu7AI+Go&+=}v#wVS?*$yj5jWBXWnCZC0 z>srYb^`6t6$fnU4{Ya;aGVXh3`0+UUD#f1-+jwOaf-~bjcX}6YHl=WV+Ra|vEh8n< zNAeGCn3_Xy=F}7LlgSQ4m#dQr9D4-X+ezn_uc;B~XIp=Mt~Of4?OYytpclRVz}?gUTL$qw#z`8p z#didbQi6oa*3beXKU z9Y4W1Z6G~$4PVMrhvR1HnAgu2cdJ+DTzO-b?`AM;eMu8J^Q`ou;e$}J)?nqNGpG8s zp)!e3)8`b|HZ8r-Pp^GoD(r^X_auzUYIN*+;tMO57lxjDPaQXLL5 z0m3brEK;K%X=6I=;X)Y<7Xf9o5{m|g)An5NCt~yE9CemTH#VpW_Xs1VAO&y!(U&F9 zwY%~~?bU>9aq~XM=gd-f^Y6We+Np36>$m#|{9W@1mWmC{76OZ>UJ$=Eel%d@#ea=_ z_W8K&jyRr7&uSP2=7{vuhU#SRGvmRN=trgaM@O%&PI{et^u z(M2)Dk{Gystg6-HSHQQ~w|T<6qxNjr{?B-Lvs$uF=ebcyTjaqE=jX!qEpiO>n$mKI z(Z|78x3TadEFQ-R_OR7jEPeSnd^>$zjhekGH!peGM1e+n4_!Qik^n=?ck%gAEps`E zGa+}weGC>Cy+_^_qgVKpjM86Vnm<9G-2HHLL~_$iqq@rPKHS*wTU<4qK3sglm8*Hr z+pDjqj(4=pr8SfB4J_71sWSX^DgPbDd+R5wboeJCzna?aufaH+ES`MQ-OS&$+c!um zIY-0zlAUmUwsRX37gx8rMwG|-?vuT zOHK4lrgpG{?mDksFqI{K1h4(%nIXL&8gU~Q9li1B-#!6F2!UqS9c8$>LlYB$e(Ze0 zZUtjsts4R&bWtNJS099#Ut`m8`kJ!_sIxwqhqxbvEXWjc^^V$G<$@?(IS1Fh{4u9FxXFvV{?d~Y4THgJnf7l3JJmBf3;h~eI4EI`B~|c9#aO10rej9}1IJuD zdfJrzeYNDt@!81-=T+H69w(KDe7+J`1B=A}J*^V-U7b%HQ*`F8HMBJ76Q)!F4I7Ur zndGPlZ*__MTO~qU9Ob{0o@ul&-cmaFThcEQUq_Vr_=9>&@UYhB`FWF61tN${wjYF? zKc`T?9PG&P9^upuzt9jN7d3vCOB9TjAcFU=@PRgA|JG}c(kF9E796}B>x5$3?|$~I zkR%w`JTS#~$PAbc6(n!ip*zNd6XUzh$?(^y9DQ_fD_~t?#H|6v$z707D=7Pqh;lBQ znRb{A8!jk8*DQ7z%&LSbyjU$D2HQ5EC69_)?~GTBymHaLLrH!N+ixj=%LLZ#@pX#2O3{VgAY~>&b0LNc=&{GY5+X zqZUWdp6~=k6L($TuR{0VqxjFiWonmyNyV9ya!w2|*U+aD3|-@1xyNls$-+s= zj}DtMc!p>qF{n`aU@ekIH>tjII;s(oHQ|(Kg?&NO&kP>_8`k@ikbmiEeW|e#6bx2+ zW3H7cZz(UFzkGiLE6tA*URkG~;#y;oBq=vaI)W8A)slBHH~P6ogyPK>BpoZrS{OZX z1lfWZ^t5tTAM5C{{?H!NQ13pE4Nen7Cl^iXx4?SiuN#<29Cxn&{f)AFpmpVDvXXQJmHZv2@n!gqVz5fh{sc00b| zFP-!g4d3r^_uz(M+YS7YNP8@7G+&f9PXAl86yvy-K-)k+PipjVq+WgRUmGv`juW)~ zvIU!yXxS@83dp`zXkz---hN4}L&nPc)e(o!j*zras-SYd+YH_QrHpLDc%*wZu{8^8 zaVg###l~%uJ-n>myWAM6fw@C>e$TJ#nBS2sCC$4@NIIs@M?+c|^78?@eYK2iS`ocI z(h+f3U=J~5)xK-~r+_=GiX`d`1t(2K)t|a8g~dveXp6aeMV9;?gj*sqIy%|%kO@os zaGarujKYr*Z1;rKoxQ74(nSBJQHAp4;_6W|UAEmI*r9rIAYid1NA*Lm`T=LHNv5i7 z=J$}7_b$)Huh?C|{C5R&mGXkBV3bb(E}a5vk1o1}TSQ^q%fjl&!a89M7YBX2w=*oC zKWD`bsl9kI$mhe-`Wc=<^2=JaJ5w6?EYk|khG;lE{6m_n_m29bLh(5WS1vu$O&KL; z>u=8op*!ye>C)E-4{Vv)c6<#R;c%`Nk{vS4Tzjfk1?j5KW(s#0cH!9#yaa3*8G+2= zvY`#gE?hU0iw(q->$%}HYQFFvV%hC0qP2#C&LR+C*si=^>N9U9Jo2Wtg0 z{wx+XH$LA!usiuscE}#ha4zkUl+yK3h@SL4cfVjg-fF`SfuAFK95~5I!W0-gaCRP^ z{Y{!}Y_UaQ$+}abh!UD!bT9Li-d7gv34%@X*OBJwwl^;aNER z3_+)*=p#lWO3?0S!DdV?!B5PFvLMh!Nf4vU^DjC|R(90mp&28VT;*O21WKY{GuA7R z6E|THX(*p~4_K%L<-=^(ydsY$YiHNJ7ygRy<3~mYd-)2}He5#Ow$J!^Sa>%hF7h2B zu;Q4jXx~IEE4_Sih5l>LR$3wKmgId?u@U1Z(jcy5A?Fr-(Jhzv4NkWaeKj{Sf^rXU z^!L0}Gw%aWX8EhKdgky(B0^`vip6*4w78LP+NYltQkcl_`&h75bIC4d*Pw58zar!s zRvkj$ppfNEC3k7tqeVmRlY;j{0(|LN0^@hdh0M@aEt^kh4^dd_k;4GL6_r)zHck_K zc- z=;q?s=?8YyA9$L;VVRam*yiE{uXu#hGh`QxqLekI37yUNRG6+TpfN;Z$*xqyX9`F3 zbmO41lnJEzUDYU=5~I-g6R6&K@|oK_^!`i7FuT1tKo=b`Z}phr31qPDzdAzE-L&q! zu4QJ}6l{tkN@}WHz)EO>^K2-Zcemwsj`vRjVFb=n?+Q66`q#>beFfj7OG?ZBbOyk@Ow^y*(`b+ zGk0xYWyl6@foP6VA(rxk=aT(mQ4!i~Q*?8+Jh>5;y%Y%#Tpu#*#DAixIXaIpw@aO( zXCS>Qh@&sgLb6RS`iI!}+93g@` zo@O2al6kb|MmZ+dcKg~WrR&dnW`)q2eG3Tg?>Z@6e;(016hSTqL*_+R5jVp)%n!|h z@H89fJm|vnUbJ@pXW#ZqQObNKO@RVVkK`j~e^l$aaXAE&9_7A&w<63A@YUg+fv^>m zaE+R+YN0>e{*lLRu^SAU94%P-8Pw0xEri0KDLjTxYcn(rhDgv9$~}MH#6)zDl!y)n z65*azoGpV6)MEt^ z;~2LE%ja*Gd35YA4iE;lhyEo)GKWCqQO5?0cVRSUCxHpPu-~e~4jz3%};Zv#bC}-ZGphT+=3MQ)d ztDZ^gF@jmP!@E>MgCxt>Rt*NF7S|y{X5AushL*6lsj{ew9H0IrhR>mo*hjO9+sHY+ zmC_IqeN7$hilHnJ(TtCL!N;XU{GiJQ+Wimz=yq;jPL4)E;Gff$V%Y42J@s$NZ{(W& z3d!Dc)cesVOvqv498GVT;tW`-Z zV!#O;$DfI?UicRhES03iuxP#{z(VVvB9G4f*(XALd=2?{7d`rF_4lJ!<8};RVm9-- z^CP8je)6rVEGi=(FKnh{HI?}6$e(ZnngoGjcgPtnQoUGqr^;ZC*rru-eZ#{( z^kguYA}Q%kk_jElitP!9v9^QJCr@148Y_=>{W`(tLZOyH8TveLC~SKk3dzl-?~;8G zbCS=DX%b6#4?!n(M*a*62P^?^mK|I;_?ZfnoGW<5AOE_dNTP$=o9*_tp*@>$r{kWk6un0z0fnel zl`#+*c+lSZPgoodI1xY%J}>p)I_x^v7E-d|K>cm@^5RKfmRQsHQi=6_%7DxB!~a2p z0KjBd0X5C0z-oTcCaLler|pdv3v^d@#~hyKQ(_Hxra{mVqb zibrsCE|fW7y%4wt5ixOSNBDI_Wtt7V01(%2*eTBePxWHB+ zmFliiDgzYiV)pVhXnC~!76=vTG||L>6&(V<0n-l)&}m-Zp>=DgyhBSHong-^-orhw zP#J_Z7=z{s!J~CVOgj`C3yYzFSovN=A-fs_Q{2kWeC(awT^{o`l-|~a9XK-pXpRfe zfF0K*qCrG((rXs+to>$oaYIt(#UUuMJO2{W{h%KL64#Wd3deC?(cL~i)s0!uhXw=! zh6V`&S-OVcv>try7|keiotxhC%P88*j(jmvd}A#`kgzdFUFB@+!(a#f6;J+asrTs! ziJK^eG$JD2e6hsvRk5*QffGVQG_Rf{ixTQb;DL1&I=JPlAvaG%&U(s-0IDbUtC`MiR-h4#W<5r603-p z6}e35<4+d{FafvoAV){X>bS=lKDGks<;RAgtc}=FBfgyj1CY}H!Uml}5_<;+=9sr2 zm?)o51bzyR+dN=wg91d=zsmKoDr?-tq$IF%iw0SDMEwuc9AyAG2$-v2sZgwW(7S9| z-A2rH;c!3SD&GtX3(En`?o?q97O;+cI{fsF3d^Vi06QkU07*D$QU@MbbBG-Tz(owt z$M3NU%ZCT4;B@c_Vx9W8PIg@lqlX^G=}TBQPfw^S?cK?3_64LjC(Ya#b`bPRHy$NF z4xA}SSHXYZ#s4DEmte3ii88c}|6eRX?U4uq1o;H|W-N7oz(o>F;=c4Iu~vea?P}~F z72S>d2(rL|=cov8A~9tJf)r@FALTQY4o~Y0%Uiy@A#i#^o2i`k{NnpGqK$ z=X7y!u21qbjx9g<{!=P92WgZZArnL0R=gA~F(5oZe;)${h}DIXXJd#=B>;uO!36?l z&Cu^vf3R?<2T;*A2<_*9dh4wJE>`ZwSOXuo#+|^tkc4qQOnt;_!S2eo505>U0Q646o%Qw`qlTV=(WjH(@NsA*v zW)LF3C*<}UljUJnG>ltDfCGV~J_54?V_?L$9MNI_G74^*hDmsPuh_K^kx~!|h2+Iz z=|?661l{zm2C#kvuO&QMQF1T=Fl%z`E)P0)01@1w{Y`Mi%LglMaxp)CY65IHC;~l% z2#k^hiF4DZ>-RvP@ewGF!B<91PBM4fK53x3|If{mRm{CO^XSgEu$I@3uBMldSD2&L z(AGN|!|k_P12A|#zRVhj(t{Wp4;p}r9IJO@WKn$+h8UCslFP~c5=87Pt$Gt3K6QcR zoA0m_j3v4M5n@$0HlBLNgFHUO4h_J{Gyc2ZZEh_@uESMM=+xl@5)<${^`8H30D^Mk zTGrjyAiS!YE&v8Wh=ox|NJwH`X^TWt3RBqQt+g$4l5|-|QOmB6#<(9$$rVQzttCB0 z2&Wou)^wS_4VR&%L)Ej($Ndw-h$s23MN0%4FD#21pp4pnH|SUy@T&AIELey+7P!Iy zv=u?b!cu_f{;rOeyKLX9nfQB?1BbvF$IkKN$RUgAC;x^L>uE$L7@k+%q<0NKN-io@}OP%02}+a-g(SeitU#t4P?e2_OlckQ~pqiGY-+2 z+aIF(mWhI6<+*eo%4R{mAle1?q2TT$3;sheW32oeWzP-RgN5G^g< zc6y2UDm)B2A%^gbxF~}+ir}eGtxLEd&Is-iG&s-l^iXQA#w(e-p9Q>jtSD(-6=fy# zYn_=l>|3S?-ZsHodnYBk{v!P5PAbTu--2ZrK#t%uAn^t>6Xgm5tMz2c1}%PGNgJRl z3~27IUk@el!Jia?x&s!MQ(X7^ zsrQA5I7w0?4Eel+FEV((DhqiGAbU(M;HY06M*%|;m6MnEdH70x%ldTFO|S)(37|bB427~9 zc*xHg-`oYg?j3$W0(JA-Sd<&5F1izR2c2T2tGx5Rr3Fw$1WmcK-}d=yvp@=v&cv&#uI2&JdC$!m8X6H#FzXNpGfv|; zhs__Ph_PTPoj#a+5HZRd?{0&2C?8@!JM0vmh#0B>K#)!31rO@>9flve!medsW1$xm zu|CwBf21x`z8SxPF}Z}l-1z$$Kl!*p+$()CsN>tv@u74=;tb@4Y#=DPwIp##fq-Lp}IUiYny4Z1(1tgBDJ49VFev?Aqk<(F={ z4)s~!TfKTRM$3Kj@$ujdUQ;(Z276oxsm0BF9KI#6AkWXWhawnp2>q~RV28Hn>{U$t z<(Ql=0|(B!dd+;w2vjkr+N(6VS8p;3cO{el(LND<9$$7oAueREp%NcVPqVKOJz{D1 z0DNY+!B=1gcEpK}!*0KfSg`iaV5?q`Ey8cOH&czCclRalH3dl3`iorSKJAW@V^d4(GD&d zw(G~Qv1>}$RUGR*Wv+Csu?8z2m(2+W{@d{p+1tpGY9$Z}qey+k!Y~VsuZXjhUam&; z6~1HwE1d}q?S2^x4=7mto($wY3?m2-vHSTxlz=7%FD0@^0y1WXMwQIcTqn~fmzz;O|{*K4IyFiO+vC9DZ7PBGjF5R-1%8Ja$Yngrk(W(3LIvkMaqEuCkQBhc-c_` zUnc!pds6T|03B5|wJu<&j4kqnV&O}_SIb0LGq-tU!D6UT z10>Zo{Crdq?NLD0(t(lfE7~ZdA%TsNXkZ_Rk@Hw!BFT1iG#+9kMlS9zgqXp-tAwIj zM;HvGL8dkiC<9zm1fCROJecSKTo^GA0#tMtsEt+t z_2F&!XeaVl(Afpz4KxDk3Z14(Df$unFmP`Gvxo^4IBv!70-WzSK>r>aGdMs zu@ny_4yQbj`vLc;0>Uns*iE^0(;&%E^=2(x5yFN+ZM|+iy8^jg7d$oslu+QA5OAG> z=)t@UJVn8g>4(nJAb_Cfs{6$;P+$X_JAQZs{^^yVxDN8eh^bec*a0~ZdC*XZ#Ss_` zTx^9))YArm(U3p5-qZtCg(vXLr>;Ao^bjK$>^9Iau<($0NN`I$8ew+ru0c17p zkjH}_F48}WD9mIA_6yv4A>i*NO}3sN7$FvFUzVJJoI%W@(gt)G4KuSiNVOh;Pik37 z)@aiuLZm}@OJ|@%EDuaF@XCDtbhG6qR19j>o3FuYyI2oMF8mwGVup z5XuK6mK|WeWYTZa;&%_c61mo<8i=o4xuRcXbrp^@ytqH>vw)AdOan#h`LBPSKqLft zYauIZYcx9?y4RdWFF>h$)I7oQ7dYH4P@DFn`>f zz5&u)T|*-T(Pu|;`eL0DrgLXQ%6^1Y0SSFwJq^@rU;u>&tp#BG^&rHaI_K#(qRxoG zH9S@gP0eR;`{#j#O2{L^>TFF61$((4k?-^F9D$ zs?UxBi1i^-%OM`zdBw#mjr~S7c0?jxD`AMRGcZt)0R}$A;6df0(0B`l{7X#@zdy7S zkX#tXS_r}_`Tl7Z9tF?S14mTb*JO@L|6}*jQ_rFYy6eIxw|LOALDYd8%A-IA%?wkNW;|p{%kV%gScmoLyyk@(=yAp*0_u=PkQAeO; zZPGsu^go2E1cc3xN5ZxI8>=m5U|CFu90+O=gkWhJbnXS5xQ<#*gd(M&5V1I`s=P2> zX^9P0>*R0mW^jfFhrBNc3k%s0m##0P)+p6d zGN`R(!U=#Ng$olh7TN#|3=+Ix0*N@9gDWpWAcFEC67t}AP}{eB*{`Uoif~SlBnW5& zC=|lUgKCBvD(uEX!Ijz8*3}D$sS9AmBd@0RLuY&|Wo@hy1H{)60$>T1tdEZnZP1w; zl9quYI1O0&xdKHF;qa8HxWRIduu2ze;n(1a=$ER(LM`S;0@ZVFZZ6VsLYeoa@+{A` zN+5R{)dqx{Xdr+rfYnwq{|JZ4<~ilG=P%W=oi{LQt!!-t$5Y^B1QmT0&)3RH$jNJMSJAQIK!hztZhQmA-TX$4_oj@nWY5rqKnCBMGD{=eG<7iwAr^8=CO z24d$HNQXZHz69dpiIiA2x3V)c@lnW>!ovz(wFPzwOofJxbI!+oivr@8esBudDAkoR zH1o~~A|OkWP%1O{9c~1CADsa6TO{4?=}|z;jlnrV9_-9yw_CsY!*yc7q(Z``fb$d% zIDEpY_i#|(Xg5&L{>-?nma`PD$#$mM7if9yVDk_UlvXILf&Dt48&2E!cNc0+YJvyf z4(t467Y~6}2n7vvMy3jEN}%)c8u0`K4l(hgM~@=FKE6OPX$!21kp>vD?gDQl@cSWR zUIL_?m*9*Q_Toj}!)$RM=-R0p8Lj&DA*FCe#@d@9)~GxOW8fe^TU;LpKS`+R36Rv3 zo}M15=zs!)_&b4#nX ztq1uuAua99q8nmVg_P_N=wV8mFZLv;p3o^X@1K{EP*VC$J3U^v4dRT^yMnlqnYQ?$ z+12}TL)1W``gmlRW+g6m?VDkHukW5*ckVd4n}IvHO<(HI#W@>+bR>aUgQBaqw^zt} zjT|_iM*ipEt&I&v^g2nCz@^!SIrMw6H>vDu91MgqKb{==U}tJQD0i5gzJc#{Fk*QJ zQv;Rr>mTw=-qa%$AF$!Pl6n8hrws>#Qr$cH6(|^v7$}@)s7$qRD1m^bcokT&7|10- zxl()V3n^EbQ_KE{(Kb|=_k6!21g*EPO{GD2U%+vU?q4+>gJx4-pUT-mU8@|Fhgks! z<1B|j$3vpVcX1aO(_nQ0E*egQwYdcan81UAA6ovN$7HD4CXG&mofs{$#9>Zulr8XnGVOH}>pE>TLe~$1 zIa28`%7uhp!~+q+1Gn4nPMhq}_YZF&t34>~x81tf!bWI>Mjsv9Vft49C2VzO)(*xC zbRjN6;E^N#AY(O;iGiIxVUhT@^4%e1pRzD8kSY+oNzjqQR9Sy>Jv(wkmgLK`B?%sz zK5`_MK|DoPVu)Q4u=JBcgIB-Nv#2D60)>S~{=dZ7Bj9mYx-H001)i?MrH6j8c+C4^ z(zyvAJYK-s0a-Fu4`6vYJKqd?&F}nVX44(X9eFHYI2a+_O^9Q^K}{g(tm(0{DAED1 zB3qpyzHtL_%>+jSOfZ6zhDoPeYWN)a5th2-3@e9}VSCc!j%+Z9Aqo}(kGS4`7<@!% z5vWdy^M4P^Cc)(K{^&Y%L+V$2p)X?r>4_`~u~tu?g1?H4dc0Rn_a62Dqh@+aJS?K% zBN(kfo`+T?AzB1wOjoIsS*6AERWZaYvSg!m{o^Ej+{$Xvt4@rQQ*~%{p8@3taa*rt z1V%9DwP$qbgs>D&3rK82vhEqP0Bl^Z>TIut&5saqqk{UuR_kJ`TT24^jl>Ysm|uj2 z)yIZH2>lJ-uAR_N8C^IzSm%hP;OpAo1U}z3)HqKvl`*9V!BL)(RwB@N@Eke?gf5N$ zSSq0xS#}6N75YGmN!I-)DT$GVi3zS7CeGpfmmwc z!F_Sy5C8W&NJATFcOg1OL1tSvisa#6z_-Z_^a)hEz?q8<3maQdxK1GJ8)Sz}zEher zcW>WTY6e53vXg+f1qJ-$DT|9%Q1Qej1_^$Tv4zk54o1T;JX-@oZ6_E($PL-?myyqd zS_KjOrc8JS-tGoFHJqQgpaZi2T}n(8?8YFAQCXt|7Z*Xke2n|Pt7Gr~z13MJe1C-I z^}`!>A1s@upy|yG<$_+oNG;-0C6JB}jd|!bw5(i!PQvdORL*Tk(;eI(U^OUL?Qfa_ zPpYy;PB=c|qYQ1;n6)(|wv)q7QR{{`AyJVDn7Ja66m}aBa;}t=6vVLR6*stZb~~Gp zYJsCHE$Bb=eElj7;|HcS-Ekmld7_ph@Z=w>m5mLOvjTf}l-dCvF5)152INwNEgAfx zj0()X*G!4y|lnY-|qw{F!TZzM^+BTpsuq zR*d3;0$ETY8F^LmJen#f4LZASgTg)wwEm}l@6O*Xw72@)+8<;=%^mN$Tpqamcd8(r zcK%D^T&wL(@8!3+DSf7Ev{SW%~C(uX%i?myhVF@{z-V9ta!?NXFa5;ha zqH+|m{OCFtJ^!!3Ur>LMl99cGv+X{($&3;$zt}gs^fKh&72|}NT>w?)L)f7kR=(Rp z;_AqvJpO&?{$_LjrvK9Y6PO%chZ`oPCQZ6c-s^sj|9fitw6@h-$4TbZ<9oZ=m&V9t z+~emjfP#M&G0oe97EobxvoX}nKf zz8V$w-6;S|q(A$9=S~pgzV`Qz!XV*)KZ?G!M-R6+%NP6?iwg?}Apb>|cH*9%o`wSd zmA`m4IQi6oe9->hUSVFIH0(&mz=nM-WbKNl*%CpfP#{Fb#f<{D|5ajQURfCzd~IQF zt`x*u5VA>2azOJD;lT#kp1#%PWp%I~1S~~O&}AUF*sB;C>FKf7O_uJjjygbt;cH)? z_M=C+FdJAEi_6Qe7d~m4CO%33ZUalM0yJKf9zN8AfA?M+qgS+l{5Wm979~nW9)g7u z-G!7tIXinZyKKAAd}4Z1(;FFN{mlgh1&>EXGSwhWSH)>dgeNro>sNkzyVRGiuCEK*3Mb## zYKHBH5o`Co=7mSX0s`Lha2wZG|JRCilM6RtTctA-JABgV%j<;GHStCT&w~07@?E zpe55&c4h9L6ilW*4k!tCd_>Wx(jnp*4A@kw`etQi(FTCZ3jBJa&LtZ%`PV~6$QULCZc~H9)x3-!=(WxaR)t+I3+g2SCsfP;owT9Lo zJa0W^<(G&Q6sKX0!uk1mqyKT$=Z=nAXlVwmcTg263_@=%_s0)4Xax2+*R6I&5)+pt zoY@GtqEK`wMOi8Bw6r3)ZB+l=SqLTEQfc zeG(sE_cpjg1|t}=6spU#5yJrwH%?SPmOOITbTu^xUrh%0%lTw&AOqAVk`N-p|A(kH zf{f@|Q{fx_?^}g$GvX{t&i6`{Gmjd%+y53EO>$NhNntlE8L)Xx7!dUDYtuzvTQ!UMc z&TF|$8kyp{i3dKywBwj}Uo6sU5Ct|c z`hE);vC~Ym0o3=PgQh7b_Z+lsav)Rqv$Uj~_#<1Q{LLH6FWub^(4tjRRNNjF;OA!( z7dHj$M%?PpC46K#X`?PKD@$Q&f$p9mR1{3?u(bde850vz{Nck8#F+Da=Q<;p5f|lD zl$1=0uqg-Oppl6k$_&$TJ>&}E1SKR#hlhI|1y-Sg006fYT4rJF5qfC0?pyG5FcZA_bR5|f1XN- z)CA!W*ddg%4*mW6S1D2c!GopcBGAl&F@*X%u)JLOL3cIm0J>7JOX%S0Ixs6B{$OI= z`*ad^PKfuKO-xJ@7lRU@eXs)E^XrC_NYsmpiOFmyHouJojbLHG2Qa_?#a=$jQ9VxW zdIvHPI?xNQRfg>oT_vTj1xqk{vkZ-lyg*w@?!kl82UWM;R#j;xo@t43*ZsFZd$8TR zr{m=01hNq+tMn@#m&X#IN}>-+qdBbXDw-iHe0-UBdR&a~KJ)vUGcrwxFnVpMEw z)`+jBmR2nYdR>k}hg=6v3;HGRp|*FD4tV;sNeybx>hTW%fMVm}adW1{A?_2Ato!)! zHe9PfI_I)mct*p=n!z!7i_Mbe_^SFnH2YbV z3_1dlBBW&8HA>YEzSNVL5$e?ck&Ao|hQ4CWn(;S2%{nJeRE{{OAv(wY-r*(A0MV|L z`%D%>Bx=PGTntcv=Nr2Qa=lyGHg42%aLD%c^(9NgcO;B0Qn0bTJq_v?D;F0%)|&@_ zL4=kt)Z_2a^#>2R9oaMh_2VTT2%&yTa|aQ63QLag=G~wpIRan_m>$7RH$aw>3mkoE z+c!i4Bs4;ssoXPf=n)1GKc=p(j;@ZY^jdpC6=H%j*ET>5zzsN=r_M z51QT|tE%Acu6Pv!ovu#G?Y-%dsh?|ECiz4s4QGAc1~Yn(!N39Q8Hn9^A*nQ2-&hZTk?x2?`3X zZVL(}{>zk`Q{Vgb;2Q*C7;(QyFqXB;G3%B#nUM;cf|;9wo2>Zw`H>0n8sB(}v&N^2 zZ5kRKWpWe7MAc;jlIH~EgDz~A|x>N&H&1inw-qHNnUPWih2kV-~SyqF_U?~dxdv@dE!H=6&#$eL#LHnu6T|m z4jPx9U>}sbpDQoYyW@rQi}~7_s!iqP<%@a74sDR9JgIeFN%5Ec#&tC>YA%FE9yPm)jgIqR+vbSqzOX8f1+T+J{2myXci4k4nm zG&jFfeeSrkbDrDf%fxb{OP|fBtXD?+TOZ`n61$Y1o?hrOo&eiR)A=~&!^~}+-s3Xx zyS*EpQMlOIx5J78&Zax1bNlw~_ojQ)3opmlEoK+9ig4jRyDdz$O#PEtlFoZSYO=j> zc9Cd=c+XXqIUp1SZuVuV4ekxD_xLUi-IFI%5x}8w>A3h_3PnRx@6l1t4I8$>Y~|(U zc{?NSMt%-Aj0od{>QbxWs_@%AJtomoPKPlRSszdUZY#;Ho<7};9Ot84@fksKBn1R& zK~o|)-+~9uESa;c@AKnLEhspN$9mRk-3A|NAhQ;s(3LyO2gaivxD9vAp-&jx719+3 zbFZ0X0URKFTfnntdpZgnRDkQ&k^#_Y<))HZx>yLTH5180w6v?eem^L{Cgfv|W8DhG z>g&Ln;O>IeDTtdw0w#6w%e4>ZvR8BNL$vd{zp(a6vJ+0@(U zqbZvPLSCGs69Fhx^2!6`jT$Ys}$n z`dYc!N)2vTX&IT*=od&%oLPRm*;Bn7bYG-%dL^#4yS~d@NMs#yO5|=x6&l3IGsn0Y@qsV@=P*qzi!P<*H0T zDX`#l;RzQJFsN#Ic`YTSIRxIiC9{rd4$O-}|0Ox=S67z@8A$v#!Ffjvs%vVR1g3`i zHhHk@Y=`<1S6A0X3kg6gFiZ>(Alw7Cp9}-d$iN_g6nH>8zEWIkI}GW?i%;?AuZ~jd zIXE~b8}5^_&89VD&xv`5emd&e58(A8EO8pqQpsUqtcb)lR@UNhLQ)fzGYW;pwwrJE zj38nd+e9rULIZ~2xNorvR}K8f@F_P-3{#i29~pZ8{xGp4Fl!C6=g*!^)YsSNm-%70 zk5?7PbyZ=&+Wn!_lyg25#!X3Zt#|LNnHTzj>=v)HWB>mB#=MKKHi+i{E;8$0;(bCL(aB^~*Ze{F($#JK1S;X= zY(yJmewoawz7R*?84wuUqA+#`42+C40Wi3S7ZmZ6{In{(7xD}QdIw4D334QI@-y-Y zBoKR|su7xK+1QNa7@97_p$adf>JE7HAJP`_s=pbDaM^9%Qn6|3os`McM#q!H7m=mY}{DbI4mse zy=}e~063&}USDTBZ1WL%g11h_Q$50&M96~}tU;f78O2-W&!-T>Syy)~9kOu!DH6-4 zr8NM~&w&to`!KkZ(;d)I7zeyU3u+Ja4MvSXR2By>g>q1Ynz8#S?3|^wHK@bJoU$z5 zXi0~IIN*rgTXKec(rco@V#iu_bavVf#86RO)@-c}*CmOo?w`cF~;E z^_&Qa)NIp!-3gsQF?CpQfg# zlN*mqaQDFjX^RdYj#N;%s!*}g>rZ16w!Ti<3Awqtpm`hdD0Rf@1an$hi%mtEe81Av z?VPx7!KKm8oUpD_Ao%X?KMPO@aF>OhohGn>_m!0q%~Gurwq)4#4J2zhqa2i&OGv$f z)R7zWF1LR06Q+6(F~f*QTYxk$8l8pw7)h@d(hynnS4Qw#gYXwK_DzGAD1q?8WawJqL09XU%s5NX?=E}e!ZFmtS|jIM$wX7S6!>_h4PPoF+L=-{Dzpv615_`EQDYTktVhc+0l^l1Ifol;)}i99{Nh&r)8lB*$PYF?dVo zL>f+q2yfYT&*%icfk zBDQaz09?_)z`)<1953MVws7q`v=mx$J>_jm=JKx3ymw(Gn!38sIg^ub+cpjT>9K=? z;L01*Pvtk()~?AqYjWbmz0bDO4n;@BDc9BljEf;X!9!TGF1{~Exbh5Ca8pZ5T5|G% zSofa+pgIW#N0LT_jJ^l6sVLLr0k^jR^8E3`HaR853VN~7=H=~&kgy!gEdCVX`-nU-W*oF-nfR>cmKH!b9~l{`DZ`I%`4(~Kmi+$cqpIt= zR@PKj2Jp4pHfMz7*hwvADz-dz3kp&vh*QIILmgHJQ&S7eR5dEbr0BzQ@iSP}Sk1NAcj^1oK1tYDBi`g)t5y*sLa;Hd7ea zpH;#fB|M>(rq9VIjAbF`fkrS5wi#Zt9)aeSP9Uw9=t^z2>+Zda8*MM;UkZP@LPx5<02Py{GhW^ zC0AQ?{WHm0eB02#KrLY$@JY~Kz<&>ti}FwIpe*+y_y#YRq`fjyGeSXuE|y)IpP*|Y zvL@8Gr9m;()Yu4NqN*PgkB*K`7!nBFXM#uIApWB`}$$H3pQC5z6$VX+aG z&_XQc;kkpqcFEM*=2zL~|K&CC(K}$)p~*U45yV5d7Puh34xZ&*NbhQ08}I^Xez#Np zNIgQa29VBuPzbx4PU{L6y~89cXZCMhIES|Ewa z&A`%f=q^XH+WD>b1|j>>vA6&E;K3h~G~B|`QEZ0#{lus4rCB-Te)tuU>!0N2djbq3 zOw+*QP$)Ht6??Ato}5@(&obbH0^!(6n@!6MW!jdKF7%{coNQXAH03_Jcy+Yn!+3F& zWMbF;51ewByk6Cuwp%t(8Lp-=w|Wh=?08pGO?S<{t|Hno{7}gy(TdU|L5y;jn7aFS z2|WDsJ^z;pO!onKovS)+)NtywL^H=)Bk@$s{KytGkZi zGLYm50S1h-i2JC#0AZNrHUG)7CTIT1vIfUPw`n{sDKSLg(WL{>5Q#sCmm}+jiVZVM z7U!%GCjiSi6q0jk)R0;%Mv71aYwni!09r*JBOYZ_HjY3^^>@s_<#Oo;9H1bD!xe-J zMpQzmH1K-ge#LuB{vqoXBw?$yz|aE5;yF3&Ttq|dgn}jlXmCj-fjm*w0>c7ufN(y! zIXTOg4M0qa5440F(hcA}kK{8(X^X#4h-{2kNH429*a?n{08P!AMwwWWsvbK6<0AUx ziK#%8`iD7Luz@cnkky+rbufyGE^m(q5f#Bz@Vqzt{qM9|6EX)eG$CP4^siU+20MDO z=!d{9VBo|;T>tkUKf-unyXV@Gg(C4ip{Mr<=^0{_s@`!-7rC{a(?#&_4j?}OI64Pa z9goPF2gtlYB+Mv{!8+u)O<4l0RCE1^)K(Q4Nl9sXVxm%r81gtAa;8Q3T^&46WntXP z$^&+~xMi&dPqp&>h_jWowHj1=ZO_bZ!o>pkXl!nN2=H-v<53A|!c4&4fVBCQ582S+ z5R!)CoN(>4lLxh|b>>V0`5VOP)gwMs*^_!+(ZfSSAsx25`udUJml&sckmABLu&}eI zf-|720Gyj)P>=w)3|N_fgv2F%FPyEH%8){3{OBxBgD0PB$Ae5kH~Kg|9oY;4^&^`L zU@?G8?~1B^h%kNyCkIc*F2HB-ZSy1OIWPxp@gqDYF+tGrMEayqpA-H{)iyjegghI& zGq&VA3kOpp@Mmm8q1)7BaMOm*|ISSfZkPZQo1~9ufj2`Q z*ZAqvqhG&%Su7v;Pc(P<9V%qOysD^rr!&_;Fave1)5JG*80#Ga-Rxt$*QDjW=Eo~6 zZEeGFLSW$Lz1RW?{F0c0v~mI0QnYigY8qBW#$p*qQP}*|EQ9 zV<4E)kc!3&=CeQh6owJQI${MtYpAiAahEpxq&ZVG^xqk7!H^AGuW#TTdVdR2P zl+d)D-gQ62sB~9oB}-Pp`lEkI#W(Ov`tC_^Z?EKi}toFxx{qy(fFIo5*v z_n!j&TU}j^xE)%Ni3=e=k;8;cVz$>KFd{>o=boY9iQ)ACKpw z^*eMx{yl#B^cbjOB=`4Qtv#RAFi9VN_lMWw>sXrkCb!rtH(wforU=B)UU)I?>!n@+ zDKfAeO(=S)`q_{~lCXW&#A*@)_Muv)_?=nF}Lh?3CgQ4$woe*4j! z+iXhZ=AK~>O9<#OgS-PsJE%0U3MA@>k^Y+LwNLs;J!-Y^87a7gf}1y+=uG!cxt(v~ zp?J@}J(oR*XtEiBU{h=B;1cg_PeBdvSyzDgnO}kU!@FS3Gv%=VVI;$P`zo?3^?JbXSnJ5ppnr^KHdq>hU zAV+X?qehfsoI)@H&-Bx&hE-&r2fxR{=9pE5#q}@r343kFWkkV4MOPRc5SUF6Z2ZPl zzo5tkc}j9+hb3=(a`=5jw-}1^2!P#VBw}834Y7A)V}$`bqsR?uCNPNK_ha@ud<#Ut zn{%=Etwpt~ryf`dAexPhjY&}Jl3*7JGh$4FMqj)*ZXm~vkN%c=$F|P{JO(*%&CNq7 zvk!ChvYjm7`XQ+8keL*~c=Se4=YoP7QUPLld69~m!#4mcLHz#lniyhDXwZ^i^9dvb zr6(YSNsT5pLg~GlU+7x$sQrbgfs9rf8X39QVS67Mk*wa$_;!&~o0)3s7xr?cY+N35 z)FtLNBJHJBfe>TpW^&S%{O)p}9JI=A4`g)Fd-q2bLy1u#aRuf7pIXEJUJ$vGsSkTx zguF>~a2(wp-dl^y{e+rCNjJlw4#^!PUw5OT(tu!`Y$1u4D04lf1AY^BUd_!NM*~MH zlshv$ofw}!`+|8J?8$LJ{?35?diC)eNE|oDAxPl0fGZ)A5<6+!!TOSa?w z9;L=5gDi) zJcu<+gE0pUdl&>Aq6eCx&$jtU{h`WP_$T%M!+sm$-XSz6jLEKDA2o%NNOlZx=3mh_ zk~f=kyvGo!-r^c5aog-Adn{QwO#~u1f^Y+FM=HhngcaLlToj8 z(KfCK2BuQ4c7zLn0(>p|i*QkhybfNf4LWVqenAMD3{d3sb2|kvMNoIf{+fj&1&g<5 zaD3cC8jMP4^|>g!`C}8^RB(p}H!~tRJcU3OF!r&72ce+wb(|VH(ec9dIEb<)qopaM z-&Q;fH4RhUD~Al4Wo!P|?DuhbZ|9oyX%n>pDY&(L)NmR=mgC3 ze9ZPl%sW`#YTQx_cS=-<(AWz~N$DffSv>oXG<4hdZv)OnPN=4Y42x7V1WA`x_0>a- zNG3DVe(wIJ^!u?i;n(1b0C19s z9YIb0Wobh0y*u+1QR!Pdp&wQj7Io+pG;ee&U5AKjfo@Ydy~)hFN+y z99ZLHgbhF?=~ugbBzn!u69-VIhE8JB{ok(Oy}3j0sP~{!f*_5^N#%jIK>JdQ z>$=)GYK3?WRg^CXLplfqAJ80o)0Ywu#CTY9a3E0a1()~K!doXJeo^@a?bC5Yr345@ z3mrArXi$#2ax<@(CZk8)RRC1AVWWsY!Lk9$At{N&)FC`a(1CXc;{af#V-VRva*$#d zC$|ZmF4V^9hCw7>g27<(uf#tc6vXd7PE9?A_=m972*`n7;NonTmNp=Osug?c8xKTg zi=(-YOV?i_ha=etu;#X;1p+#P^TserEB%%LXw0&HT>4Kb3Ejk3a<9&9j;2{C9`(=w zzt{}pJiql8z)$%0KXK14JOsceJnBOzt}FuKGD(bVWn;HUo+`kuSMFt5@yGHbr0ydp6n0omjB!9|ux z5TKx;)IU8ibLWrW} zv(A7ki;>hYW#2C?`CrPh-r7C}k^cPxM2=!yko&tc6(abJs7T2q1{&KT$Zkn%SsM_rJ>g8;8e^ zyOJGep`Mf`QazAVAft$eOk7-ifF%-CI^8#@hF7)`(h6y>6%>q+1l+CYJ?7>nZ9=#fg+|Z*x1~I{>srY2f@K( z{7hW#|15GTaAUz!Z_1&X17}FmHlj2h0g8a(m!asru-9w}^(kq<+vAr04Nvk1O5h>V zY0Z^1j!@G<&76d+0dD#PE_ z=b&*K6j=%oF5j)`N6M`Jh#Qgz%7hv$B4&3zhP{H)Vnt5M!-t1MaK}qW(8`497(sXt zbu5r+D3L9p8d*0dY*b=^C;Y=mp@u`X9=#{1Ehm2d{9FAXno@%m^q$>eN;UWL3XMWL z1Q>kVyALSlw6*?-lhYF%Jhm$lnNO12Eaj*mzSMVHHHy zZ8o}o)&R^rQrjsAeRlvdL5}*1ryV5-z?~Kn8-nbiNmiu~mqVm$CLZO}?C00zrJT~B z>W$}k`Q*CvAHV=3VS|^f07sz~)T2zxv4N4ul0hLii;U6y>z*oGjF z9ivdURv~^UF80u$g2I-hn_nRe9;n?+H1&$=kn7--1Ebu=$-%`131tWZwh`2yL(NH7 zi(3MWW+|0PZr-l!DS95j2wI@$Oo-9_Q@g>& z24M7bp1)w61Yb=ydw}K zMNPT^p9~Q*DZl$S#njL{LTa_bQ}0w?>BJ!gyE=vTAUmM@$9E$zA;A;KZB&7R{rXeA zfw+TEBDi|6?Stq+7i)Lxz)e;QdxR^Jr^eKJJL%fD}&A?VF~5pCPZFIC;|Y#ba7I08UYCs9E@G&9}{ z!TvEwACi9W@J1UK(Sa8b$rA3akX{9N8)}>!VcjJ;S3}FRLrBO*@ic_8p2(Ir7U}@A z?)3a^Gxh5iq&HP(o|*%#&h{h=*{u*{wykV%S?i#6(jG48$iT0~ggTHtXS)2o>J#}t zHG7B%p7Q^p;-abM&=5b{$}c4;7dCK5I(r+|9gh#Zl14vq zYqs6~M`R;=zS^zSb{fm$ei=KaZTph?1+z^p8#zU@{V3l3%ZMQ03|+=ip^-GLc{^Qs zN=ycyN0Yuw=CKTay$-dVjhdzjXHhSzju;G2))QZUT;7wE= zR$pQnDcu(oDK0nOFkRYV`&{K$xSCUYn1Dl^>UeoaXmeD>=byd@W=cPDK7YLXc=*P8 zXNyfz2SUWwL?=8I$<}eYC)j#XR7C#r588qD@f}U)PqHPXPpLVoEPN_i!>j4+o=p(B$ePA)LVh z4)eT}v3Zncy*&PbIRY`GNUUxMi|n^xveu6L(<5=YPq#vAUEY)D{cGi@{|gi5jiT4L zI}H?;RUF*Q67lHDKx4#bS&H<1)L@J~FhAP)(h7L`v(MG!b0n4E70lv!h z%o0)Uo)7t+OF^=3aF#!NSIWp8(Jh{ex7s7(u2FRML_U);KM z;m1TdF#DJ8EYB#wK5U4znB>KfZ32ZR9d=cRRa8_kYn**D9JU`}5X9YSXfR4w0crnN z=b{r@S_w$n4uz1c3Ia(|Cj$A}GV^Y_$dPlKa0YW<ni&F_jcn>oFOlH$tMs)r7p`SN-^$@)GWbV-6@j9Qd+ zZRlWg8(c^03zjXBd|qlR5*+u}tu11`b@4jITft_nwV+J16Sq=iYV!{7k0U!2uFh^; z;aK_nf&Gy~&=D@SrG9pPGC03R%8!n5oTF~{kDG7x#Lf0?u|Aj-VOdOVo?CUp#eqY4 z<6Luq+4=YD*cIUM>`<0Ky4<22k1UOOb}Pem z#Vd`C0j{p_jcDT_5~1dQgT6Y}HsGp_c<2?1{I%+pl!1VEF?I$;T7GtyOLNrv^0qc< z)8bE6l|@Q|F29^cbS}jz-c8@Y>cld6Tj7bAyR=EEg3TVO#GkcX5k7oAx@*o3Dw_N@ znH;W;?zFqt{rbK{dxzbO#@?Eu#R={ADWl0%1o?rOY{-#!jv zMKPtp1P%8>e~jAgi_;eL$T*&Q(CEv%cWB$4uqmS2bkj@o%)0^t#`IA$Z$4)V*TycJ*?&iIyowtSE;wutL19??_#+A=B!b)ZLTE-1DyN=oa>HvQ{=q` z?q#Q`6|67t;KRcm3^bc;k;#u!zNEa`GQ^g_biyJgqN*`1BFTbzdBcm9aa3w6W2m}O zEsB};qz~YkGY^+2zuxfBum=c?xvP`C?TJaUEpv>ctOFfofoRwSM;@6xO zxz6`8zVYMp>Ku`3v!Q#R#e@=!qa>&%T@aZy(2_hv z9wlSfh2<0LURsNnTjnaJO)W;$+2$*)xyG*1sVEj!N?WjVRMJn`Vb#u|cXU*ac~4nR zF5Ij4v2bkV)800+vf%K_gg9>zRpFem`@)sG-V9VkY}0j^uPMffUEx&e&takR{Sd7i z|MtFv%0H{crw)J2Q=YgoTD14wG6i{b*nu37nU(e16fK4RIyL0VS{(ym!u%8bp%={T zMa3LiqoM8MfMdMq+F0sx(RT+1of9N&WpVL!}B+#n-v(=4J0KG4J?2Mr(yJ9VMePw}_ypK-nBr)tYu6%j#j^MEA@#{*XY|4Sj?P)27n+w-`6D!YX zd=<~RaMh++d8=&_SFrO|x2(qDeKB!u{E5Co%*#U_jH_~1DNj_q7`P&f&P`16JPsTj|+r|zT?XurFP!CxZ1V& zjcm}pmdo7wDeSk#C1wnGEF{V@8dYCqt5|*5NJ;EVW))3t@0l8(6CD7bjN^_IQn7(Ts^}iHhcYn!mg4PjV`?5nVVf7QOWe29Juk}&Crh^ ze(OZX{l>>NzVmU>-}F1BIrlx+aHspNZx?PFUe`X(wYFMFuf>&trpNbW7kH|ezS3GaZU9YBl?2{*(ufO%m1di=Wj4)U^Z=U#`3g6&Ct9&!^h~`!`&MWV2 zd>lTrjP?HO+MJ{;pwGwALfdBn+U~P{UNf|@RmZio#y*`5iqFsA0H6$=n+|C(rC-ru z(X(GsFtbrp)Qy2QY%0d@IJ@uMwaO|{sr4Jp4Oj(~r>_~;Bx@=SZWS@w>FzOWCy@I{ zt$2CWCE0dJp|(e*XMEM7aMxv5Fp@5v%PC9x$(GLKUIbh*RiVRP9C zo2dtOm*v)eu+c2A$=Z=Sz*uwbfXqevUD4&&1gvV3Dh31It&R}3v)B6P=HKKte>trz zC`$VASZy5F+^fqJI-a4MXX65fX5zghrUn^&b?+eAG-S9tGYe;T$rDRStA?5Iqt?m~}+Xj_=MY`6rK zSao!Pd$`)?OFy64+${gmV4G@^Pg**vWUJR@@>E0^VXxx#f^HtcwN25W9GMoUfSvHOn6eP*Jk9KywJy1 zr<}OMJ|d?$Me(SHOIXdT$Gc1}$~vEqa^pLHDq+_6Vo9ilmcxPwyVc`oHmhD)(-wT4 z@}xednXt>G%BiMlUCi~lYwGXB!_HQ|Tu<><>am-m7(O^Vvg;u3`|{dwK`2tRWxiDh-SJUupkIViQs z-}a>FHRkJk3Yr|=PA6=fvRD(`b7F8g<%3D$_6r;DH(3?*cZo(vJIbzd{KplZp>Un~ zHfQpsXM4NOy%$yIn*y#Ii~ATTD}>us^R5njXeO}N?siq3lR){4k9`qOu4fN0tJhek z^&6;9%4}1BA)xRFnrRkU+ih>OTSd>yD521ocUEs5$J#4#rGJhn%T9(kr4I&jYTkqQ zY)-BGy4s$-{c_jZQ{G{!kL5mVEg5B{IX=Jh^isXU4&@C$-Q*PJ4{-#}IZh6W&X3*j zXO;8Pu3%oU6|>adZ8q086=oHimFmh&c%Bw~9D2!K&@$n`RVqjS zh+)4<$ErM`W#qmN72iLyxiIU!-9|WXX7R0JyH@#@eK{7IQ*I<2Ah7I1iQ8%lZ{(@0 zya}bjF7bQZx*-?d);|BZGP#{jfyJaTrHm!aTcl;>TEA0ktOj2{{&D>I-Njb+lGR%x zHLzO`3OvHq^08T)&flrhUYDwNU(pdZjrr*HjXF-eQVBY7lC~c28t?E$?r(|R()Rd< zJY2cJfo)|rH2zr}PZRog3TjQe+#8d=Keefhi-xV1|43C^f^Ls*Ub%m+6w0GT8v4C&qu1TtNYn#`m)V#F&^p(q4Y(EBc(k@A>eZ6aQ zO5oxCcV<$>)7%yJJ>K-&rznaJN^Obc_EKk-S!{_lEA9`Lv}3PwJE9peXJKRIw}*k| zy=kULb)?>;udu>g zMSRoQEc!Z~@|?W<1-@xlYj35SE%+L@Z&dzy&X=nTx*bkgNf7h8a(Uzz`nnVirKD>A z@J<}|-bwfA|<%(Ly*kNaVQtJ8W-U z6YuS<;S=@Y%3=84Zv79DbbZn?>z?dmdD6p8f9}*C@it5OyScOrg<@=5!nRav?;pIM z`!)WcfU-ne;{C+!wlb8LN$OXR#Fq{IIDSYZU&MPgh5xuOn}+ZqxNfUiM;`uD8O1(V zZ!_^f;aCzGziY!$_c}1_JjVpBnql58|97z~91{mwQXfiX_QecI_EsIao&LZ?cPP&J zB(v3^{FCGctD?quDIA7_jdk^VqV{m&bk;9w+14u|nCSexf?4s9ddAxKU&8`Bnr8NY zonpOgb7|Kw)!md1Su>5jB5qz(;bUo!QuG@>v8?^c^9!b<_3oJoX*I{y4cD%S#Q0Ta zxry1B9X8*~r_$meryoqc-h)+O-q`e zZRRCEH7Y+1W<4%D7FEOqnF*_{V&KV^A2up$5P*XRc>JLK{Caqu}aW%bs|EDU%J zQGv5kw)YjQ?VTLCT7=p6a|z}%R$czM`Ge$Ds?+ozBH6ARGz>^m?Zk%PYOR`T0DNeoR#szweA;b{|hm)NmpUgO8SIDG888r&}DCpXzI zsk>%myfbh-@NG-kxogdm3@KaG4sVTriD`7o$`h;HZ?Cu@a!zhoK3 zjp_@H8G|eujQgA4eo9Y^7iJD-z&tYYz@~qGQ(2jp=ATyk>==%-=P?4DiOv$_>m}6bKhNpuj+fYqXi6h33^*gw1Yl(gMNuR$$>sw>?|E z^7^sxTed`Ic=yR0p&RsSKN_$?uK|$(tGfc#h5HYOSRa8K0>Z-6ZKxEiaq%kn=T}m_ ze*u{Uz4Ichzprnzv@|Cu=K5zq*}kAYmCVAiEgBJT{aw`>Mjqc>oVu9?1u^lO0_epp zWpWxlsIA30&=Q$~#6+IuK&GL&Zx`TN)W>&B#Nk25bb`S|PpCZZC98FD$iTsuK zN~H9ZM2qd++`X9{did@9v5XGw*iZ+np3_CMJ}tK2Tt?0v?aW=Zo@!Ox-i?eO&WWPO zdX9d2i&Rm^YK1jxn3;R-qYX>O_*)(yvM%qo8cWtf+6Slxkf~u+^wDit6Ey2}l!`X` z*WUX-++j>L8NzpjVqC_{4;`L&c@GlQ$d;eu>r&sf8vXclLj2Dio`srxN#)8uJG6X8 zd1!52-4(EK42+EN&z`M?`ax5Gr=wNyz2g72o=REmBUBtG zQ1^5lowm@HL22U)oJAj0tzd3|QCkM40^y^`h_>iUo!c*a6|}DL zdRi&7Wvh%#N5A+AACr3h+J;sy{=Yv|xpy08fZ#uMXP6r!R{q&RR*Z=Ib8PouiUT>0 zA)AdMHk&^y!dBbR-~+@lHuotYED8lk+`4Ay{L4)DY!(t?ME?g*tA-k{MF(Wz?jZlC z+jrBX7Z-D(sYpYcI8HejIu~>euKV=KpR`%qq4Q*=-Kq_wSs5FH@AmwFpdb}AFuL2$ z#;^h^MPq=}n~xRN+vX?c<*}lU6Pp74&%3HBB^MW$tSIpd+8b zTdfIjLDW4P)D700`}rd7`W4KU8~pL(E!u|Mgc3`7vR27(7*b{w=7Fk5e`lGV@@H5> zz`!o3lU~>;FRTnr(ra|zjv$Xe0P*c}yR zQ)gH8$3mt>`kkK3ZnY}VNqd7nBxsx3%+6DkoV;A{o@L#MJ@jAqp0a*hvW@hd{fw6E zp|)1pt>iIaIbOegyT_Z`r{?CHn|R)nn80xNaB@vd2^wMn*r3SU*a)FrOp?>llyz8$ z+CfLOPmRp}^-&kX{DUYJXnBT00fl%?W7P2*R%LD&3(iOXgxFGVN<&c?e#W=FhZu+X zjvUuyG<{OJ&3R?hN@5itgoX_uCld@{58yO(p3*DzTnN0qgn(1Iyx)R3cycDf8Wdty%+F!YtTv?6GpIcj!sUl#V1ec>u*{~4crFg zoGzuKvGMixx(Yp1C|=_ZgSJj7Rr?Gy*xtRa%WI)1!ca$FtyE={G`Gm&Qd7DoQj*am$DqWW9XK(0-$KXjXdXwOtTmV$ z-CKT4Bo$%(U%wjTL+VS&WJb(Nqr9}tC5xe;th~$?!!jgY zPF&%ej;wU$ar;pT#dYGthv(i;Pb-E-L}k3K3s*$!rj0D(dNWA=t`-n6p5JU2Ug9SD${iz&6h1F`PCD9n>RZW!bKQ#I3z ziIK4f#lTmw38tpJz~k_MSFkpXEiJw1*S*EN&M&9>9Gt3MfdL*|U(9EBpP{Jas8WrL z;MB3(^m9_AMTICLIN#DEzO}5l8#bbwlBsH zQWAZRN@o}r(^Jq6XB)gLRp4#6uA)m9-t~PTV>7fgN)9KNL32Q5+-7#0wFvV1`61oX z$g%#k^TW9NWw;CR+Jf?X;=$!216ptuw!$w1 zDzBeI#~au)*hJN;w|m$aVD;G8*uuwN@vo#tXC11*Z?e;W;slME)<%aC&4eb);>D4{ z1^Qg>#>z+9g4@qu+G#}fb84u5mopkhyu$p?8@NQohC-o)&J+h797Mq;U&N$|L(`;> z4?2w`GNaiNs4TmEoLV0rw~wrD8xB8WpV6we^X+tgRi7dT525E#E$$Q)UxV47MP0J8 zvexLNHCf4FsvklZ$ZpR-tG@1bRCM$$(8>VNj~IRRe&fnWV^&yWLeH?GcC&zt3>Ork z3YRbM|7eNK!si&$`vw#1&w*hlv}OUNpH@)Lc|h;=foEaLZ zb8-AXC2qdCiUq=xsM2Kp>9-C&(+jA~%`GjjA__t{f16w824a*a1_f);)KFPbk($y? zhB9Cnhlt_Z2a%O~6OYB@1fsCi9UZFidu7m}in-K=p4r_wCHvb(oWolqc0F&7|Yq6xMF8Ad}(i*D7-8#eS$X{sJM5_)iA_3G7IHgA44yloN+F+7n88mK~6wC+7lEpGdbi-Xo`~zebLG?5o3VJ7!=I2>K)regbi8=n4|816^n1q3tI3fH`E?8S%gA+QK zsDPskNAj$y?`oa--MnnQo%NKA@lmDgiccT?OgL{}JtO-7ZG6_iKazCe&6(g8<45_o zZKEakJChThk?fmJ8s?aC7Mc_9PmqARX##X0Jbnm{XnCr$+ zfLCK6&4yN_+mMu#Gz77*r6Wy z)=!vUf=^m;zv{ZL?~2s5LH+%XLC~%-tX};E*9GqH-oYthQ~ONzF28lCMcuT2KL_q2 zvK@>yD8Ji2ih*0ibHITjAwxN!iFg#z5aVh=#1-0m_HD33SEcLf(52nptB;|P6q!bg zq^*X%olKiUtf9zqAeJgGC8Hl=zuMYbZ=5JQTTZ6dpj1U$MT-NVWlfFBg$u%HH5-I*mx?WYABpB3V5IcB^u$>r5=!#TWy2KWb<<*SO%x%12+ zqLgZEYTCSGN0n6qlM(87#?U#33~|L?X{k0qoc!6oN(cj*s|>_k75??gbk0T5b*rl1 zzkEqSBgwcXOAIKIHdF6}svQ11DJ4ZiKv%gFzLQkYuB1jkg|#6CX^tKkPJt8#rWOY@ zV$UOXZtjB+J|KNd3JBppyC;I=ZZk782ShpI{T^7oosRcHVwebaNEORdOIG}k`QnwoIpzNb;PQXsBNWzuU$Lfc{$k6kDHKbA8rPA_z2+}4^NB`XSpm1|Iyxw^Ty%FP&JQpWoY10{3UGMK4n;+>aY3*JlD^#UsPcS` zsSh^pQ)xyAR8{E+$j~UYh2HGL75)U*QT&q-l3G7955}+x{YS=855WY_@*1Y#57U{D zK;1R}O=3LX>vz6v(3Hl~q{eg1P$D;sWZlnE+LH4FYSIdXNSkhKL2Wci56FD>78|4U z=eLmoLC}KJ;$6xS{rQvj!@sA<;$r@RFnH)|M3{oHTGZd2e+TB1QthYs0D~fDMk2vZ z8lJ$=8B$8!VB6w8iMfhgw+hAaa5zkPw^+0Zo;QxGqG zzDSG66xmlWW`+9X2Asa`B((dBvPBQn74EBSb z&Oc!#LKfH*6Jz6{_q>Q85JoheO;POa_jUDOG?aLQ7nBD(|{qH9S?_^3TQt7GHG~*9m9^#PL@Xoj46o zg1i%v2<5}*fB!Yes4;&Pu0Jb^+F0z++$$zeZ*qO0%qBkDbGFI|?FZJ)U;raCa2^w$ zWG%WsQvpdMrdjEXZR-zw%xmeTOL|ze;7&C2uwMY)Xu_9TLZ)f!z7Q&a^#R7+L4zNc zmbMCL4qWWY!~1c5pN2YDPf#fAePl*}*ODhXt9DsGO(Yrn2y5knN`FW{MEV$R z5Z_0FY!qK`fkPm9G4>u(N`II)g~U2z6b?MgpPH%gnpZ*Ldji5*7=#%Nx1ptw@l)rV zJiguN??k$#75)Dd_od-fu5bH~xs7eeA|Yc+*-B9)L$ngofY=#Age94hS%?g~5Y1(l z;YVdrgv^9WhG;TmEW^&UND1+t&;IW(|8MV?_kEAUCzf@r^*r};-`91X=XIV#XxhkN zDbgnF!_zs&KMxA;BR+{Bi+^x0b^!yA4R{3kj=Ka5SIWZ=lw7sg9 z(;g^O0f31m4x2Z|Ta%-Mcb!rIyj{W<`S*!uE&rrho-ZPuA-NZVDqJN<0J+hbVNx0J z4$@Z7G&Y@eaoO+SAWP=0Ve_{3T|zTNu1YK=kUl2tx>eYz(t%qPlGPp!o)sWnC9SU?51J0_ z2b6`7%9e+5sR;>EE*^FyR9N=q*80@#D8nH&4(=D4NqH_qdHwH6LGp539mo?3Cr@v3 zJ$>@+2fjwLLU1zq>|p2nsRWjQjT?NKMSRubJ9?d4$uP!r8>@fyR3r5r;1x2~$bBYR z(H6!$FKq6htm3i;&Id3lJ~2`LYtGk(JXlI2n-L^{$;hjYd4)!oGGQBmH&*ul5QCuO zHX9>r6@0`0ZTf>Qa=?wo%42~AIJ&Y!A7Mc-d(5F00tM55Q z53qCYah>#I@TO$%q*A2}CWHZNi@qXa3#K;{860d@6=pRZ zM_(_ojw!4%t)p3S`pDFax74pWO37)q%lR|?;aW*ZI)2X^iZ&HiaO zq49$ExO7H?%Y>8qFkH(ROy3svbvyAEIdSyWP|i-oN=kEXSbm-J)9&ma>W{Q9rK~#e zDz|VfOUg=fDlGTr{Ip$W4eJ!4j@63ZA$dNXmU+8@E&uYrvyK1qzW)<#$bWw^r*ZnQ zM9ZCrDbN4_Yi0tO#QZP=af-JrT7Vk|oFCE(3;99+kQ`xibNxEVacxyx!^o6xIC;F+ z#C}57^~`Ujr8A5`cFWOFtOBfIBH)dvY=p8y#Pa?Mj4n@4}y(ha>#o~S&=k{uFE2%%dv*l$O@Hc=P z>F>@kZqkDsv{~CaO)V@q!)poR<5O45c+36DKZH$KIRev0+Xa4Fs3*`HEWLLxf0aE{ zkhq_sOhT|OE-b`D>q-%TD&!QxfQPCF(r|hadU|~dCBjlQ5ef?gdsJ!yPYZh{{ota> zL||@wVZupk@2NznyVD;&dH9MdCMMv8|JYs%y4Rxum(X^JI?b@QAlP$c0d#$_7p6dwQp)fW@)J~ zL8fnm%Hb&6MfGyGNfBxj{ClQcL=>*LwFUdReXi>;BhO_#069UQovtPmf>!_%48}+4GH|2FzoiiK9J?w_`|W>Y8#oE zie6&g!VRnG=yX+ z{(U6CavaK1d-wKCk1A~4dM#`e$R-&ai`iWgM>I7RL~>Cm%*v`$*AXj-c*S}m*;kZC zCraEl;1Fv^<%Qt+Gyp8{A|T_8;qDoJP~0DPiihLfy&pu-rheDqS#rceASJ@Yjq&TZKRx%%b z)H%oqQn;MIXGY?-g6i9ibjrrVyeu@Wa+yQnbo?>SaF?>dbd7)ewjtV;4NaEjxBk+B zh4|eYRRu8Ja{h^+HxI-Xs*3Tz_OW)F34^2!D2|wkHN3n{m_v=j6>z>_Z7mMKDU2); z`3|hEu)+mKifx1pbw@Xm<&9PXymTGhe^^lk!D)eP=dmK$20nF)f#*S8WIj4IKF*|Q z@#Qm_LRev)h%Ore$Ak4z=8?VKvlR$gdR3J;QGlQpxtoTpS?%YaeY&{%r*rM- ztuyh0dlog%<+M<4n=O_%hl3!7*xKvVzDg;v&%UCKYI+dd75fRIP2O*@O8W|5)Aolu%J_b}%Lg zXiiH@BOr<(p;!zVpHdbv0`&#Lm9Bg>7rXfYs?*0kMXo)&>D&2~;J)e%|7YOmgW!vj z<{8mKd7G|t9ZeSg6;l>sE-Y>#9;tCxgzBPuKOu}&kkf}cU>OmxT-X;G;uH{NqZs-< z{L}g~%S{S>ybbyMDm=To7_S_-T7CD1zulSfv*Gm4bQ~Tvw5!t#gg=B8WN+Vfwh>`C zBtBD}9C-Fje@3QuS}6<4~z>9Bu_YXZ330zWdD0FTB^e#9)C%~qw75tziMHnpvgzApsp(^r0iu2RB~lhL z1I-VLOYyCqX8$MMjCdKqR`v8q6s3}xw?ailFjPp1y**fQ#naOD{9xJDD2BDtTwHXc zTF6SpTN$<8@pBL;Xdp*~`AJs{7FjiWdy4i2gRHf9co;pNIZ(R{V?0B9S#YC}&xPdj-dc$>Lk z&hx>xgZI0~>QY5r{k~ilj16BdyF}VX{}Z`h1Z!(SN+Zr5lBfat0hl-b&YiK_UV+TM z$wx+S55Fu1R)LOp;BBr6sI^8AA|UKx?-vUnqR*c{54^W@zj-e8mx88daECW68ja5! z4h&o>Vy0DE^Hy3E7V?tf8iF-Q7F#Ua; zzs~W=AR2rVw`repBLr`^U6}F;-c#)qf44=bV&^rS(shuUfGs`-SQW4}82eLxe!}Q+ zY0l2INHv=-=@M?bm7AD1aS|Sh-}+@_WPS9nF`_+f-L*E}B zolDht&BGs+IJsb2#+I}9#ETjUTy6cU4YAY7O2dJpul>#>^Vpa_YWQ9M{%sY*Edx&t ze|KwsJK)q)&nOnC_sh9hoVKM1y^PV~bZ)@@i*L?zm4AwZ{-c_$J;k=er0r*bD+w=b z1Qn&fstGn7)}a@$4+hQDas+dw2?z*);6;ny-ruh^?qly_78Mck^Gol=fpcY0Lnw)&NK7Hy=Jk;gdQ?mK6$a&EA_3 z4PGYiM)ol?v)$vT6|UcHDT6~bE;OHzP$bBI+q%U>w`aeRmJ#{+kw6PU=-Hf$01-|? z0XWyNQ6GMG67JXE`sen@lHuyczfq4Q=_qeiG9DLHzd{&1OJ11XD!+n(Obs52?m4FO zrCo7t8^oTEl(5hAzcb_RHm{4*AtSW1-iD4FmROxQA!k|-Bh{O?nwpxxQ2y$h*5_D1 zjd#|(O}DAG&RaAxGaFG_;|3Gg>`HO>-J{4zs|Un`t?+N9Y0(Ac1}an#e{bY$$dTwg zlCykSGsU6@f-#(!A1}=#$zjnB^0;u+d0nG-3r&!m(Ut{} z%^kC-HN^IuWA$006(@pJB~g3QU8c<*QW^bRe!xY3lf@r0JA80-qmru^b+6dr9Iuw> z<&Fv+vuGJ|Lnzp6?J!(!ik$%c3Hn+}_SEbJYz`FrG#v>=gyp`c8JsW?dnL zVknrci_?+A=)EPvUbAfkwytF587h#&7yHh|bNIG{(8Hgp!M(m8FY#KMGo9V07-7%j zeYKRq>(o-~#{MP=t-m&Q4}zQ`gTyK2eK6`un!9@x1RuzF^Mufjg}_z3NHQC4C89Y; zlIx&sN;7+qrEd)Q5)@MJ)L%BowdU@&r9FD|JJ=%{jaEYso|mT;Ti^iz9VbWOM6pGm zb+>Q%)(f+-`uvmSWSM}y5(LEp3t9T?fA9`T?o>|vlfqQ#Fc1C0^=sGSLK?^NXv z>)by`xeOv8j<>0*sH_V?cy%o4t-D0>J-6XoREDSi^kKbgDJgMH;(^@Qd-+(k)k@?p zLy|}0>f-*N6PzX7^MP)e8e9O~_#zmtT3JQH81|~Eb_o~`u*x^i8I9_7zEeT)4TJ%3QYpkYaVLJ(O0kD{(JlC z(7Nh_8(> zKLVoKxgl(X?Wow$d9@uocZPjd`RRYOw$tOon5|o^E=#e+?-4qKf>DYQ;n6}5;Zgar zuZgBCjaED<>V!iJ*As)iWDkfS zEh2`;2g&m$@s@`m`4&Xm&bgk{5HoNPrUSgi(LzGx1&5Cu;Q>dr?$UcGT6JpC)$5Q- zh^pC}bYv|E0p}c>n0Std5!^PWNef}xg9=dUW6MT>JaJ$xBa*N+EjjE%Nf@z-M|$J` zJ{+a!Kq#zXw%aviRUGl+kk!XA4LvF~{Qw{9^9Z(bK}sI};yrv-pM|E)hngfl%Xg{r z6ty!U%NN2t#pq4aoKh(ZGJB;zDx@DPrhct(Ti)ToTcnd-V}IANS|x_2R&{UGZpM&G z2?K7w`qG=Vd_5&&B_NlLv*E3IYhJDyXIN-kw%Xu%5k`O|tA)Z=Zq+-x4__3x?;~R} zTDNLGQqyO+3)eq`Z{r%~?~cqoqiceDgd-iF)GUNEZ`GaD4YKb}xbo(8tpWLE)T5j;nYT=t0=R)w7);W$JoMr4-d^Zi)vW#Dz z=aJ4hU`RQD!gvc0`e!)P0Zb=1eJN~Y~kv7z6RG;+nc)103+HcF;!KQlbcXA_j|5i`k8Ibg(@ z()3+TDRfhaa8L8V_{HzNHQ)xMIW>mEootJqG<-Ry@0^(ur_SE4Y&jg5($pwz(jb+` z;9xA%M;qrqi~6sq`wd^Kj`?->bYALF3;}q~1-%b6i1r^!U}&@&%F2d_NcbAws@rj^ zjS^S57n}bUSNn Date: Wed, 7 Aug 2019 17:24:01 +0200 Subject: [PATCH 008/124] Amazfit Bip: Whitelist new firmware versions I tested --- .../devices/huami/amazfitbip/AmazfitBipFirmwareInfo.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipFirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipFirmwareInfo.java index 980e78cf3..02bc939d2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipFirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipFirmwareInfo.java @@ -107,6 +107,11 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { crcToVersion.put(60002, "1.1.5.04"); crcToVersion.put(5229, "1.1.5.12"); crcToVersion.put(32576, "1.1.5.16"); + crcToVersion.put(28893, "1.1.5.24"); + crcToVersion.put(61710, "1.1.5.56"); + + // Latin Firmware + crcToVersion.put(52828, "1.1.5.36 (Latin)"); // resources crcToVersion.put(12586, "0.0.8.74"); @@ -130,7 +135,9 @@ public class AmazfitBipFirmwareInfo extends HuamiFirmwareInfo { crcToVersion.put(23073, "0.1.1.45"); crcToVersion.put(59245, "1.0.2.00"); crcToVersion.put(20591, "1.1.2.05"); - crcToVersion.put(5341, "1.1.5.02-16"); + crcToVersion.put(5341, "1.1.5.02-24"); + crcToVersion.put(22662, "1.1.5.36"); + crcToVersion.put(24045, "1.1.5.56"); // gps crcToVersion.put(61520, "9367,8f79a91,0,0,"); From da59991aa590ba602a8bb3223c8e0fc9bff152a3 Mon Sep 17 00:00:00 2001 From: Konrad Iturbe Date: Sun, 4 Aug 2019 23:24:57 +0200 Subject: [PATCH 009/124] Use Rebble Store URI --- .../activities/appmanager/AbstractAppManagerFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java index fa6d97da4..d8bb0ad8a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java @@ -429,7 +429,7 @@ public abstract class AbstractAppManagerFragment extends Fragment { startActivity(startIntent); return true; case R.id.appmanager_app_openinstore: - String url = "https://pebble-appstore.romanport.com/" + ((selectedApp.getType() == GBDeviceApp.Type.WATCHFACE) ? "watchfaces" : "watchapps") + "/0/?query=" + selectedApp.getName(); + String url = "https://apps.rebble.io/en_US/search/" + ((selectedApp.getType() == GBDeviceApp.Type.WATCHFACE) ? "watchfaces" : "watchapps") + "/1/?native=true&?query=" + Uri.encode(selectedApp.getName()); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); From c243541c6e3881749b8a46369e5d8dcccb612b04 Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 11 Aug 2019 10:52:44 +0200 Subject: [PATCH 010/124] Add dedicated charts section into Settings --- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index feb1c6dd4..76f10ad5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,6 +71,7 @@ Reconnect automatically Preferred Audioplayer Default + Charts Settings Enable left/right swipe in the charts activity Date and Time Sync time diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 03f4e8552..1d057873f 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -157,6 +157,9 @@ android:maxLength="3" android:title="@string/activity_prefs_activetime_minutes" /> + + From f11628b42be89a419fd9fa9e0ffe2043cb7440c8 Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 11 Aug 2019 00:57:07 +0200 Subject: [PATCH 011/124] Add Averages to Charts --- .../charts/AbstractWeekChartFragment.java | 22 ++++++++++++++++++- app/src/main/res/values/strings.xml | 1 + 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index 34bebe755..f376b7625 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -130,7 +130,27 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { barChart.getAxisLeft().removeAllLimitLines(); barChart.getAxisLeft().addLimitLine(target); - return new WeekChartsData(barData, new PreformattedXIndexLabelFormatter(labels), getBalanceMessage(balance, mTargetValue)); + float average = 0; + if (TOTAL_DAYS > 0) { + average = Math.abs(balance / TOTAL_DAYS); + } + LimitLine average_line = new LimitLine(average); + average_line.setLabel(getString(R.string.average, average)); + + if (average > (mTargetValue)) { + average_line.setLineColor(Color.GREEN); + average_line.setTextColor(Color.GREEN); + } + else { + average_line.setLineColor(Color.RED); + average_line.setTextColor(Color.RED); + } + if (average > 0) { + barChart.getAxisLeft().addLimitLine(average_line); + } + + + return new WeekChartsData(barData, new PreformattedXIndexLabelFormatter(labels), getBalanceMessage(balance, mTargetValue)); } private DayData refreshDayPie(DBHandler db, Calendar day, GBDevice device) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 76f10ad5d..e9dfb49af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -417,6 +417,7 @@ Steps today, target: %1$s Lack of steps: %1$d Overstep: %1$d + Average: %1$.0f Do not ACK activity data transfer If the activity data are not acked to the band, they will not be cleared. Useful if GB is used together with other apps. Will keep activity data on the Mi Band even after synchronization. Useful if GB is used together with other apps. From 7809655ef443210c3d5516084a3e583f706541cc Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 11 Aug 2019 12:00:00 +0200 Subject: [PATCH 012/124] Add Average Settings. Addformat method to get average. --- .../activities/charts/AbstractWeekChartFragment.java | 10 +++++++--- .../activities/charts/WeekSleepChartFragment.java | 7 +++++++ .../activities/charts/WeekStepsChartFragment.java | 5 +++++ app/src/main/res/values/strings.xml | 3 ++- app/src/main/res/xml/preferences.xml | 6 ++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index f376b7625..a50dcdbab 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -48,6 +48,7 @@ import java.util.Calendar; import java.util.List; import java.util.Locale; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; @@ -135,7 +136,7 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { average = Math.abs(balance / TOTAL_DAYS); } LimitLine average_line = new LimitLine(average); - average_line.setLabel(getString(R.string.average, average)); + average_line.setLabel(getString(R.string.average, getAverage(average))); if (average > (mTargetValue)) { average_line.setLineColor(Color.GREEN); @@ -146,10 +147,11 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { average_line.setTextColor(Color.RED); } if (average > 0) { - barChart.getAxisLeft().addLimitLine(average_line); + if (GBApplication.getPrefs().getBoolean("charts_show_average", true)) { + barChart.getAxisLeft().addLimitLine(average_line); + } } - return new WeekChartsData(barData, new PreformattedXIndexLabelFormatter(labels), getBalanceMessage(balance, mTargetValue)); } @@ -335,6 +337,8 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { return amounts; } + abstract String getAverage(float value); + abstract int getGoal(); abstract int getOffsetHours(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index 936bcc27a..d13a0b492 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -167,4 +167,11 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { private String getHM(long value) { return DateTimeUtils.formatDurationHoursMinutes(value, TimeUnit.MINUTES); } + + @Override + String getAverage(float value) { + //return String.format("%.0f", value); + return getHM((long)value); + } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java index 35ef4ee40..8dccc1a26 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java @@ -113,4 +113,9 @@ public class WeekStepsChartFragment extends AbstractWeekChartFragment { } else return getString(R.string.no_data); } + + @Override + String getAverage(float value) { + return String.format("%.0f", value); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9dfb49af..1dbdca832 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,6 +73,7 @@ Default Charts Settings Enable left/right swipe in the charts activity + Show averages in the charts Date and Time Sync time Sync time to Gadgetbridge device when connecting, and when time or time zone changes on Android device @@ -417,7 +418,7 @@ Steps today, target: %1$s Lack of steps: %1$d Overstep: %1$d - Average: %1$.0f + Average: %1$s Do not ACK activity data transfer If the activity data are not acked to the band, they will not be cleared. Useful if GB is used together with other apps. Will keep activity data on the Mi Band even after synchronization. Useful if GB is used together with other apps. diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1d057873f..a07f53dcc 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -183,6 +183,12 @@ android:defaultValue="true" android:key="charts_allow_swipe" android:title="@string/pref_title_charts_swipe" /> + + Date: Sun, 11 Aug 2019 12:53:22 +0200 Subject: [PATCH 013/124] Clean commented code --- .../gadgetbridge/activities/charts/WeekSleepChartFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index d13a0b492..331d3a3a6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -170,7 +170,6 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { @Override String getAverage(float value) { - //return String.format("%.0f", value); return getHM((long)value); } From 3017742cbacb61b6a50aeb730c3141d831a6431f Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 11 Aug 2019 23:15:56 +0200 Subject: [PATCH 014/124] Added type to intent when sharing --- .../nodomain/freeyourgadget/gadgetbridge/util/AndroidUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/AndroidUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/AndroidUtils.java index b5cbf9665..034f51f10 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/AndroidUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/AndroidUtils.java @@ -224,7 +224,7 @@ public class AndroidUtils { Uri contentUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".screenshot_provider", file); intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setData(contentUri); + intent.setDataAndType(contentUri,"application/gpx+xml"); context.startActivity(intent); } } From 0c35eec2f757c0166942eb3937ea8f8bdd72c8e1 Mon Sep 17 00:00:00 2001 From: Richard Finegold Date: Wed, 31 Jul 2019 12:41:37 -0700 Subject: [PATCH 015/124] Fix firmware spelling in CHANGELOG.md Fix spelling in fastlane metadata changelog Fix spelling in res/xml/changelog_master.xml --- CHANGELOG.md | 2 +- app/src/main/res/xml/changelog_master.xml | 2 +- fastlane/metadata/android/en-US/changelogs/154.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffc750ff5..01b1208a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### Changelog #### Version 0.35.2 -* Mi Band 1/2: Crash when updating firemare while phone is set to Spanish +* Mi Band 1/2: Crash when updating firmware while phone is set to Spanish * Mi Band 4: Enable music info support (displays now on the band) * Mi Band 4: Support setting date format (for built-in watchfaces) * Amazfit Cor 2: Try to fix empty menu on device diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index b509528d1..bb136ae81 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,7 +1,7 @@ - Mi Band 1/2: Crash when updating firemare while phone is set to Spanish + Mi Band 1/2: Crash when updating firmware while phone is set to Spanish Mi Band 4: Enable music info support (displays now on the band) Mi Band 4: Support setting date format (for built-in watchfaces) Amazfit Cor 2: Try to fix empty menu on device diff --git a/fastlane/metadata/android/en-US/changelogs/154.txt b/fastlane/metadata/android/en-US/changelogs/154.txt index 5307fc835..c78886996 100644 --- a/fastlane/metadata/android/en-US/changelogs/154.txt +++ b/fastlane/metadata/android/en-US/changelogs/154.txt @@ -1,5 +1,5 @@ #### Version 0.35.2 -* Mi Band 1/2: Crash when updating firemare while phone is set to Spanish +* Mi Band 1/2: Crash when updating firmware while phone is set to Spanish * Mi Band 4: Enable music info support (displays now on the band) * Mi Band 4: Support setting date format (for built-in watchfaces) * Amazfit Cor 2: Try to fix empty menu on device From 2a2bc7257f04925c1b12c23b4cec5d65b6e799e0 Mon Sep 17 00:00:00 2001 From: Giuseppe Date: Tue, 6 Aug 2019 08:15:55 +0000 Subject: [PATCH 016/124] Translated using Weblate (Italian) Currently translated at 100.0% (671 of 671 strings) Translation: Freeyourgadget/Gadgetbridge Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/it/ --- app/src/main/res/values-it/strings.xml | 59 +++++++++++++++++++------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 77b177f8a..5e90eb3dc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -45,12 +45,12 @@ Calendari ignorati Installazione FW/App - Il firmware %s verrà installato al posto di quello attualmente sulla Mi Band. + Stai per installare il firmware %s. Stai per installare i firmware %1$s e %2$s al posto di quelli al momento sulla tua Mi Band. Questo firmware è stato testato ed è compatibile con Gadgetbridge. Questo firmware non è stato testato e potrebbe non essere compatibile con Gadgetbridge. \n -\nNON è consigliato installarlo sulla Mi Band! +\nNON è consigliato installarlo sulla tua Mi Band! Se si procede e tutto continua a funzionare ti invitiamo a contattare gli sviluppatori e dire loro di aggiungere il firmware %s all\'elenco di quelli compatibili. Impostazioni @@ -312,7 +312,7 @@ Notifica raggiungimento obbiettivi La band vibrerà una volta raggiunto l\'obbiettivo passi giornalieri Elementi mostrati - Scelta elementi da mostrare sullo schermo della band + Scegli gli elementi da mostrare sullo schermo della band Attiva il display quando sollevato Rotazione polso per cambiare vista Non disturbare @@ -339,7 +339,7 @@ Versione Hardware: %1$s Versione Firmware: %1$s Errore durante la creazione della directory per i file di log: %1$s - "HR: " + "Battito Cardiaco: " Aggiornamento firmware in corso Firmware non inviato Battito cardiaco @@ -406,7 +406,7 @@ \nPROCEDI A TUO RISCHIO E PERICOLO! Si sta per installare il firmware %s sul Amazfit Cor. \n -\nSi prega di installare prima il file .fw e successivamente il file .res. Il tuo smartwatch si riavvierà dopo l\'installazione del file .fw. +\nSi prega di installare prima il file .fw e successivamente il file .res. La tua band si riavvierà dopo l\'installazione del file .fw. \n \nNOTA: Non è necessario installare il file .res se risulta essere uguale a quello precedentemente installato. \n @@ -432,7 +432,7 @@ ogni 10 minuti ogni 30 minuti ogni ora - Esportazione del database fallita! Si prega di controllare le impostazioni. + Esportazione del database fallita! Per favore controlla le impostazioni. Azioni tasto Specifica le azioni alla pressione del pulsante del Mi Band 2 Conteggio pressione tasto @@ -492,15 +492,15 @@ Consenti le notifiche da tutte le applicazioni Si sta per installare il firmware %s sul Mi Band 3. \n -\nSi prega di installare prima il file .fw e successivamente il file .res. Il tuo Miband si riavvierà dopo l\'installazione del file .fw. +\nSi prega di installare prima il file .fw e successivamente il file .res. La Miband3 si riavvierà dopo l\'installazione del file .fw. \n \nNOTA: Non è necessario installare il file .res se risulta essere uguale a quello precedentemente installato. -\n -\nNON TESTATO, POTREBBE DANNEGGIARE IL DISPOSITIVO IN MANIERA IRREVERSIBILE, PROCEDI A TUO RISCHIO E PERICOLO! +\n +\nPROCEDI A TUO RISCHIO E PERICOLO! Modalità GATT client Sperimentale, compatibile solo con Pebble 2, attivare solo in caso di problemi di connettività "Recupero automatico dati delle attività" - Il recupero avviene quando lo schermo viene sbloccato. Funziona solo se è attivata una modalità di blocco! + Sincronizza i dati quando lo schermo viene sbloccato. Funziona solo se è attivata una modalità di blocco! Traccia delle tua attività Non misurato Attività @@ -609,7 +609,7 @@ Sonno extra: %1$s Passi mancanti: %1$d Passi eccedenti: %1$d - Confermare il ripristino delle impostazioni di fabbrica\? + Vuoi ripristinare alle impostazioni di fabbrica\? Effettuare il ripristino delle impostazioni di fabbrica cancellerà tutti i dati presenti sul dispositivo connesso (se supportato). I dispositivi Xiaomi/Huami cambieranno anche il proprio MAC Address Bluetooth, in modo da risultare dispositivi nuovi per Gadgetbrige. Casio GB-6900 Filtro Notifiche @@ -627,9 +627,9 @@ Salva Configurazione Non connesso, sveglia non impostata. Esercizio - Impostazioni frequenza cardiaca + Impostazioni Battito cardiaco Durata schermo acceso in secondi - L\'orologio mostrerà un avviso se la frequenza cardiaca supererà i limiti. + L\'orologio ti avviserà quando la frequenza del tuo battito cardiaco supererà il limite. Frequenza cardiaca massima Frequenza cardiaca minima Ruota il polso per attivare o disattivare il display. @@ -650,7 +650,7 @@ Impostazioni ZeTime Avviso frequenza cardiaca Abilita l\'avviso per la frequenza cardiaca - Modalità analogica + Analogico Solo mani Mani e passi Registrazione attività @@ -673,7 +673,7 @@ Vibrazione e beep singoli Impostazioni specifiche del dispositivo Chiave di autenticazione - Cambia la chiave di autenticazione on una chiave comune a tutti i tuoi dispositivi Android dai quali vuoi connetterti. La chiave predefinita precedente per tutti i dispositivi è 0123456789@ABCDE + Cambia la chiave di autenticazione con una chiave comune a tutti i tuoi dispositivi Android dai quali vuoi connetterti. La chiave predefinita precedente per tutti i dispositivi è 0123456789@ABCDE Notifica chiamata persa Notifica calendario Notifica inattività @@ -687,4 +687,33 @@ Obiettivo giornaliero: tempo di attività in minuti Mi Scale 2 BFH-16 + Stai per installare il firmware %s sul tuo Amazfit Cor 2. +\n +\nAssicurati di installare il file .fw e successivamente il file .res. L\' Amazfit Cor 2 si riavvierà dopo aver installato il file .fw. +\n +\nNota: non è necessario installare .res se è esattamente lo stesso di quello precedentemente installato. +\n +\nPROCEDI A TUO RISCHIO! +\n +\nNON COMPLETAMENTE TESTATO, PROBABILMENTE DOVRAI FLASHARE IL FIRMWARE BEATS_W SE IL NOME DEL TUO DISPOSITIVO è \"Amazfit Band 2\" + Olandese + Turco + Ucraino + Arabo + Indonesiano + Tailandese + Vietnamita + Portoghese + Amazfit Cor 2 + Mi Band 4 + Si sta per installare il firmware %s sul Mi Band 4. +\n +\nSi prega di installare prima il file .fw e successivamente il file .res. La Mi Band 4 si riavvierà dopo l\'installazione del file .fw. +\n +\nNOTA: Non è necessario installare il file .res se risulta essere uguale a quello precedentemente installato. +\n +\nPROCEDI A TUO RISCHIO E PERICOLO! + Imposta allarme frequenza cardiaca durante l\'attività sportiva + Limite inferiore + Limite Superiore \ No newline at end of file From f68485e6f00ebde3ee17b9ede9dceeff8f28170a Mon Sep 17 00:00:00 2001 From: vanous Date: Mon, 12 Aug 2019 23:05:55 +0200 Subject: [PATCH 017/124] Add Preferences and strins. Format Preferences. --- app/src/main/res/values/strings.xml | 14 +++++++++++--- app/src/main/res/xml/preferences.xml | 12 ++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1dbdca832..bf1c2d936 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,9 +71,6 @@ Reconnect automatically Preferred Audioplayer Default - Charts Settings - Enable left/right swipe in the charts activity - Show averages in the charts Date and Time Sync time Sync time to Gadgetbridge device when connecting, and when time or time zone changes on Android device @@ -509,9 +506,20 @@ Gender Height in cm Weight in kg + + + Charts Settings + Enable left/right swipe in the charts activity + Show averages in the charts Chart settings Max heart rate Min heart rate + Charts Range + Charts range is set to a Month + Charts range is set to a Week + Steps per month + Sleep per month + Authenticating Authentication required Zzz diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index a07f53dcc..10e0b6d29 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -157,8 +157,8 @@ android:maxLength="3" android:title="@string/activity_prefs_activetime_minutes" /> - - + + + From 28fde846ead8f15f43d2a35f215e67a3ed2bfa1f Mon Sep 17 00:00:00 2001 From: vanous Date: Mon, 12 Aug 2019 23:08:17 +0200 Subject: [PATCH 018/124] Modify getTitle(). Probably not visible, but done for completness. --- .../activities/charts/WeekSleepChartFragment.java | 7 ++++++- .../activities/charts/WeekStepsChartFragment.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index 331d3a3a6..04ed240a6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -40,7 +40,12 @@ import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; public class WeekSleepChartFragment extends AbstractWeekChartFragment { @Override public String getTitle() { - return getString(R.string.weeksleepchart_sleep_a_week); + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + return getString(R.string.weeksleepchart_sleep_a_month); + } + else{ + return getString(R.string.weeksleepchart_sleep_a_week); + } } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java index 8dccc1a26..24f02940d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java @@ -30,7 +30,12 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; public class WeekStepsChartFragment extends AbstractWeekChartFragment { @Override public String getTitle() { - return getString(R.string.weekstepschart_steps_a_week); + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + return getString(R.string.weekstepschart_steps_a_month); + } + else{ + return getString(R.string.weekstepschart_steps_a_week); + } } @Override From 80bd31d89493926a18ae94a06431b32aa210b84f Mon Sep 17 00:00:00 2001 From: vanous Date: Mon, 12 Aug 2019 23:16:38 +0200 Subject: [PATCH 019/124] Modify Charts Fragment's Titles --- .../activities/charts/ChartsActivity.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java index a85bced23..2f9a6c881 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java @@ -338,6 +338,24 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts return 5; } + private String getSleepTitle() { + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + return getString(R.string.weeksleepchart_sleep_a_month); + } + else{ + return getString(R.string.weeksleepchart_sleep_a_week); + } + } + + public String getStepsTitle() { + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + return getString(R.string.weekstepschart_steps_a_month); + } + else{ + return getString(R.string.weekstepschart_steps_a_week); + } + } + @Override public CharSequence getPageTitle(int position) { switch (position) { @@ -346,9 +364,9 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts case 1: return getString(R.string.sleepchart_your_sleep); case 2: - return getString(R.string.weeksleepchart_sleep_a_week); + return getSleepTitle(); case 3: - return getString(R.string.weekstepschart_steps_a_week); + return getStepsTitle(); case 4: return getString(R.string.stats_title); case 5: From a2630593170f0637eb2170a85467dd02a0cb78e8 Mon Sep 17 00:00:00 2001 From: vanous Date: Mon, 12 Aug 2019 23:18:20 +0200 Subject: [PATCH 020/124] Modify charts range based on settings. More/Less labels density. --- .../charts/AbstractWeekChartFragment.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index a50dcdbab..0af2e32f9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -59,7 +59,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.LimitedQueue; public abstract class AbstractWeekChartFragment extends AbstractChartFragment { protected static final Logger LOG = LoggerFactory.getLogger(AbstractWeekChartFragment.class); - protected final int TOTAL_DAYS = 7; + protected final int TOTAL_DAYS = getRangeDays(); private Locale mLocale; private int mTargetValue = 0; @@ -103,6 +103,17 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { // mBalanceView.setText(getBalanceMessage(balance)); } + private String getWeeksChartsLabel(Calendar day){ + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + //month, show day date + return String.valueOf(day.get(Calendar.DAY_OF_MONTH)); + } + else{ + //week, show short day name + return day.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, mLocale); + } + } + private WeekChartsData refreshWeekBeforeData(DBHandler db, BarChart barChart, Calendar day, GBDevice device) { day = (Calendar) day.clone(); // do not modify the caller's argument day.add(Calendar.DATE, -TOTAL_DAYS); @@ -115,7 +126,7 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { balance += calculateBalance(amounts); entries.add(new BarEntry(counter, getTotalsForActivityAmounts(amounts))); - labels.add(day.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, mLocale)); + labels.add(getWeeksChartsLabel(day)); day.add(Calendar.DATE, 1); } @@ -337,6 +348,14 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { return amounts; } + private int getRangeDays(){ + if (GBApplication.getPrefs().getBoolean("charts_range", true)) { + return 30;} + else{ + return 7; + } + } + abstract String getAverage(float value); abstract int getGoal(); From 404bdc471343c8b52f49dcc739a538c50d94305f Mon Sep 17 00:00:00 2001 From: vanous Date: Tue, 13 Aug 2019 12:24:41 +0200 Subject: [PATCH 021/124] Polish strings key to keep consistency with the project. --- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/preferences.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf1c2d936..a7eb31a4c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -514,7 +514,7 @@ Chart settings Max heart rate Min heart rate - Charts Range + Charts Range Charts range is set to a Month Charts range is set to a Week Steps per month diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 10e0b6d29..5422672a7 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -195,7 +195,7 @@ android:key="charts_range" android:summaryOff="@string/pref_charts_range_off" android:summaryOn="@string/pref_charts_range_on" - android:title="@string/pref_charts_range" /> + android:title="@string/pref_title_charts_range" /> Date: Tue, 13 Aug 2019 14:49:23 +0200 Subject: [PATCH 022/124] Put all chart preferences into a preference screen --- app/src/main/res/xml/preferences.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 5422672a7..7eb6e91b9 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -158,8 +158,6 @@ android:title="@string/activity_prefs_activetime_minutes" /> - @@ -177,7 +175,6 @@ android:maxLength="3" android:defaultValue="10" android:title="@string/activity_prefs_chart_min_heart_rate" /> - - + Date: Tue, 13 Aug 2019 15:07:31 +0200 Subject: [PATCH 023/124] update dependencies --- app/build.gradle | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ca37a2415..7121ef0c6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,8 +67,8 @@ dependencies { testImplementation "com.google.code.gson:gson:2.8.5" implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "androidx.appcompat:appcompat:1.0.2" - implementation "androidx.preference:preference:1.1.0-alpha05" + implementation "androidx.appcompat:appcompat:1.1.0-rc01" + implementation "androidx.preference:preference:1.1.0-rc01" implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.recyclerview:recyclerview:1.0.0" implementation "androidx.legacy:legacy-support-v4:1.0.0" diff --git a/build.gradle b/build.gradle index 61c5a196f..a7772d912 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.4.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From ff7886765f0fe925f19be7664eea5cd9df3f1e69 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 13 Aug 2019 22:04:52 +0200 Subject: [PATCH 024/124] Add Swimming to sport activity types, rename some AmazfitBip stuff to Huami (these were things introduced with the bip but working with other devices now also) --- ...Type.java => HuamiSportsActivityType.java} | 24 +++++++++++-------- .../huami/amazfitbip/AmazfitBipSupport.java | 8 ++----- .../FetchSportsSummaryOperation.java | 4 ++-- .../HuamiFetchDebugLogsOperation.java} | 13 +++++----- 4 files changed, 24 insertions(+), 25 deletions(-) rename app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/{amazfitbip/BipActivityType.java => HuamiSportsActivityType.java} (77%) rename app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/{amazfitbip/operations/AmazfitBipFetchLogsOperation.java => operations/HuamiFetchDebugLogsOperation.java} (89%) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/BipActivityType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSportsActivityType.java similarity index 77% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/BipActivityType.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSportsActivityType.java index f3ade44bb..bd08fd488 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/BipActivityType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSportsActivityType.java @@ -14,20 +14,20 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip; +package nodomain.freeyourgadget.gadgetbridge.service.devices.huami; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; -public enum BipActivityType { +public enum HuamiSportsActivityType { Outdoor(1), Treadmill(2), Walking(3), Cycling(4), - Exercise(5); - + Exercise(5), + Swimming(6); private final int code; - BipActivityType(final int code) { + HuamiSportsActivityType(final int code) { this.code = code; } @@ -43,20 +43,22 @@ public enum BipActivityType { return ActivityKind.TYPE_WALKING; case Exercise: return ActivityKind.TYPE_EXERCISE; + case Swimming: + return ActivityKind.TYPE_SWIMMING; } throw new RuntimeException("Not mapped activity kind for: " + this); } - public static BipActivityType fromCode(int bipCode) { - for (BipActivityType type : values()) { - if (type.code == bipCode) { + public static HuamiSportsActivityType fromCode(int huamiCode) { + for (HuamiSportsActivityType type : values()) { + if (type.code == huamiCode) { return type; } } - throw new RuntimeException("No matching BipActivityType for code: " + bipCode); + throw new RuntimeException("No matching HuamiSportsActivityType for code: " + huamiCode); } - public static BipActivityType fromActivityKind(int activityKind) { + public static HuamiSportsActivityType fromActivityKind(int activityKind) { switch (activityKind) { case ActivityKind.TYPE_RUNNING: return Outdoor; @@ -68,6 +70,8 @@ public enum BipActivityType { return Walking; case ActivityKind.TYPE_EXERCISE: return Exercise; + case ActivityKind.TYPE_SWIMMING: + return Swimming; } throw new RuntimeException("No matching activity activityKind: " + activityKind); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java index 967f48076..e67c6532e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/AmazfitBipSupport.java @@ -30,13 +30,11 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.Locale; import java.util.Set; import java.util.SimpleTimeZone; import java.util.UUID; import cyanogenmod.weather.util.WeatherUtils; -import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiService; @@ -44,7 +42,6 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiWeatherConditions import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipService; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; -import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; @@ -53,13 +50,12 @@ import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes; import nodomain.freeyourgadget.gadgetbridge.model.Weather; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; -import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.ConditionalWriteAction; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.AlertCategory; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.AlertNotificationProfile; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.NewAlert; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiIcon; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.operations.AmazfitBipFetchLogsOperation; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.HuamiFetchDebugLogsOperation; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.FetchActivityOperation; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.FetchSportsSummaryOperation; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.NotificationStrategy; @@ -442,7 +438,7 @@ public class AmazfitBipSupport extends HuamiSupport { } else if (dataTypes == RecordedDataTypes.TYPE_GPS_TRACKS) { new FetchSportsSummaryOperation(this).perform(); } else if (dataTypes == RecordedDataTypes.TYPE_DEBUGLOGS) { - new AmazfitBipFetchLogsOperation(this).perform(); + new HuamiFetchDebugLogsOperation(this).perform(); } else { LOG.warn("fetching multiple data types at once is not supported yet"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java index 537a4c774..a47cc445a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java @@ -44,7 +44,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.BipActivityType; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSportsActivityType; import nodomain.freeyourgadget.gadgetbridge.util.GB; /** @@ -170,7 +170,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { int activityKind = ActivityKind.TYPE_UNKNOWN; try { int rawKind = BLETypeConversions.toUnsigned(buffer.getShort()); - BipActivityType activityType = BipActivityType.fromCode(rawKind); + HuamiSportsActivityType activityType = HuamiSportsActivityType.fromCode(rawKind); activityKind = activityType.toActivityKind(); } catch (Exception ex) { LOG.error("Error mapping acivity kind: " + ex.getMessage(), ex); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/operations/AmazfitBipFetchLogsOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/HuamiFetchDebugLogsOperation.java similarity index 89% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/operations/AmazfitBipFetchLogsOperation.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/HuamiFetchDebugLogsOperation.java index eb4a7c8b8..3d4471321 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/operations/AmazfitBipFetchLogsOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/HuamiFetchDebugLogsOperation.java @@ -15,7 +15,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.operations; +package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations; import android.widget.Toast; @@ -36,18 +36,17 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbip.AmazfitBipS import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.AbstractFetchOperation; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; -public class AmazfitBipFetchLogsOperation extends AbstractFetchOperation { - private static final Logger LOG = LoggerFactory.getLogger(AmazfitBipFetchLogsOperation.class); +public class HuamiFetchDebugLogsOperation extends AbstractFetchOperation { + private static final Logger LOG = LoggerFactory.getLogger(HuamiFetchDebugLogsOperation.class); private FileOutputStream logOutputStream; - public AmazfitBipFetchLogsOperation(AmazfitBipSupport support) { + public HuamiFetchDebugLogsOperation(AmazfitBipSupport support) { super(support); - setName("fetch logs"); + setName("fetch debug logs"); } @Override @@ -60,7 +59,7 @@ public class AmazfitBipFetchLogsOperation extends AbstractFetchOperation { } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.US); - String filename = "amazfitbip_" + dateFormat.format(new Date()) + ".log"; + String filename = "huamidebug_" + dateFormat.format(new Date()) + ".log"; File outputFile = new File(dir, filename ); try { From f99bc0de64035b473517cea6faa10521710cf9b9 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 13 Aug 2019 22:20:18 +0200 Subject: [PATCH 025/124] Move another file from AmazfitBip to Huami which is no longer Bip specific --- ...ailsParser.java => HuamiActivityDetailsParser.java} | 8 ++++---- .../huami/operations/FetchSportsDetailsOperation.java | 4 ++-- .../gadgetbridge/test/HexToBinaryInputStreamTest.java | 4 ++-- ...erTest.java => HuamiActivityDetailsParserTest.java} | 10 +++++----- 4 files changed, 13 insertions(+), 13 deletions(-) rename app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/{amazfitbip/ActivityDetailsParser.java => HuamiActivityDetailsParser.java} (98%) rename app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/{ActivityDetailsParserTest.java => HuamiActivityDetailsParserTest.java} (90%) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/ActivityDetailsParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java similarity index 98% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/ActivityDetailsParser.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java index 65b27d2aa..2d2323015 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbip/ActivityDetailsParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java @@ -15,7 +15,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip; +package nodomain.freeyourgadget.gadgetbridge.service.devices.huami; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +34,8 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityTrack; import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; -public class ActivityDetailsParser { - private static final Logger LOG = LoggerFactory.getLogger(ActivityDetailsParser.class); +public class HuamiActivityDetailsParser { + private static final Logger LOG = LoggerFactory.getLogger(HuamiActivityDetailsParser.class); private static final byte TYPE_GPS = 0; private static final byte TYPE_HR = 1; @@ -65,7 +65,7 @@ public class ActivityDetailsParser { private boolean skipCounterByte; - public ActivityDetailsParser(BaseActivitySummary summary) { + public HuamiActivityDetailsParser(BaseActivitySummary summary) { this.summary = summary; // this.version = version; // this.baseDate = baseDate; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsDetailsOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsDetailsOperation.java index 3881fbf30..dddc326e6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsDetailsOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsDetailsOperation.java @@ -40,7 +40,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityTrack; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.ActivityDetailsParser; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiActivityDetailsParser; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -86,7 +86,7 @@ public class FetchSportsDetailsOperation extends AbstractFetchOperation { if (success) { - ActivityDetailsParser parser = new ActivityDetailsParser(summary); + HuamiActivityDetailsParser parser = new HuamiActivityDetailsParser(summary); parser.setSkipCounterByte(false); // is already stripped try { ActivityTrack track = parser.parse(buffer.toByteArray()); diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HexToBinaryInputStreamTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HexToBinaryInputStreamTest.java index a4b5f5b95..f879ea393 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HexToBinaryInputStreamTest.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HexToBinaryInputStreamTest.java @@ -19,10 +19,10 @@ public class HexToBinaryInputStreamTest extends TestBase { byte[] hexString; byte[] binString; - try (InputStream in = ActivityDetailsParserTest.class.getClassLoader().getResourceAsStream("ActivityDetailsDump1.txt")) { + try (InputStream in = HuamiActivityDetailsParserTest.class.getClassLoader().getResourceAsStream("ActivityDetailsDump1.txt")) { hexString = FileUtils.readAll(in, 1024 * 1024); assertTrue(hexString.length > 1); - try (InputStream in2 = getContents(ActivityDetailsParserTest.class.getClassLoader().getResource("ActivityDetailsDump1.txt"))) { + try (InputStream in2 = getContents(HuamiActivityDetailsParserTest.class.getClassLoader().getResource("ActivityDetailsDump1.txt"))) { binString = FileUtils.readAll(in2, 1024 * 1024); assertTrue(binString.length > 1); } diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ActivityDetailsParserTest.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HuamiActivityDetailsParserTest.java similarity index 90% rename from app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ActivityDetailsParserTest.java rename to app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HuamiActivityDetailsParserTest.java index 2730dc464..841f40338 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/ActivityDetailsParserTest.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/test/HuamiActivityDetailsParserTest.java @@ -17,15 +17,15 @@ import nodomain.freeyourgadget.gadgetbridge.export.GPXExporter; import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint; import nodomain.freeyourgadget.gadgetbridge.model.ActivityTrack; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.ActivityDetailsParser; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiActivityDetailsParser; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class ActivityDetailsParserTest extends TestBase { - private static final URL DETAILS_1 = ActivityDetailsParserTest.class.getClassLoader().getResource("ActivityDetailsDump1.txt"); +public class HuamiActivityDetailsParserTest extends TestBase { + private static final URL DETAILS_1 = HuamiActivityDetailsParserTest.class.getClassLoader().getResource("ActivityDetailsDump1.txt"); private static final long MAX_DETAILS = 1024 * 1024; private static Date baseTime; @@ -38,7 +38,7 @@ public class ActivityDetailsParserTest extends TestBase { public void testActivityDetails() throws Exception { BipActivitySummary summary = createSummary(); - ActivityDetailsParser parser = new ActivityDetailsParser(summary); + HuamiActivityDetailsParser parser = new HuamiActivityDetailsParser(summary); parser.setSkipCounterByte(true); try (InputStream in = getContents(DETAILS_1)) { ActivityTrack track = parser.parse(FileUtils.readAll(in, MAX_DETAILS)); @@ -79,7 +79,7 @@ public class ActivityDetailsParserTest extends TestBase { summary.setBaseLatitude(baseLati); summary.setBaseAltitude(baseAlti); - ActivityDetailsParser parser = new ActivityDetailsParser(summary); + HuamiActivityDetailsParser parser = new HuamiActivityDetailsParser(summary); parser.setSkipCounterByte(true); try (InputStream in = getContents(DETAILS_1)) { ActivityTrack track = parser.parse(FileUtils.readAll(in, MAX_DETAILS)); From b5ea3ca591cf338d81c2fb3c0efc18d3ae76c18e Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 13 Aug 2019 23:02:10 +0200 Subject: [PATCH 026/124] Hexdump sports activity packets for better analysis type 2 seems to be pause, 3 resume. type 8 and seems to be related to swimming activites --- .../huami/HuamiActivityDetailsParser.java | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java index 2d2323015..aa2d978be 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiActivityDetailsParser.java @@ -33,32 +33,28 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint; import nodomain.freeyourgadget.gadgetbridge.model.ActivityTrack; import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; +import nodomain.freeyourgadget.gadgetbridge.util.GB; public class HuamiActivityDetailsParser { private static final Logger LOG = LoggerFactory.getLogger(HuamiActivityDetailsParser.class); private static final byte TYPE_GPS = 0; private static final byte TYPE_HR = 1; - private static final byte TYPE_UNKNOWN2 = 2; - private static final byte TYPE_PAUSE = 3; + private static final byte TYPE_PAUSE = 2; + private static final byte TYPE_RESUME = 3; private static final byte TYPE_SPEED4 = 4; private static final byte TYPE_SPEED5 = 5; - private static final byte TYPE_GPS_SPEED6 = 6; + private static final byte TYPE_SPEED6 = 6; + private static final byte TYPE_SWIMMING = 8; - public static final BigDecimal HUAMI_TO_DECIMAL_DEGREES_DIVISOR = new BigDecimal(3000000.0); - private final BaseActivitySummary summary; + private static final BigDecimal HUAMI_TO_DECIMAL_DEGREES_DIVISOR = new BigDecimal(3000000.0); private final ActivityTrack activityTrack; - // private final int version; private final Date baseDate; private long baseLongitude; private long baseLatitude; private int baseAltitude; private ActivityPoint lastActivityPoint; - public boolean getSkipCounterByte() { - return skipCounterByte; - } - public void setSkipCounterByte(boolean skipCounterByte) { this.skipCounterByte = skipCounterByte; } @@ -66,10 +62,6 @@ public class HuamiActivityDetailsParser { private boolean skipCounterByte; public HuamiActivityDetailsParser(BaseActivitySummary summary) { - this.summary = summary; -// this.version = version; -// this.baseDate = baseDate; -// this.baseLongitude = summary.getBaseLongitude(); this.baseLatitude = summary.getBaseLatitude(); this.baseAltitude = summary.getBaseAltitude(); @@ -109,21 +101,24 @@ public class HuamiActivityDetailsParser { case TYPE_HR: i += consumeHeartRate(bytes, i, totalTimeOffset); break; - case TYPE_UNKNOWN2: - i += consumeUnknown2(bytes, i); - break; case TYPE_PAUSE: i += consumePause(bytes, i); break; + case TYPE_RESUME: + i += consumeResume(bytes, i); + break; case TYPE_SPEED4: i += consumeSpeed4(bytes, i); break; case TYPE_SPEED5: i += consumeSpeed5(bytes, i); break; - case TYPE_GPS_SPEED6: + case TYPE_SPEED6: i += consumeSpeed6(bytes, i); break; + case TYPE_SWIMMING: + i += consumeSwimming(bytes, i); + break; default: LOG.warn("unknown packet type" + type); i+=6; @@ -213,7 +208,6 @@ public class HuamiActivityDetailsParser { if (v2 == 0 && v3 == 0 && v4 == 0 && v5 == 0 && v6 == 0) { // new version -// LOG.info("detected heart rate in 'new' version, where version is: " + summary.getVersion()); LOG.info("detected heart rate in 'new' version format"); ActivityPoint ap = getActivityPointFor(timeOffsetSeconds); ap.setHeartRate(v1); @@ -270,23 +264,33 @@ public class HuamiActivityDetailsParser { } } - private int consumeUnknown2(byte[] bytes, int offset) { - return 6; // just guessing... + private int consumePause(byte[] bytes, int offset) { + LOG.debug("got pause packet: " + GB.hexdump(bytes, offset, 6)); + return 6; } - private int consumePause(byte[] bytes, int i) { - return 6; // just guessing... + private int consumeResume(byte[] bytes, int offset) { + LOG.debug("got resume package: " + GB.hexdump(bytes, offset, 6)); + return 6; } private int consumeSpeed4(byte[] bytes, int offset) { + LOG.debug("got packet type 4 (speed): " + GB.hexdump(bytes, offset, 6)); return 6; } private int consumeSpeed5(byte[] bytes, int offset) { + LOG.debug("got packet type 5 (speed): " + GB.hexdump(bytes, offset, 6)); return 6; } private int consumeSpeed6(byte[] bytes, int offset) { + LOG.debug("got packet type 6 (speed): " + GB.hexdump(bytes, offset, 6)); + return 6; + } + + private int consumeSwimming(byte[] bytes, int offset) { + LOG.debug("got packet type 8 (swimming?): " + GB.hexdump(bytes, offset, 6)); return 6; } } From 320f792d1962fc0580ac9911060fe73b87cb8127 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 14 Aug 2019 07:55:10 +0200 Subject: [PATCH 027/124] Add icons for "swimming" and "exercise" Also set tint color to gray (for dark theme) and remove duplicate sleep icon --- .../gadgetbridge/model/ActivityKind.java | 6 ++++-- app/src/main/res/drawable/ic_activity_biking.xml | 7 +++++-- .../main/res/drawable/ic_activity_deep_sleep.xml | 7 ------- app/src/main/res/drawable/ic_activity_exercise.xml | 10 ++++++++++ .../main/res/drawable/ic_activity_light_sleep.xml | 7 ------- .../main/res/drawable/ic_activity_not_measured.xml | 7 +++++-- app/src/main/res/drawable/ic_activity_running.xml | 7 +++++-- app/src/main/res/drawable/ic_activity_sleep.xml | 10 ++++++++++ app/src/main/res/drawable/ic_activity_swimming.xml | 13 +++++++++++++ app/src/main/res/drawable/ic_activity_unknown.xml | 7 +++++-- app/src/main/res/drawable/ic_activity_walking.xml | 7 +++++-- 11 files changed, 62 insertions(+), 26 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_activity_deep_sleep.xml create mode 100644 app/src/main/res/drawable/ic_activity_exercise.xml delete mode 100644 app/src/main/res/drawable/ic_activity_light_sleep.xml create mode 100644 app/src/main/res/drawable/ic_activity_sleep.xml create mode 100644 app/src/main/res/drawable/ic_activity_swimming.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityKind.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityKind.java index a3319aefa..4138fe32d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityKind.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityKind.java @@ -116,9 +116,9 @@ public class ActivityKind { case TYPE_NOT_MEASURED: return R.drawable.ic_activity_not_measured; case TYPE_LIGHT_SLEEP: - return R.drawable.ic_activity_light_sleep; + return R.drawable.ic_activity_sleep; case TYPE_DEEP_SLEEP: - return R.drawable.ic_activity_deep_sleep; + return R.drawable.ic_activity_sleep; case TYPE_RUNNING: return R.drawable.ic_activity_running; case TYPE_WALKING: @@ -128,7 +128,9 @@ public class ActivityKind { case TYPE_TREADMILL: return R.drawable.ic_activity_walking; case TYPE_EXERCISE: // fall through + return R.drawable.ic_activity_exercise; case TYPE_SWIMMING: // fall through + return R.drawable.ic_activity_swimming; case TYPE_NOT_WORN: // fall through case TYPE_ACTIVITY: // fall through case TYPE_UNKNOWN: // fall through diff --git a/app/src/main/res/drawable/ic_activity_biking.xml b/app/src/main/res/drawable/ic_activity_biking.xml index 7001d100b..a2ffce6a5 100644 --- a/app/src/main/res/drawable/ic_activity_biking.xml +++ b/app/src/main/res/drawable/ic_activity_biking.xml @@ -1,7 +1,10 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_deep_sleep.xml b/app/src/main/res/drawable/ic_activity_deep_sleep.xml deleted file mode 100644 index abdaea833..000000000 --- a/app/src/main/res/drawable/ic_activity_deep_sleep.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_exercise.xml b/app/src/main/res/drawable/ic_activity_exercise.xml new file mode 100644 index 000000000..9b802f2da --- /dev/null +++ b/app/src/main/res/drawable/ic_activity_exercise.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_activity_light_sleep.xml b/app/src/main/res/drawable/ic_activity_light_sleep.xml deleted file mode 100644 index abdaea833..000000000 --- a/app/src/main/res/drawable/ic_activity_light_sleep.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_not_measured.xml b/app/src/main/res/drawable/ic_activity_not_measured.xml index 7a6bb2d01..d42708d7e 100644 --- a/app/src/main/res/drawable/ic_activity_not_measured.xml +++ b/app/src/main/res/drawable/ic_activity_not_measured.xml @@ -1,7 +1,10 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_running.xml b/app/src/main/res/drawable/ic_activity_running.xml index 14c06266a..78ce0c027 100644 --- a/app/src/main/res/drawable/ic_activity_running.xml +++ b/app/src/main/res/drawable/ic_activity_running.xml @@ -1,7 +1,10 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_sleep.xml b/app/src/main/res/drawable/ic_activity_sleep.xml new file mode 100644 index 000000000..6b13d8083 --- /dev/null +++ b/app/src/main/res/drawable/ic_activity_sleep.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_swimming.xml b/app/src/main/res/drawable/ic_activity_swimming.xml new file mode 100644 index 000000000..391cb99bd --- /dev/null +++ b/app/src/main/res/drawable/ic_activity_swimming.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_activity_unknown.xml b/app/src/main/res/drawable/ic_activity_unknown.xml index 4e323aeaa..6bde4c5f2 100644 --- a/app/src/main/res/drawable/ic_activity_unknown.xml +++ b/app/src/main/res/drawable/ic_activity_unknown.xml @@ -1,7 +1,10 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_walking.xml b/app/src/main/res/drawable/ic_activity_walking.xml index 831c0b345..97036cc9d 100644 --- a/app/src/main/res/drawable/ic_activity_walking.xml +++ b/app/src/main/res/drawable/ic_activity_walking.xml @@ -1,7 +1,10 @@ - + \ No newline at end of file From 26165f91172279d99afe4b93194b41c0111f9d00 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 14 Aug 2019 19:24:03 +0200 Subject: [PATCH 028/124] Amazfit Bip/Cor: Fix resetting of last fetched date for sports activities For Mi Band 3/4 this does nothing, since the Mi Band seems to remove the activities from the Band immediately after fetching --- .../activities/ActivitySummariesActivity.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java index 56b97a9c0..acb260aac 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ActivitySummariesActivity.java @@ -36,6 +36,10 @@ import android.widget.DatePicker; import android.widget.ListView; import android.widget.Toast; +import androidx.core.content.FileProvider; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.io.File; @@ -45,9 +49,6 @@ import java.util.Calendar; import java.util.List; import java.util.Objects; -import androidx.core.content.FileProvider; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.adapter.ActivitySummariesAdapter; @@ -240,10 +241,10 @@ public class ActivitySummariesActivity extends AbstractListActivity Date: Wed, 14 Aug 2019 19:24:09 +0200 Subject: [PATCH 029/124] Improve parsing and debug output for activity summaries from Mi Band/Amazfit --- .../FetchSportsSummaryOperation.java | 120 ++++++++++++------ 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java index a47cc445a..777c49c74 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java @@ -43,8 +43,8 @@ import nodomain.freeyourgadget.gadgetbridge.entities.User; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSportsActivityType; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiSupport; import nodomain.freeyourgadget.gadgetbridge.util.GB; /** @@ -197,44 +197,88 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { summary.setBaseLongitude(baseLongitude); summary.setBaseLatitude(baseLatitude); summary.setBaseAltitude(baseAltitude); + + // unused data (for now) + float distanceMeters = buffer.getFloat(); + float ascentMeters = buffer.getFloat(); + float descentMeters = buffer.getFloat(); + float maxAltitude = buffer.getFloat(); + float minAltitude = buffer.getFloat(); + int maxLatitude = buffer.getInt(); // format? + int minLatitude = buffer.getInt(); // format? + int maxLongitude = buffer.getInt(); // format? + int minLongitude = buffer.getInt(); // format? + int steps = buffer.getInt(); + int activeSeconds = buffer.getInt(); + float caloriesBurnt = buffer.getFloat(); + float maxSpeed = buffer.getFloat(); + float minPace = buffer.getFloat(); // format? + float maxPace = buffer.getFloat(); // format? + float totalStride = buffer.getFloat(); + + buffer.getInt(); // unknown + buffer.getInt(); // unknown + buffer.getInt(); // unknown + + int ascentSeconds = buffer.getInt() / 1000; //ms? + buffer.getInt(); // unknown; + int descentSeconds = buffer.getInt() / 1000; //ms? + buffer.getInt(); // unknown; + int flatSeconds = buffer.getInt() / 1000; // ms? + int averageHR = buffer.getShort(); + int averagePaceSeconds = buffer.getShort(); + int averageStride = buffer.getShort(); + buffer.getShort(); // unknown + + LOG.debug("unused data:" + + "\ndistanceMeters=" + distanceMeters + + "\nascentMeters=" + ascentMeters + + "\ndescentMeters=" + descentMeters + + "\nmaxAltitude=" + maxAltitude + + "\nminAltitude=" + minAltitude + + //"\nmaxLatitude=" + maxLatitude + // not useful + //"\nminLatitude=" + minLatitude + // not useful + //"\nmaxLongitude=" + maxLongitude + // not useful + //"\nminLongitude=" + minLongitude + // not useful + "\nsteps=" + steps + + "\nactiveSeconds=" + activeSeconds + + "\ncaloriesBurnt=" + caloriesBurnt + + "\nmaxSpeed=" + maxSpeed + + "\nminPace=" + minPace + + "\nmaxPace=" + maxPace + + "\ntotalStride=" + totalStride + + "\nascentSeconds=" + ascentSeconds + + "\ndescentSeconds=" + descentSeconds + + "\nflatSeconds=" + flatSeconds + + "\naverageHR=" + averageHR + + "\naveragePaceSeconds=" + averagePaceSeconds + + "\naverageStride=" + averageStride + + "" + ); + // summary.setBaseCoordinate(new GPSCoordinate(baseLatitude, baseLongitude, baseAltitude)); - -// summary.setDistanceMeters(Float.intBitsToFloat(buffer.getInt())); -// summary.setAscentMeters(Float.intBitsToFloat(buffer.getInt())); -// summary.setDescentMeters(Float.intBitsToFloat(buffer.getInt())); -// -// summary.setMinAltitude(Float.intBitsToFloat(buffer.getInt())); -// summary.setMaxAltitude(Float.intBitsToFloat(buffer.getInt())); -// summary.setMinLatitude(buffer.getInt()); -// summary.setMaxLatitude(buffer.getInt()); -// summary.setMinLongitude(buffer.getInt()); -// summary.setMaxLongitude(buffer.getInt()); -// -// summary.setSteps(BLETypeConversions.toUnsigned(buffer.getInt())); -// summary.setActiveTimeSeconds(BLETypeConversions.toUnsigned(buffer.getInt())); -// -// summary.setCaloriesBurnt(Float.intBitsToFloat(buffer.get())); -// summary.setMaxSpeed(Float.intBitsToFloat(buffer.get())); -// summary.setMinPace(Float.intBitsToFloat(buffer.get())); -// summary.setMaxPace(Float.intBitsToFloat(buffer.get())); -// summary.setTotalStride(Float.intBitsToFloat(buffer.get())); - - buffer.getInt(); // - buffer.getInt(); // - buffer.getInt(); // - -// summary.setTimeAscent(BLETypeConversions.toUnsigned(buffer.getInt())); -// buffer.getInt(); // -// summary.setTimeDescent(BLETypeConversions.toUnsigned(buffer.getInt())); -// buffer.getInt(); // -// summary.setTimeFlat(BLETypeConversions.toUnsigned(buffer.getInt())); -// -// summary.setAverageHR(BLETypeConversions.toUnsigned(buffer.getShort())); -// -// summary.setAveragePace(BLETypeConversions.toUnsigned(buffer.getShort())); -// summary.setAverageStride(BLETypeConversions.toUnsigned(buffer.getShort())); - - buffer.getShort(); // +// summary.setDistanceMeters(distanceMeters); +// summary.setAscentMeters(ascentMeters); +// summary.setDescentMeters(descentMeters); +// summary.setMinAltitude(maxAltitude); +// summary.setMaxAltitude(maxAltitude); +// summary.setMinLatitude(minLatitude); +// summary.setMaxLatitude(maxLatitude); +// summary.setMinLongitude(minLatitude); +// summary.setMaxLongitude(maxLatitude); +// summary.setSteps(steps); +// summary.setActiveTimeSeconds(secondsActive); +// summary.setCaloriesBurnt(caloriesBurnt); +// summary.setMaxSpeed(maxSpeed); +// summary.setMinPace(minPace); +// summary.setMaxPace(maxPace); +// summary.setTotalStride(totalStride); +// summary.setTimeAscent(BLETypeConversions.toUnsigned(ascentSeconds); +// summary.setTimeDescent(BLETypeConversions.toUnsigned(descentSeconds); +// summary.setTimeFlat(BLETypeConversions.toUnsigned(flatSeconds); +// summary.setAverageHR(BLETypeConversions.toUnsigned(averageHR); +// summary.setAveragePace(BLETypeConversions.toUnsigned(averagePace); +// summary.setAverageStride(BLETypeConversions.toUnsigned(averageStride); return summary; } From 13b078aaddb4c4dd8c8cef8610eb5310e0ed9385 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 14 Aug 2019 19:40:10 +0200 Subject: [PATCH 030/124] fix verison typo (before I get a PR again :P) --- .../devices/huami/operations/FetchSportsSummaryOperation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java index 777c49c74..6e62cb923 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java @@ -166,14 +166,14 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { ByteBuffer buffer = ByteBuffer.wrap(stream.toByteArray()).order(ByteOrder.LITTLE_ENDIAN); // summary.setVersion(BLETypeConversions.toUnsigned(buffer.getShort())); short version = buffer.getShort(); // version - LOG.debug("Got verison " + version); + LOG.debug("Got sport summary version " + version); int activityKind = ActivityKind.TYPE_UNKNOWN; try { int rawKind = BLETypeConversions.toUnsigned(buffer.getShort()); HuamiSportsActivityType activityType = HuamiSportsActivityType.fromCode(rawKind); activityKind = activityType.toActivityKind(); } catch (Exception ex) { - LOG.error("Error mapping acivity kind: " + ex.getMessage(), ex); + LOG.error("Error mapping activity kind: " + ex.getMessage(), ex); } summary.setActivityKind(activityKind); From d7c6fad235a0b1e0927b9765500b66bc12d83dbd Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 15 Aug 2019 11:14:41 +0200 Subject: [PATCH 031/124] Mi Band 4: decode swim info (not used yet) After swimming a lot on the sofa and desk this seems right and in line with the data displayed on the band swimming styles I got so far are breast and freestyle. Others are probably missing. Might be correct for Cor also (I don't have one) --- .../FetchSportsSummaryOperation.java | 66 ++++++++++++++----- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java index 6e62cb923..eb2d578a1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/operations/FetchSportsSummaryOperation.java @@ -141,7 +141,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { return; } - if ((byte) (lastPacketCounter + 1) == value[0] ) { + if ((byte) (lastPacketCounter + 1) == value[0]) { lastPacketCounter++; bufferActivityData(value); } else { @@ -154,6 +154,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { /** * Buffers the given activity summary data. If the total size is reached, * it is converted to an object and saved in the database. + * * @param value */ @Override @@ -166,7 +167,7 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { ByteBuffer buffer = ByteBuffer.wrap(stream.toByteArray()).order(ByteOrder.LITTLE_ENDIAN); // summary.setVersion(BLETypeConversions.toUnsigned(buffer.getShort())); short version = buffer.getShort(); // version - LOG.debug("Got sport summary version " + version); + LOG.debug("Got sport summary version " + version + "total bytes=" + buffer.capacity()); int activityKind = ActivityKind.TYPE_UNKNOWN; try { int rawKind = BLETypeConversions.toUnsigned(buffer.getShort()); @@ -216,21 +217,53 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { float maxPace = buffer.getFloat(); // format? float totalStride = buffer.getFloat(); - buffer.getInt(); // unknown - buffer.getInt(); // unknown buffer.getInt(); // unknown - int ascentSeconds = buffer.getInt() / 1000; //ms? - buffer.getInt(); // unknown; - int descentSeconds = buffer.getInt() / 1000; //ms? - buffer.getInt(); // unknown; - int flatSeconds = buffer.getInt() / 1000; // ms? - int averageHR = buffer.getShort(); - int averagePaceSeconds = buffer.getShort(); - int averageStride = buffer.getShort(); - buffer.getShort(); // unknown + if (activityKind == ActivityKind.TYPE_SWIMMING) { + // 28 bytes + float averageStrokeDistance = buffer.getFloat(); + float averageStrokesPerSecond = buffer.getFloat(); + float averageLapPace = buffer.getFloat(); + short strokes = buffer.getShort(); + short swolfIndex = buffer.getShort(); + byte swimStyle = buffer.get(); + byte laps = buffer.get(); + buffer.getInt(); // unknown + buffer.getInt(); // unknown + buffer.getShort(); // unknown - LOG.debug("unused data:" + + LOG.debug("unused swim data:" + + "\naverageStrokeDistance=" + averageStrokeDistance + + "\naverageStrokesPerSecond=" + averageStrokesPerSecond + + "\naverageLapPace" + averageLapPace + + "\nstrokes=" + strokes + + "\nswolfIndex=" + swolfIndex + + "\nswimStyle=" + swimStyle + // 1 = breast, 2 = freestyle + "\nlaps=" + laps + + "" + ); + } else { + // 28 bytes + buffer.getInt(); // unknown + buffer.getInt(); // unknown + int ascentSeconds = buffer.getInt() / 1000; //ms? + buffer.getInt(); // unknown; + int descentSeconds = buffer.getInt() / 1000; //ms? + buffer.getInt(); // unknown; + int flatSeconds = buffer.getInt() / 1000; // ms? + LOG.debug("unused non-swim data:" + + "\nascentSeconds=" + ascentSeconds + + "\ndescentSeconds=" + descentSeconds + + "\nflatSeconds=" + flatSeconds + + "" + ); + } + + short averageHR = buffer.getShort(); + short averageKMPaceSeconds = buffer.getShort(); + short averageStride = buffer.getShort(); + + LOG.debug("unused common:" + "\ndistanceMeters=" + distanceMeters + "\nascentMeters=" + ascentMeters + "\ndescentMeters=" + descentMeters + @@ -247,11 +280,8 @@ public class FetchSportsSummaryOperation extends AbstractFetchOperation { "\nminPace=" + minPace + "\nmaxPace=" + maxPace + "\ntotalStride=" + totalStride + - "\nascentSeconds=" + ascentSeconds + - "\ndescentSeconds=" + descentSeconds + - "\nflatSeconds=" + flatSeconds + "\naverageHR=" + averageHR + - "\naveragePaceSeconds=" + averagePaceSeconds + + "\naverageKMPaceSeconds=" + averageKMPaceSeconds + "\naverageStride=" + averageStride + "" ); From c1145e1244f04675a229e054c87db33ac6a9d8c0 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Wed, 21 Aug 2019 23:24:51 +0200 Subject: [PATCH 032/124] Mi Band 4: Support flashing the V2 font that came with beta FW 1.0.6.00 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only tested with 1.0.6.00 It now contains new characters like äöüß and others. --- .../service/devices/huami/miband4/MiBand4FirmwareInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java index 5b7f3fcee..38987a3b2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband4/MiBand4FirmwareInfo.java @@ -65,7 +65,7 @@ public class MiBand4FirmwareInfo extends HuamiFirmwareInfo { return HuamiFirmwareType.WATCHFACE; } if (ArrayUtils.startsWith(bytes, NEWFT_HEADER)) { - if (bytes[10] == 0x03) { + if (bytes[10] == 0x03 || bytes[10] == 0x06) { return HuamiFirmwareType.FONT; } } From aec3d21216c20dec0338e1c2ea2da4c67df51e41 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 22 Aug 2019 10:20:45 +0200 Subject: [PATCH 033/124] Mi Band 4: remove unsupported DND setting from settings menu --- .../gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java index 13468b851..31c0796d6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband4/MiBand4Coordinator.java @@ -90,7 +90,6 @@ public class MiBand4Coordinator extends HuamiCoordinator { R.xml.devicesettings_miband3, R.xml.devicesettings_dateformat, R.xml.devicesettings_nightmode, - R.xml.devicesettings_donotdisturb_withauto, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_swipeunlock, R.xml.devicesettings_pairingkey From 75c99158aeb464a36076e0724211f9d6ba820cf5 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 22 Aug 2019 11:22:29 +0200 Subject: [PATCH 034/124] collect changes so far into changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01b1208a4..4406b2393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ ### Changelog +#### NEXT +* Initial Mijia LYWSD02 support (Smart Clock with Humidity and Temperature Sensor), just for setting the time +* Mi Band 3/4: Allow enabling the NFC menu where supported (useless for now) +* Mi Band 3/4, Amazfit Cor/Bip: Set language immediately when changing it (not only on connect) +* Mi Band 3/4, Amazfir Cor/Bip: Add icons for "swimming" and "exercise" +* Mi Band 4: Support flashing the V2 font +* Mi Band 4: remove unsupported DND setting from settings menu +* Amazfit Bip/Cor: Fix resetting of last fetched date for sports activities +* Amazfit Bip: Fix sharing GPX files for some Apps +* Pebble: Use Rebble Store URI +* Add Averages to Charts +* Allow togging between weekly and monthly charts + #### Version 0.35.2 * Mi Band 1/2: Crash when updating firmware while phone is set to Spanish * Mi Band 4: Enable music info support (displays now on the band) From 5f998d8a95b1b399e7f1f4ab334250008e2e5c5c Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Thu, 22 Aug 2019 21:19:03 +0200 Subject: [PATCH 035/124] add stripped down version of weather part of lineage sdk Makes it possible to use the lineage weather provider without binary jar (This is based on 63a590625c6c76f82e5ef43408a52238b2b34e43 of https://github.com/LineageOS/android_lineage-sdk) --- .../weather/ILineageWeatherManager.aidl | 31 + .../weather/IRequestInfoListener.aidl | 30 + ...IWeatherServiceProviderChangeListener.aidl | 22 + .../aidl/lineageos/weather/RequestInfo.aidl | 19 + .../aidl/lineageos/weather/WeatherInfo.aidl | 19 + .../lineageos/weather/WeatherLocation.aidl | 19 + .../IWeatherProviderService.aidl | 28 + .../IWeatherProviderServiceClient.aidl | 25 + .../weatherservice/ServiceRequestResult.aidl | 19 + .../app/LineageContextConstants.java | 31 + app/src/main/java/lineageos/os/Build.java | 32 + app/src/main/java/lineageos/os/Concierge.java | 153 +++++ .../lineageos/providers/WeatherContract.java | 245 +++++++ .../weather/LineageWeatherManager.java | 435 ++++++++++++ .../java/lineageos/weather/RequestInfo.java | 379 +++++++++++ .../java/lineageos/weather/WeatherInfo.java | 642 ++++++++++++++++++ .../lineageos/weather/WeatherLocation.java | 274 ++++++++ .../lineageos/weather/util/WeatherUtils.java | 84 +++ .../weatherservice/ServiceRequest.java | 161 +++++ .../weatherservice/ServiceRequestResult.java | 197 ++++++ .../WeatherProviderService.java | 181 +++++ 21 files changed, 3026 insertions(+) create mode 100644 app/src/main/aidl/lineageos/weather/ILineageWeatherManager.aidl create mode 100644 app/src/main/aidl/lineageos/weather/IRequestInfoListener.aidl create mode 100644 app/src/main/aidl/lineageos/weather/IWeatherServiceProviderChangeListener.aidl create mode 100644 app/src/main/aidl/lineageos/weather/RequestInfo.aidl create mode 100644 app/src/main/aidl/lineageos/weather/WeatherInfo.aidl create mode 100644 app/src/main/aidl/lineageos/weather/WeatherLocation.aidl create mode 100644 app/src/main/aidl/lineageos/weatherservice/IWeatherProviderService.aidl create mode 100644 app/src/main/aidl/lineageos/weatherservice/IWeatherProviderServiceClient.aidl create mode 100644 app/src/main/aidl/lineageos/weatherservice/ServiceRequestResult.aidl create mode 100644 app/src/main/java/lineageos/app/LineageContextConstants.java create mode 100644 app/src/main/java/lineageos/os/Build.java create mode 100644 app/src/main/java/lineageos/os/Concierge.java create mode 100644 app/src/main/java/lineageos/providers/WeatherContract.java create mode 100644 app/src/main/java/lineageos/weather/LineageWeatherManager.java create mode 100644 app/src/main/java/lineageos/weather/RequestInfo.java create mode 100755 app/src/main/java/lineageos/weather/WeatherInfo.java create mode 100644 app/src/main/java/lineageos/weather/WeatherLocation.java create mode 100644 app/src/main/java/lineageos/weather/util/WeatherUtils.java create mode 100644 app/src/main/java/lineageos/weatherservice/ServiceRequest.java create mode 100644 app/src/main/java/lineageos/weatherservice/ServiceRequestResult.java create mode 100644 app/src/main/java/lineageos/weatherservice/WeatherProviderService.java diff --git a/app/src/main/aidl/lineageos/weather/ILineageWeatherManager.aidl b/app/src/main/aidl/lineageos/weather/ILineageWeatherManager.aidl new file mode 100644 index 000000000..d12e8bbd4 --- /dev/null +++ b/app/src/main/aidl/lineageos/weather/ILineageWeatherManager.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +import lineageos.weather.IWeatherServiceProviderChangeListener; +import lineageos.weather.RequestInfo; + +interface ILineageWeatherManager { + oneway void updateWeather(in RequestInfo info); + oneway void lookupCity(in RequestInfo info); + oneway void registerWeatherServiceProviderChangeListener( + in IWeatherServiceProviderChangeListener listener); + oneway void unregisterWeatherServiceProviderChangeListener( + in IWeatherServiceProviderChangeListener listener); + String getActiveWeatherServiceProviderLabel(); + oneway void cancelRequest(int requestId); +} \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weather/IRequestInfoListener.aidl b/app/src/main/aidl/lineageos/weather/IRequestInfoListener.aidl new file mode 100644 index 000000000..11916f3cf --- /dev/null +++ b/app/src/main/aidl/lineageos/weather/IRequestInfoListener.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +import lineageos.weather.RequestInfo; +import lineageos.weather.WeatherInfo; +import lineageos.weather.WeatherLocation; + +import java.util.List; + +interface IRequestInfoListener { + void onWeatherRequestCompleted(in RequestInfo requestInfo, int status, + in WeatherInfo weatherInfo); + void onLookupCityRequestCompleted(in RequestInfo requestInfo, int status, + in List weatherLocation); +} \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weather/IWeatherServiceProviderChangeListener.aidl b/app/src/main/aidl/lineageos/weather/IWeatherServiceProviderChangeListener.aidl new file mode 100644 index 000000000..12ad2ff8f --- /dev/null +++ b/app/src/main/aidl/lineageos/weather/IWeatherServiceProviderChangeListener.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +/** @hide */ +oneway interface IWeatherServiceProviderChangeListener { + void onWeatherServiceProviderChanged(String providerLabel); +} \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weather/RequestInfo.aidl b/app/src/main/aidl/lineageos/weather/RequestInfo.aidl new file mode 100644 index 000000000..bdc3ecc64 --- /dev/null +++ b/app/src/main/aidl/lineageos/weather/RequestInfo.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +parcelable RequestInfo; \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weather/WeatherInfo.aidl b/app/src/main/aidl/lineageos/weather/WeatherInfo.aidl new file mode 100644 index 000000000..16cbb599e --- /dev/null +++ b/app/src/main/aidl/lineageos/weather/WeatherInfo.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2016 The CyanongenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +parcelable WeatherInfo; \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weather/WeatherLocation.aidl b/app/src/main/aidl/lineageos/weather/WeatherLocation.aidl new file mode 100644 index 000000000..d19e8bce7 --- /dev/null +++ b/app/src/main/aidl/lineageos/weather/WeatherLocation.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weather; + +parcelable WeatherLocation; \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weatherservice/IWeatherProviderService.aidl b/app/src/main/aidl/lineageos/weatherservice/IWeatherProviderService.aidl new file mode 100644 index 000000000..fb3bc5ec3 --- /dev/null +++ b/app/src/main/aidl/lineageos/weatherservice/IWeatherProviderService.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weatherservice; + +import lineageos.weatherservice.IWeatherProviderServiceClient; +import lineageos.weather.RequestInfo; + +interface IWeatherProviderService { + void processWeatherUpdateRequest(in RequestInfo request); + void processCityNameLookupRequest(in RequestInfo request); + void setServiceClient(in IWeatherProviderServiceClient client); + void cancelOngoingRequests(); + void cancelRequest(int requestId); +} \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weatherservice/IWeatherProviderServiceClient.aidl b/app/src/main/aidl/lineageos/weatherservice/IWeatherProviderServiceClient.aidl new file mode 100644 index 000000000..2f54eddc1 --- /dev/null +++ b/app/src/main/aidl/lineageos/weatherservice/IWeatherProviderServiceClient.aidl @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weatherservice; + +import lineageos.weather.RequestInfo; +import lineageos.weatherservice.ServiceRequestResult; + +interface IWeatherProviderServiceClient { + void setServiceRequestState(in RequestInfo requestInfo, in ServiceRequestResult result, + int state); +} \ No newline at end of file diff --git a/app/src/main/aidl/lineageos/weatherservice/ServiceRequestResult.aidl b/app/src/main/aidl/lineageos/weatherservice/ServiceRequestResult.aidl new file mode 100644 index 000000000..ece4f47fc --- /dev/null +++ b/app/src/main/aidl/lineageos/weatherservice/ServiceRequestResult.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.weatherservice; + +parcelable ServiceRequestResult; \ No newline at end of file diff --git a/app/src/main/java/lineageos/app/LineageContextConstants.java b/app/src/main/java/lineageos/app/LineageContextConstants.java new file mode 100644 index 000000000..a5ab9d3e3 --- /dev/null +++ b/app/src/main/java/lineageos/app/LineageContextConstants.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015, The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.app; + + +public final class LineageContextConstants { + + private LineageContextConstants() { + // Empty constructor + } + + public static final String LINEAGE_WEATHER_SERVICE = "lineageweather"; + + public static class Features { + public static final String WEATHER_SERVICES = "org.lineageos.weather"; + } +} diff --git a/app/src/main/java/lineageos/os/Build.java b/app/src/main/java/lineageos/os/Build.java new file mode 100644 index 000000000..61d475b7b --- /dev/null +++ b/app/src/main/java/lineageos/os/Build.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.os; + + +public class Build { + public static class LINEAGE_VERSION_CODES { + public static final int APRICOT = 1; + public static final int BOYSENBERRY = 2; + public static final int CANTALOUPE = 3; + public static final int DRAGON_FRUIT = 4; + public static final int ELDERBERRY = 5; + public static final int FIG = 6; + public static final int GUAVA = 7; + public static final int HACKBERRY = 8; + public static final int ILAMA = 9; + } +} diff --git a/app/src/main/java/lineageos/os/Concierge.java b/app/src/main/java/lineageos/os/Concierge.java new file mode 100644 index 000000000..d4f9b4e22 --- /dev/null +++ b/app/src/main/java/lineageos/os/Concierge.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * 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 + * + * http://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. + */ + +package lineageos.os; + +import android.os.Parcel; + +import lineageos.os.Build.LINEAGE_VERSION_CODES; + +/** + * Simply, Concierge handles your parcels and makes sure they get marshalled and unmarshalled + * correctly when cross IPC boundaries even when there is a version mismatch between the client + * sdk level and the framework implementation. + * + *