From f800d695fff99c57ffe256e3ba7c0a98813f8367 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Tue, 3 Apr 2018 09:15:28 +0300 Subject: [PATCH 01/43] SAGE, CAGE ... change color if old - second try requested in #811 --- .../nightscout/androidaps/db/CareportalEvent.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index e2e4e6d639..9cd013a1c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -98,6 +98,20 @@ public class CareportalEvent implements DataPointWithLabelInterface { return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); } + public String age(int threshold) { + Map diff = computeDiff(date, System.currentTimeMillis()); + if (OverviewFragment.shorttextmode) + if(diff.get(TimeUnit.DAYS) > threshold) + return "isOLD"+diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; + else + return diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; + else + if(diff.get(TimeUnit.DAYS) > threshold) + return "isOLD"+diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); + else + return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); + } + public String log() { return "CareportalEvent{" + "date= " + date + @@ -259,4 +273,5 @@ public class CareportalEvent implements DataPointWithLabelInterface { public int getSecondColor() { return 0; } + } From ddf39e8d55fd3a54207645de86d2b89ea69f843b Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Tue, 3 Apr 2018 09:18:01 +0300 Subject: [PATCH 02/43] added color when values are old harcoded values fo SAGE, CAGE ... --- .../Careportal/CareportalFragment.java | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index 2656e43a26..bb04123cd2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -212,22 +212,67 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli @Override public void run() { CareportalEvent careportalEvent; + String isOld = ""; String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); - sage.setText(careportalEvent != null ? careportalEvent.age() : notavailable); + if(careportalEvent != null) { + isOld = careportalEvent.age(7).substring(0, 5); + if(isOld.equals("isOLD")){ + sage.setTextColor(MainApp.sResources.getColor(R.color.low)); + sage.setText(careportalEvent.age(7).substring(5)); + } else { + sage.setText(careportalEvent.age(7)); + } + + } else { + sage.setText(notavailable); + } } if (iage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); - iage.setText(careportalEvent != null ? careportalEvent.age() : notavailable); + if(careportalEvent != null) { + isOld = careportalEvent.age(7).substring(0, 5); + if(isOld.equals("isOLD")){ + iage.setTextColor(MainApp.sResources.getColor(R.color.low)); + iage.setText(careportalEvent.age(7).substring(5)); + } else { + iage.setText(careportalEvent.age(7)); + } + + } else { + iage.setText(notavailable); + } } if (cage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); - cage.setText(careportalEvent != null ? careportalEvent.age() : notavailable); + if (careportalEvent != null) { + isOld = careportalEvent.age(3).substring(0, 5); + if(isOld.equals("isOLD")){ + cage.setTextColor(MainApp.sResources.getColor(R.color.low)); + cage.setText(careportalEvent.age(3).substring(5)); + } else { + cage.setText(careportalEvent.age(3)); + } + + } else { + cage.setText(notavailable); + } } if (pbage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); - pbage.setText(careportalEvent != null ? careportalEvent.age() : notavailable); + if(careportalEvent != null) { + isOld = careportalEvent.age(15).substring(0, 5); + if(isOld.equals("isOLD")){ + pbage.setTextColor(MainApp.sResources.getColor(R.color.low)); + pbage.setText(careportalEvent.age(15).substring(5)); + } else { + pbage.setText(careportalEvent.age(15)); + } + + } else { + pbage.setText(notavailable); + } } } } @@ -236,3 +281,4 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli } } + From d50f31e7a65d3b78eae5c3091e0f0007d14d7bc1 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 09:35:45 +0300 Subject: [PATCH 03/43] change age(int) to boolean isOldetThan() --- .../nightscout/androidaps/db/CareportalEvent.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index 9cd013a1c4..1c5fc85041 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -98,18 +98,12 @@ public class CareportalEvent implements DataPointWithLabelInterface { return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); } - public String age(int threshold) { + public boolean isOlderThan(int threshold) { Map diff = computeDiff(date, System.currentTimeMillis()); - if (OverviewFragment.shorttextmode) if(diff.get(TimeUnit.DAYS) > threshold) - return "isOLD"+diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; + return true; else - return diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; - else - if(diff.get(TimeUnit.DAYS) > threshold) - return "isOLD"+diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); - else - return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); + return false; } public String log() { From f2844835008eda294ae0696389cebcb631082fd7 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 09:37:08 +0300 Subject: [PATCH 04/43] used isOlderThan --- .../Careportal/CareportalFragment.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index bb04123cd2..b45dd00faf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -217,12 +217,11 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); if(careportalEvent != null) { - isOld = careportalEvent.age(7).substring(0, 5); - if(isOld.equals("isOLD")){ + if(careportalEvent.isOlderThan(7)){ sage.setTextColor(MainApp.sResources.getColor(R.color.low)); - sage.setText(careportalEvent.age(7).substring(5)); + sage.setText(careportalEvent.age()); } else { - sage.setText(careportalEvent.age(7)); + sage.setText(careportalEvent.age()); } } else { @@ -232,12 +231,11 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (iage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); if(careportalEvent != null) { - isOld = careportalEvent.age(7).substring(0, 5); - if(isOld.equals("isOLD")){ + if(careportalEvent.isOlderThan(5)){ iage.setTextColor(MainApp.sResources.getColor(R.color.low)); - iage.setText(careportalEvent.age(7).substring(5)); + iage.setText(careportalEvent.age()); } else { - iage.setText(careportalEvent.age(7)); + iage.setText(careportalEvent.age()); } } else { @@ -247,12 +245,11 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (cage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); if (careportalEvent != null) { - isOld = careportalEvent.age(3).substring(0, 5); - if(isOld.equals("isOLD")){ + if(careportalEvent.isOlderThan(3)){ cage.setTextColor(MainApp.sResources.getColor(R.color.low)); - cage.setText(careportalEvent.age(3).substring(5)); + cage.setText(careportalEvent.age()); } else { - cage.setText(careportalEvent.age(3)); + cage.setText(careportalEvent.age()); } } else { @@ -262,12 +259,11 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (pbage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); if(careportalEvent != null) { - isOld = careportalEvent.age(15).substring(0, 5); - if(isOld.equals("isOLD")){ + if(careportalEvent.isOlderThan(15)){ pbage.setTextColor(MainApp.sResources.getColor(R.color.low)); - pbage.setText(careportalEvent.age(15).substring(5)); + pbage.setText(careportalEvent.age()); } else { - pbage.setText(careportalEvent.age(15)); + pbage.setText(careportalEvent.age()); } } else { From 5e045264d575688f5a2d6a3ae8da202623afd0b9 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 12:14:19 +0300 Subject: [PATCH 05/43] changed isOlderThan(int) to double --- .../java/info/nightscout/androidaps/db/CareportalEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index 1c5fc85041..643b5d066c 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -98,7 +98,7 @@ public class CareportalEvent implements DataPointWithLabelInterface { return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); } - public boolean isOlderThan(int threshold) { + public boolean isOlderThan(double threshold) { Map diff = computeDiff(date, System.currentTimeMillis()); if(diff.get(TimeUnit.DAYS) > threshold) return true; From 5e56e2afa0c6c3c7b48f0be67c5185f88decca33 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 12:16:01 +0300 Subject: [PATCH 06/43] Get thresholds from NS thresholds in NS are in hours --- .../Careportal/CareportalFragment.java | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index b45dd00faf..160fb150ca 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -12,6 +12,11 @@ import android.widget.TextView; import com.squareup.otto.Subscribe; +import org.json.JSONException; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; @@ -22,11 +27,11 @@ import info.nightscout.androidaps.events.EventCareportalEventChange; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus; import info.nightscout.androidaps.plugins.Overview.OverviewFragment; import info.nightscout.utils.FabricPrivacy; public class CareportalFragment extends SubscriberFragment implements View.OnClickListener { - TextView iage; TextView cage; TextView sage; @@ -212,12 +217,33 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli @Override public void run() { CareportalEvent careportalEvent; - String isOld = ""; + NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); + JSONObject extendedSettings = nsSettings.getExtendedSettings(); + // Thresholds in NS are in hours + double iageThreshold = 7*24; + double cageThreshold = 3*24; + double sageThreshold = 7*24; + double pbageThreshold = 15*24; +// log.debug("NSExtendedSettings are "+extendedSettings.toString()); +// try { + JSONObject iageSettings = extendedSettings.optJSONObject("iage"); + if(iageSettings != null) + iageThreshold = iageSettings.optDouble("urgent", 7*24); + JSONObject cageSettings = extendedSettings.optJSONObject("cage"); + if(cageSettings != null) + cageThreshold = cageSettings.optDouble("urgent", 3*24); +// log.debug("cageThreshold is "+cageThreshold); + JSONObject sageSettings = extendedSettings.optJSONObject("sage"); + if(sageSettings != null) + sageThreshold = sageSettings.optDouble("urgent", 7*24); +// } catch (JSONException e) { +// log.error("Unhandled exception", e); +// } String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan(7)){ + if(careportalEvent.isOlderThan( sageThreshold/24)){ sage.setTextColor(MainApp.sResources.getColor(R.color.low)); sage.setText(careportalEvent.age()); } else { @@ -231,7 +257,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (iage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan(5)){ + if(careportalEvent.isOlderThan(iageThreshold/24)){ iage.setTextColor(MainApp.sResources.getColor(R.color.low)); iage.setText(careportalEvent.age()); } else { @@ -245,7 +271,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (cage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); if (careportalEvent != null) { - if(careportalEvent.isOlderThan(3)){ + if(careportalEvent.isOlderThan(cageThreshold/24)){ cage.setTextColor(MainApp.sResources.getColor(R.color.low)); cage.setText(careportalEvent.age()); } else { @@ -259,7 +285,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (pbage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan(15)){ + if(careportalEvent.isOlderThan(pbageThreshold/24)){ pbage.setTextColor(MainApp.sResources.getColor(R.color.low)); pbage.setText(careportalEvent.age()); } else { From 2c42bad48dc33c6f99fef18c731f7a49edd91965 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 12:22:54 +0300 Subject: [PATCH 07/43] change name of threshold to days to clarify --- .../java/info/nightscout/androidaps/db/CareportalEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index 643b5d066c..7302475a4e 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -98,9 +98,9 @@ public class CareportalEvent implements DataPointWithLabelInterface { return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); } - public boolean isOlderThan(double threshold) { + public boolean isOlderThan(double days) { Map diff = computeDiff(date, System.currentTimeMillis()); - if(diff.get(TimeUnit.DAYS) > threshold) + if(diff.get(TimeUnit.DAYS) > days) return true; else return false; From 29bbc9dfec2442ad6d369cd3f2e5186b8622b1a6 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 14:52:52 +0300 Subject: [PATCH 08/43] added method to get iage,cage,sage --- .../data/NSSettingsStatus.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java index 3feced94cd..01ac520c38 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java @@ -170,6 +170,38 @@ public class NSSettingsStatus { } + // return JSONObject with the WARN and URGENT values of cage,sage and iage + // added pbage for pump battery warnings + public JSONObject getExtendedValues(){ + JSONObject extendedValues = new JSONObject(); // + JSONObject defaultSettings = new JSONObject(); + JSONObject extendedSettings = this.getExtendedSettings(); + // Thresholds in NS are in hours + try { + // Default + defaultSettings.put("urgent", 7*24D); + defaultSettings.put("warn", 5*24D); + + JSONObject iageSettings = extendedSettings.optJSONObject("iage") != null ? extendedSettings.optJSONObject("iage") : defaultSettings; + JSONObject cageSettings = extendedSettings.optJSONObject("cage") != null ? extendedSettings.optJSONObject("cage") : defaultSettings; + JSONObject sageSettings = extendedSettings.optJSONObject("sage") != null ? extendedSettings.optJSONObject("sage") : defaultSettings; + + extendedValues.put("cageUrgent", cageSettings.optDouble("urgent", 3 * 24)); + extendedValues.put("cageWarn", cageSettings.optDouble("warn", 2 * 24)); + extendedValues.put("sageUrgent", sageSettings.optDouble("urgent", 7 * 24)); + extendedValues.put("sageWarn", sageSettings.optDouble("warn", 7 * 24)); + extendedValues.put("iageUrgent", iageSettings.optDouble("urgent", 7 * 24)); + extendedValues.put("iageWarn", iageSettings.optDouble("warn", 5 * 24)); + extendedValues.put("pbageWarn", 240D); + extendedValues.put("pbageUrgent", 360D); + + } catch (JSONException e) { + log.error("Unhandled exception", e); + } + + return extendedValues; + } + public String getActiveProfile() { return getStringOrNull("activeProfile"); } From 5e418c5916f5e604006826996905f4bfe7514a74 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Apr 2018 14:55:29 +0300 Subject: [PATCH 09/43] adding color for warn levels of cage,sage... --- .../Careportal/CareportalFragment.java | 68 ++++++++++++------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index 160fb150ca..cabe074081 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -32,6 +32,8 @@ import info.nightscout.androidaps.plugins.Overview.OverviewFragment; import info.nightscout.utils.FabricPrivacy; public class CareportalFragment extends SubscriberFragment implements View.OnClickListener { + private static Logger log = LoggerFactory.getLogger(CareportalFragment.class); + TextView iage; TextView cage; TextView sage; @@ -218,34 +220,43 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli public void run() { CareportalEvent careportalEvent; NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); - JSONObject extendedSettings = nsSettings.getExtendedSettings(); + JSONObject extendedSettings = nsSettings.getExtendedValues(); + double iageUrgent = 7 * 24; + double iageWarn = 5 * 24; + double cageUrgent = 3 * 24; + double cageWarn = 2 * 24; + double sageUrgent = 7 * 24; + double sageWarn = 6 * 24; + double pbageUrgent = 10 * 24; + double pbageWarn = 15 * 24; + log.debug("Values from NSSettings "+extendedSettings.toString()); // Thresholds in NS are in hours - double iageThreshold = 7*24; - double cageThreshold = 3*24; - double sageThreshold = 7*24; - double pbageThreshold = 15*24; -// log.debug("NSExtendedSettings are "+extendedSettings.toString()); -// try { - JSONObject iageSettings = extendedSettings.optJSONObject("iage"); - if(iageSettings != null) - iageThreshold = iageSettings.optDouble("urgent", 7*24); - JSONObject cageSettings = extendedSettings.optJSONObject("cage"); - if(cageSettings != null) - cageThreshold = cageSettings.optDouble("urgent", 3*24); -// log.debug("cageThreshold is "+cageThreshold); - JSONObject sageSettings = extendedSettings.optJSONObject("sage"); - if(sageSettings != null) - sageThreshold = sageSettings.optDouble("urgent", 7*24); -// } catch (JSONException e) { -// log.error("Unhandled exception", e); -// } + try { + iageUrgent = extendedSettings.getDouble("iageUrgent"); + iageWarn = extendedSettings.getDouble("iageWarn"); + cageUrgent = extendedSettings.getDouble("cageUrgent"); + cageWarn = extendedSettings.getDouble("cageWarn"); + sageUrgent = extendedSettings.getDouble("sageUrgent"); + sageWarn = extendedSettings.getDouble("sageWarn"); + pbageUrgent = extendedSettings.getDouble("pbageUrgent"); + pbageWarn = extendedSettings.getDouble("pbageWarn"); + + } catch (JSONException e) { + log.error("Unhandled exception", e); + } + + + String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan( sageThreshold/24)){ + if(careportalEvent.isOlderThan( sageUrgent/24)){ sage.setTextColor(MainApp.sResources.getColor(R.color.low)); sage.setText(careportalEvent.age()); + } else if(careportalEvent.isOlderThan( sageWarn/24)){ + sage.setTextColor(MainApp.sResources.getColor(R.color.high)); + sage.setText(careportalEvent.age()); } else { sage.setText(careportalEvent.age()); } @@ -257,9 +268,12 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (iage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan(iageThreshold/24)){ + if(careportalEvent.isOlderThan(iageUrgent/24)){ iage.setTextColor(MainApp.sResources.getColor(R.color.low)); iage.setText(careportalEvent.age()); + } else if(careportalEvent.isOlderThan( iageWarn/24)) { + iage.setTextColor(MainApp.sResources.getColor(R.color.high)); + iage.setText(careportalEvent.age()); } else { iage.setText(careportalEvent.age()); } @@ -271,9 +285,12 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (cage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); if (careportalEvent != null) { - if(careportalEvent.isOlderThan(cageThreshold/24)){ + if(careportalEvent.isOlderThan(cageUrgent/24)){ cage.setTextColor(MainApp.sResources.getColor(R.color.low)); cage.setText(careportalEvent.age()); + } else if(careportalEvent.isOlderThan( cageWarn/24)) { + cage.setTextColor(MainApp.sResources.getColor(R.color.high)); + cage.setText(careportalEvent.age()); } else { cage.setText(careportalEvent.age()); } @@ -285,9 +302,12 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (pbage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan(pbageThreshold/24)){ + if(careportalEvent.isOlderThan(pbageUrgent/24)){ pbage.setTextColor(MainApp.sResources.getColor(R.color.low)); pbage.setText(careportalEvent.age()); + } else if(careportalEvent.isOlderThan( pbageWarn/24)) { + pbage.setTextColor(MainApp.sResources.getColor(R.color.high)); + pbage.setText(careportalEvent.age()); } else { pbage.setText(careportalEvent.age()); } From 8c303fd447c0d25879c121e480842f1ebc16b447 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 4 Apr 2018 14:55:25 +0200 Subject: [PATCH 10/43] notifications for oreo quickfix --- .../androidaps/plugins/Loop/LoopPlugin.java | 21 +++++++++++++++++- .../notifications/NotificationStore.java | 22 ++++++++++++++++++- .../PersistentNotificationPlugin.java | 20 ++++++++++++++++- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index fed92404e5..e29eda04dc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -1,11 +1,14 @@ package info.nightscout.androidaps.plugins.Loop; +import android.annotation.SuppressLint; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.support.v4.app.NotificationCompat; import com.crashlytics.android.answers.CustomEvent; @@ -48,6 +51,9 @@ import info.nightscout.utils.SP; public class LoopPlugin extends PluginBase { private static Logger log = LoggerFactory.getLogger(LoopPlugin.class); + public static final String CHANNEL_ID = "AndroidAPS-Openloop"; + + protected static LoopPlugin loopPlugin; public static LoopPlugin getPlugin() { @@ -90,9 +96,22 @@ public class LoopPlugin extends PluginBase { @Override protected void onStart() { MainApp.bus().register(this); + createNotificationChannel(); super.onStart(); } + private void createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + NotificationManager mNotificationManager = + (NotificationManager) MainApp.instance().getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); + @SuppressLint("WrongConstant") NotificationChannel channel = new NotificationChannel(CHANNEL_ID, + CHANNEL_ID, + NotificationManager.IMPORTANCE_HIGH); + mNotificationManager.createNotificationChannel(channel); + } + } + @Override protected void onStop() { super.onStop(); @@ -322,7 +341,7 @@ public class LoopPlugin extends PluginBase { } else { if (result.isChangeRequested() && allowNotification) { NotificationCompat.Builder builder = - new NotificationCompat.Builder(MainApp.instance().getApplicationContext()); + new NotificationCompat.Builder(MainApp.instance().getApplicationContext(), CHANNEL_ID); builder.setSmallIcon(R.drawable.notif_icon) .setContentTitle(MainApp.sResources.getString(R.string.openloop_newsuggestion)) .setContentText(resultAfterConstraints.toString()) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java index aa61b48097..a8c2a37891 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.plugins.Overview.notifications; +import android.annotation.SuppressLint; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; @@ -8,6 +10,7 @@ import android.graphics.BitmapFactory; import android.media.AudioAttributes; import android.media.RingtoneManager; import android.net.Uri; +import android.os.Build; import android.support.v4.app.NotificationCompat; import org.slf4j.Logger; @@ -28,11 +31,15 @@ import info.nightscout.utils.SP; */ public class NotificationStore { + + public static final String CHANNEL_ID = "AndroidAPS-Overview"; + private static Logger log = LoggerFactory.getLogger(NotificationStore.class); public List store = new ArrayList(); public long snoozedUntil = 0L; public NotificationStore() { + createNotificationChannel(); } public class NotificationComparator implements Comparator { @@ -110,7 +117,7 @@ public class NotificationStore { Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), R.mipmap.blueowl); Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(context) + new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setLargeIcon(largeIcon) .setContentText(n.text) @@ -127,4 +134,17 @@ public class NotificationStore { } mgr.notify(n.id, notificationBuilder.build()); } + + private void createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + NotificationManager mNotificationManager = + (NotificationManager) MainApp.instance().getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); + @SuppressLint("WrongConstant") NotificationChannel channel = new NotificationChannel(CHANNEL_ID, + CHANNEL_ID, + NotificationManager.IMPORTANCE_HIGH); + mNotificationManager.createNotificationChannel(channel); + } + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index ee04843080..789c9df143 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -1,11 +1,14 @@ package info.nightscout.androidaps.plugins.Persistentnotification; +import android.annotation.SuppressLint; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.Build; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; @@ -41,6 +44,8 @@ import info.nightscout.utils.DecimalFormatter; public class PersistentNotificationPlugin extends PluginBase { + public static final String CHANNEL_ID = "AndroidAPS-Ongoing"; + private static final int ONGOING_NOTIFICATION_ID = 4711; private final Context ctx; @@ -57,10 +62,23 @@ public class PersistentNotificationPlugin extends PluginBase { @Override protected void onStart() { MainApp.bus().register(this); + createNotificationChannel(); updateNotification(); super.onStart(); } + private void createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + NotificationManager mNotificationManager = + (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); + @SuppressLint("WrongConstant") NotificationChannel channel = new NotificationChannel(CHANNEL_ID, + CHANNEL_ID, + NotificationManager.IMPORTANCE_HIGH); + mNotificationManager.createNotificationChannel(channel); + } + } + @Override protected void onStop() { MainApp.bus().unregister(this); @@ -118,7 +136,7 @@ public class PersistentNotificationPlugin extends PluginBase { line3 += " - " + MainApp.getConfigBuilder().getProfileName(); - NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx); + NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID); builder.setOngoing(true); builder.setCategory(NotificationCompat.CATEGORY_STATUS); builder.setSmallIcon(R.drawable.ic_notification); From 16319aeb520c4f8ed6e570ff7bf45b1335451f2f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 4 Apr 2018 17:51:39 +0200 Subject: [PATCH 11/43] logging options --- app/src/main/java/info/nightscout/androidaps/Config.java | 1 - .../plugins/IobCobCalculator/IobCobThread.java | 6 ++++-- .../plugins/SensitivityAAPS/SensitivityAAPSPlugin.java | 9 ++++++--- .../plugins/SensitivityOref0/SensitivityOref0Plugin.java | 9 +++++++-- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/Config.java b/app/src/main/java/info/nightscout/androidaps/Config.java index babaccb2b1..bbd96a6c61 100644 --- a/app/src/main/java/info/nightscout/androidaps/Config.java +++ b/app/src/main/java/info/nightscout/androidaps/Config.java @@ -32,7 +32,6 @@ public class Config { public static final boolean logPumpComm = true; public static final boolean logPrefsChange = true; public static final boolean logConfigBuilder = true; - public static final boolean logConstraintsChanges = true; public static final boolean logNSUpload = true; public static final boolean logPumpActions = true; public static final boolean logCongigBuilderActions = true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java index da7d0fbbbd..1605ee8e10 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java @@ -155,7 +155,8 @@ public class IobCobThread extends Thread { AutosensData hourAgoData = iobCobCalculatorPlugin.getAutosensData(hourago); if (hourAgoData != null) { int initialIndex = autosensDataTable.indexOfKey(hourAgoData.time); - log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + "hourAgoData=" + hourAgoData.toString()); + if (Config.logAutosensData) + log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + "hourAgoData=" + hourAgoData.toString()); int past = 1; try { for (; past < 12; past++) { @@ -242,7 +243,8 @@ public class IobCobThread extends Thread { previous = autosensData; autosensDataTable.put(bgTime, autosensData); - log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime)); + if (Config.logAutosensData) + log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime)); autosensData.autosensRatio = iobCobCalculatorPlugin.detectSensitivity(oldestTimeWithData, bgTime).ratio; if (Config.logAutosensData) log.debug(autosensData.toString()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java index 6b072a3a17..0725823ac9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java @@ -30,7 +30,7 @@ import info.nightscout.utils.SafeParse; * Created by mike on 24.06.2017. */ -public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInterface{ +public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInterface { private static Logger log = LoggerFactory.getLogger(SensitivityAAPSPlugin.class); static SensitivityAAPSPlugin plugin = null; @@ -118,7 +118,9 @@ public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInte String ratioLimit = ""; String sensResult = ""; - log.debug("Records: " + index + " " + pastSensitivity); + if (Config.logAutosensData) + log.debug("Records: " + index + " " + pastSensitivity); + Arrays.sort(deviations); double percentile = IobCobCalculatorPlugin.percentile(deviations, 0.50); @@ -133,7 +135,8 @@ public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInte sensResult = "Sensitivity normal"; } - log.debug(sensResult); + if (Config.logAutosensData) + log.debug(sensResult); double rawRatio = ratio; ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java index 46e00427bf..842c4c83bc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java @@ -118,7 +118,9 @@ public class SensitivityOref0Plugin extends PluginBase implements SensitivityInt String ratioLimit = ""; String sensResult = ""; - log.debug("Records: " + index + " " + pastSensitivity); + if (Config.logAutosensData) + log.debug("Records: " + index + " " + pastSensitivity); + Arrays.sort(deviations); for (double i = 0.9; i > 0.1; i = i - 0.02) { @@ -140,7 +142,10 @@ public class SensitivityOref0Plugin extends PluginBase implements SensitivityInt } else { sensResult = "Sensitivity normal"; } - log.debug(sensResult); + + if (Config.logAutosensData) + log.debug(sensResult); + ratio = 1 + (basalOff / profile.getMaxDailyBasal()); double rawRatio = ratio; From c3bec7e7a6d273b5520dd0f2d266c3bc9bb76b8b Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 4 Apr 2018 21:38:44 +0200 Subject: [PATCH 12/43] Revert targetSdkVersion --- app/build.gradle | 8 +++----- wear/build.gradle | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 080422af46..d6119e8874 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,6 @@ apply plugin: 'com.jakewharton.butterknife' ext { supportLibraryVersion = "27.0.2" - sdkBuildVersion = "27.0.3" ormLiteVersion = "4.46" powermockVersion = "1.7.3" dexmakerVersion = "1.2" @@ -56,13 +55,12 @@ tasks.matching {it instanceof Test}.all { } android { - compileSdkVersion 27 - buildToolsVersion "${sdkBuildVersion}" + compileSdkVersion 26 defaultConfig { applicationId "info.nightscout.androidaps" minSdkVersion 21 - targetSdkVersion 27 + targetSdkVersion 25 multiDexEnabled true versionCode 1500 version "1.60c-dev" @@ -78,7 +76,7 @@ android { // TODO remove once wear dependency com.google.android.gms:play-services-wearable:7.3.0 // has been upgraded (requiring significant code changes), which currently fails release // build with a deprecation warning - // abortOnError false + abortOnError false // (disabled entirely to avoid reports on the error, which would still be displayed // and it's easy to overlook that it's ignored) checkReleaseBuilds false diff --git a/wear/build.gradle b/wear/build.gradle index e842aae62f..7d8863fe33 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -1,8 +1,7 @@ apply plugin: 'com.android.application' ext { - supportLibraryVersion = "23.0.1" - wearableVersion = "2.0.1" + wearableVersion = "2.0.1" } def generateGitBuild = { -> @@ -28,12 +27,11 @@ def generateGitBuild = { -> android { compileSdkVersion 23 - buildToolsVersion "27.0.3" defaultConfig { applicationId "info.nightscout.androidaps" - minSdkVersion 20 - targetSdkVersion 23 + minSdkVersion 21 + targetSdkVersion 25 versionCode 1 versionName "1.0.2" buildConfigField "String", "BUILDVERSION", generateGitBuild() From b7840fb5b5031731c3a4b03e64f3361f06273651 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 4 Apr 2018 21:44:23 +0200 Subject: [PATCH 13/43] Revert compileSdkVersion as well --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d6119e8874..a6a1c2434d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ tasks.matching {it instanceof Test}.all { } android { - compileSdkVersion 26 + compileSdkVersion 25 defaultConfig { applicationId "info.nightscout.androidaps" From 3e792ebfe3e3f584e225e4dd0ffb30f52e1087f0 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 4 Apr 2018 21:53:37 +0200 Subject: [PATCH 14/43] Downgrade supportLibVersion --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a6a1c2434d..99aeb35dd1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ apply plugin: "jacoco-android" apply plugin: 'com.jakewharton.butterknife' ext { - supportLibraryVersion = "27.0.2" + supportLibraryVersion = "25.4.0" ormLiteVersion = "4.46" powermockVersion = "1.7.3" dexmakerVersion = "1.2" From 79094a92f9b7bad89d85fe64cec7795f35ed3d35 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 4 Apr 2018 22:46:44 +0200 Subject: [PATCH 15/43] Provide newer support libraries, compile with 27 and target 25 --- app/build.gradle | 6 +++--- build.gradle | 2 +- wear/build.gradle | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 99aeb35dd1..72af0a8020 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ apply plugin: "jacoco-android" apply plugin: 'com.jakewharton.butterknife' ext { - supportLibraryVersion = "25.4.0" + supportLibraryVersion = "27.1.0" ormLiteVersion = "4.46" powermockVersion = "1.7.3" dexmakerVersion = "1.2" @@ -55,7 +55,7 @@ tasks.matching {it instanceof Test}.all { } android { - compileSdkVersion 25 + compileSdkVersion 27 defaultConfig { applicationId "info.nightscout.androidaps" @@ -181,7 +181,7 @@ dependencies { implementation("com.crashlytics.sdk.android:answers:1.3.12@aar") { transitive = true; } - libs 'MilosKozak:danars-support-lib:master@zip' + libs "MilosKozak:danars-support-lib:master@zip" implementation "com.android.support:appcompat-v7:${supportLibraryVersion}" implementation "com.android.support:support-v4:${supportLibraryVersion}" diff --git a/build.gradle b/build.gradle index 7cfd0f7ea4..b958e8ab96 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ buildscript { allprojects { repositories { - jcenter() google() + jcenter() maven { url "https://maven.google.com" diff --git a/wear/build.gradle b/wear/build.gradle index 7d8863fe33..aef05d79c4 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -26,7 +26,7 @@ def generateGitBuild = { -> } android { - compileSdkVersion 23 + compileSdkVersion 27 defaultConfig { applicationId "info.nightscout.androidaps" From d235fc0bfbb2f6b23652388d0a8b839aeaa52dac Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 00:08:59 +0200 Subject: [PATCH 16/43] show build flavor in about dialog --- app/src/main/java/info/nightscout/androidaps/MainActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index 0ae1e48775..956d2c46e6 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -403,7 +403,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe else builder.setIcon(R.mipmap.blueowl); String message = "Build: " + BuildConfig.BUILDVERSION + "\n"; - message += MainApp.sResources.getString(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName; + message += "Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + "\n"; + message += getString(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName; if (MainApp.engineeringMode) message += "\n" + MainApp.gs(R.string.engineering_mode_enabled); message += getString(R.string.about_link_urls); From 269382f5fffe2206efd6661f73b91986d12ade09 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Thu, 5 Apr 2018 09:37:20 +0300 Subject: [PATCH 17/43] Default values of CAGE, SAGE .. like in NS --- .../NSClientInternal/data/NSSettingsStatus.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java index 01ac520c38..93b2f6fd5d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java @@ -186,12 +186,12 @@ public class NSSettingsStatus { JSONObject cageSettings = extendedSettings.optJSONObject("cage") != null ? extendedSettings.optJSONObject("cage") : defaultSettings; JSONObject sageSettings = extendedSettings.optJSONObject("sage") != null ? extendedSettings.optJSONObject("sage") : defaultSettings; - extendedValues.put("cageUrgent", cageSettings.optDouble("urgent", 3 * 24)); - extendedValues.put("cageWarn", cageSettings.optDouble("warn", 2 * 24)); - extendedValues.put("sageUrgent", sageSettings.optDouble("urgent", 7 * 24)); - extendedValues.put("sageWarn", sageSettings.optDouble("warn", 7 * 24)); - extendedValues.put("iageUrgent", iageSettings.optDouble("urgent", 7 * 24)); - extendedValues.put("iageWarn", iageSettings.optDouble("warn", 5 * 24)); + extendedValues.put("cageUrgent", cageSettings.optDouble("urgent", 72)); + extendedValues.put("cageWarn", cageSettings.optDouble("warn", 48)); + extendedValues.put("sageUrgent", sageSettings.optDouble("urgent", 166)); + extendedValues.put("sageWarn", sageSettings.optDouble("warn", 164)); + extendedValues.put("iageUrgent", iageSettings.optDouble("urgent", 72)); + extendedValues.put("iageWarn", iageSettings.optDouble("warn", 48)); extendedValues.put("pbageWarn", 240D); extendedValues.put("pbageUrgent", 360D); From 6ace7080b26aaf5a8c2476928060c09c8f3cf710 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Thu, 5 Apr 2018 09:58:55 +0300 Subject: [PATCH 18/43] changed isOlderThan() parameter to hours not days --- .../java/info/nightscout/androidaps/db/CareportalEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index 7302475a4e..b0f69144c5 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -98,9 +98,9 @@ public class CareportalEvent implements DataPointWithLabelInterface { return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); } - public boolean isOlderThan(double days) { + public boolean isOlderThan(double hours) { Map diff = computeDiff(date, System.currentTimeMillis()); - if(diff.get(TimeUnit.DAYS) > days) + if(diff.get(TimeUnit.DAYS)*24 + diff.get(TimeUnit.HOURS) > hours) return true; else return false; From 934fedaa732203b4ea5a9fd270e57d54aebd42d6 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Thu, 5 Apr 2018 10:01:16 +0300 Subject: [PATCH 19/43] added determineTextColor() to shorten source --- .../Careportal/CareportalFragment.java | 76 +++++++------------ 1 file changed, 28 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index cabe074081..f88734d64a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.Careportal; import android.app.Activity; +import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; @@ -221,14 +222,15 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli CareportalEvent careportalEvent; NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); JSONObject extendedSettings = nsSettings.getExtendedValues(); - double iageUrgent = 7 * 24; - double iageWarn = 5 * 24; - double cageUrgent = 3 * 24; - double cageWarn = 2 * 24; - double sageUrgent = 7 * 24; - double sageWarn = 6 * 24; - double pbageUrgent = 10 * 24; - double pbageWarn = 15 * 24; + + double iageUrgent = 0; + double iageWarn = 0; + double cageUrgent = 0; + double cageWarn = 0; + double sageUrgent = 0; + double sageWarn = 0; + double pbageUrgent = 0; + double pbageWarn = 0; log.debug("Values from NSSettings "+extendedSettings.toString()); // Thresholds in NS are in hours try { @@ -251,16 +253,8 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan( sageUrgent/24)){ - sage.setTextColor(MainApp.sResources.getColor(R.color.low)); - sage.setText(careportalEvent.age()); - } else if(careportalEvent.isOlderThan( sageWarn/24)){ - sage.setTextColor(MainApp.sResources.getColor(R.color.high)); - sage.setText(careportalEvent.age()); - } else { - sage.setText(careportalEvent.age()); - } - + sage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, sageUrgent, sageWarn)); + sage.setText(careportalEvent.age()); } else { sage.setText(notavailable); } @@ -268,16 +262,8 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (iage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); if(careportalEvent != null) { - if(careportalEvent.isOlderThan(iageUrgent/24)){ - iage.setTextColor(MainApp.sResources.getColor(R.color.low)); - iage.setText(careportalEvent.age()); - } else if(careportalEvent.isOlderThan( iageWarn/24)) { - iage.setTextColor(MainApp.sResources.getColor(R.color.high)); - iage.setText(careportalEvent.age()); - } else { - iage.setText(careportalEvent.age()); - } - + iage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, iageUrgent, iageWarn)); + iage.setText(careportalEvent.age()); } else { iage.setText(notavailable); } @@ -285,33 +271,17 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli if (cage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); if (careportalEvent != null) { - if(careportalEvent.isOlderThan(cageUrgent/24)){ - cage.setTextColor(MainApp.sResources.getColor(R.color.low)); - cage.setText(careportalEvent.age()); - } else if(careportalEvent.isOlderThan( cageWarn/24)) { - cage.setTextColor(MainApp.sResources.getColor(R.color.high)); - cage.setText(careportalEvent.age()); - } else { - cage.setText(careportalEvent.age()); - } - + cage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, cageUrgent, cageWarn)); + cage.setText(careportalEvent.age()); } else { cage.setText(notavailable); } } if (pbage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); - if(careportalEvent != null) { - if(careportalEvent.isOlderThan(pbageUrgent/24)){ - pbage.setTextColor(MainApp.sResources.getColor(R.color.low)); + if (careportalEvent != null) { + pbage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, pbageUrgent, pbageWarn)); pbage.setText(careportalEvent.age()); - } else if(careportalEvent.isOlderThan( pbageWarn/24)) { - pbage.setTextColor(MainApp.sResources.getColor(R.color.high)); - pbage.setText(careportalEvent.age()); - } else { - pbage.setText(careportalEvent.age()); - } - } else { pbage.setText(notavailable); } @@ -322,5 +292,15 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli } } + public static int determineTextColor(CareportalEvent careportalEvent, double warnThreshold, double urgentThreshold){ + if(careportalEvent.isOlderThan(urgentThreshold)){ + return MainApp.sResources.getColor(R.color.low); + } else if(careportalEvent.isOlderThan( warnThreshold)) { + return MainApp.sResources.getColor(R.color.high); + } else { + return Color.WHITE; + } + + } } From f6cd1201e3f85bf035dcbfeceeb6f087998341c9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 09:39:18 +0200 Subject: [PATCH 20/43] Treatments refactor --- .../nightscout/androidaps/MainActivity.java | 4 +- .../androidaps/Services/DataService.java | 144 +++--- .../androidaps/db/DatabaseHelper.java | 286 +----------- .../androidaps/db/ExtendedBolus.java | 4 +- .../androidaps/db/TemporaryBasal.java | 2 +- .../androidaps/events/EventNsTreatment.java | 36 ++ .../events/EventTreatmentChange.java | 2 +- .../interfaces/InsulinInterface.java | 5 +- .../interfaces/TreatmentsInterface.java | 2 +- .../androidaps/plugins/Food/Food.java | 8 +- .../androidaps/plugins/Food/FoodService.java | 1 + .../plugins/Insulin/ActivityGraph.java | 2 +- .../Insulin/InsulinOrefBasePlugin.java | 2 +- .../IobCobCalculator/AutosensData.java | 3 +- .../IobCobCalculator/IobCobThread.java | 2 +- .../events/EventOverviewBolusProgress.java | 3 +- .../plugins/Overview/graphData/GraphData.java | 2 +- .../plugins/PumpCombo/ComboPlugin.java | 2 +- .../plugins/PumpDanaR/DanaRPlugin.java | 2 +- .../PumpDanaR/comm/MsgBolusProgress.java | 6 +- .../plugins/PumpDanaR/comm/MsgBolusStop.java | 4 +- .../AbstractDanaRExecutionService.java | 3 +- .../services/DanaRExecutionService.java | 2 +- .../PumpDanaRKorean/DanaRKoreanPlugin.java | 2 +- .../services/DanaRKoreanExecutionService.java | 2 +- .../plugins/PumpDanaRS/DanaRSPlugin.java | 2 +- ...naRS_Packet_Bolus_Set_Step_Bolus_Stop.java | 2 +- ...anaRS_Packet_Notify_Delivery_Complete.java | 2 +- ...S_Packet_Notify_Delivery_Rate_Display.java | 2 +- .../PumpDanaRS/services/DanaRSService.java | 2 +- .../plugins/PumpDanaRv2/DanaRv2Plugin.java | 2 +- .../services/DanaRv2ExecutionService.java | 2 +- .../plugins/PumpInsight/InsightPlugin.java | 2 +- .../SmsCommunicatorPlugin.java | 2 +- .../{db => plugins/Treatments}/Treatment.java | 43 +- .../plugins/Treatments/TreatmentService.java | 426 ++++++++++++++++++ .../plugins/Treatments/TreatmentsPlugin.java | 38 +- .../fragments/TreatmentsBolusFragment.java | 8 +- .../wearintegration/WatchUpdaterService.java | 2 +- .../java/info/nightscout/utils/DateUtil.java | 4 + .../info/nightscout/utils/JsonHelper.java | 54 ++- .../Insulin/InsulinOrefBasePluginTest.java | 2 +- .../nightscout/utils/BolusWizardTest.java | 1 - 43 files changed, 676 insertions(+), 451 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/events/EventNsTreatment.java rename app/src/main/java/info/nightscout/androidaps/{db => plugins/Treatments}/Treatment.java (75%) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index 0ae1e48775..188cbf393d 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -48,6 +48,7 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Food.FoodPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock; +import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.tabs.SlidingTabLayout; import info.nightscout.androidaps.tabs.TabPageAdapter; import info.nightscout.utils.ImportExportPrefs; @@ -378,7 +379,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe MainApp.getDbHelper().resetDatabases(); // should be handled by Plugin-Interface and // additional service interface and plugin registry - MainApp.getSpecificPlugin(FoodPlugin.class).getService().resetFood(); + FoodPlugin.getPlugin().getService().resetFood(); + TreatmentsPlugin.getPlugin().getService().resetTreatments(); } }) .create() diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java index 7a0193d65c..6a771fc4a1 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java @@ -19,6 +19,7 @@ import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.events.EventNsFood; +import info.nightscout.androidaps.events.EventNsTreatment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; @@ -40,6 +41,7 @@ import info.nightscout.androidaps.plugins.Source.SourceNSClientPlugin; import info.nightscout.androidaps.plugins.Source.SourceXdripPlugin; import info.nightscout.androidaps.receivers.DataReceiver; import info.nightscout.utils.BundleLogger; +import info.nightscout.utils.JsonHelper; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; @@ -382,19 +384,18 @@ public class DataService extends IntentService { if (intent.getAction().equals(Intents.ACTION_NEW_TREATMENT) || intent.getAction().equals(Intents.ACTION_CHANGED_TREATMENT)) { try { if (bundles.containsKey("treatment")) { - String trstring = bundles.getString("treatment"); - handleAddChangeDataFromNS(trstring); + JSONObject json = new JSONObject(bundles.getString("treatment")); + handleTreatmentFromNS(json, intent); } if (bundles.containsKey("treatments")) { String trstring = bundles.getString("treatments"); JSONArray jsonArray = new JSONArray(trstring); for (int i = 0; i < jsonArray.length(); i++) { - JSONObject trJson = jsonArray.getJSONObject(i); - String trstr = trJson.toString(); - handleAddChangeDataFromNS(trstr); + JSONObject json = jsonArray.getJSONObject(i); + handleTreatmentFromNS(json, intent); } } - } catch (Exception e) { + } catch (JSONException e) { log.error("Unhandled exception", e); } } @@ -403,21 +404,19 @@ public class DataService extends IntentService { try { if (bundles.containsKey("treatment")) { String trstring = bundles.getString("treatment"); - JSONObject trJson = new JSONObject(trstring); - String _id = trJson.getString("_id"); - handleRemovedRecordFromNS(_id); + JSONObject json = new JSONObject(trstring); + handleTreatmentFromNS(json); } if (bundles.containsKey("treatments")) { String trstring = bundles.getString("treatments"); JSONArray jsonArray = new JSONArray(trstring); for (int i = 0; i < jsonArray.length(); i++) { - JSONObject trJson = jsonArray.getJSONObject(i); - String _id = trJson.getString("_id"); - handleRemovedRecordFromNS(_id); + JSONObject json = jsonArray.getJSONObject(i); + handleTreatmentFromNS(json); } } - } catch (Exception e) { + } catch (JSONException e) { log.error("Unhandled exception", e); } } @@ -489,8 +488,12 @@ public class DataService extends IntentService { } } - private void handleRemovedRecordFromNS(String _id) { - MainApp.getDbHelper().deleteTreatmentById(_id); + private void handleTreatmentFromNS(JSONObject json) { + // new DB model + EventNsTreatment evtTreatment = new EventNsTreatment(EventNsTreatment.REMOVE, json); + MainApp.bus().post(evtTreatment); + // old DB model + String _id = JsonHelper.safeGetString(json, "_id"); MainApp.getDbHelper().deleteTempTargetById(_id); MainApp.getDbHelper().deleteTempBasalById(_id); MainApp.getDbHelper().deleteExtendedBolusById(_id); @@ -498,86 +501,53 @@ public class DataService extends IntentService { MainApp.getDbHelper().deleteProfileSwitchById(_id); } - private void handleAddChangeDataFromNS(String trstring) throws JSONException { - JSONObject trJson = new JSONObject(trstring); - handleDanaRHistoryRecords(trJson); // update record _id in history - handleAddChangeTempTargetRecord(trJson); - handleAddChangeTempBasalRecord(trJson); - handleAddChangeExtendedBolusRecord(trJson); - handleAddChangeCareportalEventRecord(trJson); - handleAddChangeTreatmentRecord(trJson); - handleAddChangeProfileSwitchRecord(trJson); - } - - public void handleDanaRHistoryRecords(JSONObject trJson) { - if (trJson.has(DanaRNSHistorySync.DANARSIGNATURE)) { - MainApp.getDbHelper().updateDanaRHistoryRecordId(trJson); - } - } - - public void handleAddChangeTreatmentRecord(JSONObject trJson) throws JSONException { - if (trJson.has("insulin") || trJson.has("carbs")) { - MainApp.getDbHelper().createTreatmentFromJsonIfNotExists(trJson); - return; - } - } - - public void handleAddChangeTempTargetRecord(JSONObject trJson) throws JSONException { - if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.TEMPORARYTARGET)) { - MainApp.getDbHelper().createTemptargetFromJsonIfNotExists(trJson); - } - } - - public void handleAddChangeTempBasalRecord(JSONObject trJson) throws JSONException { - if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.TEMPBASAL)) { - MainApp.getDbHelper().createTempBasalFromJsonIfNotExists(trJson); - } - } - - public void handleAddChangeExtendedBolusRecord(JSONObject trJson) throws JSONException { - if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.COMBOBOLUS)) { - MainApp.getDbHelper().createExtendedBolusFromJsonIfNotExists(trJson); - } - } - - public void handleAddChangeCareportalEventRecord(JSONObject trJson) throws JSONException { - if (trJson.has("insulin") && trJson.getDouble("insulin") > 0) - return; - if (trJson.has("carbs") && trJson.getDouble("carbs") > 0) - return; - if (trJson.has("eventType") && ( - trJson.getString("eventType").equals(CareportalEvent.SITECHANGE) || - trJson.getString("eventType").equals(CareportalEvent.INSULINCHANGE) || - trJson.getString("eventType").equals(CareportalEvent.SENSORCHANGE) || - trJson.getString("eventType").equals(CareportalEvent.BGCHECK) || - trJson.getString("eventType").equals(CareportalEvent.NOTE) || - trJson.getString("eventType").equals(CareportalEvent.NONE) || - trJson.getString("eventType").equals(CareportalEvent.ANNOUNCEMENT) || - trJson.getString("eventType").equals(CareportalEvent.QUESTION) || - trJson.getString("eventType").equals(CareportalEvent.EXERCISE) || - trJson.getString("eventType").equals(CareportalEvent.OPENAPSOFFLINE) || - trJson.getString("eventType").equals(CareportalEvent.PUMPBATTERYCHANGE) - )) { - MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(trJson); + private void handleTreatmentFromNS(JSONObject json, Intent intent) throws JSONException { + // new DB model + int mode = Intents.ACTION_NEW_TREATMENT.equals(intent.getAction()) ? EventNsTreatment.ADD : EventNsTreatment.UPDATE; + double insulin = JsonHelper.safeGetDouble(json, "insulin"); + double carbs = JsonHelper.safeGetDouble(json, "carbs"); + String eventType = JsonHelper.safeGetString(json, "eventType"); + if (insulin > 0 || carbs > 0) { + EventNsTreatment evtTreatment = new EventNsTreatment(mode, json); + MainApp.bus().post(evtTreatment); + } else if (json.has(DanaRNSHistorySync.DANARSIGNATURE)) { + // old DB model + MainApp.getDbHelper().updateDanaRHistoryRecordId(json); + } else if (eventType.equals(CareportalEvent.TEMPORARYTARGET)) { + MainApp.getDbHelper().createTemptargetFromJsonIfNotExists(json); + } else if (eventType.equals(CareportalEvent.TEMPBASAL)) { + MainApp.getDbHelper().createTempBasalFromJsonIfNotExists(json); + } else if (eventType.equals(CareportalEvent.COMBOBOLUS)) { + MainApp.getDbHelper().createExtendedBolusFromJsonIfNotExists(json); + } else if (eventType.equals(CareportalEvent.PROFILESWITCH)) { + MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(json); + } else if (eventType.equals(CareportalEvent.SITECHANGE) || + eventType.equals(CareportalEvent.INSULINCHANGE) || + eventType.equals(CareportalEvent.SENSORCHANGE) || + eventType.equals(CareportalEvent.BGCHECK) || + eventType.equals(CareportalEvent.NOTE) || + eventType.equals(CareportalEvent.NONE) || + eventType.equals(CareportalEvent.ANNOUNCEMENT) || + eventType.equals(CareportalEvent.QUESTION) || + eventType.equals(CareportalEvent.EXERCISE) || + eventType.equals(CareportalEvent.OPENAPSOFFLINE) || + eventType.equals(CareportalEvent.PUMPBATTERYCHANGE)) { + MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(json); } - if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.ANNOUNCEMENT)) { - long date = trJson.getLong("mills"); + if (eventType.equals(CareportalEvent.ANNOUNCEMENT)) { + long date = JsonHelper.safeGetLong(json,"mills"); long now = System.currentTimeMillis(); - if (date > now - 15 * 60 * 1000L && trJson.has("notes") - && !(trJson.has("enteredBy") && trJson.getString("enteredBy").equals(SP.getString("careportal_enteredby", "AndroidAPS")))) { - Notification announcement = new Notification(Notification.NSANNOUNCEMENT, trJson.getString("notes"), Notification.ANNOUNCEMENT, 60); + String enteredBy = JsonHelper.safeGetString(json, "enteredBy", ""); + String notes = JsonHelper.safeGetString(json, "notes", ""); + if (date > now - 15 * 60 * 1000L && !notes.isEmpty() + && !enteredBy.equals(SP.getString("careportal_enteredby", "AndroidAPS"))) { + Notification announcement = new Notification(Notification.NSANNOUNCEMENT, notes, Notification.ANNOUNCEMENT, 60); MainApp.bus().post(new EventNewNotification(announcement)); } } } - public void handleAddChangeProfileSwitchRecord(JSONObject trJson) throws JSONException { - if (trJson.has("eventType") && trJson.getString("eventType").equals(CareportalEvent.PROFILESWITCH)) { - MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(trJson); - } - } - private void handleNewSMS(Intent intent) { Bundle bundle = intent.getExtras(); if (bundle == null) return; diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index b1349e1761..7c7b373414 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -28,9 +28,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import info.nightscout.androidaps.Config; -import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.events.EventCareportalEventChange; @@ -43,15 +41,10 @@ import info.nightscout.androidaps.events.EventReloadTempBasalData; import info.nightscout.androidaps.events.EventReloadTreatmentData; import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTempTargetChange; -import info.nightscout.androidaps.events.EventTreatmentChange; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData; -import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; -import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRNSHistorySync; import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin; -import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.PercentageSplitter; import info.nightscout.utils.ToastUtils; @@ -72,7 +65,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public static final String DATABASE_TEMPORARYBASALS = "TemporaryBasals"; public static final String DATABASE_EXTENDEDBOLUSES = "ExtendedBoluses"; public static final String DATABASE_TEMPTARGETS = "TempTargets"; - public static final String DATABASE_TREATMENTS = "Treatments"; public static final String DATABASE_DANARHISTORY = "DanaRHistory"; public static final String DATABASE_DBREQUESTS = "DBRequests"; public static final String DATABASE_CAREPORTALEVENTS = "CareportalEvents"; @@ -81,14 +73,11 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final int DATABASE_VERSION = 8; - private static Long earliestDataChange = null; + public static Long earliestDataChange = null; private static final ScheduledExecutorService bgWorker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledBgPost = null; - private static final ScheduledExecutorService treatmentsWorker = Executors.newSingleThreadScheduledExecutor(); - private static ScheduledFuture scheduledTratmentPost = null; - private static final ScheduledExecutorService tempBasalsWorker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledTemBasalsPost = null; @@ -118,7 +107,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { try { log.info("onCreate"); TableUtils.createTableIfNotExists(connectionSource, TempTarget.class); - TableUtils.createTableIfNotExists(connectionSource, Treatment.class); TableUtils.createTableIfNotExists(connectionSource, BgReading.class); TableUtils.createTableIfNotExists(connectionSource, DanaRHistoryRecord.class); TableUtils.createTableIfNotExists(connectionSource, DbRequest.class); @@ -141,12 +129,9 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { if (oldVersion == 7 && newVersion == 8) { log.debug("Upgrading database from v7 to v8"); - TableUtils.dropTable(connectionSource, Treatment.class, true); - TableUtils.createTableIfNotExists(connectionSource, Treatment.class); } else { log.info(DatabaseHelper.class.getName(), "onUpgrade"); TableUtils.dropTable(connectionSource, TempTarget.class, true); - TableUtils.dropTable(connectionSource, Treatment.class, true); TableUtils.dropTable(connectionSource, BgReading.class, true); TableUtils.dropTable(connectionSource, DanaRHistoryRecord.class, true); TableUtils.dropTable(connectionSource, DbRequest.class, true); @@ -178,40 +163,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { super.close(); } - public void cleanUpDatabases() { - // TODO: call it somewhere - log.debug("Before BgReadings size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_BGREADINGS)); - getWritableDatabase().delete(DATABASE_BGREADINGS, "date" + " < '" + (System.currentTimeMillis() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) + "'", null); - log.debug("After BgReadings size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_BGREADINGS)); - - log.debug("Before TempTargets size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPTARGETS)); - getWritableDatabase().delete(DATABASE_TEMPTARGETS, "date" + " < '" + (System.currentTimeMillis() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) + "'", null); - log.debug("After TempTargets size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPTARGETS)); - - log.debug("Before Treatments size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TREATMENTS)); - getWritableDatabase().delete(DATABASE_TREATMENTS, "date" + " < '" + (System.currentTimeMillis() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) + "'", null); - log.debug("After Treatments size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TREATMENTS)); - - log.debug("Before History size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_DANARHISTORY)); - getWritableDatabase().delete(DATABASE_DANARHISTORY, "recordDate" + " < '" + (System.currentTimeMillis() - Constants.daysToKeepHistoryInDatabase * 24 * 60 * 60 * 1000L) + "'", null); - log.debug("After History size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_DANARHISTORY)); - - log.debug("Before TemporaryBasals size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPORARYBASALS)); - getWritableDatabase().delete(DATABASE_TEMPORARYBASALS, "recordDate" + " < '" + (System.currentTimeMillis() - Constants.daysToKeepHistoryInDatabase * 24 * 60 * 60 * 1000L) + "'", null); - log.debug("After TemporaryBasals size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPORARYBASALS)); - - log.debug("Before ExtendedBoluses size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_EXTENDEDBOLUSES)); - getWritableDatabase().delete(DATABASE_EXTENDEDBOLUSES, "recordDate" + " < '" + (System.currentTimeMillis() - Constants.daysToKeepHistoryInDatabase * 24 * 60 * 60 * 1000L) + "'", null); - log.debug("After ExtendedBoluses size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_EXTENDEDBOLUSES)); - - log.debug("Before CareportalEvent size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_CAREPORTALEVENTS)); - getWritableDatabase().delete(DATABASE_CAREPORTALEVENTS, "recordDate" + " < '" + (System.currentTimeMillis() - Constants.daysToKeepHistoryInDatabase * 24 * 60 * 60 * 1000L) + "'", null); - log.debug("After CareportalEvent size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_CAREPORTALEVENTS)); - - log.debug("Before ProfileSwitch size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_PROFILESWITCHES)); - getWritableDatabase().delete(DATABASE_PROFILESWITCHES, "recordDate" + " < '" + (System.currentTimeMillis() - Constants.daysToKeepHistoryInDatabase * 24 * 60 * 60 * 1000L) + "'", null); - log.debug("After ProfileSwitch size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_PROFILESWITCHES)); - } public long size(String database) { return DatabaseUtils.queryNumEntries(getReadableDatabase(), database); @@ -222,7 +173,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void resetDatabases() { try { TableUtils.dropTable(connectionSource, TempTarget.class, true); - TableUtils.dropTable(connectionSource, Treatment.class, true); TableUtils.dropTable(connectionSource, BgReading.class, true); TableUtils.dropTable(connectionSource, DanaRHistoryRecord.class, true); TableUtils.dropTable(connectionSource, DbRequest.class, true); @@ -232,7 +182,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.dropTable(connectionSource, ProfileSwitch.class, true); TableUtils.dropTable(connectionSource, TDD.class, true); TableUtils.createTableIfNotExists(connectionSource, TempTarget.class); - TableUtils.createTableIfNotExists(connectionSource, Treatment.class); TableUtils.createTableIfNotExists(connectionSource, BgReading.class); TableUtils.createTableIfNotExists(connectionSource, DanaRHistoryRecord.class); TableUtils.createTableIfNotExists(connectionSource, DbRequest.class); @@ -248,7 +197,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { VirtualPumpPlugin.setFakingStatus(true); scheduleBgChange(null); // trigger refresh scheduleTemporaryBasalChange(); - scheduleTreatmentChange(null); scheduleExtendedBolusChange(); scheduleTemporaryTargetChange(); scheduleCareportalEventChange(); @@ -264,17 +212,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { ); } - public void resetTreatments() { - try { - TableUtils.dropTable(connectionSource, Treatment.class, true); - TableUtils.createTableIfNotExists(connectionSource, Treatment.class); - updateEarliestDataChange(0); - } catch (SQLException e) { - log.error("Unhandled exception", e); - } - scheduleTreatmentChange(null); - } - public void resetTempTargets() { try { TableUtils.dropTable(connectionSource, TempTarget.class, true); @@ -343,11 +280,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return getDao(TempTarget.class); } - private Dao getDaoTreatments() throws SQLException { - return getDao(Treatment.class); - } - - private Dao getDaoBgReadings() throws SQLException { + private Dao getDaoBgReadings() throws SQLException { return getDao(BgReading.class); } @@ -379,7 +312,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return getDao(ProfileSwitch.class); } - public long roundDateToSec(long date) { + public static long roundDateToSec(long date) { return date - date % 1000; } // ------------------- BgReading handling ----------------------- @@ -604,147 +537,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { // -------------------- TREATMENT HANDLING ------------------- - // return true if new record is created - public boolean createOrUpdate(Treatment treatment) { - try { - Treatment old; - treatment.date = roundDateToSec(treatment.date); - - if (treatment.source == Source.PUMP) { - // check for changed from pump change in NS - QueryBuilder queryBuilder = getDaoTreatments().queryBuilder(); - Where where = queryBuilder.where(); - where.eq("pumpId", treatment.pumpId); - PreparedQuery preparedQuery = queryBuilder.prepare(); - List trList = getDaoTreatments().query(preparedQuery); - if (trList.size() > 0) { - // do nothing, pump history record cannot be changed - log.debug("TREATMENT: Pump record already found in database: " + treatment.toString()); - return false; - } - getDaoTreatments().create(treatment); - log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString()); - updateEarliestDataChange(treatment.date); - scheduleTreatmentChange(treatment); - return true; - } - if (treatment.source == Source.NIGHTSCOUT) { - old = getDaoTreatments().queryForId(treatment.date); - if (old != null) { - if (!old.isEqual(treatment)) { - boolean historyChange = old.isDataChanging(treatment); - long oldDate = old.date; - getDaoTreatments().delete(old); // need to delete/create because date may change too - old.copyFrom(treatment); - getDaoTreatments().create(old); - log.debug("TREATMENT: Updating record by date from: " + Source.getString(treatment.source) + " " + old.toString()); - if (historyChange) { - updateEarliestDataChange(oldDate); - updateEarliestDataChange(old.date); - } - scheduleTreatmentChange(treatment); - return true; - } - return false; - } - // find by NS _id - if (treatment._id != null) { - QueryBuilder queryBuilder = getDaoTreatments().queryBuilder(); - Where where = queryBuilder.where(); - where.eq("_id", treatment._id); - PreparedQuery preparedQuery = queryBuilder.prepare(); - List trList = getDaoTreatments().query(preparedQuery); - if (trList.size() > 0) { - old = trList.get(0); - if (!old.isEqual(treatment)) { - boolean historyChange = old.isDataChanging(treatment); - long oldDate = old.date; - getDaoTreatments().delete(old); // need to delete/create because date may change too - old.copyFrom(treatment); - getDaoTreatments().create(old); - log.debug("TREATMENT: Updating record by _id from: " + Source.getString(treatment.source) + " " + old.toString()); - if (historyChange) { - updateEarliestDataChange(oldDate); - updateEarliestDataChange(old.date); - } - scheduleTreatmentChange(treatment); - return true; - } - } - } - getDaoTreatments().create(treatment); - log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString()); - updateEarliestDataChange(treatment.date); - scheduleTreatmentChange(treatment); - return true; - } - if (treatment.source == Source.USER) { - getDaoTreatments().create(treatment); - log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString()); - updateEarliestDataChange(treatment.date); - scheduleTreatmentChange(treatment); - return true; - } - } catch (SQLException e) { - log.error("Unhandled exception", e); - } - return false; - } - - public void delete(Treatment treatment) { - try { - getDaoTreatments().delete(treatment); - updateEarliestDataChange(treatment.date); - } catch (SQLException e) { - log.error("Unhandled exception", e); - } - scheduleTreatmentChange(treatment); - } - - public void update(Treatment treatment) { - try { - getDaoTreatments().update(treatment); - updateEarliestDataChange(treatment.date); - } catch (SQLException e) { - log.error("Unhandled exception", e); - } - scheduleTreatmentChange(treatment); - } - - public void deleteTreatmentById(String _id) { - Treatment stored = findTreatmentById(_id); - if (stored != null) { - log.debug("TREATMENT: Removing Treatment record from database: " + stored.toString()); - delete(stored); - updateEarliestDataChange(stored.date); - scheduleTreatmentChange(null); - } - } - - @Nullable - private Treatment findTreatmentById(String _id) { - try { - Dao daoTreatments = getDaoTreatments(); - QueryBuilder queryBuilder = daoTreatments.queryBuilder(); - Where where = queryBuilder.where(); - where.eq("_id", _id); - queryBuilder.limit(10L); - PreparedQuery preparedQuery = queryBuilder.prepare(); - List trList = daoTreatments.query(preparedQuery); - if (trList.size() != 1) { - //log.debug("Treatment findTreatmentById query size: " + trList.size()); - return null; - } else { - //log.debug("Treatment findTreatmentById found: " + trList.get(0).log()); - return trList.get(0); - } - } catch (SQLException e) { - log.error("Unhandled exception", e); - } - return null; - } - - private void updateEarliestDataChange(long newDate) { + public static void updateEarliestDataChange(long newDate) { if (earliestDataChange == null) { earliestDataChange = newDate; return; @@ -754,73 +547,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { } } - private static void scheduleTreatmentChange(@Nullable final Treatment treatment) { - class PostRunnable implements Runnable { - public void run() { - log.debug("Firing EventTreatmentChange"); - MainApp.bus().post(new EventReloadTreatmentData(new EventTreatmentChange(treatment))); - if (earliestDataChange != null) - MainApp.bus().post(new EventNewHistoryData(earliestDataChange)); - earliestDataChange = null; - scheduledTratmentPost = null; - } - } - // prepare task for execution in 1 sec - // cancel waiting task to prevent sending multiple posts - if (scheduledTratmentPost != null) - scheduledTratmentPost.cancel(false); - Runnable task = new PostRunnable(); - final int sec = 1; - scheduledTratmentPost = treatmentsWorker.schedule(task, sec, TimeUnit.SECONDS); - - } - - public List getTreatmentDataFromTime(long mills, boolean ascending) { - try { - Dao daoTreatments = getDaoTreatments(); - List treatments; - QueryBuilder queryBuilder = daoTreatments.queryBuilder(); - queryBuilder.orderBy("date", ascending); - Where where = queryBuilder.where(); - where.ge("date", mills); - PreparedQuery preparedQuery = queryBuilder.prepare(); - treatments = daoTreatments.query(preparedQuery); - return treatments; - } catch (SQLException e) { - log.error("Unhandled exception", e); - } - return new ArrayList(); - } - - public void createTreatmentFromJsonIfNotExists(JSONObject trJson) { - try { - Treatment treatment = new Treatment(); - treatment.source = Source.NIGHTSCOUT; - treatment.date = roundDateToSec(trJson.getLong("mills")); - treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0; - treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d; - treatment.pumpId = trJson.has("pumpId") ? trJson.getLong("pumpId") : 0; - treatment._id = trJson.getString("_id"); - if (trJson.has("isSMB")) - treatment.isSMB = trJson.getBoolean("isSMB"); - if (trJson.has("eventType")) { - treatment.mealBolus = !trJson.get("eventType").equals("Correction Bolus"); - double carbs = treatment.carbs; - if (trJson.has("boluscalc")) { - JSONObject boluscalc = trJson.getJSONObject("boluscalc"); - if (boluscalc.has("carbs")) { - carbs = Math.max(boluscalc.getDouble("carbs"), carbs); - } - } - if (carbs <= 0) - treatment.mealBolus = false; - } - createOrUpdate(treatment); - } catch (JSONException e) { - log.error("Unhandled exception", e); - } - } - // ---------------- TempTargets handling --------------- public List getTemptargetsDataFromTime(long mills, boolean ascending) { @@ -1557,7 +1283,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void deleteCareportalEventById(String _id) { try { - QueryBuilder queryBuilder = null; + QueryBuilder queryBuilder; queryBuilder = getDaoCareportalEvents().queryBuilder(); Where where = queryBuilder.where(); where.eq("_id", _id); @@ -1580,7 +1306,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void createCareportalEventFromJsonIfNotExists(JSONObject trJson) { try { - QueryBuilder queryBuilder = null; + QueryBuilder queryBuilder; queryBuilder = getDaoCareportalEvents().queryBuilder(); Where where = queryBuilder.where(); where.eq("_id", trJson.getString("_id")).or().eq("date", trJson.getLong("mills")); diff --git a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java index 7bd60fe496..8e7022b609 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java @@ -12,19 +12,17 @@ import com.j256.ormlite.table.DatabaseTable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Date; import java.util.Objects; import info.nightscout.androidaps.Constants; -import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.interfaces.Interval; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface; import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.Round; diff --git a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java index e2303bac53..0747669538 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java @@ -6,7 +6,6 @@ import com.j256.ormlite.table.DatabaseTable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Date; import java.util.Objects; import info.nightscout.androidaps.MainApp; @@ -17,6 +16,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.interfaces.Interval; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SP; diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventNsTreatment.java b/app/src/main/java/info/nightscout/androidaps/events/EventNsTreatment.java new file mode 100644 index 0000000000..2c5ba6c9c0 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/events/EventNsTreatment.java @@ -0,0 +1,36 @@ +package info.nightscout.androidaps.events; + +import org.json.JSONObject; + + +/** + * Event which is published with data fetched from NightScout specific for the + * Treatment-class. + *

+ * Payload is the from NS retrieved JSON-String which should be handled by all + * subscriber. + */ + +public class EventNsTreatment extends Event { + + public static final int ADD = 0; + public static final int UPDATE = 1; + public static final int REMOVE = 2; + + private final int mode; + + private final JSONObject payload; + + public EventNsTreatment(int mode, JSONObject payload) { + this.mode = mode; + this.payload = payload; + } + + public int getMode() { + return mode; + } + + public JSONObject getPayload() { + return payload; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventTreatmentChange.java b/app/src/main/java/info/nightscout/androidaps/events/EventTreatmentChange.java index 2a3581f9bf..989b24b7f9 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventTreatmentChange.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventTreatmentChange.java @@ -2,7 +2,7 @@ package info.nightscout.androidaps.events; import android.support.annotation.Nullable; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; /** * Created by mike on 04.06.2016. diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java index f7be6883e9..a123554ae8 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/InsulinInterface.java @@ -1,10 +1,7 @@ package info.nightscout.androidaps.interfaces; -import java.util.Date; - import info.nightscout.androidaps.data.Iob; -import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; /** * Created by mike on 17.04.2017. diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java index 129e54b50b..f93dbdf5fe 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java @@ -9,7 +9,7 @@ import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.ProfileIntervals; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/Food.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/Food.java index 5506d32471..49da1d6ac5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/Food.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/Food.java @@ -5,8 +5,6 @@ import com.j256.ormlite.table.DatabaseTable; import org.json.JSONException; import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Objects; @@ -18,9 +16,7 @@ import info.nightscout.utils.JsonHelper; @DatabaseTable(tableName = Food.TABLE_FOODS) public class Food { - private static Logger log = LoggerFactory.getLogger(Food.class); - - public static final String TABLE_FOODS = "Foods"; + static final String TABLE_FOODS = "Foods"; @DatabaseField(id = true) public long key; @@ -65,7 +61,7 @@ public class Food { @DatabaseField public int gi; // not used yet - public Food() { + private Food() { key = System.currentTimeMillis(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java index c3028461ec..44b96850ae 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java @@ -347,6 +347,7 @@ public class FoodService extends OrmLiteBaseService { * @param _id * @return */ + @Nullable public Food findByNSId(String _id) { try { List list = this.getDao().queryForEq("_id", _id); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/ActivityGraph.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/ActivityGraph.java index 5a0d7fcce9..8bbd1d3e7f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/ActivityGraph.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/ActivityGraph.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import info.nightscout.androidaps.data.Iob; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.InsulinInterface; /** diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java index cf56452bcc..672c5cfeb6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java @@ -5,7 +5,7 @@ import com.squareup.otto.Bus; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Iob; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java index 42a2b35490..397656306b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java @@ -10,8 +10,7 @@ import java.util.List; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.db.Treatment; -import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java index da7d0fbbbd..0a9fbb75e7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java @@ -20,7 +20,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java index 18c3ff1e27..6f9526369e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java @@ -3,8 +3,7 @@ package info.nightscout.androidaps.plugins.Overview.events; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.Event; public class EventOverviewBolusProgress extends Event { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 7d1cd07b69..a017f31209 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -23,7 +23,7 @@ import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.TempTarget; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.BasalData; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 43d855dab1..b25e6d3b4a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -28,7 +28,7 @@ import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TDD; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.interfaces.Constraint; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index ee0f33b281..df8dea6178 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -18,7 +18,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.Constraint; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java index b200ccc5c1..79358526fa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java @@ -1,16 +1,12 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm; -import com.squareup.otto.Bus; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Date; - import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; public class MsgBolusProgress extends MessageBase { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java index 7040b84183..6718d76194 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java @@ -1,13 +1,11 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm; -import com.squareup.otto.Bus; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; public class MsgBolusStop extends MessageBase { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java index 4727e2650f..5524cf5c5c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java @@ -21,10 +21,9 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; -import info.nightscout.androidaps.plugins.PumpDanaR.SerialIOThread; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStop; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgHistoryAlarm; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java index 4bf080f3fb..eabf4fc94a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java @@ -18,7 +18,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventPreferenceChange; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index 212eb95dcd..61851561ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -18,7 +18,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.Constraint; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java index 12d7590a59..c136666d5e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java @@ -18,7 +18,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventPreferenceChange; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index 17bc4671ce..a8e460c078 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -26,7 +26,7 @@ import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.ConstraintsInterface; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java index 5383fca413..83e84e28cc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java @@ -9,7 +9,7 @@ import info.nightscout.androidaps.R; import com.cozmo.danar.util.BleCommandUtil; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; public class DanaRS_Packet_Bolus_Set_Step_Bolus_Stop extends DanaRS_Packet { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java index 0139b12197..fb5793995c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java @@ -9,7 +9,7 @@ import info.nightscout.androidaps.R; import com.cozmo.danar.util.BleCommandUtil; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; public class DanaRS_Packet_Notify_Delivery_Complete extends DanaRS_Packet { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java index 26c12c27af..5354836375 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java @@ -7,7 +7,7 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import com.cozmo.danar.util.BleCommandUtil; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; public class DanaRS_Packet_Notify_Delivery_Rate_Display extends DanaRS_Packet { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java index 489864ebd1..dd7f22b0b1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java @@ -19,7 +19,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventPumpStatusChanged; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index 5d7eae2091..765ef865cf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -17,7 +17,7 @@ import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PumpDescription; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 1eb73a500a..27b1275047 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -18,7 +18,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventPreferenceChange; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java index 4ad70cfc31..f94ff4d3ff 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java @@ -21,7 +21,7 @@ import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.ConstraintsInterface; import info.nightscout.androidaps.interfaces.PluginBase; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java index b6c8ebca33..8308a2eb92 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java @@ -315,7 +315,7 @@ public class SmsCommunicatorPlugin extends PluginBase { switch (splited[1].toUpperCase()) { case "REFRESH": Intent restartNSClient = new Intent(Intents.ACTION_RESTART); - MainApp.getDbHelper().resetTreatments(); + TreatmentsPlugin.getPlugin().getService().resetTreatments(); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0); reply = "TERATMENTS REFRESH " + q.size() + " receivers"; diff --git a/app/src/main/java/info/nightscout/androidaps/db/Treatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java similarity index 75% rename from app/src/main/java/info/nightscout/androidaps/db/Treatment.java rename to app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java index 31df191387..31d44a3e30 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/Treatment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java @@ -1,10 +1,12 @@ -package info.nightscout.androidaps.db; +package info.nightscout.androidaps.plugins.Treatments; import android.graphics.Color; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import org.json.JSONException; +import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,6 +16,8 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Iob; +import info.nightscout.androidaps.db.DatabaseHelper; +import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; @@ -21,11 +25,14 @@ import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWith import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; +import info.nightscout.utils.JsonHelper; -@DatabaseTable(tableName = DatabaseHelper.DATABASE_TREATMENTS) +@DatabaseTable(tableName = Treatment.TABLE_TREATMENTS) public class Treatment implements DataPointWithLabelInterface { private static Logger log = LoggerFactory.getLogger(Treatment.class); + public static final String TABLE_TREATMENTS = "Treatments"; + @DatabaseField(id = true) public long date; @@ -57,6 +64,32 @@ public class Treatment implements DataPointWithLabelInterface { public Treatment() { } + public static Treatment createFromJson(JSONObject json) throws JSONException { + Treatment treatment = new Treatment(); + treatment.source = Source.NIGHTSCOUT; + treatment.date = DateUtil.roundDateToSec(JsonHelper.safeGetLong(json, "mills")); + if (treatment.date == 0L) + return null; + treatment.carbs = JsonHelper.safeGetDouble(json,"carbs"); + treatment.insulin = JsonHelper.safeGetDouble(json,"insulin"); + treatment.pumpId = JsonHelper.safeGetLong(json, "pumpId"); + treatment._id = json.getString("_id"); + treatment.isSMB = JsonHelper.safeGetBoolean(json,"isSMB"); + if (json.has("eventType")) { + treatment.mealBolus = !json.get("eventType").equals("Correction Bolus"); + double carbs = treatment.carbs; + if (json.has("boluscalc")) { + JSONObject boluscalc = json.getJSONObject("boluscalc"); + if (boluscalc.has("carbs")) { + carbs = Math.max(boluscalc.getDouble("carbs"), carbs); + } + } + if (carbs <= 0) + treatment.mealBolus = false; + } + return treatment; + } + public String toString() { return "Treatment{" + "date= " + date + @@ -72,9 +105,8 @@ public class Treatment implements DataPointWithLabelInterface { } public boolean isDataChanging(Treatment other) { - if (date != other.date) { + if (date != other.date) return true; - } if (insulin != other.insulin) return true; if (carbs != other.carbs) @@ -83,9 +115,8 @@ public class Treatment implements DataPointWithLabelInterface { } public boolean isEqual(Treatment other) { - if (date != other.date) { + if (date != other.date) return false; - } if (insulin != other.insulin) return false; if (carbs != other.carbs) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java new file mode 100644 index 0000000000..2a5b798018 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java @@ -0,0 +1,426 @@ +package info.nightscout.androidaps.plugins.Treatments; + +import android.content.Intent; +import android.os.IBinder; +import android.support.annotation.Nullable; + +import com.j256.ormlite.android.apptools.OpenHelperManager; +import com.j256.ormlite.android.apptools.OrmLiteBaseService; +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.stmt.PreparedQuery; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.Where; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import com.squareup.otto.Subscribe; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.db.DatabaseHelper; +import info.nightscout.androidaps.db.ICallback; +import info.nightscout.androidaps.db.Source; +import info.nightscout.androidaps.events.Event; +import info.nightscout.androidaps.events.EventNsTreatment; +import info.nightscout.androidaps.events.EventReloadTreatmentData; +import info.nightscout.androidaps.events.EventTreatmentChange; +import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData; +import info.nightscout.utils.JsonHelper; + + +/** + * Created by mike on 24.09.2017. + */ + +public class TreatmentService extends OrmLiteBaseService { + private static Logger log = LoggerFactory.getLogger(TreatmentService.class); + + private static final ScheduledExecutorService treatmentEventWorker = Executors.newSingleThreadScheduledExecutor(); + private static ScheduledFuture scheduledTreatmentEventPost = null; + + public TreatmentService() { + onCreate(); + dbInitialize(); + MainApp.bus().register(this); + } + + /** + * This method is a simple re-implementation of the database create and up/downgrade functionality + * in SQLiteOpenHelper#getDatabaseLocked method. + *

+ * It is implemented to be able to late initialize separate plugins of the application. + */ + protected void dbInitialize() { + DatabaseHelper helper = OpenHelperManager.getHelper(this, DatabaseHelper.class); + int newVersion = helper.getNewVersion(); + int oldVersion = helper.getOldVersion(); + + if (oldVersion > newVersion) { + onDowngrade(this.getConnectionSource(), oldVersion, newVersion); + } else { + onUpgrade(this.getConnectionSource(), oldVersion, newVersion); + } + } + + public Dao getDao() { + try { + return DaoManager.createDao(this.getConnectionSource(), Treatment.class); + } catch (SQLException e) { + log.error("Cannot create Dao for Treatment.class"); + } + + return null; + } + + @Subscribe + @SuppressWarnings("unused") + public void handleNsEvent(EventNsTreatment event) { + int mode = event.getMode(); + JSONObject payload = event.getPayload(); + + if (mode == EventNsTreatment.ADD || mode == EventNsTreatment.UPDATE) { + this.createTreatmentFromJsonIfNotExists(payload); + } else { // EventNsTreatment.REMOVE + this.deleteNS(payload); + } + } + + @Override + public void onCreate() { + super.onCreate(); + try { + log.info("onCreate"); + TableUtils.createTableIfNotExists(this.getConnectionSource(), Treatment.class); + } catch (SQLException e) { + log.error("Can't create database", e); + throw new RuntimeException(e); + } + } + + public void onUpgrade(ConnectionSource connectionSource, int oldVersion, int newVersion) { + if (oldVersion == 7 && newVersion == 8) { + log.debug("Upgrading database from v7 to v8"); + try { + TableUtils.dropTable(connectionSource, Treatment.class, true); + TableUtils.createTableIfNotExists(connectionSource, Treatment.class); + } catch (SQLException e) { + log.error("Can't create database", e); + throw new RuntimeException(e); + } + } else { + log.info("onUpgrade"); +// this.resetFood(); + } + } + + public void onDowngrade(ConnectionSource connectionSource, int oldVersion, int newVersion) { + // this method is not supported right now + } + + public void resetTreatments() { + try { + TableUtils.dropTable(this.getConnectionSource(), Treatment.class, true); + TableUtils.createTableIfNotExists(this.getConnectionSource(), Treatment.class); + DatabaseHelper.updateEarliestDataChange(0); + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + scheduleTreatmentChange(null); + } + + + /** + * A place to centrally register events to be posted, if any data changed. + * This should be implemented in an abstract service-class. + *

+ * We do need to make sure, that ICallback is extended to be able to handle multiple + * events, or handle a list of events. + *

+ * on some methods the earliestDataChange event is handled separatly, in that it is checked if it is + * set to null by another event already (eg. scheduleExtendedBolusChange). + * + * @param event + * @param eventWorker + * @param callback + */ + private void scheduleEvent(final Event event, ScheduledExecutorService eventWorker, + final ICallback callback) { + + class PostRunnable implements Runnable { + public void run() { + log.debug("Firing EventFoodChange"); + MainApp.bus().post(event); + if (DatabaseHelper.earliestDataChange != null) + MainApp.bus().post(new EventNewHistoryData(DatabaseHelper.earliestDataChange)); + DatabaseHelper.earliestDataChange = null; + callback.setPost(null); + } + } + // prepare task for execution in 1 sec + // cancel waiting task to prevent sending multiple posts + if (callback.getPost() != null) + callback.getPost().cancel(false); + Runnable task = new PostRunnable(); + final int sec = 1; + callback.setPost(eventWorker.schedule(task, sec, TimeUnit.SECONDS)); + } + + /** + * Schedule a foodChange Event. + */ + public void scheduleTreatmentChange(@Nullable final Treatment treatment) { + this.scheduleEvent(new EventReloadTreatmentData(new EventTreatmentChange(treatment)), treatmentEventWorker, new ICallback() { + @Override + public void setPost(ScheduledFuture post) { + scheduledTreatmentEventPost = post; + } + + @Override + public ScheduledFuture getPost() { + return scheduledTreatmentEventPost; + } + }); + } + + public List getTreatmentData() { + try { + return this.getDao().queryForAll(); + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + + return new ArrayList<>(); + } + + /* + { + "_id": "551ee3ad368e06e80856e6a9", + "type": "food", + "category": "Zakladni", + "subcategory": "Napoje", + "name": "Mleko", + "portion": 250, + "carbs": 12, + "gi": 1, + "created_at": "2015-04-14T06:59:16.500Z", + "unit": "ml" + } + */ + public void createTreatmentFromJsonIfNotExists(JSONObject json) { + try { + Treatment treatment = Treatment.createFromJson(json); + if (treatment != null) + createOrUpdate(treatment); + } catch (JSONException e) { + log.error("Unhandled exception", e); + } + } + + public void createFoodFromJsonIfNotExists(JSONArray array) { + try { + for (int n = 0; n < array.length(); n++) { + JSONObject json = array.getJSONObject(n); + createTreatmentFromJsonIfNotExists(json); + } + } catch (JSONException e) { + log.error("Unhandled exception", e); + } + } + + // return true if new record is created + public boolean createOrUpdate(Treatment treatment) { + try { + Treatment old; + treatment.date = DatabaseHelper.roundDateToSec(treatment.date); + + if (treatment.source == Source.PUMP) { + // check for changed from pump change in NS + QueryBuilder queryBuilder = getDao().queryBuilder(); + Where where = queryBuilder.where(); + where.eq("pumpId", treatment.pumpId); + PreparedQuery preparedQuery = queryBuilder.prepare(); + List trList = getDao().query(preparedQuery); + if (trList.size() > 0) { + // do nothing, pump history record cannot be changed + log.debug("TREATMENT: Pump record already found in database: " + treatment.toString()); + return false; + } + getDao().create(treatment); + log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString()); + DatabaseHelper.updateEarliestDataChange(treatment.date); + scheduleTreatmentChange(treatment); + return true; + } + if (treatment.source == Source.NIGHTSCOUT) { + old = getDao().queryForId(treatment.date); + if (old != null) { + if (!old.isEqual(treatment)) { + boolean historyChange = old.isDataChanging(treatment); + long oldDate = old.date; + getDao().delete(old); // need to delete/create because date may change too + old.copyFrom(treatment); + getDao().create(old); + log.debug("TREATMENT: Updating record by date from: " + Source.getString(treatment.source) + " " + old.toString()); + if (historyChange) { + DatabaseHelper.updateEarliestDataChange(oldDate); + DatabaseHelper.updateEarliestDataChange(old.date); + } + scheduleTreatmentChange(treatment); + return true; + } + return false; + } + // find by NS _id + if (treatment._id != null) { + old = findByNSId(treatment._id); + if (old != null) { + if (!old.isEqual(treatment)) { + boolean historyChange = old.isDataChanging(treatment); + long oldDate = old.date; + getDao().delete(old); // need to delete/create because date may change too + old.copyFrom(treatment); + getDao().create(old); + log.debug("TREATMENT: Updating record by _id from: " + Source.getString(treatment.source) + " " + old.toString()); + if (historyChange) { + DatabaseHelper.updateEarliestDataChange(oldDate); + DatabaseHelper.updateEarliestDataChange(old.date); + } + scheduleTreatmentChange(treatment); + return true; + } + } + } + getDao().create(treatment); + log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString()); + DatabaseHelper.updateEarliestDataChange(treatment.date); + scheduleTreatmentChange(treatment); + return true; + } + if (treatment.source == Source.USER) { + getDao().create(treatment); + log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString()); + DatabaseHelper.updateEarliestDataChange(treatment.date); + scheduleTreatmentChange(treatment); + return true; + } + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + return false; + } + + public void deleteNS(JSONObject json) { + String _id = JsonHelper.safeGetString(json, "_id"); + if (_id != null && !_id.isEmpty()) + this.deleteByNSId(_id); + } + + /** + * deletes an entry by its NS Id. + *

+ * Basically a convenience method for findByNSId and delete. + * + * @param _id + */ + private void deleteByNSId(String _id) { + Treatment stored = findByNSId(_id); + if (stored != null) { + log.debug("TREATMENT: Removing Treatment record from database: " + stored.toString()); + delete(stored); + DatabaseHelper.updateEarliestDataChange(stored.date); + scheduleTreatmentChange(null); + } + } + + /** + * deletes the treatment and sends the treatmentChange Event + *

+ * should be moved ot a Service + * + * @param treatment + */ + public void delete(Treatment treatment) { + try { + getDao().delete(treatment); + DatabaseHelper.updateEarliestDataChange(treatment.date); + this.scheduleTreatmentChange(treatment); + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + } + + public void update(Treatment treatment) { + try { + getDao().update(treatment); + DatabaseHelper.updateEarliestDataChange(treatment.date); + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + scheduleTreatmentChange(treatment); + } + + /** + * finds treatment by its NS Id. + * + * @param _id + * @return + */ + @Nullable + public Treatment findByNSId(String _id) { + try { + Dao daoTreatments = getDao(); + QueryBuilder queryBuilder = daoTreatments.queryBuilder(); + Where where = queryBuilder.where(); + where.eq("_id", _id); + queryBuilder.limit(10L); + PreparedQuery preparedQuery = queryBuilder.prepare(); + List trList = daoTreatments.query(preparedQuery); + if (trList.size() != 1) { + //log.debug("Treatment findTreatmentById query size: " + trList.size()); + return null; + } else { + //log.debug("Treatment findTreatmentById found: " + trList.get(0).log()); + return trList.get(0); + } + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + return null; + } + + public List getTreatmentDataFromTime(long mills, boolean ascending) { + try { + Dao daoTreatments = getDao(); + List treatments; + QueryBuilder queryBuilder = daoTreatments.queryBuilder(); + queryBuilder.orderBy("date", ascending); + Where where = queryBuilder.where(); + where.ge("date", mills); + PreparedQuery preparedQuery = queryBuilder.prepare(); + treatments = daoTreatments.query(preparedQuery); + return treatments; + } catch (SQLException e) { + log.error("Unhandled exception", e); + } + return new ArrayList<>(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java index 55195928fc..722ce0539a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java @@ -27,7 +27,6 @@ import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventReloadProfileSwitchData; import info.nightscout.androidaps.events.EventReloadTempBasalData; import info.nightscout.androidaps.events.EventReloadTreatmentData; @@ -43,6 +42,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotificati import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; +import info.nightscout.utils.T; /** * Created by mike on 05.08.2016. @@ -58,14 +58,16 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface return treatmentsPlugin; } + private TreatmentService service; + private IobTotal lastTreatmentCalculation; private IobTotal lastTempBasalsCalculation; - private final static ArrayList treatments = new ArrayList<>(); - private final static Intervals tempBasals = new NonOverlappingIntervals<>(); - private final static Intervals extendedBoluses = new NonOverlappingIntervals<>(); - private final static Intervals tempTargets = new OverlappingIntervals<>(); - private final static ProfileIntervals profiles = new ProfileIntervals<>(); + private final ArrayList treatments = new ArrayList<>(); + private final Intervals tempBasals = new NonOverlappingIntervals<>(); + private final Intervals extendedBoluses = new NonOverlappingIntervals<>(); + private final Intervals tempTargets = new OverlappingIntervals<>(); + private final ProfileIntervals profiles = new ProfileIntervals<>(); public TreatmentsPlugin() { super(new PluginDescription() @@ -76,6 +78,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface .preferencesId(R.xml.pref_absorption_oref0) .alwaysEnabled(true) ); + this.service = new TreatmentService(); } @Override @@ -94,18 +97,22 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface MainApp.bus().register(this); } - private static void initializeTreatmentData() { + public TreatmentService getService() { + return this.service; + } + + private void initializeTreatmentData() { double dia = Constants.defaultDIA; if (MainApp.getConfigBuilder() != null && MainApp.getConfigBuilder().getProfile() != null) dia = MainApp.getConfigBuilder().getProfile().getDia(); long fromMills = (long) (System.currentTimeMillis() - 60 * 60 * 1000L * (24 + dia)); synchronized (treatments) { treatments.clear(); - treatments.addAll(MainApp.getDbHelper().getTreatmentDataFromTime(fromMills, false)); + treatments.addAll(getService().getTreatmentDataFromTime(fromMills, false)); } } - private static void initializeTempBasalData() { + private void initializeTempBasalData() { double dia = Constants.defaultDIA; if (MainApp.getConfigBuilder() != null && MainApp.getConfigBuilder().getProfile() != null) dia = MainApp.getConfigBuilder().getProfile().getDia(); @@ -117,7 +124,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface } - private static void initializeExtendedBolusData() { + private void initializeExtendedBolusData() { double dia = Constants.defaultDIA; if (MainApp.getConfigBuilder() != null && MainApp.getConfigBuilder().getProfile() != null) dia = MainApp.getConfigBuilder().getProfile().getDia(); @@ -203,7 +210,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (profile == null) return result; long now = System.currentTimeMillis(); - long dia_ago = now - (Double.valueOf(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue(); + long dia_ago = now - (Double.valueOf(1.5d * profile.getDia() * T.hours(1).msecs())).longValue(); synchronized (treatments) { for (Treatment treatment : treatments) { @@ -235,7 +242,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface @Override public List getTreatmentsFromHistory() { synchronized (treatments) { - return (List) treatments.clone(); + return new ArrayList<>(treatments); } } @@ -300,6 +307,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface } @Subscribe + @SuppressWarnings("unused") public void onStatusEvent(final EventReloadTempBasalData ev) { log.debug("EventReloadTempBasalData"); initializeTempBasalData(); @@ -442,7 +450,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface treatment.carbs = detailedBolusInfo.carbs; treatment.source = detailedBolusInfo.source; treatment.mealBolus = treatment.carbs > 0; - boolean newRecordCreated = MainApp.getDbHelper().createOrUpdate(treatment); + boolean newRecordCreated = getService().createOrUpdate(treatment); //log.debug("Adding new Treatment record" + treatment.toString()); if (detailedBolusInfo.carbTime != 0) { Treatment carbsTreatment = new Treatment(); @@ -451,7 +459,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface carbsTreatment.date = detailedBolusInfo.date + detailedBolusInfo.carbTime * 60 * 1000L + 1000L; // add 1 sec to make them different records carbsTreatment.carbs = detailedBolusInfo.carbs; carbsTreatment.source = detailedBolusInfo.source; - MainApp.getDbHelper().createOrUpdate(carbsTreatment); + getService().createOrUpdate(carbsTreatment); //log.debug("Adding new Treatment record" + carbsTreatment); } if (newRecordCreated && detailedBolusInfo.isValid) @@ -480,6 +488,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface // TempTargets @Subscribe + @SuppressWarnings("unused") public void onStatusEvent(final EventTempTargetChange ev) { initializeTempTargetData(); } @@ -509,6 +518,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface // Profile Switch @Subscribe + @SuppressWarnings("unused") public void onStatusEvent(final EventReloadProfileSwitchData ev) { initializeProfileSwitchData(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java index 6831ee33f9..87626ed4cd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java @@ -31,7 +31,7 @@ import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.Source; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; @@ -145,14 +145,14 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. final String _id = treatment._id; if (treatment.source == Source.PUMP) { treatment.isValid = false; - MainApp.getDbHelper().update(treatment); + TreatmentsPlugin.getPlugin().getService().update(treatment); } else { if (NSUpload.isIdValid(_id)) { NSUpload.removeCareportalEntryFromNS(_id); } else { UploadQueue.removeID("dbAdd", _id); } - MainApp.getDbHelper().delete(treatment); + TreatmentsPlugin.getPlugin().getService().delete(treatment); } updateGUI(); FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveTreatment")); @@ -204,7 +204,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + "?"); builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - MainApp.getDbHelper().resetTreatments(); + TreatmentsPlugin.getPlugin().getService().resetTreatments(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 90a1262a6b..bde197b45f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -37,7 +37,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; diff --git a/app/src/main/java/info/nightscout/utils/DateUtil.java b/app/src/main/java/info/nightscout/utils/DateUtil.java index cb0081f941..fd88ec2f9a 100644 --- a/app/src/main/java/info/nightscout/utils/DateUtil.java +++ b/app/src/main/java/info/nightscout/utils/DateUtil.java @@ -167,4 +167,8 @@ public class DateUtil { return System.currentTimeMillis(); } + public static long roundDateToSec(long date) { + return date - date % 1000; + } + } diff --git a/app/src/main/java/info/nightscout/utils/JsonHelper.java b/app/src/main/java/info/nightscout/utils/JsonHelper.java index 3cc9a3c8a0..ead68132af 100644 --- a/app/src/main/java/info/nightscout/utils/JsonHelper.java +++ b/app/src/main/java/info/nightscout/utils/JsonHelper.java @@ -17,41 +17,79 @@ public class JsonHelper { private JsonHelper() {}; - public static String safeGetString(JSONObject json, String fieldName) throws JSONException { + public static String safeGetString(JSONObject json, String fieldName) { String result = null; if (json.has(fieldName)) { - result = json.getString(fieldName); + try { + result = json.getString(fieldName); + } catch (JSONException ignored) { + } } return result; } - public static String safeGetString(JSONObject json, String fieldName, String defaultValue) throws JSONException { + public static String safeGetString(JSONObject json, String fieldName, String defaultValue) { String result = defaultValue; if (json.has(fieldName)) { - result = json.getString(fieldName); + try { + result = json.getString(fieldName); + } catch (JSONException ignored) { + } } return result; } - public static double safeGetDouble(JSONObject json, String fieldName) throws JSONException { + public static double safeGetDouble(JSONObject json, String fieldName) { double result = 0d; if (json.has(fieldName)) { - result = json.getDouble(fieldName); + try { + result = json.getDouble(fieldName); + } catch (JSONException ignored) { + } } return result; } - public static int safeGetInt(JSONObject json, String fieldName) throws JSONException { + public static int safeGetInt(JSONObject json, String fieldName) { int result = 0; if (json.has(fieldName)) { - result = json.getInt(fieldName); + try { + result = json.getInt(fieldName); + } catch (JSONException ignored) { + } + } + + return result; + } + + public static long safeGetLong(JSONObject json, String fieldName) { + long result = 0; + + if (json.has(fieldName)) { + try { + result = json.getLong(fieldName); + } catch (JSONException e) { + } + } + + return result; + } + + public static boolean safeGetBoolean(JSONObject json, String fieldName) { + boolean result = false; + + if (json.has(fieldName)) { + try { + result = json.getBoolean(fieldName); + } catch (JSONException e) { + } } return result; diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePluginTest.java index d362937b82..c98dd07959 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePluginTest.java @@ -4,7 +4,7 @@ import org.junit.Before; import org.junit.Test; import info.nightscout.androidaps.data.Iob; -import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/app/src/test/java/info/nightscout/utils/BolusWizardTest.java b/app/src/test/java/info/nightscout/utils/BolusWizardTest.java index 4dfd87f870..be386e5eba 100644 --- a/app/src/test/java/info/nightscout/utils/BolusWizardTest.java +++ b/app/src/test/java/info/nightscout/utils/BolusWizardTest.java @@ -11,7 +11,6 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.PumpMDI.MDIPlugin; From a615553047a25834a8a23bf4cf4628173019b2c9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 10:02:57 +0200 Subject: [PATCH 21/43] check for profile already set before notification --- .../nightscout/androidaps/queue/CommandQueue.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index 141d064682..8b7b2f8fbe 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -299,6 +299,13 @@ public class CommandQueue { // returns true if command is queued public boolean setProfile(Profile profile, Callback callback) { + if (isThisProfileSet(profile)) { + log.debug("QUEUE: Correct profile already set"); + if (callback != null) + callback.result(new PumpEnactResult().success(true).enacted(false)).run(); + return false; + } + if (isRunning(Command.CommandType.BASALPROFILE)) { if (callback != null) callback.result(executingNowError()).run(); @@ -329,13 +336,6 @@ public class CommandQueue { MainApp.bus().post(new EventDismissNotification(Notification.BASAL_VALUE_BELOW_MINIMUM)); - if (isThisProfileSet(profile)) { - log.debug("QUEUE: Correct profile already set"); - if (callback != null) - callback.result(new PumpEnactResult().success(true).enacted(false)).run(); - return false; - } - // remove all unfinished removeAll(Command.CommandType.BASALPROFILE); From ba7d0aebaaced1f221d0009bb3ea08fed5a0e3c4 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 10:46:23 +0200 Subject: [PATCH 22/43] show message ragarding closed loop mode only if closed mode is enabled in preferences --- .../java/info/nightscout/androidaps/MainApp.java | 5 ----- .../plugins/ConstraintsSafety/SafetyPlugin.java | 14 +++++++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index d925330484..b5a1878160 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -212,11 +212,6 @@ public class MainApp extends Application { startKeepAliveService(); }).start(); } - - if (!isEngineeringModeOrRelease()) { - Notification n = new Notification(Notification.TOAST_ALARM, gs(R.string.closed_loop_disabled_on_dev_branch), Notification.NORMAL); - bus().post(new EventNewNotification(n)); - } } private void registerLocalBroadcastReceiver() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java index a3e27e1662..219236263c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java @@ -14,6 +14,8 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAPlugin; import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin; +import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.HardLimits; import info.nightscout.utils.Round; @@ -55,12 +57,18 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface { @Override public Constraint isClosedLoopAllowed(Constraint value) { - if (!MainApp.isEngineeringModeOrRelease()) - value.set(false, MainApp.gs(R.string.closed_loop_disabled_on_dev_branch), this); - String mode = SP.getString("aps_mode", "open"); if (!mode.equals("closed")) value.set(false, MainApp.gs(R.string.closedmodedisabledinpreferences), this); + + if (!MainApp.isEngineeringModeOrRelease()) { + if (value.value()) { + Notification n = new Notification(Notification.TOAST_ALARM, MainApp.gs(R.string.closed_loop_disabled_on_dev_branch), Notification.NORMAL); + MainApp.bus().post(new EventNewNotification(n)); + } + value.set(false, MainApp.gs(R.string.closed_loop_disabled_on_dev_branch), this); + } + return value; } From ee133f87ae03981b7c69c97c38ea53cbec66c44b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 10:56:55 +0200 Subject: [PATCH 23/43] fix test --- .../androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java index bfe430ccf5..0bd35e49ff 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java @@ -230,6 +230,7 @@ public class SafetyPluginTest { AAPSMocker.mockConstraintsChecker(); AAPSMocker.mockSP(); AAPSMocker.mockStrings(); + AAPSMocker.mockBus(); when(MainApp.getConfigBuilder().getActivePump()).thenReturn(pump); From a5a0a27db6d42d630c29f0e50f5c36213a94cd9b Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Thu, 5 Apr 2018 20:38:49 +0200 Subject: [PATCH 24/43] Xchange activity and eating soon temp target mgdl --- app/src/main/java/info/nightscout/androidaps/Constants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java index cd645abd9a..aeb4977584 100644 --- a/app/src/main/java/info/nightscout/androidaps/Constants.java +++ b/app/src/main/java/info/nightscout/androidaps/Constants.java @@ -41,10 +41,10 @@ public class Constants { // Temp targets public static final int defaultActivityTTDuration = 90; // min - public static final double defaultActivityTTmgdl = 90d; + public static final double defaultActivityTTmgdl = 140d; public static final double defaultActivityTTmmol = 8d; public static final int defaultEatingSoonTTDuration = 45; // min - public static final double defaultEatingSoonTTmgdl = 140d; + public static final double defaultEatingSoonTTmgdl = 90d; public static final double defaultEatingSoonTTmmol = 5d; public static final int defaultHypoTTDuration = 30; // min public static final double defaultHypoTTmgdl = 120d; From f89372e1de426198c433ad648f88bf6b38318c6a Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Thu, 5 Apr 2018 20:54:48 +0200 Subject: [PATCH 25/43] build flavour full type debug on travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1d620e70b2..54a3e7ca0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ before_install: script: # Unit Test - - ./gradlew -Pcoverage test jacocoTestReport + - ./gradlew -Pcoverage testFullDebugUnitTest jacocoTestFullDebugUnitTestReport after_success: - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From 4ec959b0c4ce1843e2bb7475a0c0a14ada860869 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 5 Apr 2018 21:53:09 +0200 Subject: [PATCH 26/43] Show "Disconnected (2d m)" on overview fragment --- .../androidaps/plugins/Overview/OverviewFragment.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 38498f5eaf..f409942b18 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -1051,6 +1051,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuperbolusfor), activeloop.minutesToEndOfSuspend())); apsModeView.setTextColor(Color.WHITE); + } else if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isDisconnected()) { + apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); + apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopdisconnectedfor), activeloop.minutesToEndOfSuspend())); + apsModeView.setTextColor(Color.WHITE); } else if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuspended()) { apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), activeloop.minutesToEndOfSuspend())); From afebf30bc0640ab81b57714a598f0a6a82f28ad6 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Thu, 5 Apr 2018 21:55:07 +0200 Subject: [PATCH 27/43] Add string loopdisconnectedfor --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6da4c26248..e6837e0470 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - + Tratments safety Max allowed bolus [U] Max allowed carbs [g] @@ -996,5 +996,5 @@ SMB not allowed in open loop mode Food IobCobCalculator + Disconnected (%d m) - From e5bf36bfe346ed567fe8bd4352e010a6af3aac63 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 23:21:08 +0200 Subject: [PATCH 28/43] code cleanup --- .../Careportal/CareportalFragment.java | 117 +++++++----------- .../data/NSSettingsStatus.java | 67 ++++------ 2 files changed, 70 insertions(+), 114 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index f88734d64a..8a8a730bb3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -13,12 +13,9 @@ import android.widget.TextView; import com.squareup.otto.Subscribe; -import org.json.JSONException; -import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -27,7 +24,6 @@ import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.events.EventCareportalEventChange; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus; import info.nightscout.androidaps.plugins.Overview.OverviewFragment; import info.nightscout.utils.FabricPrivacy; @@ -216,75 +212,54 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli public static void updateAge(Activity activity, final TextView sage, final TextView iage, final TextView cage, final TextView pbage) { if (activity != null) { activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - CareportalEvent careportalEvent; - NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); - JSONObject extendedSettings = nsSettings.getExtendedValues(); + () -> { + CareportalEvent careportalEvent; + NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); - double iageUrgent = 0; - double iageWarn = 0; - double cageUrgent = 0; - double cageWarn = 0; - double sageUrgent = 0; - double sageWarn = 0; - double pbageUrgent = 0; - double pbageWarn = 0; - log.debug("Values from NSSettings "+extendedSettings.toString()); - // Thresholds in NS are in hours - try { - iageUrgent = extendedSettings.getDouble("iageUrgent"); - iageWarn = extendedSettings.getDouble("iageWarn"); - cageUrgent = extendedSettings.getDouble("cageUrgent"); - cageWarn = extendedSettings.getDouble("cageWarn"); - sageUrgent = extendedSettings.getDouble("sageUrgent"); - sageWarn = extendedSettings.getDouble("sageWarn"); - pbageUrgent = extendedSettings.getDouble("pbageUrgent"); - pbageWarn = extendedSettings.getDouble("pbageWarn"); + double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 72); + double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 48); + double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 72); + double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 48); + double sageUrgent = nsSettings.getExtendedWarnValue("sage", "urgent", 166); + double sageWarn = nsSettings.getExtendedWarnValue("sage", "warn", 164); + double pbageUrgent = nsSettings.getExtendedWarnValue("pgage", "urgent", 360); + double pbageWarn = nsSettings.getExtendedWarnValue("pgage", "warn", 240); - } catch (JSONException e) { - log.error("Unhandled exception", e); + String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); + if (sage != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); + if (careportalEvent != null) { + sage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, sageWarn, sageUrgent)); + sage.setText(careportalEvent.age()); + } else { + sage.setText(notavailable); } - - - - String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); - if (sage != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); - if(careportalEvent != null) { - sage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, sageUrgent, sageWarn)); - sage.setText(careportalEvent.age()); - } else { - sage.setText(notavailable); - } + } + if (iage != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); + if (careportalEvent != null) { + iage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, iageWarn, iageUrgent)); + iage.setText(careportalEvent.age()); + } else { + iage.setText(notavailable); } - if (iage != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); - if(careportalEvent != null) { - iage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, iageUrgent, iageWarn)); - iage.setText(careportalEvent.age()); - } else { - iage.setText(notavailable); - } + } + if (cage != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); + if (careportalEvent != null) { + cage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, cageWarn, cageUrgent)); + cage.setText(careportalEvent.age()); + } else { + cage.setText(notavailable); } - if (cage != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); - if (careportalEvent != null) { - cage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, cageUrgent, cageWarn)); - cage.setText(careportalEvent.age()); - } else { - cage.setText(notavailable); - } - } - if (pbage != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); - if (careportalEvent != null) { - pbage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, pbageUrgent, pbageWarn)); - pbage.setText(careportalEvent.age()); - } else { - pbage.setText(notavailable); - } + } + if (pbage != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); + if (careportalEvent != null) { + pbage.setTextColor(CareportalFragment.determineTextColor(careportalEvent, pbageWarn, pbageUrgent)); + pbage.setText(careportalEvent.age()); + } else { + pbage.setText(notavailable); } } } @@ -292,10 +267,10 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli } } - public static int determineTextColor(CareportalEvent careportalEvent, double warnThreshold, double urgentThreshold){ - if(careportalEvent.isOlderThan(urgentThreshold)){ + public static int determineTextColor(CareportalEvent careportalEvent, double warnThreshold, double urgentThreshold) { + if (careportalEvent.isOlderThan(urgentThreshold)) { return MainApp.sResources.getColor(R.color.low); - } else if(careportalEvent.isOlderThan( warnThreshold)) { + } else if (careportalEvent.isOlderThan(warnThreshold)) { return MainApp.sResources.getColor(R.color.high); } else { return Color.WHITE; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java index 93b2f6fd5d..8d09a05146 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java @@ -170,36 +170,17 @@ public class NSSettingsStatus { } - // return JSONObject with the WARN and URGENT values of cage,sage and iage - // added pbage for pump battery warnings - public JSONObject getExtendedValues(){ - JSONObject extendedValues = new JSONObject(); // - JSONObject defaultSettings = new JSONObject(); + // valid property is "warn" or "urgent" + // plugings "iage" "sage" "cage" "pbage" + + public double getExtendedWarnValue(String plugin, String property, double defaultvalue) { JSONObject extendedSettings = this.getExtendedSettings(); - // Thresholds in NS are in hours - try { - // Default - defaultSettings.put("urgent", 7*24D); - defaultSettings.put("warn", 5*24D); - - JSONObject iageSettings = extendedSettings.optJSONObject("iage") != null ? extendedSettings.optJSONObject("iage") : defaultSettings; - JSONObject cageSettings = extendedSettings.optJSONObject("cage") != null ? extendedSettings.optJSONObject("cage") : defaultSettings; - JSONObject sageSettings = extendedSettings.optJSONObject("sage") != null ? extendedSettings.optJSONObject("sage") : defaultSettings; - - extendedValues.put("cageUrgent", cageSettings.optDouble("urgent", 72)); - extendedValues.put("cageWarn", cageSettings.optDouble("warn", 48)); - extendedValues.put("sageUrgent", sageSettings.optDouble("urgent", 166)); - extendedValues.put("sageWarn", sageSettings.optDouble("warn", 164)); - extendedValues.put("iageUrgent", iageSettings.optDouble("urgent", 72)); - extendedValues.put("iageWarn", iageSettings.optDouble("warn", 48)); - extendedValues.put("pbageWarn", 240D); - extendedValues.put("pbageUrgent", 360D); - - } catch (JSONException e) { - log.error("Unhandled exception", e); - } - - return extendedValues; + if (extendedSettings == null) + return defaultvalue; + JSONObject pluginJson = extendedSettings.optJSONObject(plugin); + if (pluginJson == null) + return defaultvalue; + return pluginJson.optDouble(property, defaultvalue); } public String getActiveProfile() { @@ -225,7 +206,7 @@ public class NSSettingsStatus { return result; } } - if (settingsO.has("alarmTimeagoWarnMins") && Objects.equals(what, "alarmTimeagoWarnMins")){ + if (settingsO.has("alarmTimeagoWarnMins") && Objects.equals(what, "alarmTimeagoWarnMins")) { Double result = settingsO.getDouble(what); return result; } @@ -238,7 +219,7 @@ public class NSSettingsStatus { private String getStringOrNull(String key) { String ret = null; - if(data == null) return null; + if (data == null) return null; if (data.has(key)) { try { ret = data.getString(key); @@ -320,21 +301,21 @@ public class NSSettingsStatus { JSONObject pump = extentendedPumpSettings(); switch (setting) { case "warnClock": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; case "urgentClock": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; case "warnRes": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; case "urgentRes": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; case "warnBattV": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; case "urgentBattV": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; - case "warnBattP": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + case "warnBattP": + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; case "urgentBattP": - return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; + return pump != null && pump.has(setting) ? pump.getDouble(setting) : 30; } } catch (JSONException e) { log.error("Unhandled exception", e); @@ -342,12 +323,12 @@ public class NSSettingsStatus { return 0d; } - + @Nullable public JSONObject extentendedPumpSettings() { try { JSONObject extended = getExtendedSettings(); - if(extended == null) return null; + if (extended == null) return null; if (extended.has("pump")) { JSONObject pump = extended.getJSONObject("pump"); return pump; @@ -382,7 +363,7 @@ public class NSSettingsStatus { return ""; } - public boolean openAPSEnabledAlerts() { + public boolean openAPSEnabledAlerts() { try { JSONObject pump = extentendedPumpSettings(); if (pump != null && pump.has("openaps")) { From a3811b503f89ddeaadf7df4cddbbdf2703f5b94f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 23:28:17 +0200 Subject: [PATCH 29/43] catch the thread --- .../nightscout/androidaps/interfaces/PluginBase.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java index 190a3b89f9..708e3be32d 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java @@ -150,13 +150,13 @@ public abstract class PluginBase { protected void onStart() { if (getType() == PluginType.PUMP) { - new Thread(() -> { - SystemClock.sleep(3000); - try { + try { + new Thread(() -> { + SystemClock.sleep(3000); ConfigBuilderPlugin.getCommandQueue().readStatus("Pump driver changed.", null); - } catch (Exception ignored) { // Thread fail to start in tests - } - }).start(); + }).start(); + } catch (Exception ignored) { // Thread fail to start in tests + } } } From 828b20e3581ebe87ee0ae81cb7dcadea2e4ab616 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 5 Apr 2018 23:42:27 +0200 Subject: [PATCH 30/43] optimize notifications & overview, fix reporting profile update --- .../plugins/Overview/OverviewFragment.java | 497 +++++++----------- .../plugins/Overview/OverviewPlugin.java | 4 +- .../NotificationRecyclerViewAdapter.java | 107 ++++ .../notifications/NotificationStore.java | 5 +- .../androidaps/queue/CommandQueue.java | 6 - .../queue/commands/CommandSetProfile.java | 11 + 6 files changed, 302 insertions(+), 328 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index f409942b18..d6c9c70c4e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -111,6 +111,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotificati import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock; import info.nightscout.androidaps.plugins.Overview.graphData.GraphData; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; +import info.nightscout.androidaps.plugins.Overview.notifications.NotificationRecyclerViewAdapter; import info.nightscout.androidaps.plugins.Overview.notifications.NotificationStore; import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin; import info.nightscout.androidaps.plugins.Source.SourceXdripPlugin; @@ -460,32 +461,32 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final PumpDescription pumpDescription = ConfigBuilderPlugin.getActivePump().getPumpDescription(); if (activeloop == null || !MainApp.getConfigBuilder().isProfileValid("ContexMenuCreation")) return; - menu.setHeaderTitle(MainApp.sResources.getString(R.string.loop)); + menu.setHeaderTitle(MainApp.gs(R.string.loop)); if (activeloop.isEnabled(PluginType.LOOP)) { - menu.add(MainApp.sResources.getString(R.string.disableloop)); + menu.add(MainApp.gs(R.string.disableloop)); if (!activeloop.isSuspended()) { - menu.add(MainApp.sResources.getString(R.string.suspendloopfor1h)); - menu.add(MainApp.sResources.getString(R.string.suspendloopfor2h)); - menu.add(MainApp.sResources.getString(R.string.suspendloopfor3h)); - menu.add(MainApp.sResources.getString(R.string.suspendloopfor10h)); + menu.add(MainApp.gs(R.string.suspendloopfor1h)); + menu.add(MainApp.gs(R.string.suspendloopfor2h)); + menu.add(MainApp.gs(R.string.suspendloopfor3h)); + menu.add(MainApp.gs(R.string.suspendloopfor10h)); if (pumpDescription.tempDurationStep15mAllowed) - menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor15m)); + menu.add(MainApp.gs(R.string.disconnectpumpfor15m)); if (pumpDescription.tempDurationStep30mAllowed) - menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor30m)); - menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor1h)); - menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor2h)); - menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor3h)); + menu.add(MainApp.gs(R.string.disconnectpumpfor30m)); + menu.add(MainApp.gs(R.string.disconnectpumpfor1h)); + menu.add(MainApp.gs(R.string.disconnectpumpfor2h)); + menu.add(MainApp.gs(R.string.disconnectpumpfor3h)); } else { - menu.add(MainApp.sResources.getString(R.string.resume)); + menu.add(MainApp.gs(R.string.resume)); } } if (!activeloop.isEnabled(PluginType.LOOP)) - menu.add(MainApp.sResources.getString(R.string.enableloop)); + menu.add(MainApp.gs(R.string.enableloop)); } else if (v == activeProfileView) { - menu.setHeaderTitle(MainApp.sResources.getString(R.string.profile)); - menu.add(MainApp.sResources.getString(R.string.danar_viewprofile)); + menu.setHeaderTitle(MainApp.gs(R.string.profile)); + menu.add(MainApp.gs(R.string.danar_viewprofile)); if (MainApp.getConfigBuilder().getActiveProfileInterface().getProfile() != null) { - menu.add(MainApp.sResources.getString(R.string.careportal_profileswitch)); + menu.add(MainApp.gs(R.string.careportal_profileswitch)); } } } @@ -496,7 +497,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (profile == null) return true; final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); - if (item.getTitle().equals(MainApp.sResources.getString(R.string.disableloop))) { + if (item.getTitle().equals(MainApp.gs(R.string.disableloop))) { activeloop.setPluginEnabled(PluginType.LOOP, false); activeloop.setFragmentVisible(PluginType.LOOP, false); MainApp.getConfigBuilder().storeSettings("DisablingLoop"); @@ -505,75 +506,75 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, @Override public void run() { if (!result.success) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror)); } } }); NSUpload.uploadOpenAPSOffline(24 * 60); // upload 24h, we don't know real duration return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.enableloop))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.enableloop))) { activeloop.setPluginEnabled(PluginType.LOOP, true); activeloop.setFragmentVisible(PluginType.LOOP, true); MainApp.getConfigBuilder().storeSettings("EnablingLoop"); updateGUI("suspendmenu"); NSUpload.uploadOpenAPSOffline(0); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.resume))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.resume))) { activeloop.suspendTo(0L); updateGUI("suspendmenu"); MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(true, new Callback() { @Override public void run() { if (!result.success) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror)); } } }); NSUpload.uploadOpenAPSOffline(0); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor1h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor1h))) { MainApp.getConfigBuilder().suspendLoop(60); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor2h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor2h))) { MainApp.getConfigBuilder().suspendLoop(120); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor3h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor3h))) { MainApp.getConfigBuilder().suspendLoop(180); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor10h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor10h))) { MainApp.getConfigBuilder().suspendLoop(600); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor15m))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor15m))) { MainApp.getConfigBuilder().disconnectPump(15, profile); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor30m))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor30m))) { MainApp.getConfigBuilder().disconnectPump(30, profile); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor1h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor1h))) { MainApp.getConfigBuilder().disconnectPump(60, profile); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor2h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor2h))) { MainApp.getConfigBuilder().disconnectPump(120, profile); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor3h))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor3h))) { MainApp.getConfigBuilder().disconnectPump(180, profile); updateGUI("suspendmenu"); return true; - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.careportal_profileswitch))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.careportal_profileswitch))) { NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog(); final OptionsToShow profileswitch = CareportalFragment.PROFILESWITCHDIRECT; profileswitch.executeProfileSwitch = true; newDialog.setOptions(profileswitch, R.string.careportal_profileswitch); newDialog.show(getFragmentManager(), "NewNSTreatmentDialog"); - } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.danar_viewprofile))) { + } else if (item.getTitle().equals(MainApp.gs(R.string.danar_viewprofile))) { ProfileViewerDialog pvd = ProfileViewerDialog.newInstance(System.currentTimeMillis()); FragmentManager manager = getFragmentManager(); pvd.show(manager, "ProfileViewDialog"); @@ -753,9 +754,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (!insulinAfterConstraints.equals(wizard.calculatedTotalInsulin) || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; } @@ -765,7 +766,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final Context context = getContext(); final AlertDialog.Builder builder = new AlertDialog.Builder(context); accepted = false; - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -789,7 +790,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -810,7 +811,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -841,12 +842,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, public void onResume() { super.onResume(); MainApp.bus().register(this); - sRefreshLoop = new Runnable() { - @Override - public void run() { - scheduleUpdateGUI("refreshLoop"); - sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L); - } + sRefreshLoop = () -> { + scheduleUpdateGUI("refreshLoop"); + sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L); }; sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L); registerForContextMenu(apsModeView); @@ -894,23 +892,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, scheduleUpdateGUI("EventExtendedBolusChange"); } -// Handled by EventAutosensCalculationFinished -// @Subscribe -// public void onStatusEvent(final EventNewBG ev) { -// scheduleUpdateGUI("EventNewBG"); -// } - @Subscribe public void onStatusEvent(final EventNewOpenLoopNotification ev) { scheduleUpdateGUI("EventNewOpenLoopNotification"); } -// Handled by EventAutosensCalculationFinished -// @Subscribe -// public void onStatusEvent(final EventNewBasalProfile ev) { -// scheduleUpdateGUI("EventNewBasalProfile"); -// } - @Subscribe public void onStatusEvent(final EventTempTargetChange ev) { scheduleUpdateGUI("EventTempTargetChange"); @@ -920,12 +906,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, public void onStatusEvent(final EventPumpStatusChanged s) { Activity activity = getActivity(); if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - updatePumpStatus(s.textStatus()); - } - }); + activity.runOnUiThread(() -> updatePumpStatus(s.textStatus())); } private void hideTempRecommendation() { @@ -962,12 +943,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, public void run() { Activity activity = getActivity(); if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - updateGUI(from); - scheduledUpdate = null; - } + activity.runOnUiThread(() -> { + updateGUI(from); + scheduledUpdate = null; }); } } @@ -1032,7 +1010,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, avgdeltaView.setText("øΔ15m: " + Profile.toUnitsString(glucoseStatus.short_avgdelta, glucoseStatus.short_avgdelta * Constants.MGDL_TO_MMOLL, units) + " øΔ40m: " + Profile.toUnitsString(glucoseStatus.long_avgdelta, glucoseStatus.long_avgdelta * Constants.MGDL_TO_MMOLL, units)); } else { - deltaView.setText("Δ " + MainApp.sResources.getString(R.string.notavailable)); + deltaView.setText("Δ " + MainApp.gs(R.string.notavailable)); if (avgdeltaView != null) avgdeltaView.setText(""); } @@ -1049,29 +1027,29 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuperBolus()) { apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); - apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuperbolusfor), activeloop.minutesToEndOfSuspend())); + apsModeView.setText(String.format(MainApp.gs(R.string.loopsuperbolusfor), activeloop.minutesToEndOfSuspend())); apsModeView.setTextColor(Color.WHITE); } else if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isDisconnected()) { apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); - apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopdisconnectedfor), activeloop.minutesToEndOfSuspend())); + apsModeView.setText(String.format(MainApp.gs(R.string.loopdisconnectedfor), activeloop.minutesToEndOfSuspend())); apsModeView.setTextColor(Color.WHITE); } else if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuspended()) { apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); - apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), activeloop.minutesToEndOfSuspend())); + apsModeView.setText(String.format(MainApp.gs(R.string.loopsuspendedfor), activeloop.minutesToEndOfSuspend())); apsModeView.setTextColor(Color.WHITE); } else if (pump.isSuspended()) { apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.looppumpsuspended)); - apsModeView.setText(MainApp.sResources.getString(R.string.pumpsuspended)); + apsModeView.setText(MainApp.gs(R.string.pumpsuspended)); apsModeView.setTextColor(Color.WHITE); } else if (activeloop != null && activeloop.isEnabled(activeloop.getType())) { if (closedLoopEnabled.value()) { - apsModeView.setText(MainApp.sResources.getString(R.string.closedloop)); + apsModeView.setText(MainApp.gs(R.string.closedloop)); } else { - apsModeView.setText(MainApp.sResources.getString(R.string.openloop)); + apsModeView.setText(MainApp.gs(R.string.openloop)); } } else { apsModeView.setBackgroundColor(MainApp.sResources.getColor(R.color.loopdisabled)); - apsModeView.setText(MainApp.sResources.getString(R.string.disabledloop)); + apsModeView.setText(MainApp.gs(R.string.disabledloop)); apsModeView.setTextColor(Color.WHITE); } } else { @@ -1139,11 +1117,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, baseBasalView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - String fullText = MainApp.sResources.getString(R.string.pump_basebasalrate_label) + ": " + DecimalFormatter.to2Decimal(profile.getBasal()) + "U/h\n"; + String fullText = MainApp.gs(R.string.pump_basebasalrate_label) + ": " + DecimalFormatter.to2Decimal(profile.getBasal()) + "U/h\n"; if (activeTemp != null) { - fullText += MainApp.sResources.getString(R.string.pump_tempbasal_label) + ": " + activeTemp.toStringFull(); + fullText += MainApp.gs(R.string.pump_tempbasal_label) + ": " + activeTemp.toStringFull(); } - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.basal), fullText, null); + OKDialog.show(getActivity(), MainApp.gs(R.string.basal), fullText, null); } }); @@ -1177,7 +1155,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, extendedBolusView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.extendedbolus), extendedBolus.toString(), null); + OKDialog.show(getActivity(), MainApp.gs(R.string.extendedbolus), extendedBolus.toString(), null); } }); @@ -1196,17 +1174,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, activeProfileView.setText(MainApp.getConfigBuilder().getProfileName()); activeProfileView.setBackgroundColor(Color.GRAY); - tempTargetView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - NewNSTreatmentDialog newTTDialog = new NewNSTreatmentDialog(); - final OptionsToShow temptarget = CareportalFragment.TEMPTARGET; - temptarget.executeTempTarget = true; - newTTDialog.setOptions(temptarget, R.string.careportal_temporarytarget); - newTTDialog.show(getFragmentManager(), "NewNSTreatmentDialog"); - return true; - } + tempTargetView.setOnLongClickListener(view -> { + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + NewNSTreatmentDialog newTTDialog = new NewNSTreatmentDialog(); + final OptionsToShow temptarget = CareportalFragment.TEMPTARGET; + temptarget.executeTempTarget = true; + newTTDialog.setOptions(temptarget, R.string.careportal_temporarytarget); + newTTDialog.show(getFragmentManager(), "NewNSTreatmentDialog"); + return true; }); tempTargetView.setLongClickable(true); @@ -1280,14 +1255,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (shorttextmode) { String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U"; iobView.setText(iobtext); - iobView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U\n" - + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U\n" - + getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U\n"; - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.iob), iobtext, null); - } + iobView.setOnClickListener(v -> { + String iobtext1 = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U\n" + + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U\n" + + getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U\n"; + OKDialog.show(getActivity(), MainApp.gs(R.string.iob), iobtext1, null); }); } else if (MainApp.sResources.getBoolean(R.bool.isTablet)) { String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" @@ -1314,159 +1286,138 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // pump status from ns if (pumpDeviceStatusView != null) { pumpDeviceStatusView.setText(NSDeviceStatus.getInstance().getPumpStatus()); - pumpDeviceStatusView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.pump), NSDeviceStatus.getInstance().getExtendedPumpStatus(), null); - } - }); + pumpDeviceStatusView.setOnClickListener(v -> OKDialog.show(getActivity(), MainApp.gs(R.string.pump), NSDeviceStatus.getInstance().getExtendedPumpStatus(), null)); } // OpenAPS status from ns if (openapsDeviceStatusView != null) { openapsDeviceStatusView.setText(NSDeviceStatus.getInstance().getOpenApsStatus()); - openapsDeviceStatusView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.openaps), NSDeviceStatus.getInstance().getExtendedOpenApsStatus(), null); - } - }); + openapsDeviceStatusView.setOnClickListener(v -> OKDialog.show(getActivity(), MainApp.gs(R.string.openaps), NSDeviceStatus.getInstance().getExtendedOpenApsStatus(), null)); } // Uploader status from ns if (uploaderDeviceStatusView != null) { uploaderDeviceStatusView.setText(NSDeviceStatus.getInstance().getUploaderStatus()); - uploaderDeviceStatusView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - OKDialog.show(getActivity(), MainApp.sResources.getString(R.string.uploader), NSDeviceStatus.getInstance().getExtendedUploaderStatus(), null); - } - }); + uploaderDeviceStatusView.setOnClickListener(v -> OKDialog.show(getActivity(), MainApp.gs(R.string.uploader), NSDeviceStatus.getInstance().getExtendedUploaderStatus(), null)); } // ****** GRAPH ******* - new Thread(new Runnable() { - @Override - public void run() { - // allign to hours - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis()); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.add(Calendar.HOUR, 1); + new Thread(() -> { + // allign to hours + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(System.currentTimeMillis()); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.add(Calendar.HOUR, 1); - int hoursToFetch; - final long toTime; - final long fromTime; - final long endTime; - if (predictionsAvailable && SP.getBoolean("showprediction", false)) { - int predHours = (int) (Math.ceil(finalLastRun.constraintsProcessed.getLatestPredictionsTime() - System.currentTimeMillis()) / (60 * 60 * 1000)); - predHours = Math.min(2, predHours); - predHours = Math.max(0, predHours); - hoursToFetch = rangeToDisplay - predHours; - toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific - fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; - endTime = toTime + predHours * 60 * 60 * 1000L; - } else { - hoursToFetch = rangeToDisplay; - toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific - fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; - endTime = toTime; - } + int hoursToFetch; + final long toTime; + final long fromTime; + final long endTime; + if (predictionsAvailable && SP.getBoolean("showprediction", false)) { + int predHours = (int) (Math.ceil(finalLastRun.constraintsProcessed.getLatestPredictionsTime() - System.currentTimeMillis()) / (60 * 60 * 1000)); + predHours = Math.min(2, predHours); + predHours = Math.max(0, predHours); + hoursToFetch = rangeToDisplay - predHours; + toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific + fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; + endTime = toTime + predHours * 60 * 60 * 1000L; + } else { + hoursToFetch = rangeToDisplay; + toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific + fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; + endTime = toTime; + } - final long now = System.currentTimeMillis(); + final long now = System.currentTimeMillis(); - // ------------------ 1st graph - Profiler.log(log, from + " - 1st graph - START", updateGUIStart); + // ------------------ 1st graph + Profiler.log(log, from + " - 1st graph - START", updateGUIStart); - final GraphData graphData = new GraphData(bgGraph, IobCobCalculatorPlugin.getPlugin()); + final GraphData graphData = new GraphData(bgGraph, IobCobCalculatorPlugin.getPlugin()); - // **** In range Area **** - graphData.addInRangeArea(fromTime, endTime, lowLine, highLine); + // **** In range Area **** + graphData.addInRangeArea(fromTime, endTime, lowLine, highLine); - // **** BG **** - if (predictionsAvailable && SP.getBoolean("showprediction", false)) - graphData.addBgReadings(fromTime, toTime, lowLine, highLine, finalLastRun.constraintsProcessed); - else - graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null); + // **** BG **** + if (predictionsAvailable && SP.getBoolean("showprediction", false)) + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, finalLastRun.constraintsProcessed); + else + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null); - // set manual x bounds to have nice steps - graphData.formatAxis(fromTime, endTime); + // set manual x bounds to have nice steps + graphData.formatAxis(fromTime, endTime); - // Treatments - graphData.addTreatments(fromTime, endTime); + // Treatments + graphData.addTreatments(fromTime, endTime); - // add basal data - if (pump.getPumpDescription().isTempBasalCapable && SP.getBoolean("showbasals", true)) { - graphData.addBasals(fromTime, now, lowLine / graphData.maxY / 1.2d); - } + // add basal data + if (pump.getPumpDescription().isTempBasalCapable && SP.getBoolean("showbasals", true)) { + graphData.addBasals(fromTime, now, lowLine / graphData.maxY / 1.2d); + } - // add target line - graphData.addTargetLine(fromTime, toTime, profile); + // add target line + graphData.addTargetLine(fromTime, toTime, profile); - // **** NOW line **** - graphData.addNowLine(now); + // **** NOW line **** + graphData.addNowLine(now); - // ------------------ 2nd graph - Profiler.log(log, from + " - 2nd graph - START", updateGUIStart); + // ------------------ 2nd graph + Profiler.log(log, from + " - 2nd graph - START", updateGUIStart); - final GraphData secondGraphData = new GraphData(iobGraph, IobCobCalculatorPlugin.getPlugin()); + final GraphData secondGraphData = new GraphData(iobGraph, IobCobCalculatorPlugin.getPlugin()); - boolean useIobForScale = false; - boolean useCobForScale = false; - boolean useDevForScale = false; - boolean useRatioForScale = false; - boolean useDSForScale = false; + boolean useIobForScale = false; + boolean useCobForScale = false; + boolean useDevForScale = false; + boolean useRatioForScale = false; + boolean useDSForScale = false; - if (SP.getBoolean("showiob", true)) { - useIobForScale = true; - } else if (SP.getBoolean("showcob", true)) { - useCobForScale = true; - } else if (SP.getBoolean("showdeviations", false)) { - useDevForScale = true; - } else if (SP.getBoolean("showratios", false)) { - useRatioForScale = true; - } else if (Config.displayDeviationSlope) { - useDSForScale = true; - } + if (SP.getBoolean("showiob", true)) { + useIobForScale = true; + } else if (SP.getBoolean("showcob", true)) { + useCobForScale = true; + } else if (SP.getBoolean("showdeviations", false)) { + useDevForScale = true; + } else if (SP.getBoolean("showratios", false)) { + useRatioForScale = true; + } else if (Config.displayDeviationSlope) { + useDSForScale = true; + } - if (SP.getBoolean("showiob", true)) - secondGraphData.addIob(fromTime, now, useIobForScale, 1d); - if (SP.getBoolean("showcob", true)) - secondGraphData.addCob(fromTime, now, useCobForScale, useCobForScale ? 1d : 0.5d); - if (SP.getBoolean("showdeviations", false)) - secondGraphData.addDeviations(fromTime, now, useDevForScale, 1d); - if (SP.getBoolean("showratios", false)) - secondGraphData.addRatio(fromTime, now, useRatioForScale, 1d); - if (Config.displayDeviationSlope) - secondGraphData.addDeviationSlope(fromTime, now, useDSForScale, 1d); + if (SP.getBoolean("showiob", true)) + secondGraphData.addIob(fromTime, now, useIobForScale, 1d); + if (SP.getBoolean("showcob", true)) + secondGraphData.addCob(fromTime, now, useCobForScale, useCobForScale ? 1d : 0.5d); + if (SP.getBoolean("showdeviations", false)) + secondGraphData.addDeviations(fromTime, now, useDevForScale, 1d); + if (SP.getBoolean("showratios", false)) + secondGraphData.addRatio(fromTime, now, useRatioForScale, 1d); + if (Config.displayDeviationSlope) + secondGraphData.addDeviationSlope(fromTime, now, useDSForScale, 1d); - // **** NOW line **** - // set manual x bounds to have nice steps - secondGraphData.formatAxis(fromTime, endTime); - secondGraphData.addNowLine(now); + // **** NOW line **** + // set manual x bounds to have nice steps + secondGraphData.formatAxis(fromTime, endTime); + secondGraphData.addNowLine(now); - // do GUI update - FragmentActivity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - if (SP.getBoolean("showiob", true) || SP.getBoolean("showcob", true) || SP.getBoolean("showdeviations", false) || SP.getBoolean("showratios", false) || Config.displayDeviationSlope) { - iobGraph.setVisibility(View.VISIBLE); - } else { - iobGraph.setVisibility(View.GONE); - } - // finally enforce drawing of graphs - graphData.performUpdate(); - secondGraphData.performUpdate(); - Profiler.log(log, from + " - onDataChanged", updateGUIStart); - } - }); - } + // do GUI update + FragmentActivity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + if (SP.getBoolean("showiob", true) || SP.getBoolean("showcob", true) || SP.getBoolean("showdeviations", false) || SP.getBoolean("showratios", false) || Config.displayDeviationSlope) { + iobGraph.setVisibility(View.VISIBLE); + } else { + iobGraph.setVisibility(View.GONE); + } + // finally enforce drawing of graphs + graphData.performUpdate(); + secondGraphData.performUpdate(); + Profiler.log(log, from + " - onDataChanged", updateGUIStart); + }); } }).start(); @@ -1474,108 +1425,18 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } //Notifications - static class RecyclerViewAdapter extends RecyclerView.Adapter { - - List notificationsList; - - RecyclerViewAdapter(List notificationsList) { - this.notificationsList = notificationsList; - } - - @Override - public NotificationsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { - View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.overview_notification_item, viewGroup, false); - return new NotificationsViewHolder(v); - } - - @Override - public void onBindViewHolder(NotificationsViewHolder holder, int position) { - Notification notification = notificationsList.get(position); - holder.dismiss.setTag(notification); - if (Objects.equals(notification.text, MainApp.sResources.getString(R.string.nsalarm_staledata))) - holder.dismiss.setText("snooze"); - holder.text.setText(notification.text); - holder.time.setText(DateUtil.timeString(notification.date)); - if (notification.level == Notification.URGENT) - holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationUrgent)); - else if (notification.level == Notification.NORMAL) - holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationNormal)); - else if (notification.level == Notification.LOW) - holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationLow)); - else if (notification.level == Notification.INFO) - holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationInfo)); - else if (notification.level == Notification.ANNOUNCEMENT) - holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationAnnouncement)); - } - - @Override - public int getItemCount() { - return notificationsList.size(); - } - - @Override - public void onAttachedToRecyclerView(RecyclerView recyclerView) { - super.onAttachedToRecyclerView(recyclerView); - } - - static class NotificationsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - CardView cv; - TextView time; - TextView text; - Button dismiss; - - NotificationsViewHolder(View itemView) { - super(itemView); - cv = (CardView) itemView.findViewById(R.id.notification_cardview); - time = (TextView) itemView.findViewById(R.id.notification_time); - text = (TextView) itemView.findViewById(R.id.notification_text); - dismiss = (Button) itemView.findViewById(R.id.notification_dismiss); - dismiss.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - Notification notification = (Notification) v.getTag(); - switch (v.getId()) { - case R.id.notification_dismiss: - MainApp.bus().post(new EventDismissNotification(notification.id)); - if (notification.nsAlarm != null) { - BroadcastAckAlarm.handleClearAlarm(notification.nsAlarm, MainApp.instance().getApplicationContext(), 60 * 60 * 1000L); - } - // Adding current time to snooze if we got staleData - log.debug("Notification text is: " + notification.text); - if (notification.text.equals(MainApp.sResources.getString(R.string.nsalarm_staledata))) { - NotificationStore nstore = OverviewPlugin.getPlugin().notificationStore; - long msToSnooze = SP.getInt("nsalarm_staledatavalue", 15) * 60 * 1000L; - log.debug("snooze nsalarm_staledatavalue in minutes is " + SP.getInt("nsalarm_staledatavalue", 15) + "\n in ms is: " + msToSnooze + " currentTimeMillis is: " + System.currentTimeMillis()); - nstore.snoozeTo(System.currentTimeMillis() + (SP.getInt("nsalarm_staledatavalue", 15) * 60 * 1000L)); - } - break; - } - } - } - - } void updateNotifications() { - Activity activity = getActivity(); - if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - NotificationStore nstore = OverviewPlugin.getPlugin().notificationStore; - nstore.removeExpired(); - nstore.unSnooze(); - if (nstore.store.size() > 0) { - RecyclerViewAdapter adapter = new RecyclerViewAdapter(nstore.store); - notificationsView.setAdapter(adapter); - notificationsView.setVisibility(View.VISIBLE); - } else { - notificationsView.setVisibility(View.GONE); - } - } - }); + NotificationStore nstore = OverviewPlugin.getPlugin().notificationStore; + nstore.removeExpired(); + nstore.unSnooze(); + if (nstore.store.size() > 0) { + NotificationRecyclerViewAdapter adapter = new NotificationRecyclerViewAdapter(nstore.store); + notificationsView.setAdapter(adapter); + notificationsView.setVisibility(View.VISIBLE); + } else { + notificationsView.setVisibility(View.GONE); + } } - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java index ff9b4f809c..67e494a76d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java @@ -72,8 +72,8 @@ public class OverviewPlugin extends PluginBase { @Subscribe public void onStatusEvent(final EventNewNotification n) { - notificationStore.add(n.notification); - MainApp.bus().post(new EventRefreshOverview("EventNewNotification")); + if (notificationStore.add(n.notification)) + MainApp.bus().post(new EventRefreshOverview("EventNewNotification")); } @Subscribe diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java new file mode 100644 index 0000000000..6087ae0210 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java @@ -0,0 +1,107 @@ +package info.nightscout.androidaps.plugins.Overview.notifications; + +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Objects; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastAckAlarm; +import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; +import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; +import info.nightscout.utils.DateUtil; +import info.nightscout.utils.SP; + +public class NotificationRecyclerViewAdapter extends RecyclerView.Adapter { + private static Logger log = LoggerFactory.getLogger(NotificationRecyclerViewAdapter.class); + + private List notificationsList; + + public NotificationRecyclerViewAdapter(List notificationsList) { + this.notificationsList = notificationsList; + } + + @Override + public NotificationsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { + View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.overview_notification_item, viewGroup, false); + return new NotificationsViewHolder(v); + } + + @Override + public void onBindViewHolder(NotificationsViewHolder holder, int position) { + Notification notification = notificationsList.get(position); + holder.dismiss.setTag(notification); + if (Objects.equals(notification.text, MainApp.gs(R.string.nsalarm_staledata))) + holder.dismiss.setText("snooze"); + holder.text.setText(notification.text); + holder.time.setText(DateUtil.timeString(notification.date)); + if (notification.level == Notification.URGENT) + holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationUrgent)); + else if (notification.level == Notification.NORMAL) + holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationNormal)); + else if (notification.level == Notification.LOW) + holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationLow)); + else if (notification.level == Notification.INFO) + holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationInfo)); + else if (notification.level == Notification.ANNOUNCEMENT) + holder.cv.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationAnnouncement)); + } + + @Override + public int getItemCount() { + return notificationsList.size(); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + } + + static class NotificationsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + CardView cv; + TextView time; + TextView text; + Button dismiss; + + NotificationsViewHolder(View itemView) { + super(itemView); + cv = (CardView) itemView.findViewById(R.id.notification_cardview); + time = (TextView) itemView.findViewById(R.id.notification_time); + text = (TextView) itemView.findViewById(R.id.notification_text); + dismiss = (Button) itemView.findViewById(R.id.notification_dismiss); + dismiss.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + Notification notification = (Notification) v.getTag(); + switch (v.getId()) { + case R.id.notification_dismiss: + MainApp.bus().post(new EventDismissNotification(notification.id)); + if (notification.nsAlarm != null) { + BroadcastAckAlarm.handleClearAlarm(notification.nsAlarm, MainApp.instance().getApplicationContext(), 60 * 60 * 1000L); + } + // Adding current time to snooze if we got staleData + log.debug("Notification text is: " + notification.text); + if (notification.text.equals(MainApp.sResources.getString(R.string.nsalarm_staledata))) { + NotificationStore nstore = OverviewPlugin.getPlugin().notificationStore; + long msToSnooze = SP.getInt("nsalarm_staledatavalue", 15) * 60 * 1000L; + log.debug("snooze nsalarm_staledatavalue in minutes is " + SP.getInt("nsalarm_staledatavalue", 15) + "\n in ms is: " + msToSnooze + " currentTimeMillis is: " + System.currentTimeMillis()); + nstore.snoozeTo(System.currentTimeMillis() + (SP.getInt("nsalarm_staledatavalue", 15) * 60 * 1000L)); + } + break; + } + } + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java index a8c2a37891..f0bb147982 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java @@ -49,13 +49,13 @@ public class NotificationStore { } } - public synchronized void add(Notification n) { + public synchronized boolean add(Notification n) { log.info("Notification received: " + n.text); for (Notification storeNotification : store) { if (storeNotification.id == n.id) { storeNotification.date = n.date; storeNotification.validTo = n.validTo; - return; + return false; } } store.add(n); @@ -71,6 +71,7 @@ public class NotificationStore { } Collections.sort(store, new NotificationComparator()); + return true; } public synchronized boolean remove(int id) { diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index 8b7b2f8fbe..fa15ee46d2 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -306,12 +306,6 @@ public class CommandQueue { return false; } - if (isRunning(Command.CommandType.BASALPROFILE)) { - if (callback != null) - callback.result(executingNowError()).run(); - return false; - } - if (!MainApp.isEngineeringModeOrRelease()) { Notification notification = new Notification(Notification.NOT_ENG_MODE_OR_RELEASE, MainApp.sResources.getString(R.string.not_eng_mode_or_release), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java index 96a11dacf5..8a8bc41dfa 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java @@ -1,5 +1,8 @@ package info.nightscout.androidaps.queue.commands; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; @@ -17,6 +20,7 @@ import info.nightscout.androidaps.queue.Callback; */ public class CommandSetProfile extends Command { + private static Logger log = LoggerFactory.getLogger(CommandSetProfile.class); private Profile profile; public CommandSetProfile(Profile profile, Callback callback) { @@ -27,6 +31,13 @@ public class CommandSetProfile extends Command { @Override public void execute() { + if (ConfigBuilderPlugin.getCommandQueue().isThisProfileSet(profile)) { + log.debug("QUEUE: Correct profile already set"); + if (callback != null) + callback.result(new PumpEnactResult().success(true).enacted(false)).run(); + return; + } + PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setNewBasalProfile(profile); if (callback != null) callback.result(r).run(); From e937a777ba66c70df7712bc0eb56d2cb91d41701 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Fri, 6 Apr 2018 11:16:16 +0200 Subject: [PATCH 31/43] Combo: remove superseeded TDD button and dialog. --- .../plugins/PumpCombo/ComboFragment.java | 29 ---------- .../plugins/PumpCombo/ComboPlugin.java | 17 ------ .../PumpCombo/ComboTddHistoryDialog.java | 58 ------------------- .../res/layout/combo_tdd_history_fragment.xml | 54 ----------------- .../main/res/layout/combopump_fragment.xml | 13 ----- 5 files changed, 171 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboTddHistoryDialog.java delete mode 100644 app/src/main/res/layout/combo_tdd_history_fragment.xml diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 9753f35ea4..7e2b6ae8ad 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -40,7 +40,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis private TextView tempBasalText; private Button refreshButton; private Button alertsButton; - private Button tddsButton; private TextView bolusCount; private TextView tbrCount; private Button fullHistoryButton; @@ -68,10 +67,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis alertsButton.setOnClickListener(this); alertsButton.setOnLongClickListener(this); - tddsButton = (Button) view.findViewById(R.id.combo_tdds_button); - tddsButton.setOnClickListener(this); - tddsButton.setOnLongClickListener(this); - fullHistoryButton = (Button) view.findViewById(R.id.combo_full_history_button); fullHistoryButton.setOnClickListener(this); fullHistoryButton.setOnLongClickListener(this); @@ -103,10 +98,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis ComboAlertHistoryDialog ehd = new ComboAlertHistoryDialog(); ehd.show(getFragmentManager(), ComboAlertHistoryDialog.class.getSimpleName()); break; - case R.id.combo_tdds_button: - ComboTddHistoryDialog thd = new ComboTddHistoryDialog(); - thd.show(getFragmentManager(), ComboTddHistoryDialog.class.getSimpleName()); - break; case R.id.combo_full_history_button: AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setMessage(R.string.combo_read_full_history_info); @@ -121,29 +112,12 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis switch (view.getId()) { case R.id.combo_alerts_button: alertsButton.setEnabled(false); - tddsButton.setEnabled(false); fullHistoryButton.setEnabled(false); new Thread(() -> ComboPlugin.getPlugin().readAlertData(new Callback() { @Override public void run() { runOnUiThread(() -> { alertsButton.setEnabled(true); - tddsButton.setEnabled(true); - fullHistoryButton.setEnabled(true); - }); - } - })).start(); - return true; - case R.id.combo_tdds_button: - alertsButton.setEnabled(false); - tddsButton.setEnabled(false); - fullHistoryButton.setEnabled(false); - new Thread(() -> ComboPlugin.getPlugin().readTddData(new Callback() { - @Override - public void run() { - runOnUiThread(() -> { - alertsButton.setEnabled(true); - tddsButton.setEnabled(true); fullHistoryButton.setEnabled(true); }); } @@ -151,14 +125,12 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis return true; case R.id.combo_full_history_button: alertsButton.setEnabled(false); - tddsButton.setEnabled(false); fullHistoryButton.setEnabled(false); new Thread(() -> ComboPlugin.getPlugin().readAllPumpData(new Callback() { @Override public void run() { runOnUiThread(() -> { alertsButton.setEnabled(true); - tddsButton.setEnabled(true); fullHistoryButton.setEnabled(true); }); } @@ -213,7 +185,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis refreshButton.setVisibility(View.VISIBLE); if (Config.enableComboBetaFeatures) { alertsButton.setVisibility(View.VISIBLE); - tddsButton.setVisibility(View.VISIBLE); } fullHistoryButton.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index b25e6d3b4a..1bafb8642c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -1171,23 +1171,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return pumpBolus.timestamp + Math.min(secondsFromBolus, 59 * 1000); } - // TODO use queue once ready - void readTddData(Callback post) { -// ConfigBuilderPlugin.getCommandQueue().custom(new Callback() { -// @Override -// public void run() { - readHistory(new PumpHistoryRequest().tddHistory(PumpHistoryRequest.FULL)); -// } -// }, post); - if (post != null) { - post.run(); - } - CommandQueue commandQueue = ConfigBuilderPlugin.getCommandQueue(); - if (commandQueue.performing() == null && commandQueue.size() == 0) { - ruffyScripter.disconnect(); - } - } - // TODO use queue once ready void readAlertData(Callback post) { // ConfigBuilderPlugin.getCommandQueue().custom(new Callback() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboTddHistoryDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboTddHistoryDialog.java deleted file mode 100644 index 7da1c8ba30..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboTddHistoryDialog.java +++ /dev/null @@ -1,58 +0,0 @@ -package info.nightscout.androidaps.plugins.PumpCombo; - -import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import java.text.DateFormat; -import java.util.List; -import java.util.Locale; - -import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Tdd; -import info.nightscout.androidaps.R; - -public class ComboTddHistoryDialog extends DialogFragment { - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View layout = inflater.inflate(R.layout.combo_tdd_history_fragment, container, false); - TextView text = (TextView) layout.findViewById(R.id.combo_tdd_history_text); - List tdds = ComboPlugin.getPlugin().getPump().tddHistory; - if (tdds.isEmpty()) { - text.setText(R.string.combo_no_tdd_data_note); - } else { - StringBuilder sb = new StringBuilder(); - DateFormat dateFormatter = DateFormat.getDateInstance(); - double avg = 0; - double min = 999; - double max = 0; - int count = 0; - for (Tdd tdd : tdds) { - if (tdd.total > 0) { - avg += tdd.total; - count++; - } - if (tdd.total < min) min = tdd.total; - if (tdd.total > max) max = tdd.total; - } - avg = avg / count; - sb.append(String.format(Locale.getDefault(), getString(R.string.combo_tdd_minimum), min)); - sb.append("\n"); - sb.append(String.format(Locale.getDefault(), getString(R.string.combo_tdd_average), avg)); - sb.append("\n"); - sb.append(String.format(Locale.getDefault(), getString(R.string.combo_tdd_maximum), max)); - sb.append("\n"); - for (Tdd tdd : tdds) { - sb.append("\n"); - sb.append(dateFormatter.format(tdd.timestamp)); - sb.append(" "); - sb.append(String.format(Locale.getDefault(), "%3.1f", tdd.total)); - sb.append(" U"); - } - text.setText(sb.toString()); - } - return layout; - } -} diff --git a/app/src/main/res/layout/combo_tdd_history_fragment.xml b/app/src/main/res/layout/combo_tdd_history_fragment.xml deleted file mode 100644 index 04335526ba..0000000000 --- a/app/src/main/res/layout/combo_tdd_history_fragment.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/combopump_fragment.xml b/app/src/main/res/layout/combopump_fragment.xml index 67b135b677..03024eb712 100644 --- a/app/src/main/res/layout/combopump_fragment.xml +++ b/app/src/main/res/layout/combopump_fragment.xml @@ -513,19 +513,6 @@ android:visibility="gone" android:text="@string/combo_pump_alerts" /> - - Date: Fri, 6 Apr 2018 11:19:25 +0200 Subject: [PATCH 32/43] Combo: remove half-backed alerts dialog. --- .../info/nightscout/androidaps/Config.java | 2 - .../PumpCombo/ComboAlertHistoryDialog.java | 52 ------------------ .../plugins/PumpCombo/ComboFragment.java | 55 +++++-------------- .../plugins/PumpCombo/ComboPlugin.java | 17 ------ .../layout/combo_alert_history_fragment.xml | 53 ------------------ .../main/res/layout/combopump_fragment.xml | 13 ----- 6 files changed, 14 insertions(+), 178 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboAlertHistoryDialog.java delete mode 100644 app/src/main/res/layout/combo_alert_history_fragment.xml diff --git a/app/src/main/java/info/nightscout/androidaps/Config.java b/app/src/main/java/info/nightscout/androidaps/Config.java index bbd96a6c61..ff7b935355 100644 --- a/app/src/main/java/info/nightscout/androidaps/Config.java +++ b/app/src/main/java/info/nightscout/androidaps/Config.java @@ -42,6 +42,4 @@ public class Config { public static final boolean logDanaBTComm = true; public static boolean logDanaMessageDetail = true; public static final boolean logDanaSerialEngine = true; - - public static final boolean enableComboBetaFeatures = false; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboAlertHistoryDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboAlertHistoryDialog.java deleted file mode 100644 index 6f30b3aed9..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboAlertHistoryDialog.java +++ /dev/null @@ -1,52 +0,0 @@ -package info.nightscout.androidaps.plugins.PumpCombo; - -import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import java.text.DateFormat; -import java.util.List; - -import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.PumpAlert; -import info.nightscout.androidaps.R; - -public class ComboAlertHistoryDialog extends DialogFragment { - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View layout = inflater.inflate(R.layout.combo_alert_history_fragment, container, false); - TextView text = (TextView) layout.findViewById(R.id.combo_error_history_text); - List errors = ComboPlugin.getPlugin().getPump().errorHistory; - if (errors.isEmpty()) { - text.setText(R.string.combo_no_alert_data_note); - } else { - StringBuilder sb = new StringBuilder(); - DateFormat dateTimeFormatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - boolean first = true; - for (PumpAlert error : errors) { - if (first) { - first = false; - } else { - sb.append("\n"); - } - sb.append(dateTimeFormatter.format(error.timestamp)); - sb.append(" "); - sb.append(error.message); - if (error.warningCode != null) { - sb.append(" (W"); - sb.append(error.warningCode); - sb.append(")"); - } - if (error.errorCode != null) { - sb.append(" (E"); - sb.append(error.errorCode); - sb.append(")"); - } - } - text.setText(sb.toString()); - } - return layout; - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 7e2b6ae8ad..07f59d727e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -6,6 +6,7 @@ import android.app.AlertDialog; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; +import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,7 +17,6 @@ import com.squareup.otto.Subscribe; import org.apache.commons.lang3.StringUtils; -import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.PumpState; import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Bolus; import info.nightscout.androidaps.MainApp; @@ -39,35 +39,30 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis private TextView baseBasalRate; private TextView tempBasalText; private Button refreshButton; - private Button alertsButton; private TextView bolusCount; private TextView tbrCount; private Button fullHistoryButton; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.combopump_fragment, container, false); - stateView = (TextView) view.findViewById(R.id.combo_state); - activityView = (TextView) view.findViewById(R.id.combo_activity); - batteryView = (TextView) view.findViewById(R.id.combo_pumpstate_battery); - reservoirView = (TextView) view.findViewById(R.id.combo_insulinstate); - lastBolusView = (TextView) view.findViewById(R.id.combo_last_bolus); - lastConnectionView = (TextView) view.findViewById(R.id.combo_lastconnection); - baseBasalRate = (TextView) view.findViewById(R.id.combo_base_basal_rate); - tempBasalText = (TextView) view.findViewById(R.id.combo_temp_basal); - bolusCount = (TextView) view.findViewById(R.id.combo_bolus_count); - tbrCount = (TextView) view.findViewById(R.id.combo_tbr_count); + stateView = view.findViewById(R.id.combo_state); + activityView = view.findViewById(R.id.combo_activity); + batteryView = view.findViewById(R.id.combo_pumpstate_battery); + reservoirView = view.findViewById(R.id.combo_insulinstate); + lastBolusView = view.findViewById(R.id.combo_last_bolus); + lastConnectionView = view.findViewById(R.id.combo_lastconnection); + baseBasalRate = view.findViewById(R.id.combo_base_basal_rate); + tempBasalText = view.findViewById(R.id.combo_temp_basal); + bolusCount = view.findViewById(R.id.combo_bolus_count); + tbrCount = view.findViewById(R.id.combo_tbr_count); - refreshButton = (Button) view.findViewById(R.id.combo_refresh_button); + refreshButton = view.findViewById(R.id.combo_refresh_button); refreshButton.setOnClickListener(this); - alertsButton = (Button) view.findViewById(R.id.combo_alerts_button); - alertsButton.setOnClickListener(this); - alertsButton.setOnLongClickListener(this); - - fullHistoryButton = (Button) view.findViewById(R.id.combo_full_history_button); + fullHistoryButton = view.findViewById(R.id.combo_full_history_button); fullHistoryButton.setOnClickListener(this); fullHistoryButton.setOnLongClickListener(this); @@ -94,10 +89,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis } }); break; - case R.id.combo_alerts_button: - ComboAlertHistoryDialog ehd = new ComboAlertHistoryDialog(); - ehd.show(getFragmentManager(), ComboAlertHistoryDialog.class.getSimpleName()); - break; case R.id.combo_full_history_button: AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setMessage(R.string.combo_read_full_history_info); @@ -110,27 +101,12 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis @Override public boolean onLongClick(View view) { switch (view.getId()) { - case R.id.combo_alerts_button: - alertsButton.setEnabled(false); - fullHistoryButton.setEnabled(false); - new Thread(() -> ComboPlugin.getPlugin().readAlertData(new Callback() { - @Override - public void run() { - runOnUiThread(() -> { - alertsButton.setEnabled(true); - fullHistoryButton.setEnabled(true); - }); - } - })).start(); - return true; case R.id.combo_full_history_button: - alertsButton.setEnabled(false); fullHistoryButton.setEnabled(false); new Thread(() -> ComboPlugin.getPlugin().readAllPumpData(new Callback() { @Override public void run() { runOnUiThread(() -> { - alertsButton.setEnabled(true); fullHistoryButton.setEnabled(true); }); } @@ -183,9 +159,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis if (plugin.isInitialized()) { refreshButton.setVisibility(View.VISIBLE); - if (Config.enableComboBetaFeatures) { - alertsButton.setVisibility(View.VISIBLE); - } fullHistoryButton.setVisibility(View.VISIBLE); // battery diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 1bafb8642c..e466e3a454 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -1171,23 +1171,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return pumpBolus.timestamp + Math.min(secondsFromBolus, 59 * 1000); } - // TODO use queue once ready - void readAlertData(Callback post) { -// ConfigBuilderPlugin.getCommandQueue().custom(new Callback() { -// @Override -// public void run() { - readHistory(new PumpHistoryRequest().pumpErrorHistory(PumpHistoryRequest.FULL)); -// } -// }, post); - if (post != null) { - post.run(); - } - CommandQueue commandQueue = ConfigBuilderPlugin.getCommandQueue(); - if (commandQueue.performing() == null && commandQueue.size() == 0) { - ruffyScripter.disconnect(); - } - } - // TODO use queue once ready void readAllPumpData(Callback post) { // ConfigBuilderPlugin.getCommandQueue().custom(new Callback() { diff --git a/app/src/main/res/layout/combo_alert_history_fragment.xml b/app/src/main/res/layout/combo_alert_history_fragment.xml deleted file mode 100644 index f1faa9bb86..0000000000 --- a/app/src/main/res/layout/combo_alert_history_fragment.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/combopump_fragment.xml b/app/src/main/res/layout/combopump_fragment.xml index 03024eb712..0d665c436b 100644 --- a/app/src/main/res/layout/combopump_fragment.xml +++ b/app/src/main/res/layout/combopump_fragment.xml @@ -500,19 +500,6 @@ android:paddingRight="0dp" android:text="@string/combo_refresh" /> - - Date: Fri, 6 Apr 2018 11:26:33 +0200 Subject: [PATCH 33/43] Combo: remove 'read history' button. History and basal rate profile are permanently checked and updated. This functionality would only be needed if driver was fundamentally broken. --- .../plugins/PumpCombo/ComboFragment.java | 34 +------------------ .../plugins/PumpCombo/ComboPlugin.java | 24 ------------- .../main/res/layout/combopump_fragment.xml | 14 -------- 3 files changed, 1 insertion(+), 71 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 07f59d727e..14fdd3c219 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -29,7 +29,7 @@ import info.nightscout.androidaps.queue.events.EventQueueChanged; import info.nightscout.utils.DateUtil; import info.nightscout.utils.SP; -public class ComboFragment extends SubscriberFragment implements View.OnClickListener, View.OnLongClickListener { +public class ComboFragment extends SubscriberFragment implements View.OnClickListener { private TextView stateView; private TextView activityView; private TextView batteryView; @@ -41,7 +41,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis private Button refreshButton; private TextView bolusCount; private TextView tbrCount; - private Button fullHistoryButton; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, @@ -62,10 +61,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis refreshButton = view.findViewById(R.id.combo_refresh_button); refreshButton.setOnClickListener(this); - fullHistoryButton = view.findViewById(R.id.combo_full_history_button); - fullHistoryButton.setOnClickListener(this); - fullHistoryButton.setOnLongClickListener(this); - updateGUI(); return view; } @@ -89,33 +84,9 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis } }); break; - case R.id.combo_full_history_button: - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setMessage(R.string.combo_read_full_history_info); - builder.show(); - break; } } - // TODO clean up when when queuing - @Override - public boolean onLongClick(View view) { - switch (view.getId()) { - case R.id.combo_full_history_button: - fullHistoryButton.setEnabled(false); - new Thread(() -> ComboPlugin.getPlugin().readAllPumpData(new Callback() { - @Override - public void run() { - runOnUiThread(() -> { - fullHistoryButton.setEnabled(true); - }); - } - })).start(); - return true; - } - return false; - } - @Subscribe public void onStatusEvent(final EventComboPumpUpdateGUI ignored) { updateGUI(); @@ -158,9 +129,6 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis } if (plugin.isInitialized()) { - refreshButton.setVisibility(View.VISIBLE); - fullHistoryButton.setVisibility(View.VISIBLE); - // battery batteryView.setTextSize(20); if (ps.batteryState == PumpState.EMPTY) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index e466e3a454..791b001038 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -1171,30 +1171,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return pumpBolus.timestamp + Math.min(secondsFromBolus, 59 * 1000); } - // TODO use queue once ready - void readAllPumpData(Callback post) { -// ConfigBuilderPlugin.getCommandQueue().custom(new Callback() { -// @Override -// public void run() { - readHistory(new PumpHistoryRequest() - .bolusHistory(PumpHistoryRequest.FULL) - .pumpErrorHistory(PumpHistoryRequest.FULL) - .tddHistory(PumpHistoryRequest.FULL)); - CommandResult readBasalResult = runCommand(MainApp.gs(R.string.combo_actvity_reading_basal_profile), 2, ruffyScripter::readBasalProfile); - if (readBasalResult.success) { - pump.basalProfile = readBasalResult.basalProfile; - } -// } -// }, post); - if (post != null) { - post.run(); - } - CommandQueue commandQueue = ConfigBuilderPlugin.getCommandQueue(); - if (commandQueue.performing() == null && commandQueue.size() == 0) { - ruffyScripter.disconnect(); - } - } - /** * Reads QuickInfo to update reservoir level and determine if new boluses exist on the pump * and if so, queries the history for all new records. diff --git a/app/src/main/res/layout/combopump_fragment.xml b/app/src/main/res/layout/combopump_fragment.xml index 0d665c436b..5bb90090be 100644 --- a/app/src/main/res/layout/combopump_fragment.xml +++ b/app/src/main/res/layout/combopump_fragment.xml @@ -499,20 +499,6 @@ android:paddingLeft="0dp" android:paddingRight="0dp" android:text="@string/combo_refresh" /> - - - From 623a5e3da1d030356b91a361966fa37000e7b836 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Fri, 6 Apr 2018 11:33:34 +0200 Subject: [PATCH 34/43] Combo: remove unused strings, minor code cleanups. --- .../plugins/PumpCombo/ComboPlugin.java | 9 ++++---- app/src/main/res/values-bg/strings.xml | 3 --- app/src/main/res/values-cs/strings.xml | 9 -------- app/src/main/res/values-de/strings.xml | 9 -------- app/src/main/res/values-es/strings.xml | 8 ------- app/src/main/res/values-fr/strings.xml | 8 ------- app/src/main/res/values-nl/strings.xml | 21 ++++++------------- app/src/main/res/values/strings.xml | 9 -------- 8 files changed, 10 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 791b001038..36f9235686 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -68,8 +68,8 @@ import info.nightscout.utils.SP; */ public class ComboPlugin extends PluginBase implements PumpInterface, ConstraintsInterface { private static final Logger log = LoggerFactory.getLogger(ComboPlugin.class); - public static final String COMBO_TBRS_SET = "combo_tbrs_set"; - public static final String COMBO_BOLUSES_DELIVERED = "combo_boluses_delivered"; + static final String COMBO_TBRS_SET = "combo_tbrs_set"; + static final String COMBO_BOLUSES_DELIVERED = "combo_boluses_delivered"; private static ComboPlugin plugin = null; @@ -1124,11 +1124,11 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint */ private boolean readHistory(@Nullable PumpHistoryRequest request) { CommandResult historyResult = runCommand(MainApp.gs(R.string.combo_activity_reading_pump_history), 3, () -> ruffyScripter.readHistory(request)); - if (!historyResult.success) { + PumpHistory history = historyResult.history; + if (!historyResult.success || history == null) { return false; } - PumpHistory history = historyResult.history; updateDbFromPumpHistory(history); // update local cache @@ -1320,7 +1320,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint @Override public PumpEnactResult loadTDDs() { - PumpEnactResult result = new PumpEnactResult(); result.success = readHistory(new PumpHistoryRequest().tddHistory(PumpHistoryRequest.FULL)); if (result.success) { diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 52d23a534a..9bda35856c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -678,9 +678,6 @@ En Използвай системни известия за аларми и съобщения Внимание - Минимум: %3.1f U - Максимум: %3.1f U - Средно: %3.1f U Нормално Ниско Няма достатъчно инсулин в резервоара diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 71e1000cbb..acd0a5df3a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -704,7 +704,6 @@ Bolus stejné velikosti už byl během poslední minuty požadován. Jako preventivní ochrana před zdvojeným bolusem byla operace zakázána. Teď Načítání historie pumpy - Výstrahy Nastavení bazálního profilu V zásobníku je málo inzulínu Slabá baterie v pumpě @@ -713,18 +712,12 @@ Provádění bolusu a čtení historie selhalo. Zkontrolujte pumpu a zadejte bolus přes péči Provádění bolusu selhalo. Zdá se, že žádný bolus nebyl podán. Zkontrolujte pumpu a případně pošlete bolus znovu. Jako bezpečnostní opatření podání bolusu není opakováno. Pouze %.2f U z bolusu %.2f bylo podáno díky chybě. Zkontrolujte pumpu a proveďte nápravu. - Historie Varování o ukončeném dočasném bazálu bylo potvrzeno. Varování Prázdný Nízký Normální - Průměr: %3.1f U - Maximum: %3.1f U - Minimum: %3.1f U - Pro přečtení historie chyb dlouze stiskněte tlačítko ALERTS. Varování: může to způsobit chybu, že pumpa bude odmítat všechny připojení a je pak vyžadováno stisknutí tlačítka na pumpě pro obnovení komunikace. Je vyžadována aktualizace času na pumpě - Pro přečtení celkových denních dávek dlouze stikněte na pumpě tlačítko TDDS. Varování: může to způsobit chybu, že pumpa bude odmítat všechna připojení a je pak vyžadováno stisknutí tlačítka na pumpě pro obnovení komunikace. Nedostatek inzulínu pro takovýto bolus Chyba spuštění extended bolusu SMB @@ -823,8 +816,6 @@ Bolus bude pouze zaznamenán Automaticky doplňovat chybějící glykémie z NS Hypoglykémie - CDD - Dlouhé stisknutí tohoto tlačítka pro plné načtení historie a bazálního profilu z pumpy. Obvykle to není nutné, protože se to děje průběžně, ale může to pomoci v případě změny datumu v pumpě nebo v případě výměny pumpy. Citlivost Odchylky Zbývající sacharidy diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 01de36c6f5..a07ec4b40c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -666,7 +666,6 @@ Gestoppt (Benutzer) Gestoppt (Fehler) In Betrieb - TDDS Bolusabgabe wird vorbereitet TBR wird abgebrochen TBR wird gesetzt (%d%% / %d Min.) @@ -680,7 +679,6 @@ Der abgegebene Bolus konnte nicht bestätigt werden. Bitte prüfe auf der Pumpe, ob ein Bolus abgegeben wurde und erstelle einen Eintrag im Careportal falls nötig. Die Bolusabgabe ist fehlgeschlagen: Es wurde scheinbar kein Bolus abgegeben. Bitte prüfe auf der Pumpe, ob ein Bolus abgegeben wurde. Um doppelte Boli durch Programmfehler zu vermeiden, werden Boli nicht automatisch wiederholt. Wegen eines Fehlers wurden nur %.2f IE von den angeforderten %.2f IE abgegeben. Bitte prüfe den abgegebenen Bolus auf der Pumpe. - Historie Status wird aktualisiert Die Pumpe wird initialisiert Jetzt @@ -689,19 +687,13 @@ Leer Niedrig Normal - Durchschnitt: %3.1f IE - Maximum: %3.1f IE - Minimum: %3.1f IE Diese Aktion wird von der Pumpe nicht unterstützt - Alarme Die Batterie in der Pumpe ist fast leer Das Reservoir in der Pumpe ist fast leer Die Pumpe zeigt einen Fehler an E%d: %s Unsichere Verwendung: In der Pumpe ist nicht das erste Basalratenprofil gewählt. Der Loop wird deaktiviert bis dies korrigiert ist. Unsichere Verwendung: Ein erweiterter oder Multiwave-Bolus ist aktiv. Der Loop wird für die nächsten 6 Stunden kein zusätzliches Insulin abgeben. - Um die Fehlerhistorie der Pumpe zu lesen, drücke lange auf ALARME. Bitte aktualisiere die Uhrzeit der Pumpe - Um die TDD-Statistik der Pumpe zu lesen, drücken Sie den TDDS Knopf lange.\nWARNUNG: Es gibt einen bekannten Fehler in der Pumpe der dazu führt, dass die Pumpe nach dieser Aktion erst wieder Verbindungen annimmt, wenn auf der Pumpe selbst ein Konpf gedrückt wird. Aus diesem Grund sollte diese Aktion nicht durchgeführt werden. Nicht mehr genug Insulin im Reservoir für den Bolus Ja Nein @@ -723,7 +715,6 @@ Achtung! Normalerweise musst Du diese Werte nicht ändern. Bitte KLICKE HIER und LESE den Text. Verändere Werte erst, wenn Du den Inhalt des Textes verstanden hast. Basalratenprofil wird gelesen %.2f IE/h - Drücke den Button lange, um die gesamte Historie und das Basal-Profil der Pumpe auszulesen. Dies ist eigentlich unnötig, weil die Historie regelmäßig gelesen wird. Hilfreich kann dies jedoch sein, wenn Datum und Zeit grundlegend verändert wurden oder die Pumpe ausgetauscht wurde. Keine Verbindung zur Pumpe: Es wurde kein Bolus abgegeben. Fehler bei der Abgabe eines verlängerten Bolus Nach der Berechnung des Bolus hat sich die Pumpenhistorie geändert. Daher wurde kein Bolus abgegeben. Bitte prüfe, ob überhaupt noch ein Bolus benötigt wird. Wenn die gleiche Bolusmenge erforderlich ist, warte zwei Minuten ab, denn es werden aus Sicherheitsgründen keine gleich großen Boli abgegeben, wenn sie innerhalb von zwei Minuten angefordert wurden (unabhängig davon, ob sie verabreicht wurden oder nicht). diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f29b7855da..1fc2769177 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -676,7 +676,6 @@ Perfil invalido: %s Programando bomba para emitir bolo Actualizar - TDDS Estado Actividad Ninguna coneccnion por %d min @@ -694,21 +693,14 @@ Un bolo de mismo valor ha sido dado durante el pasado minuto. Para evitar bolos dobles y asegurarse contra bugs esto no es permitido. Ahora Leiendo historia bomba - Alarmas " Activando perfil base " "Nivel del deposito bajo " Bateria casi agotada La bomba muesta el error E%d: %s - Para leer historial de los errores, pincha unos segundo el boton \"ALARMAS\" ATENCION: esto puede causar un bug. La bomba no vuelve a conectarse - necesitas pulsar un boton en la misma bomba para reiniciarse. Deberias evitar esto. - Para leer el hisorial TDD de la bomba pulsa el boton TDDS unso segundos. ATENCION: esto puede causar un bug. La bomba no vuelve a conectarse - necesitas pulsar un boton en la misma bomba para reiniciarse. Deberias evitar esto. - Mínimo: %3.1f U - Media: %3.1f U - Máximo: %3.1f U Bajo Vacio Normal Se necesita actualizar reloj de la bomba - Historial Alerta TBR cancelada, advertencia acceptada Emision del bolo fallado. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automaticamente. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 084d6c8609..cedf15bd5e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -684,7 +684,6 @@ Profile incorrect: %s Programmer la pompe pour administrer un bolus Actualiser - TDDS État Activité Pas de connexion depuis %d min @@ -708,21 +707,14 @@ Un bolus avec la même quantité d’insuline a été demandé au cours de la dernière minute. Pour prévenir l’administration accidentelle de deux bolus à la fois et pour protéger contre les bugs quand ceci (bolus) non autorisé Maintenant Lecture historique pompe - Alertes Définir le profil basal Niveau cartouche pompe bas Niveau batterie pompe bas La pompe affiche l’erreur E%d: %s - Pour lire l’historique des erreurs de pompe, Appuyez longuement sur le bouton ALERTES, WARNING : ceci peut provoquer un bug et ce dernier va ordonner la pompe à rejeter toutes les tentatives de connexion et qui va nécessiter d’appuyer un bouton sur la pompe pour restaurer et par conséquent le bug devrait être évité - Pour lire l’historique DTQ de la pompe, Appuyez longuement les boutons DTQS, WARNING : ceci peut provoquer un bug ce qui ordonne la pompe à rejeter toutes les tentatives de connexion et qui va nécessiter d’appuyer un bouton sur la pompe pour restaurer et par conséquent le bug devrait être évité - Minimum: %3.1f U - Moyen: %3.1f U - Maximum: %3.1f U Bas Vide Normal Mise à jour nécessaire pour l\'heure de la pompe - Historique Warning TBR ANNULÉ warning confirmé Administration bolus échouée. Il semble qu’aucun bolus n’a été administré. Pour être sûr, Veuillez vérifier la pompe pour éviter un double bolus ensuite re bolusez une nouvelle fois diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 94bbbe2e8d..55d0d9ba64 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -693,12 +693,9 @@ Pomp klok moet bijgesteld worden Leeg Bijna leeg - Maximum: %3.1f E - Normaal + Normaal Vernieuwen - Historiek - Storingen - Batterij pomp is bijna leeg + Batterij pomp is bijna leeg Gevraagde is niet momeglijk met de pomp Zojuist TB GEANNULEERD Waarschuwing is bevestigd @@ -709,20 +706,15 @@ Insuline ampul is bijna leeg Pomp is in storing, controleer op de pomp: E%d %s Bolus (%.1f E) - Minimum: %3.1f E - Gemiddelde: %3.1f E - Instellen van basaal profiel + Instellen van basaal profiel Lezen van pomp historiek - Om de pomp fouthistoriek op te halen, druk lang op de Storingen knop. - Maar %.2f E van de gevraagde %.2f E zijn toegediend door een storing. Gelieve op de pomp te controleren en het gepaste gevolg uit te voeren. - "Om de TTD van de pomp op te halen, lang duwen op de TDDS knop OPGELET: dit kan een bug veroorzaken waardoor de pomp alle verbindingen verbreekt en het vereist is op een knop op de pomp te duwen, dit wordt daarom afgeraden." - Toedienen en controleren van de bolus in de pomp historiek is mislukt, controleer de pomp en creëer een manuele bolus in het Careportal tabblad + Maar %.2f E van de gevraagde %.2f E zijn toegediend door een storing. Gelieve op de pomp te controleren en het gepaste gevolg uit te voeren. + Toedienen en controleren van de bolus in de pomp historiek is mislukt, controleer de pomp en creëer een manuele bolus in het Careportal tabblad Bolus toedienen mislukt. Waarschijnlijk is er geen bolus toegediend. Gelieve de pomp te controleren om een dubbele bolus te vermijden. Als bescherming tegen programmeerfouten worden bolussen niet automatisch opnieuw uitgevoerd. Actie Instellen TBR (%d%% / %d min) Onvoorzichtig gebruik: Vertraagde of multi wave bolussen zijn toegediend in de afgelopen 6 uur op het geselecteerde basaal patroon is niet 1. Loop is onderbroken tot de 6 uur nadat deze bolussen of andere basale patronen zijn gedetecteerd. Alleen normale bolussen en basaal patroon 1 zijn mogelijk binnen basaal patroon 1 - TDDS - Opgelet: verlengde en multi wafe bolussen zijn actief. Loop is naar onderdruk lage waardes enkel overgeschakeld gedurende 6 uur. Alleen gewone bolussen worden onderdsteund in loop modus. + Opgelet: verlengde en multi wafe bolussen zijn actief. Loop is naar onderdruk lage waardes enkel overgeschakeld gedurende 6 uur. Alleen gewone bolussen worden onderdsteund in loop modus. Niet genoeg insuline aanwezig in reservoir voor de bolus Combinatie-Bolus %.2f E/u @@ -732,7 +724,6 @@ Basaal profiel wordt gelezen Basale patroon niet geschikt op complete uren: %s Ongeldig profiel: %s - Lang duwen op deze knop zal de volledige historiek en basaal profiel uit de pomp ophalen. Dit is normaal gezien niet nodig, daar de pomp historiek permanent wordt gelezen, maar kan nuttig zijn wanneer de pomp dat en tijd grote afwijkingen hadden of de pomp vervangen is. Er kon geen verbinding met de pomp gemaakt worden. De Bolus is niet toegediend. Vertraagde bolus toedien storing De pomp historiek is gewijzigd nadat de bolus berend was. De bolus is NIET toegediend. Programmeer een nieuwe bolus indien nodig. Als dezelfde bolus hoeveelheid moet worden toegediend, gelieve 2 minuten te wachten. Gelijke bolussen worden geweigerd om veiligheidsredenen (toegediend of niet). diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e6837e0470..71788baf05 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -780,7 +780,6 @@ Invalid profile: %s Programming pump for bolusing Refresh - TDDS State Activity No connection for %d min @@ -801,23 +800,15 @@ Now Reading pump history pump history - Alerts Setting basal profile Pump cartridge level is low Pump battery is low The pump is showing the error E%d: %s - To read the pump\'s error history, long press this button - To read the pump\'s TDD history, long press this button - Minimum: %3.1f U - Average: %3.1f U - Maximum: %3.1f U Low Empty Normal Pump clock update needed - History Warning - Long press this button to force a full read of history and basal profile from the pump. This is generally not needed, since the pump\'s history is read continuously, but can be useful if the pump\'s date and time changed significantly or the pump was replaced. TBR CANCELLED warning was confirmed The pump could not be reached. No bolus was given Bolus delivery failed. It appears no bolus was delivered. To be sure, please check the pump to avoid a double bolus and then bolus again. To guard against bugs, boluses are not automatically retried. From c94d01f22b9556cb193bcd1d07ea45d0bed8b9f1 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 6 Apr 2018 18:30:36 +0200 Subject: [PATCH 35/43] better time synchronization for danarv2 --- .../plugins/PumpDanaRv2/DanaRv2Plugin.java | 3 ++- .../services/DanaRv2ExecutionService.java | 18 ++++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index 765ef865cf..b06f9541af 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -17,13 +17,13 @@ import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage; import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.Round; import info.nightscout.utils.SP; @@ -380,4 +380,5 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { public PumpEnactResult loadEvents() { return sExecutionService.loadEvents(); } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 27b1275047..551c2684c0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -64,8 +64,10 @@ import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgSetHistoryEntry_v2 import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusBolusExtended_v2; import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgStatusTempBasal_v2; import info.nightscout.androidaps.queue.Callback; +import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; +import info.nightscout.utils.T; import info.nightscout.utils.ToastUtils; public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { @@ -198,8 +200,10 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); - if (Math.abs(timeDiff) > 10) { - mSerialIOThread.sendMessage(new MsgSetTime(new Date())); + if (Math.abs(timeDiff) > 3) { + waitForWholeMinute(); // Dana can set only whole minute + // add 10sec to be sure we are over minute (will be cutted off anyway) + mSerialIOThread.sendMessage(new MsgSetTime(new Date(DateUtil.now() + T.secs(10).msecs()))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -450,4 +454,14 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { return true; } + void waitForWholeMinute() { + while (true) { + long time = DateUtil.now(); + long timeToWholeMinute = (60000 - time % 60000); + if (timeToWholeMinute > 59800 || timeToWholeMinute < 3000) + break; + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int)(timeToWholeMinute / 1000)))); + SystemClock.sleep(Math.min(timeToWholeMinute, 100)); + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6da4c26248..b405cbc30c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -996,5 +996,6 @@ SMB not allowed in open loop mode Food IobCobCalculator + Waiting for time synchronization (%d sec) From fc56af7add0cfe553ec6d43365c1988288e54ab7 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 6 Apr 2018 18:58:13 +0200 Subject: [PATCH 36/43] Fix detailedbolusinfo for DanaRv2 --- .../androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index b06f9541af..cff758f121 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -25,6 +25,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.utils.DateUtil; import info.nightscout.utils.Round; import info.nightscout.utils.SP; @@ -153,7 +154,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { speed = 60; break; } - detailedBolusInfo.date += speed * detailedBolusInfo.insulin * 1000; + detailedBolusInfo.date = DateUtil.now() + (long)(speed * detailedBolusInfo.insulin * 1000); // clean carbs to prevent counting them as twice because they will picked up as another record // I don't think it's necessary to copy DetailedBolusInfo right now for carbs records double carbs = detailedBolusInfo.carbs; @@ -167,7 +168,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { t.isSMB = detailedBolusInfo.isSMB; boolean connectionOK = false; if (detailedBolusInfo.insulin > 0 || carbs > 0) - connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000, t); + connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) carbs, DateUtil.now() + carbTime * 60 * 1000, t); PumpEnactResult result = new PumpEnactResult(); result.success = connectionOK; result.bolusDelivered = t.insulin; From 7cf2505276be356205ec4c893648f5b62f00efad Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 6 Apr 2018 19:07:47 +0200 Subject: [PATCH 37/43] Better time synchronization for DanaRS --- .../PumpDanaRS/services/DanaRSService.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java index dd7f22b0b1..384c1a3772 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java @@ -71,8 +71,10 @@ import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Notify_D import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Option_Get_Pump_Time; import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Option_Set_Pump_Time; import info.nightscout.androidaps.queue.Callback; +import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; +import info.nightscout.utils.T; public class DanaRSService extends Service { private static Logger log = LoggerFactory.getLogger(DanaRSService.class); @@ -145,8 +147,10 @@ public class DanaRSService extends Service { bleComm.sendMessage(new DanaRS_Packet_Option_Get_Pump_Time()); long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); - if (Math.abs(timeDiff) > 10) { - bleComm.sendMessage(new DanaRS_Packet_Option_Set_Pump_Time(new Date())); + if (Math.abs(timeDiff) > 3) { + waitForWholeMinute(); // Dana can set only whole minute + // add 10sec to be sure we are over minute (will be cutted off anyway) + bleComm.sendMessage(new DanaRS_Packet_Option_Set_Pump_Time(new Date(DateUtil.now() + T.secs(10).msecs()))); bleComm.sendMessage(new DanaRS_Packet_Option_Get_Pump_Time()); timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -458,4 +462,14 @@ public class DanaRSService extends Service { log.debug("EventAppExit finished"); } + void waitForWholeMinute() { + while (true) { + long time = DateUtil.now(); + long timeToWholeMinute = (60000 - time % 60000); + if (timeToWholeMinute > 59800 || timeToWholeMinute < 300) + break; + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int)(timeToWholeMinute / 1000)))); + SystemClock.sleep(Math.min(timeToWholeMinute, 100)); + } + } } From 74edadd1e53e4b798d6984549760f1747f7a473a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 6 Apr 2018 21:07:29 +0200 Subject: [PATCH 38/43] fix detailedbolusinfo for DanaRS --- .../androidaps/plugins/PumpDanaRS/DanaRSPlugin.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index a8e460c078..8c94c7513e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -363,9 +363,9 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte speed = 60; break; } - // v2 stores end time for bolus, we need to adjust time + // RS stores end time for bolus, we need to adjust time // default delivery speed is 12 sec/U - detailedBolusInfo.date += detailedBolusInfo.insulin * speed * 1000; + detailedBolusInfo.date = DateUtil.now() + (long)(speed * detailedBolusInfo.insulin * 1000); // clean carbs to prevent counting them as twice because they will picked up as another record // I don't think it's necessary to copy DetailedBolusInfo right now for carbs records double carbs = detailedBolusInfo.carbs; @@ -379,7 +379,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte t.isSMB = detailedBolusInfo.isSMB; boolean connectionOK = false; if (detailedBolusInfo.insulin > 0 || carbs > 0) - connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000, t); + connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, DateUtil.now() + carbTime * 60 * 1000, t); PumpEnactResult result = new PumpEnactResult(); result.success = connectionOK; result.bolusDelivered = t.insulin; From 1d2cd4b9cf3cc373a6730ba9201224a8f00e351f Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Fri, 6 Apr 2018 21:39:42 +0200 Subject: [PATCH 39/43] Support for TDDs --- app/libs/sightparser-release.aar | Bin 191915 -> 202440 bytes .../plugins/PumpInsight/InsightPlugin.java | 2 +- .../history/HistoryIntentAdapter.java | 12 ++++++++++++ .../PumpInsight/history/HistoryReceiver.java | 12 +++++------- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/app/libs/sightparser-release.aar b/app/libs/sightparser-release.aar index 20de8894263eb4668e6ceb49b0d458e956581a64..4e474e608ec43954c73edb13f808065edc521148 100644 GIT binary patch delta 189668 zcmV(xKD`O@Adco*Kx{C>Uu3GSJK*;2X14$mOeZ+xfz z{xW<6P)h>@3V#3q2nYZ;riM(8M+ukP+yVf5uLA%J0001EY+-YAWpgfSVREdyV{jx~ z_x78K&5o0aZQHhO+qP{d6Wg|J+cqZ7gp-_^=l|9@Z`G;$uJgQgy1J{oKlGQiuWMbu zwfAm$DG*Qq5F{id5D*Xn(Et7*20{gLaxpV-q%(CiF@K?RvM@7uwl{EeGI696loL{M zwy>r(vNmvXQc;Ejg81Km_&EUtC`a>C7La?&!w(c{|(K&%3)Dgnb}3jI)E*lePtF zCSu0fL4UFgAyi4wsH;mQShk4CMPX-jLVKLuq!^vXj4@lXkVY>mhH#$4fNo;4o%vvf zoWzkwE)v4R(L|UXQxBb!hqQ?@gd+@m|2B)CVK;tHhgOP7$!r7d?Q*DJkXI59jv1=+ zD-8wM3axzV#1NTosj82_@!t*O_>C@&9g3&<~|dK}RV? z8h;^P2byM%g4Q_ZGPiO4d{M55@EgdRe5gubPm8Yb_w?siBU7P|=jS^@AHy%IF@wV3 zY2+5j5YA5Q^`KVh@c40e1FdxLSq=UU(E zRrCEcM_BV0+8no5?CrO$(&~lCb2?pWy?-=DX!9?c>E28D8#gTO7vZohSZJ}^d%B3ph->`dAprL zUY$ZKrxr1D3~CI1WuK;>GCjk16EYEun#`1P2?$>xK4^z5Q45wpRlqoh zYb+igufzT2b6hTv>n(c-;9i2bK4%0Rx}rT}gtSFjNqIXlaso;jxr~vT6MvUh9;DD}lqj8l^0=vuMWzTj$gqjqI$BIrbeGlHb-j_;3bro1 zG4P};`|6LaW7{0lK_ye!t$+6B6~4e19%s2-Cl*U+6A~}D)>OIX@AiJgRmeIk6P49y zfOS)DteCY9au)|`SbX8C$2y!}4qZoIKWLLuV}#b~T$E2%S3THggX>n8)aQeXa4SDr z9NuLRF_1y)9N z;4X0mOr5m&r;J(ioPUXhNxgiPHN*r+UWg@j6N+EyB@oQnqO@L3RBacFJ4iAfM*y2} za-m{QVd_AF16ZTY}lvVj@;@3lSt;s^S<{=?x)N6Us++|<}c2&9Blbn z@O9_>9;mB6YgBltxKs!Xg(281Q>DMhb)J_r9Z{--Sym)6tB5Zmp_C_mjT(cL$1EWAF9S!)8+xeHs@nHjs2tOvdf zrd?m(Pv|{(TYocpf2i1T*be%62nZ!i=|jd*X}+30%2AfsOB^*xx~=~N;PD&}r# zQs<%-noMwi8k0`BOWC$zVZEVW>R_a_@4eJxVoo4*vVVr5xQWvytVO5oa5;a?@Dpx% z>rkwmaS!l?9bS`isUTk-UJqJEXxco$N5Ao^~>90{qPGr+VEmJ4U}o z=)UWIoUn4?0d7`5{%BPY#}pH_bCnYf^KglL4{AE-Y1^^>H`>AN*w|+wzSzhodU$Dx zy{oexq*ZJYJt+l`W-ROF;Jax0`(ACeppsja z;iQi83CAGLeUY-b23c2b^w4})lwzpq5-~4lyG+ z;MqOy7+EWj5&HmZIxucW-zdPJ?nN~+HS*?~jre`P@dH^Cm=uJ1 zAVs6bP+z*&m`qGHL4iY|f*t0;9DBhQs()F(U_9y#1L>FlImVAeQkWx8)^)06Qi1ZT zefL=Mf}85(Fh3dtE1UeT&2c6fQI@#dz`I|CIN1sR117&fC$s@NNq-JLslImIwiy#T zZA*^a1c1#Gm%qbtnzn^`=YDo2RZH{cIONl?`q`KpY>OC&NgL#XLs~)SD?Z)ah<{*f z6&(Ym4$D+a@U&eKL-%571b4~GI%llz=?7~`Wb(>=o0Z$`G(WqM*PTL$gtr)27V%ng z*|LLG#4T=i77J0Dy?91~IrIfhtE#^cw|GL@e+ud&tz(wX1qFQbWreiyJb za{yi8ESncPKJ@|PG4QPsfnIj?CV!r5i!!}+49|AE!2UOEWf5JN<;851X` ze@%$bhysBEMu~5dy{u7Ae+0ml>8C)TaDNN*9krgd zd_6^!t1u(sm)Y|Z+#XgV=(kuyoY8dT0xhl0U$KbV+BJ~-J`aS!7N%Aj&YRj>Os6T7 zWEx8L&4y-PJ?Mk3Haz>(4?5#BU7SdVHtn{%YaR|K3SFm)wvgjWi|vBnt?{Iu-2G2Fm0$_}xoq-|CZ_*HGHRE805eoyQm>3@V}C?(dPIFB zEXN>~C_q4HXkEZC322~1fF_PBS!TerbO)1EzA9ykW@T~pMul?qQ-7qUCdE=nvSuyK zM#Zw_@cYxL-X7U2e$K;;v8$g!8g;Ob-9yeP_vw9(+e!0R_Y0%H%1c^w9JxDsEEVK_ zfTkrc<)J{1w{$>onEUY|l6L_-!XYSI+|s@R_sBGv#~a0WpC4jzRPMmJ2IDB)Z&lH= zca2F~+~e51v(xDAZ-2v(If}O=+%$)iNZuj>Fg+8~t8K3x(RSqOfrm(02cMZp-cj#% zRPNxV8dn;&IZ=CDTe%T?9;%+HnNCPueO|qjn$V0hQs&p&3yZxRJ$CwLU3T`nd;DE& z^GRE)n@kvKbMf4HxC@3F(^Es>*;xjrD-!ARRv9gY88h*z(|?!9sj8rBtrR)Z)>2oI zH_3==%Z(g?Fvx<396m#&^+l#7PN@m8#ng-QGGwgm6~~W{Ks+l>9T^KYif9bMHGp%C z^ri<)8g%UObI&PO#=@Dl)W#?6XcBWP_ih6$+1B6`n^pd2N53@xpI%3ChE_3y#(tuu)mnDp z8_eLd7|u;g{WcqIV%GgLUFR4^o&(&*Yv43b=_SYJu>yCAbyKU>r=z3QStyGiqxHU% zSF>h~pdD>CoXsvAJXRKjvY?yduI=7z=R}&km)686@PCr#HdJQv8P3oRVZ=*s?8qz0 z3Dw9n@o4(4NY)-M`d;EIu8sgT!o()^hVtm6m0#7!#Bbxjo?01nQ}M!}=nOcIpGh`Q zK*f49dR{xJ>$M8}SyLg05K12%Vo@>6OLWwtK*UXglh;;N28^dZ(m_c|<21q^g9{gn z>b1kot$)VqAUHHK!xu#-CoX=R54XroZVX9L@RHX$APkB>DqSUJGvQDrjbD6rRecgv z)G(47cL^^L-gOCAGRAsm$=F1zhr+i%m5-2Wp|xo}#3sbZyuIexVm+U6%wUNXii3?@ z!J=y4n@(V1Gl^5qjkrsFBq=!>f}bNEJ8zc!=zl-;R-Juu|0P}@i1aEzl`D1b1CBSX zsjD>(AfBp}|E9bZSxA|9rdkhw8S&sULtt0pvpYCRxf9fkjDPq}30@~OjBqRDm>Y?= zKT7F4kS>IwdIznm;sCKjcbFKNdtgSXJ9vqFl043U$~Q`<{DEv&_JS&^f+MUtTzf}) ztbc3KT*_bm0w-DyuIfxjGLSvRT6@syE;W2(pW#iKtnsy-c@s8_re9{9lWR%GHwh}FC~~PnV-tCprEAu zRK|jg+A6nX;M!7oh)2mA>?c`9=eW`H<$s@3@B*Nn=9uT=7K+E`4xOm z2rKtHWkt~lO$GJ@+A?;3mQHf%M41_TJ7Fw~g@}<>!4()XQkeA8LcQoT-c0<&O|{PtV5fP z0^T@YGpPz)y|Bc#>Pn>nbe(MpNmbcJb6+Jmu{xiGa&l^sNJ7$riXJ#lRh6x2x`(lH zqu4fjcb%_Vj^uDMWM`P}mOssLVt=7{lrNoz}TK;1(7LIu{0O z^VrcTBBLU%(y)_W>ELo%NPkLNG-AGEB5+%gfRh#@&efCnyyjlt?pdFLGXZKzLf@Lj zA8IOZ!N)U_YDM9qif(@4$jairnR(wQ2h9`eb{yh-mIyDqZwfyrTd=1T`o0xrZF}u7 z$;}|@2+B*f4)~Ql;U+WnLst%_yEXa2dlK{lgqxnR*50*7h(SNFeDxS7v_3$t1*j8`_;!tbN3aKyI&4Lrj-?-#O zCZeI#e(+ka`?IJ)r%QZmtQd1siwbd&n}q5xQ14k@RdgOtiVrG9gas@+Hp3>HH#?vd zyUr_A_pGSOQI#5TS=KDDs1O~}Vsc#DT+}vz?I`x?81{0Gb$>1uO(s7fZ8#TK8u)&L zkv-r;pKs`_G}!l`zR*+XJGfnR4|zMIXR`__fOF9uO58rZ`xROYMr{SJxM+_OC%6Qd z^ZYg$mKjugK;XOd3lPf^wi0TkIyt=$ypfBvvJF`e_9oJelUg3?VTexv!KiHt5f#Y%vzBy5OE5$1V!H zUIo0fk3`eaiO^Wyok?3d2sk5hKHe6pg~S_j+=@bd3}EmtbWXk=lwud%HGV!sjy;6q z_Gi1p_gUnY)?*^O)#D}=T$Yh&$D!Lp1S1z;m_@p#lz$9re__kVLppaFMmR!UI4YS% zU1*)Cq`#E+N>LWxdWraYmW3yePA{HOORfa;=%2&i&!S3#MnK{{>0;QThDCsqKG*@@ zB-3+0Y5Hbe?4ksAU)VmskO&Vak2ylQ-Gmq)4mN$I$M@i&hjaytjf2pIT74n>uyrIbP zG|MF*LFKiu`6-1dfB1tniM+8u5k<#fu1poJ^gLC64XyqXNo`QwJpC-}NxtSnNsK6} zIWf5IKFwJ_z3RT%`goe%-2Jx2FCoN-Mr>;pUVrAGAOy%Aae$DzsIMB}cxt1nFAx|s zLw;sHQ%`BD-KYLOlprQxC zR8-l>jFqSG(WjsN)+DdNS^b_^W#g981R8GX&Z~IpDU>1#D8+Dqp)x8apij0HY^FaI`g8buaD@cT!Vdj%j%|ybjWbjB-MM`#a-v!>_ zi0#T(&(seKA5at5JgMIj1nkq`ubQ#$iv!>HC;O0iTi{fjjp}3YY=ltB~1coQ7pn8 zwTX8it)lBE$mw1tg|SIbAn!)i4FH$XHhYn^lW>*`gWU`xgx*{uFA&Nxo_my3{wWVH zh^u9(qQRh4Ed;|aLSsg$v44`%;zcB+B$ZgAhHvTiKl6D)KYZ@k zD%}$Mt*29Rt!etI*Zihr_YZ>!t6QXV8DU=ud+G1Tr}820+YG*-RS=+l|j!xB5O{xn_OZ5-Z#(PWBP zlHG!M+(XG1iU=*_T>0ZVT*^pI>i1aOr*2X%(36i@i%-43oyv%PN|GBC2uKR@-#Qh~ zKX)nvdwXjGk3S!bO@Ew>94+jf?Hrxx1dN<5TulV+tX=-8Zxt(B$)N}Uc$7A5wOX3G z01Al8c{F2@_lT2?fFgB%CH(!vmh2X(RNF=bs}**p()v%s67 z^B19Be=_kBUmJ|{FY;Fjt?PFYQGIT+CD-&|OEK2RhV4hKwoZ3k-%3)6@~ZIZ!w9Y_ z(F|>*9^P|n$UcNNOP9k|RahwwoM|^EA5PRraJirzPl=?&TO^*1$*NJ7mSHP8&ML>b z6UO~sN|VxHh<}`NEHq7-xs?0MT*;$;20erhL~>F$YL3iCeU@`rLVv|2=LGCQls z0Oe3&>zeGCY9_t*=JA9tZ1sIEDQo~C8;Z-<+1i*uy?<`Sk2Z{UhS47}2A1h>s}dU# zzpP3j&cV5~%2T_Xnd9fFc}7favu=G<~@j3o1NVN>42eh8TRYWBE zLPJVjNDc_ygbQncIub){JCUtX5G0>pb8+7ZjZos1+qIKh8X>sFmO8T%3nVa4fhle( z=~l-4Jb#7AYMnTGGbuAs7A-o$eYvKSnY%spF+*QyqV?4yjcu)pN69I`3Jzn7uCQ19 zWLjNnRL>p+Y%h*1dCN7Hsn8@ulQ4?nWH63+yUs))I4yQWa*@$H&gE3uof!KfoUdfB zDu;bf+xao>b4COvh$Ev5$Xwxn4Qu=g7p+x#Jbz?}F?9Ksqd!&-XH*3KDXxM({PV{C zXKo=04;EL@JK#H)Cmnv)0Qy5#{|)TSAc790IXa>olJ(f8<=))cI7y7b27J+|SmZ#_ zs46qRXQ=ojpj^G!I;m`p`9`@MKagAmuREJT)2tGEcn!5#Z~t{Ek9AF$rclkZ3u?`6 z0e=Xd1x(7_70Oj7Fen$h@25;ZicG&v%-&4N-l+^r7#52g8(6Qss?6tqjvUDd_F0|K~PT_OSn_O|W8R87CAmM4!Q$ro^t#cw<;rG$?p|32;DPFv5Cd2u&b` z0lJ1p1XXFh`cUGNWOJt@>hlL;Bn&$I2!AoZ!2Us2Z-UULAUs9l^)`(d;%*V8%&hZs z*K>!Nso&R&D_$SBEm{77CG@Jjj*#qN3}8h5#2|nuiUNxgs%YJJGN%}{!MYMEy0N?5 zKm*@^xx$KS`9=*C?NYavW_tl-m02oh+4sz?_%g#*!nL!-TRQ2zWYw{{X4j!xv48nk zi|b@McKZPyIW-~%dP4W5g99C1#Tt@0@bYnqY|u8j73pC_=?>p-6Rh2tqN1x~eAZ2QXQ z4&!#{R>OE981W?n==Jes+)*s``hS8&8tiU!mTNmbzD>!Fg#r;tbJ7~2FB4J z7z>?x?6DeXEN+46GC8wF=hs|82{BydPx0PUMnm54Gn+*|{nHlApbI(M-w zjDGB@%8o*xQKmuYFEIpZahl#`$5Ld?IUwuZGS(8sM8{Gi9F9Rodux()ho^2ks2ldo ztp+_+i6wBKu;G(Jvv|%wqof0Ftz|%w>BPKPy8%Q z2hySXf!FWwrX zcyvcul%_}E3S?>9zm)HbImRX!{NVS>(6X$8pD9L87vFv|6mit~Xw%K4YxWgti;bI%?at%k1D{e2e}r z`W_n`l;~XH+M`jnMKe$N{8QOINLL|@AXi#OO@j8(Gh?cUnXM*^sJsBe8#^X6@`e72-sdHLuZ|!{#U$i7oW?@iT zA_b>C%YW+i8&iCcyviszg+|ce7Qp>Jn7ry4+;y|fHu6_}#EZzh#Gr=5!;D2)-h};A zcBh4SLCHSK5=&Np7}m^TAU&O>`bcD`3c*TnI7~tx^x(%)l{3}Gc8&;tT4FiF_X`Mw zm=>u)ZA`us!!$10Url!Q4U|8%IDS5ev$)aC(|;L7To-m=qvL;DsO-^waM@ag%9rQ~ zbD_7M^8~+HlxhS{2+m9J76=~NOTI(WFq4QP;|6_)W2(i+joOTpp;HCP(OPvHjwN(tIW?ay^oJEwj`+zDf$}yWH0&!*=0ia-g<)mW8l%c!fY(Xe0D;2*{1-!MYu*c3BvhIE3gptS@j;GLU%E2 zeHkB^m!so7)BqKtsCaIGpmgOLNzM(T1{3cM*O({gGu_|bz{~D#o%5$RQ2%T2|9{u~ z{kJzLIU6|t3x7)~Ey@EvX(e)t=Fq;Cb9?7K<|`u#=i#f{3rA5yXB%kiNRs!*yCx=M zK7S&P#$cm!D`Vhdu6)9we}butYmCP<$bYycB0MTWK)~!;Tpw;9pdK`zsYq?h&}C9#v9Tz2 z=^T)eVp;4`oPVX-sH#w%U!rtfZ(3OFu-x#-+*Gm3>SyY0V&@t}EOC#y1Y2%uYN%%x zBmI?3kW7P}It|y^_f&Ba@J>Imi3|=s!Svz@v)Ep&u@TeV283Fxv|usREqLDg70#M+9%-= z_N!h>=#5 zPS3H26xan?tcS^aTAfLry6hw;C$qEs3tdjO2#mHQtiC*=o8SKdbGlt`f8sy>H2K%; z7W^;$DQ@BP=iTGKC3Ea6b;PMKl8iilY4JKlw3fb-;CywBy#r>nD0TH(?-7x|`f-r!@^K~lHUZ!&KdB%0lv+ncMRW9DAJB0qXN{Oc{!6Urb;Q({&|7H{kx_)k>=MagJp=(X1KoRp;EZ zL@RN-hQ`hOzVA`9X8DP$MoqJsyMarM%XQZ3%6VF3pnqc9YH3ByGB~BHUBRwuyZSGf z2mjw-zCuoI`~L=WC0F@Gg1l^N)k|!aA3E)PWnJ$6mr%+NAp!kM$1@-c?3%4OPTj5D zCLM6?CP`v2>b5+9wxn9VR5_FJRM}4Bmzv`ybeN!f(~E4hCq+fE2-*W>+;$tsD;VC2 z4r`87J%1#2Z~rWo!nvZKpF~j`iOf|kM89(;!(Z_WT4nrlv$4%!wfP+{iFWGtCs&d( z8?cuX@H&ls_}M&kO-Sq)yL>7)0e5dzgn8fEw1vVjD?*qojlC(EPv~K>81vGe7??GGA@_ zLGm9mzhQs;K0(Xpj)TC+Q6m3IEi3#A^S{Vk^or+y$ej2unJcm5{tuZ`nv`WJWaWB< zxHCLsH-DkOV-NwrLZPfcg)rdiNGV3bL-KfY97Lca`)fQF+`xB*|B|_x)in$9)2mxr zilprcX3443DP6hJMeSUPpQyLw_HPNK*{^r4EAYTL2*nIyp}@xXB8>u0Dc)2r^cJLI z`6CEo7IH!94zg{Yu`m<(h%u>$uUtAiMEo- zYGX;LifgS6f@wouJ%54xb@xa(9nN1epZHgIOZ=a?ThYY8*uvIK*uv4o=GG0qzhV&<}n&XPh9X*j{iY{vhMKEih!p z;(cfPz#DPe41pcCvuf~~;h~%Lm}!5$KE0{s13IEl@&{EKB$B4YkiS(ILeB{&A>&q} zOvD;5HGGg3ksLdP)}<$pqN>Dps(gTj5r64bIL>K5)JQ$wT;9%`;n}^H)~)6Gh)=ee ztaW$gDf8%QH-0BZP^0Ow>0I{MY@`g(aVo`JT6GF(MKX?Du(?jAnI+qOW6W5?4y_TK zege4$H@Rk}#+)C;I07-q%R@%OrkX`vMHkod-X%4?L)#DA=M<=6G>fGX#9fVoJGLL(}oKhs66U zxft`vW)V|S(|Yp`TNxdbCK|PO$WERJ1_%^=TZe~Hl`4@(cFC5Yvke(5r~L& zlRs@+%x`b4w=9AK&GMC7%9R2dPJf&?xuf8+n!^rv5D-q?Kx7yj{X8R34_vofNin>) z5Y`f+2wPkVXC`7gHyO6}gC%XkjZ6kj(uRg+G4~;h3YQnKu=meL6}KZs%Ht;;7jsb$ z*Tfws^lkzVSN=L+@si*ne9w6BL6!xsIVrvagd*_acwum4fKw1*sJUBa(SJ)5O5N-k zyV#X@mo)4m7J?6I=E6j>3p!|5XyVShiFcDs1iMawEPfSGufAk1^N;%u#X?d0w_B3C|D2SqkN zU3MU@UNnuRKt8x~1sO_E_!$T{?C}uZU;E$@apkuH0|5>H>%G$d7GD3Cef~8U|Hm@d zEAzI=^>D%d_yu{J@|4ho)`WD1K$XPssfc_!qL?JbS{t#!Uq=ualz*ay`;B}P?$_Ib zq4!Wf9&@~Qa-4FU?B3sJpY?!9>oGzCOBuKaiz2_FDls@8w5ykdoQ8x7M;}GYo3a!I zPg$HHGu9rE2)P^Gfec2UuTE?+x$;ahdUtlAE4QC&<@8sogyGGbj^0b<=)h6t*j26Z zju*xhR-_n(Q`cl>f`18W(#wQ`nyhb8Xy(|dZA~w)!dl1V8+u{t=H2?=~q)aBJO~HMx~%JW-Ww?w%zop7P@ukcOu|@PDjFaqy#6hb!Iath*p- zS+GR>ygx@~FdXfwVKV3k8RFtXVM_Ig$J~A~6SFIgp5qU9Li+7hXs+bn+MPcXX%4fq32er3k=a7xCnK5g$Tb5pXJ4XC2%R~oe9Pf zd!?gl493gbmVZ>-I2Q#ye7trk!IoZ?FP+nHuHV}$;XnTxM%#rlfh)tjff;CCBeL}YqN1iIBn%CukdT^L^h+n`2W~ z2xZve;uvqyM7I_q5ECLAFaeYbm;2({0?K2KE) z(_M>PLVu#m3e47qWg?NN6qX_4i6m2|S}M|yCp{Ya&-qJN^D4{e9}DIFtA)7#OAE=n z*x3Jn9RD&~z|ALx1P}r7EoDyu&;TS*<#fvEfEoH4K`0i@1=&Q#!yUYXHiyH&u)xB? z!HwSif!@6Vfmw+PWfQRT$1Jbe%lDb~_Sc55eSao@fvHdeBl19lXma*Kd=vrLLTcN3 zGit#D)~GwggDSE$Z?a(1l_Y|ux*SD%nmltDlsL4KQqa%_+2Xv-bCpf{g;)*ugH)GI zhN~uBTJ)#WCUu6aE}PWt#Ggf{R8}U_%iEDjcac-mvrY+nA43HrQRF5+JQ>W^Vl^7j z%zws+O~Ee6q*4zrQZpB$P>F!PkbnbRSmonIk3F4G)`u-L;rMtt%k$Lck;aGYW!%~_}26gAsqKp-~-kd6d*M)zT_tca|b*PA2)!1l;NZ+4@-&s@0B`sR` zf+~w7(fCa3@A`=^otIf;T&MSq3x!XakALG7cgjg)iKsKdp!Kh5Gwgc^f(`P)expbz z%2-X>_eY46;}T^`aFi+c)I7@NnVVcL5iEQ)OyM*@$ymqwTvRo&c`WNQf~`)WblqvQ zVpKj1ctAEPJ3Fd$5*^mrLTPhg#zEz2t0fG;L@k}qFM!#mq&-01Or$(8SDc?J0DqGK zhVye1v-9auZwS|MBGg!X-MUvIx>1B!wVHKmDC3ensbl+j^JgOTT=R;biqXrr!Yh17 z!?8261Uf&dur-KrZ8{(Zm7VW^w|OjW@i*s+i(*1L`A%^_{c|SagscIqKB$979NRl{ zd?w-Q?@ZXe{31{>x+1PE+byP#aDN{fri8sKrubB7|NVDPuBk*K)mABF29Y8NZYN|3 z=dQr|hf-lc7yc0baZVoIswD}YnzYC7yGX7?`aKgJd}7WT%3fv*QTU=AL5~N7W_P$| z{$}lTMOw8a+{hCI%`dOu29R7k38QS>+Bx1i4;NwEBsWA`zX<)zt~){GT2?<_6l~qr z(=Ogi?i?TH*WKt$$TMh(>*ifP5bYTgV4vDi61um9QMMXONS zkov=s`TxI8iHasp&W;xUVMl2bSCfDGBVTdyx*dudV5B$Vr~3i>cyuEdlvWZV89>O8 zT#9wnfi-JrXlQAURXQ39e3Z2%DRlu((ye15hF3+UxIz(6pFBzv^-l5o8-nsrrDEPD zKS3&$e>tb?=mNwCG^tNtr(UnqET`7j<4*)PpqE<_%qnvBx?mHo*tNSV5U)F&NsVid z9RbJKV=&D3bh?J$iP5?zlZ!MhOuO+& z#yu29!LO;&3MZS4Bk4C|7-qVO4E^3}Bi~NEe;5U)o=v0~`QjOdKjcT4ABZpwPE0T% zGVnI4+HkJ$uZzUPh8)kvhoSZ@cX~th8gaUJ#O?|7d&@H zf9>4B12_heCx9E74*T10_xGE-c|;hzA`O3msuD(n4On^kh#-0YeX6`hQr>|@WhD@r zHH~2wK4INKz{|`I5tBD@NYJ3l9Njm;G#(}k|A?1I8Y_ALqtOYsEH4g*8<9)Y*D?(P z7a^ClTEhDQx3JhZ|8(tD9-f)DcXM0Cf0fP>&mqgA8j^TEw6t*GP3R_`DVJb`u2CW< zo_-FQy^zXcCn-heP6WX3uG?+g>8g<@m9;9Lk5uGjDrKprA#JNA$D8h8%aBETBU$1r z$hr$BldMITCAH9)ARG^AQdOUD7=oWaR2K(?&WOhRzD;V~xlh@`iklHA${UuGf3wtZ zVq`pKX42&3ZhCOE<2IQIfUThHvLx((Trj+OtGFobz)6@=q|L#Qa0F|%3bQ`-mK}P5 z@fwPdyUPgPc{*}7gwN%2z){O$k0#4zk1Wkn7yi*5jPhQ$8=;%Zo9dhTEmZ)GZxT_; z-z1%6jB$W*f^md#hOyt#pJa$}f1GicaT?i_15z_!B5XCe#(+CTV$pKR*umre%=YnfAm~V3x?d5 zm;ETEAo@8&lv}2nM);G%S)5J55k0l?<8_e9kobAs`~xR8G%%E-_V@&ZhgLKS;rp4M<#0Z)vZ z;AB*en+OJNNQO-<^V*Q)S|bYe@dplROo zsX*lIq+bsi-3}>2r+^%xVm=~fh}F58xV9v@l!7B}&GL`ZMeCmxOv6MHEx+=ckauw# z5$P1D#ZI5={8~+8SZg(jGCAllF^yx=q-w%B@``?nsTBodU`^akC>PFO!Zku2Esh4K^Zb@!f?*aYI#IaJ-yqJhLe9%@g}`R! zBD(!4wM&rngofcbpPtX0zap_dVl+RZIL8A#%c0;FSeYe#?4^{<6Hn%-P38%+ON}%P zbvv2HpiaIZfBq)Pi8PJr_#YMogZ;N8;rK6;M9IX_)xzkX#;I&&Ej4Tvz$bjW%m5Gp z&8p*~s|B(((Xk;-I4G9+20wk0uu*jt0jvSNv^{CQlwWjjUl=RuC z__tB?2GyAzvs|C|9-ou0*Z1dMpeX|~SibL~@xz6Pf3{(_?14x}?(0WMG`ja))>IfV z@gIR~U|>enEMSM!QP8C7sQ_t8^2WE~KngIudQGT(tAH_0Un{Cc)v1$K&=V)w%971; zpG|tjSPd@o@0Tq`YZSj<+G@V|Cvx_cZ64az>#~zg*T_tl)d7%}!_M_ZP-VC#W?VYr zcF@7!e@&YWd*qSM@)m=79fDe#H zS*T0PwWb?%?J&PN`wHS;Iaf%Hs!+NtL=@pZ&7bDjUdBFD8Qee(IflJO*PR$813+g#PPe48+ z#N#*}w^5O4bDU35q#phLz7y6bv(RZD^*I!=6oEz&fr-yKF|?>FfZ-Nj5FTeSn(z_T zMBpp3YW0%y&>4uS8FWuA{^`bW`8KP-+ahZCd1MFK75dd)<*?%iFJ1XKz`a`He}n~F zowbj_d;cvoY0;<_Q93r4Fd64IS5P7rR2IqCA=M7?VGM){D#4e!KzCuYc060#Zso^_|bB07)fQ`Q{PQ^_L5* z_%=b3&bf)hp+z?ASRYAMJ*?f(sD9Ypnj~|g%9Ws-;T9?K*dUrB7Dnn`e^7S^SCq12 zzNo_Ij5|eE&HU(uQZG3L5W6TRv~FXVRZ{JD|GBR$iR{|=`G;Qx|MeCi?|<2K4E~-% z{;$Kxf7<*^)3U=B!3fd6mcjDmZIwtWS(3;qk;q0vCbP)iaKP@QD4t`iCmT%o@5NY3o!0$&zM*je#MZBF}J1>ffk4M+~vF+h{^2Elp zJJs`fS8LY;LJyqL2UWyDifk^}fjjCz5iseVa@hPceFz{HYV^Y>)F|~3dQ>HrdK71r zB^F04$0(<;&msE|d=ywLp>W6{$td9vZS)eSm1AeGZSanCR13!qf72Cgp*6Uh{CA&Y zcILVTIO}K~(IKY*d6vDxT7tF6&q0h0QYR*uV#2|hEuVVQLB)o#1s91ol6qs5^NDs7 zthzh{rEYkw0Tn9!wl#M|*y;|N!Sx zdQBXgf-_MswHXadd~obZ){kxYu0SW)Y*Uh&Nc|MmLXh9=e}fLSAa+9Z+BW)AFb$R* zsOJbWO8Qm{xsE@{_tY==F;PRQ7>L6jR1wD_RgKeQ@{<5HK+3;=G==C*ui3uhhI+&1 zCrnY2R7`PBCTx(1V2)%q!xWc?L~A`+V@^mKDYgdRsLx1Rk`sN*wNg?sp7NSocd!

pDyf~S6uk#FZpZgs>_n&qAuL-HFl-D4OR*1xKvD!CbOKgDm^V( zGCS(qqHT$Hd`ZxNJlqL!^?%lnfN|1cUJoT>`?Mf8 z4@RVVEG9G{D*Xojsl)J-*WOx9*)*h>>BCcczW$OB+Bj!t@f`=RL){s zi78L+#E^SBd7U#;1)Iaw)O+_y?4d!L$~fVC&LuQMv^W$T{RqS}Xvqc3V{*k=kwY>= ze2%t;B8J7%Yk!O%i%3nqgKjdogQa21Siwu`a{I^V#%mx1@nvJlmPr7srJG*8Uz8Xz z_FGmIvDImL5$5G&_ev4XC4C2HhszR&F3^M&V=Oh8jO=jy+#1!0Sa12pN4}X(}$J5K~*~?#R8xHbrTS{K) zH)YqN4gnK37@IG@OQ?qnzw`V?lWEP(du7n%6_Ywu@D5q2X{qhcbdU1b?T?n&*}a>;;Rls$cs}j%CfPj}GgKE$=lC7y_2Ps9ylYcX==Vo1c~a8qj+k zuox^PGrMJ97#2=tfS6~33f2p|@G(4b9Sp?0gvDxz)LM*(^Wk@r(6DZIy!Ts%;?vUP z20i)zi@mdosw>;pb%F$UcXxM!2X~i+26uNS5Pw_)!QCCg!h$DwaQEQuEoc(kk*KCak+Bg2*|1NXPl7jI~3f$I1&QN~a@R7G7&MzpYU&vNMrRuw#RWxoH z(aTm{4tMjlVO>DInl?x^T2zu`3EyRHx_S<$B;V%3M!{aZ@PPkSIFCp zjelIstPP)k{84O`=am9|gXs0KagC9jTvVi@N(n}eC?FFOIfpVRfMA=WC%H8BbN62Q z%1|XT?d{8ZN;`XC6-t3C%i*yrOaJE74a7V8$sNeykP2kIxMAny2uXlwq< z7+mBXj@qSYK9;Jp^Tqgii1S=*fI!;tLqeYad;Yc5er$Gy=&3#&pf94zHk%%rFn{yN zo_MQ>!b%M2L>kAig_#-Tq$HDoQUw!-E>szFg?2;ymzPh76fIfzv0lD-vHr_9q-FjJ zA{J>qYZE6u6Qf^3Quqy$TzE)VVSux<`7)6PWGLbB`)_(V`5C0UM(a(y#+P6|@o~D# z2uETeAH(wEI6G6^qPpkwHcxl&K!3jyO==cqPj#51SooK7=)cCpKAtqXeD46Fjl$)X z@Z+mGroBcY*M^9HSIB@RCzD`vRYVFyTd=>@mh?HyOZX&%mFqykaDD0<=4J%Wx@GJkN2{M>H; z$ub&4OZt6UpH+^r1rmM-92iri^80PQwh@AuL1Q@0!mXEQEWi-#omre-YSSIzDmF9> zl@LkzahFAbPkDJ|)0CamT%r5*FQowVppAJJ>o`x0ri1qfFdzBs{*saGUtq*8V`N~e zXKiMnXZf!}3QC&|c%b5Sm0{;tK-4b8s1}DpLpv0CdN&H73l8v^zkCSL7Q5KtR5khJp6GeTI{*PdJ z?%EOo-GAgyAyqME0G=Qn{I5ac5V15eaJ091#Pn-OK*?uFYxJ&<;m&Gw zrYK+v5*q1^zOYb*!k7)cMWy`$ewBw`h7lRy>ZNxqrwgze`SWkl&fB}$=LKh*tUs5# zj3paTW{Yb;G*4+@aC-0l+E2hh(8H8vQ)Q!on$Gdv1c{)lIe+u&5afCD9aR=nwS&x- zv~<2rXhG5jH=C5mwu~k5&u|C#g*B2fy-q)i(_6R9zyw_?gC?F=KW?+gJ=(ZjyX|k` zj>NdHJ4cx!-O4y76ajLijE-|8As=`6VZ!OEFkJ=4A{bKb3DZeX;c2BV2HOwNdWvgP z!VlQcC0SH>aep4rM_Kx;uh9*X`HjWb3kALcDWcUZfYJQVd%CoF+xN#I< zl3{!v%cFn&+EN_4xKzJI%Qe|TZ*SB74^#Q_}Y$QK-{ z8jJ1RYpUJwcFoJQM&$yv@FYah?}aWmaEldO)xyD}M=kca0Sa2_DyeQoRxjHfvl?+^ znUPES7@`2lm@w{1Cfl?;0$kU^u6=sns(zWV3b8A8x1$kh;=fpr5;QT0M$RFN#2`MkRkhl2|@N zs7(m-!&6?%SQ`LFVDBj6v{9Q%7N94AtBE{?L4<`&oxbQ=-5k`CEy&sgP=L^9*1b5T z-Nh$%Al0PcB#+#Xe|ZOr@?U4i^fz`QR<@3Rw0~3nGZ><#Cj6vEvp?P@1VluAlkJE6 zJ~Q7(BE6^A=x}--<)o?<494djzoch9Kr>jg--89Vs{P>ERghSY%L_M#)=*DE(J>6# ze#h99(I@!C0O=@X>WI7xIybz@`H>kt2r^E|K!%e9)y4V7Uy%X}Dr<&K)qTd1@W2-W zNPoR=%{&g6v|Z=dr;-k*`0nJzZj8bEI{I76F=_5zwOEH4_NjD2^i>v%nRsdxCpw0w zV_(-Rpk#!b1Dpth0eRALoRF-pwp*5wNvG>3v!@`}3_cB+!JjvPp=U2;D2)>)A zzE-GbYG(n!5aeDinqKI_9nsU;(7s~f*MAVb9yXa%-xbwL*YuI#I|$j3fZj^QH}nDskocddvG<`UWQtpK!+M(}WOIx6ub3LILAf>YiO zj56{QjURmMk64?frJwmR;da%}pnug3ZSL<=Cct?w^!tinzw#a@h6zh8g@vT-U#hj{gI=Sl&1} z+F0p1niQ2;=+h;_W3f`46E5o?0h!`ot0wEfr95b1f&YmC>QP`9rN_Q9nD)sf)bT-( zH4aveb%e2(7eW4#Ly>4%6H}saCqKmNA@K9E9k1D=0r9rW{Q6}5)fBMTd>NHt6tYFr zyW6yed%0r$>hULGv6lgFB9fwr@y;$jn13#;zMtQ4X>%5dzPmgT7=d4^7(G^1KQtp58GOpKj$xMHOQyQX zS4F>~tbUkHGucJcPObp)K7~{wjQI#D%P9qoU177~d&PO9<&!;(AghMV@zIp!ynR1q zrd|<|?D;+wH3f3`!)$C(pgb4#duVzX6cv`?X%En5)tFk{Du3eL$J~VhQktoWbwNF` z!|_BaT(gM>_mR@^|F*K&q;2%99nGwaTHo`3B_M0DZgxj4_-MdmC^N1Q=7M}9tuqw$8XnjKdvq|h+sVKc3H$sAWHr>*u-Lpr8 z84=UGg$mS?9JL`G)KHIpL$yuWqmA(5hj9H?&!gXv%O_Hjbr+`YQ#>c`OY~ZCL@zy! zmYe}6n5VV^!7)PS+v!v--o{!Sm`Ov%zGQcSdb{08#(({V3n61diw)@aYWXbY_g zgNb}Vdw&yBUsxX;G-#a?ZfP8!q~1DoLh5=1dP@ncItCTCg`dzCagllB^X%`xy2GfP zB?GMVWwLf>%z6W#+~UEB)*EdqNBt+a7#NGD)qP79&=vAXk6QV2Z4h+Lbbe{Y_o+aL zPREXec+n)v<`$Wb_ztbBC;$w~J{taY3+Bf#e1ANLwR2Zwd;1uYY@VSlk>uD%dibTM zNJe{pQRNaTUjwDvZi1NVmmIk^Tm_B$L2>lC2Uy@!@oB29Etip7hO78pd>ZR6g@?ww zKs2B)A28*Yw-63Ys{CY>*Iex(Ei(ff#se#$lShlx9a}{dvSUEc(>MyJ>~ra!OJ~3R zAAc|6E3~kk`-sJ>ACzK=_-1WQrKZ$B@9GX=TX1nM!9X1qNlcmWR_ z5x|<~n%n_UI5ycQj{)sEc(5||t)WD0 zRNA1Q6W@w*{ZbCiBspa}xhjO17yS3nL*zB7uz&*U*F>z=RtNfQ!>1*+KF5drM}H_B zK>t_E8xOmPkq?OOd<4^i65irEI4OUVAgc{+9qp3@8!rDzg0O%$&k~$?1}8J0_?q|; z9PBT_ss43vobq~34n{IIhDOSdQPalh4<|H_c0}k6V(I`zm$1Qjmn==qkuLxY^$oFK zjQDV(_s7znp1$VpdEVB)xyOypS%1MMeP@?PH`4r@8!68URz*uuu|!JNNnLiO98Brp z(|U`%6*#;_Itfv$_sx#nh?W3}+N3MlR+jRB02V4wmKmwdeF{)Nut8!6ir?8={b(nx z)CZjIiKO(5d6vs}tEd{cMnZ%aq)mv73SJY-jwQaWP6{UA{utQtBiO*MRey|^ojury zJATzUgN1=to0ri+qS98faGoLwr!P*OcJ@Za>#Sqw*+1UUEJ{C7FtS&qOwXo&u=&wM ze*3-md%Ui1MP$u%IKbEs-}tPy$O?5Kq%!Ksl4(NLX3q9wfmDtVuey5TVY;jl*-`|{ z_IIn&y^m^B9t>w&PL=;YkAo<=Z%FGu5eXa}NDo@Melq<||77~7j(?v_|JFa5ewP22 z>F-(YAqyh3p3KM_l@XL{qsp3;V&;gkVEJOU>2lMG^2HWUsu1bmp&9nEPD{dguG2iu zihu!suhZIotJ7}&Yn@iQ;XClX<^t}C+xpzp-jmv(e#uS!FLPu0dt2mB$^D+_22l+3 z^~b|F5d7S2!FeG=34f6uGu@iqA*mH}>V8h3S9b&QULiX;7B4_s0^HfY`mu!V8 zonnd*leG=<5_qFJ;aqWP#tz6)YK+*Xegx45)F1onO_{JbkALK#gft}$2=&T32&d*V zF;pjoW^n#Za0r%`h<(n)1r&JBtx4O`ufmkwCAOsM2*j9&0x2 zN6qnr5vM-1p1Z481o?T#@NqgT2&!9%6o3@ZjxblQG%zdhfv)Fp3|r6_(Wu&21_$bU zk$ruYT(3u?W`E`V{O%6&W+cbc{iX=NWcS}}JSrMlnOPee*)s_nS(-gM%3ob&^C&er zkjEMT6hav6&3NFTEL~F~AkkDBRX+-3bA(x%wGnzm6)1%FI0EO*{Zw#z4_(g1jgm4_UQ z+h1ojedZ?>=H=ECq#2=F+&D#QgkWRNc0}fm2aqkd`E*b|6>P{Ea&ci9xDI>gj_Azm zhEV{cBn5_1>FJ-DO*K&a=ooLviA&FA+$0BMkG`zuj_Rpe)cRPiLD8h)gU=TWpGa<1R zh)3F@&QiW7mTFl?{bMRy(>EiNJvLrgJ$9b{sei2Ch*!m1{s0)DtSNV`MxIcuY|37i zk8CE5V3i5;rpiVTHC%>NL1a@i!rc}oefGHY)ZpadM6vN;!U`urt!5b zHh(!^vzRSMLPl^aO*6gSa=YKK$-kpGFD0hUdQ*2>5Ck>PPntG}Q>zdS`prZi=B4@Q zZW}eEQTC5yzrO4aG6?ghuGJ_q)T9(JG+(!xQ5XDqCZ_sZSxsllg!iZO7U{nRisg-^ zp1qZjrHz5bpUo|w8z5*MPl6H*dq?aqE`JY&?wy;VHEHPN;IVfAbx%vv+V*4=DV}QT zP>xglD2{f|XQSVxif80VY$-fVTHS1)JRtu1la;%V+cPE`B?3-3688FHeRbi&v>oLj z7C|=~AK}8YePJXGp|s*%Pd?Ry$ZpZt!C`XbK4kh^u~Pq}3;(dJp@O{?hyvwjJ%2gd zi}kA;Ux@^UoP><2R}6Mr#=`KmC^)3a#&YjqIiI!wd&Z!$ye%9O3Vn4tY#vr#d#;&S z>w-JAE%{6$H~2vA&|y0(#2off0N+Cwk6N@z1{-E~#`%?GcYs3_Lp)My8$~Qd)5nr& z?HYZ@Rvr4)d0FG(xwpu41VF)gB!9H^OG-+AjS}n6x=g~____P>E1&Vy0D1HoQufbN z7t4-ETI5edW+Y;TR?};llbBMii^xY&JsXV|{F0t7|Fv7Cy(bJg3Cqkqwc8>oFEdslg8N}f@*DD4wm1~QzEZ^HG5>$f`41(CBG^h zJ4l!&UK;b%t(st{CixDh#iz!euD&t7{iDsKSMo9Vsb}jLCRL^Y(teCL0LUzx!w%hw z24bx~f0j2M^kV4?>k_&s@Hb7|aBfp;s53fr***T~t_oL5MEw2M0;;Wt;DkQZ*GqX# zYRwH8Ms3dgtgD>t(xnDUyMG?v*%6$rnrc?C-8{_9-{K$EG`;rE_~#&@+Wyq7y8GXl zko^vfLs?Mq&r0Yr#X0LS0Yu)EX}gsMc@Q}H-n&sPYFbh-aS?GDXkwKPA+yt#5RM+= z?%GL<+{Vh$o0k}epYM#~3zqAC{f1$PVgg`^IOjE%A+G4COa zTK2~AD+pc{r4Bl_p?_^3xyAV3CWZ>+8jzvjm5gs@$#b0}bZCkC%F7`%LNvRk`wNEY z2DJ_XVdn1s75qY& z)&oUUYP<;8rD}bjt%v41zZK(rZCcBp&U{L1xC5qvXry*SA#8kCpL^K@@mr?sJ5qUGjqp`K3Q z6*)}u`Qzz31N~n(fogj8)@IfwEPtOKN!z&m;R)QA9T!05bxD{PEUF~T&dy$fXoQ(X zj9_ZT)KhDZ>Edt0_8GJeV$QD~a4cSi^29Y*QM+9Ry?>JLnsc7;7Z41W;c__`czv1v zx}M+L`v!iA?_e6Un+<0Q2=F<9?ldug;vm;u&JWN;w?@G(8kh9|Hf5)p@fcsUDaN7c^=jM{r-aFv4ZRLFvZ7OF7ToE-W5+^eIho^s zq5hEXFplo*7Xf_Rk%ZrCLhZA43p77$LAUXL|9>iABQ)^#eA+f`iiN%%9IyQIrCaej)*b2bH=cN~A=H^u?h6qfRCl}d^O{N3}R{Eut z;D7I{<^ijY9_uXBhsFvKU$QTt&c8(LfecfUZwzcmwiT*-H+D!mz$MtNN9Fg5kBN;h z5{$6AmFAa#n=e0qj6l;*nBb}Z+xyGY_usS?zn{L}2VuWBd;hns;E{)UgT#ug43EP$ z`O#43=d`)!AGV>Yk^gBM3bb@WL6o9R(tlq?aE_+n^*+sJ4Vz2CCRhV8YvbhASMsyh z11e~z#De<(96VXb^|F1wtkD`05mU0+!rfc5%n1Wb#=QdgP3# znNEbKvC1*2;oe$gVioOr5iH4ikgQ277lA{u*3mI9cg}#T&tbTbymj()0*T;V*MEj} zp}RZ!m-{f2%jk@HU+{6L<_C2t&Re13?NU7yvL7v;$T)?W)Xn6j{^I1x+EjIvl3KQz z4X00iC%EUn6RKrD96+!H(h{S5{kiY-K;#~P{im)%;jckrk+62wvotdl)^mLBI{mSy zkOg`46c7*?a)`oK(zJWyZ8Q~(BY%mQ!BC;>#FGdBy#b)h%sk0)RjKror|7-nw6qF; z8ZjsJ%l@2Lrs`4%VwE9k64gS<6qIfl7M6|`xotT?Im#5eD6aD0@UM}op_RfT6>rX( z`n;hez=el;Ly<-)nDZ&3p>LDK2!cma*z9}^*iq>Z^MC}(KNe{_=kg=g>VMWSE;KED z(6dX`y(85K>dQA~1#3&E4W(Uu+1PV>Z$pdfq}n;&swH8$hP?@ap$ROa1~~_ARW*0F z?gg8!RTCXsIE!FNjt9Uy+v}j}zV)wsk|$Uv71JW`Li>v=kOgN<)m470skWYKD)Z-> ziXNc(=qW^zrfGkxsk+~g4}U#*ip&3v3E1zrSVgQ2<%}PH+3Q*VV!HeU>#_R9#Xtg6 zz$trTl}q@@Y8lmYfhPi zr%%#Bp0yr3kqR5@#Knei=K!LOgxx&OIn;%~*`xAqokZ|l7-wG&YJa`??q$}fRCnlb zc#Q(bk5l;>4}9{r>QzV5TG|aipKqZVW@2@b+I&VhGEWn*v817C$;jX;+U0s!gLP3= z6TTYy6=C(mY_VF=lx>C0ws0E?ztY?k0u*x>Gi$LOMF#f0TY7HK6^wENa5lk*#dwqk zpCc|!*1c@fMM8>Bc7JNfTs81G#9raBOhvVT5NKGiC%-PJn4m%TjTu{USL)^DFfFWR zfcf3?78|z!Y6;$-j==t6@@0Rre@~qz%U?9$6}2s%uH5~&Cl+H}BZ^a_y6bYPpe0Nt zC}OJE8N2kp_Sh{Zjg(|=-pE;X%jZO77@F_73QilymM1~ABY!w(cBtR%PpZ1SiTbqo zf~QLrj^29G7Ur`|ol?O2M)L0tc8i_l@7tqRXh&g7hvcD{J8Qy80^^h^d)l+)snQT` zJXnE472m^hluyMG+!CR1PNR^9l&~c3!n3|x!eN!_;6etTf?|cJ&5Vc_g7QHZDG_uS zWUmX$Zf2WpCx1y}T|k(zulHt965T4xns6(5~u)5{bpqn)@ zC0>1qlNz77SvTI7Ni71p5)D{Pp-XxnMSj`DSG8>w8GjRku|mKr^(f5T$qJ-y?|U#p zX#ePwIm;HJcN$(h%ph)JF9=yO!!hYDd9+kPupKn_ezQ6PexF=kw1+3UIL3`^osG5? zbYEkE8zRiSGC)6#i_b`O#@grQO=6T*?$(+NL;|Jz>C4h=y?B%aySx_&W(~siBS1NM za~E0pdw{S-hSuHv0r-yeWx(| z_Q#fH1&<;;%~vU&PT)%qd5%A~fAW9r1adyNUjFn9D(}laU;BJbG$$hYMno7@VFsj< zFqksJFz4WA9ou?C2oCWK=uY1d~Ihgd? z&ByIMOpijebcJ8(nGqiBkokp?H|;B3pPdCRV~j^}jkWQ)Cbt)G~3am}X4 zY=78A=;o@u`V4fz16z|BBS49Uim7(YZ5`yqrz*`gMN(Q4JLSZS)cmeSBE(WBf|-UXw3Q2r%qQ9Bl2 z6||uv9$z*zC4ib8+IwmpU7=1XOY#pY(Ly>R&_dLsnEKQAKG%$;_d->cOPKi#g?}(` zQK(I-*3*@Djz)p!ec#$XO!OwGvTv}5dl92fgtkHyyux(}i~n4w=#Dl@%Pf7yX&{vd zKR_y^7_(F3xBrA3G4~!JCwrOi5P~&hvQe$&cNJ(68;@=2EWPb*5oK0%zPUhO4jn&)Zf(Nf zORC)?937$Jz6Phs;QDH=cI2pLTZ!UXLj!p4H>;o>jDWW9E0>fAFjU04S7w zD2|Y!?!6U?r%sqFGPCn2$$ti|)DM;T=o6v8uL4DquDud_m_Bz==e}8)8t^QM^^7osx zos~(Q{ zm#K%`n>#yEYC~^d0DpwZK(IO~Co9UA{QPzm!u6DBHQP>&V&if2sfsW$PVyOj@`%X{ z)jM-Pd{)j4XeuKnS*!KKdu8S2;$!0CQKG!?J;MZ3gN0{z`nz2+TZvvwqv2eB)yPu0 zMFXtpjMY@VQsL`-b=$IQ?N6O}Q;yJ06Xr({XSSvdfd(~A`G2eE;rZHCJ61s+s$&cM zrmPV+)>)svHdM%5CdJ<{(Vdm3T~Bm+JB1L5n$j*5CPqq$TuM%1P0Os*j8tn!&FKVi z%o;<^6Bt0^!GMBq!}dBFl{I~qkPBLb^*5bnko77va(G`vX~T*TvR_|ml=68_3?knl zh#>e44PWd&c7OZlnG;^`ei%6GDVT;$fV06=*(?}Kku+#&PIMqJm(#0*e>HQbnJdhGAF=J`Yu zQZ%HYcYj{=C=*hECcztuil4MZQ8A_#Y_eRvyB`-Nj7M%K)x<;^Q40MQeL*B~9OnEr zeW_ncoMMGqWFgAXTi9RJo+Mkee)D1l-QZyBXcycsv?y+I^(@u74g1X8Nn!j*q&e%b{N^qL1j7KfYLW zF+?KppD~f|b6_Z!C`mdK%H3dwQCrWw1&ba>fTURecu01!`o)LorOpWqg{OQNW|pB6 zsR`x!?h1+Wi4rwEv2o*mhlzH@CqxB8CiV-CIHQ%+R|3$aA~1qKGO}*ZzTj)`Z7WbN z<$vj8(X?&^ZF!GJ`UGgn2Rv`4qZ>y^iZ*%)hi~L%I zi<_Hued_K@pvqfs-^<&OvAA$JY1EGo&ws-bm{&F4Q;&w~X*Qt@9ENmrUU)iwk zc&4!9w6Wz)9N}(b=NqV%B{S5Ejej3fJ9XbKVO!b5^m5E>B%1^?0BYCin1xwpoL-e} zSt7c;?WydPdN2_AHr13p4jYgAQF2w8a3)LXl%1~FW1lBBrWPRMS}a0ZCawA*R*%a8 zS-aglmS3hA`&;KziCrbOAOlpcHQAat^qs>*9I`t04xVqsUS6L^h~)s zTadp!CelbcEudpX!Gti{H{*sDGe+?!;v}Dh7aKaQv(4Eyr7%bSp1)hZue2CtL}ZP~ zNv-`-Py)LM@@?_Uy2Q-g>VK5-ddjZhAa6$44`{7~14fV-niq_BW);;@AEO45$`ZaY zZ}n_p_3gj+f)`{6dLsa`TD>#yLaSB9DPsjYn!S~U2!Jz<^)T++YztOWQ!!;n(ort& zC@ive;t}lq{sIjsbgz759V;mX;TD(z)Wfey=@@u-ho0XSZZQsq7Jql|dzCWHhn(km z0Hg1*H7gV&uGm<1){F`*nVRb_6npZ47*CP3D8Yw{`5XQ&I@!X0VcllNd@m7!-)39r zYQ3jsnT+Eh64J41+Oe+b8C1I?qEE_-vddPAxayGN^>bdok-3j*f3#p0zq}Ls-<@#% zKcyw8D63~>#Plms{eRqBL-ZP(uLYFUoHugV>|}*4$sEgz$QS!f=#Xg}M3kq*7=rr< zK7?V&`2|1Pu)INQDJmVd4-yMU3;j|Xr@Q;0U)guaTmkg@dBG}esd1tqg(MLwTrE6Y zgu_gF#&5ePL#CaCW54kPhC$Yck6g5TfjIPUD-VsEBXQlu!GH7n^63*<)~F(oM+U!P zR4drJBS}Ll=)15jO;=9tp>-TtYK`S63V9uq;w#m2Ywfp~&S=5j{K#^i_3`Yi#fR0v zH-)P>6H?)}mY2mi+eZtp22PcZ2|p)O%@VD7jOMY=D5uDq?{@f~$mj8vd>rpeb44|Z zWfJ22p@!nW%6~s4Rbtdx5r`WFi@SRi4e{U+==v^E&@8;bP3ampvMLqoij?m(X?)M@01WC-{X7AF~3A>U%(AA~4?j`J3b+dFp6NkH*dH zm+KqFi-#v_o;p6Q6W$i#0SMZ*Un&C~*cGVBv1 zYwmAy@!axO(&JRj?-Y2#K%gm+t?wtmvd%Z%?SE==G2tt^NI<)>X>(g2(h2biC!;l2 zcx*y5+U?%6uxE6bTwmdx#mh_LvPduoFn715zJo44_5_BM1=O`5YQ`PxohPt=$*zf? z-S@9KeXf=TqENMTO02(ky(o{6mhC00?K?TsSNy2qs&2ADY#w9F!l z?~z}Ntx!^%J`xcUi@QW7H%0DHY=NJH;K^2Q#l|A|H{+2@sH6#ow<5f+vWxSy#(PH@EZRcN-39Ik5 z7>dy`+KG^Pm~Bhj1fg#anO0uvgU+B09_Mep#^rcza4O-MFT3!@hAHnG6CTA!N`Je4 z21v>rJD1QrL2JS}6u5aA^_B3|Y{ z7d=b4=uy`~D*yh&r<-&re+)-|oPS=@jW9?Hrku3I0dgh59W6KNIzm$TC@!#)gGX`7}1{;%;Vfi^Va=Q z!4aTuapsPjTd@5#z$`C;yVrwNKnoW-rkH{n$TXxFP%Po682!QQCd+v(E`QWLUbSd~ z;+WX}8x&^)OgDi&)Ur%rRMPK3_OSQ{eVi{!a=2 zy9?)kK=`*B=1=_A&;3{SMt`JJd6Y%>lYIP2$OTjcYCmM<@D1vZ1Ei7V++*?qxxs9#h4IahI2K^yi%SUO9yOu_atMaEV;)?DWGXv5q|Y&cmgY1M=v8sIT8CyO3(`^@3#&8R5#{Gl5}aw^6ABvdn^3Tt8aM1ps5Ry z%gL<*Y+u*MyNOxqhks%~M(!Rhz5o0{tx2{&leN6hlj;V&TU``nuw!P?4WfBH_H|?@ zF0F35fswcX+_~i(;OmO`cg&FH*~_k7eybl*lQi-oi1}Z1 zTpE@ocSo9X3*$l<9VshsMC3!!OPVDc^4S`!C1cQT<#c$U@PD7?@l!K3sM|9F#>`Qd z#yW}5$=CzH(B3WyRYF#Zw4;hmmYvS3x_z~==P$77UvGe?NufW5qCgyW#Vbs?7G9o^ zzx_&YL!h%454ovqAHS7<(j`XTq6DBrD(7WZF2b*$J2OdyfW#BJ%e2+#VFaaSl>!?8 z^-8q&Yw>b34u4d8IS3QB$Vvc#%V?lz#4}_b`Sy-S$Tl}WAx|*5XA;+Y#J;@oUy*-; zyo21UotF3$GHT;FVY&#KNJIG=uYmcdwFXYJu-Mfpu)?H-8b1t4@-dKXT3~X7f^OZlAO9 zyxqu-{C^nopE$0ckPSYg-(*>pWemUPI3MQSk~z*KrWBF-Ng11itOxp@f*~CY;rSi^ zMmpkjoNv+_#|!;1&kVpNTYmDdnSiIn7hYK? zN!@FRdVll=XZG)`kv9-jN^g;fJ~xk1fKhD7BFE2C$0ziR3CvnB4Tq1X=bC3A6t!W-?8ut7RuwsuIbrp!ta9j70zS4Xz!b#6?B@3HO)wR}xdzjqaaoO&( z!GOG3y-O+xg#WGh_4p%Wq)^_E)8gqxj+Uzg&wq@ujFchM)HR8;2Fi^lku(!m!Tnar zLDpI|zftQ@pv&KuNqJJ;p?8aj3J!L>{&EBF-bX2gyUD^BMBRPj{|}cJXgY|aV%?yAW0NEjlrGAIHaQ7dte5&* zEQyS5)*+7K1FrcDcYt7BX#-qJ;;gx5Xlcw-IaELy%7w|@#M zu?xL><=Iu&0wZPxJsS|Y(dJy=j-cP0rR6zO=Gj>Pem-wF336X4U)C0X&4aspzbPHs!%B)WG%x zxVAIj&^T^V)Y{rcutUJ2WSgf_=Lxabo`eILI}*uxKD=A-l7d#$o1u9sDN_zBE=2Mz z94gR~S1$BOf!g5262!;-QJQ8#ImiVOaDsT36NGGS!1)xN+;#{Y+!{^MOMey8%SdM3 zj3tEJzSPQ3@LA&{MNsQSyR)Ik*C<+9pu9o!zBq`nh#4ENZJA6cp2+{P z1ckncWceNuvJ5~4nQcj*vOBqJHQfk#odSkL>qqdsIOpu3HAd{M2)|)$yy<3~K6CeD z_XgpG1)wO$uaC{OPQO1U%7U-_24I|s70x!4Cy50}$m+eE;2faZl7Bw}$B8*3#A6eT~AEq@xZaEkbVO_qT!*&IJH8C<~V5MPXJ)F9K&w#^9~n4z5f88rO_$bY~EN5#d;%T(vx7Y7(H zoD$B1_={v7QIH2p2QQOj)rkpP8N=MZy63}HrJJpN`0{Q{BqhihG1FWVw^EI6rPhdt zrHB%%1e_%2V-;DH#f|D5jadFIcT`gMQEK}SKZf6Jsbn>z(l%uD**vWDA!h;4&pXiX7X1c;dwwFLe}2?VBN|OomAd})CstC zwy;H#mbk@=^?B4mxDGuGzR-3p_z^}D0%$6}g_68?I)7ih@0t&ry;;6IoSrhgfM42$ zWG6xE2!Z4g4;b+cfz;>3>L`K);l%62%3Wu~>QtBRS=Q1u#U5nvyJVsp7=*BUW8Fwe z$N!<7tf+<7No_4t(oS^NBsUQbRwh;(EDM~8CNq^eLY?0e@ z8;mZY{KwqOGiS+^P$(zqE(=N(W!X@w^7F}Pc{xllR6Zgin*$ToHedIct9Fft)#_=4 zgexRYIFKpTgzTS$I~eM(NjnK}7YDSw!6(?7f`4h?rCf?|k%PJtjiB`{mD>il%69Y; zWucfz;$e%RB5D7s5-2yLa=rIDO(D&DhB2h?unut=%_sddTW9>lKM6DGb4~Q9Wkv@< zZ$o5KBIyH{5}>qaD^IPjNWeBfTrBe@AgfAov^KfkS&)uvoNL0BC>VEsoz+9SMx_$( zuz!V-cvzq_SFhy9@~&u+E_adv-nCVc!MD_IQ~ToD6YSM_xvBIYu_r!-oC{g*wlc@= zmdpusHDnxbwdlA@7H;Em;%$k|atw{D4I2E1l`X!Attbpf;M14s;jqg%>3}F#px96* zg6yqFfOICx0&`gv|5Df#z$I@h!)A{O6r?TIsf+`MM~e z`QoaEau3+~)Q-RdQ9VOGq0+u9TU(QglqbB);EhzJ(f$-+kt8{bodElBzioVcZ^p27 z!G+Ojyk2XMF} zY4q$=dTRbCU+kaCgV^8dP=&N~$ba3xJ)M+4uwUa`{4S`&6xlpZdWGtF?GaDtZ7c0; z2g@l5-k3JR^c5fb)GNGsded4bE6r1G=$yyj#2soOW9by$Ioe72o!Pu{N zU^+J`->3IBID)vEh$1w}!(B^rA?0W`%WSz+>*8J3n;*X&mL7Dcgj?dZ^M6fBV8=1_ zK;#Qqh>#v!=;99FN8FrS_GyFD4=}v;oYz1CV(;06dZAhxN}aQZPY5H ze{cI4uXv%h#(R#O*vYR}UL5b2@*omrsyj z>(5UjG#R|$R^=$Zlu-ZBw&J5`a~6_KK4csY?7wP`<8N&FBs{rAYV$7fmHM$*u>Q9< z3q9wu@m=QbH(E{j8n6Z(oh4s|nshdfnVO+QIYq-}aoz-9?ph1)VR2-80wWb&U=JH) z6+I;@L3o>+P%NA@FDhG)M-_i-3zgq~Z7y7mL&+uAsc(?DkK(SnOcYIe;q6*k`2XwP2CBTnN3WIfyN-0EtkF;wuEFO#shz`+=}5PKXg2R zaqjDKE|HcLFDrRo)VTkedxjy!$Ap=?D&@z;;m{Wl#I`x3VBHV;Hdv^z4M<&lp<;a% z1P~j`gzyTu`L5xDd6?Pa3b;(*~P4&cAABn%uoAoQl`7K5B0HFvmTv*bNDrRjzoy+ zvWVyzzfOLxZK`Zrbo4X72B{f8EAAXk=a7K#l4i7gg!m<#M*{so* zzDM!{2MW80ZARWNT(k@dyRfDQ@5>_hM-ixWtN1L8j@{F<;gEmZQk+MJo3A@yx7H^e zijupGnHzUx;Ii4P*1ga-n_wkzvSZ=T-nealEpwW3{jD%g#i2Ccn=M7A1ZA%iX+V1Y ztkh^t+Nbv$>@LZVRC6FXF1{pAkwHGcYOsR!GW&&`Jn{%j!-VM4$@MG9Q2j2Xh|dB; zrt?35M08UH@Oghp%AFCYH~PvK=M{HUw3VVxA2S!DuaQurOwkWPRM{@d(8J{Y+z%hp z=u1p$SWD{ox%A9NZfz4k2UmXBFV3r+b@#f-0n3Y4b}t?DGQ;Dtkv`w!vfSWZ zZiU|?EsSlhRbmrUA96zkEt$W6&Cwzx1LUA+7++N&N#lQ*>kjwqLPpE1TWd9H5ono(>&;*otQ7@go()+K1rjLjfj_W>D^#+K(X_ zasGdCoi!W+e8@q2`g6#>)_ca9Lu)UCb6_Zmw?qYFd8bKwbx3D!^0pc=G;+UoPAzKH zycL*n0WII9YzWNmjVZ~<&Mm%Tk;i!TT6u9@o?4HLvyMzlt2IlyZHD1>|3_PqcVdDo z0M5%U!bZ#f^$Lg7RNQp%$TzB(HSd$@$&D2Wdcsfsf0yvyFc{ zOe?=gd3^<=3lkIw0%;40E)Xn~!y}cEAoS6HcO}L=p7EG12p!46Y&9 zW?$E(Ywi2lXY94sbIy8vbzX|Y;b6@FXXba#-+OVasTd)3G58|Nyt0p49ipd%P3zq5 z>v$6}L<(Y_LVP!9DRGJxs_&N7-j$2MWW5O{&A=Cy?|+${Dx779A~T@EN;`i&`ei|| z@D#j;rj?}V{$o(6LCSlWIjz@B&o4q}jg~=A*f|v4Uq=9X~fYQuJtd-AMDSV$VaV=^vB&v7=U=KZSIa-PeH(JJWN zkSUfym`=6C4+ovi=46v4ew}|G&+rW@z2T?MX8N)uleqZF?~1wm{|xT z?fhcmMT5)e!&SK7!ndV^oyEZGDmA_IF#&A6cRaQCUnTI$4rY#mK1`r zAe{+2qu#04G=?b-2*2yN<|ECqR(YC2@Ly?Z!A2B1>5D9>`luk37k+;MPH>^j&)#t& zz>y{obv0GmJGJvhCa|1urj&dEg?K*k6;6`a+7ZSlZuXD7N)lTaKYW^bPF{vk8GIbQ z5BvzN=C$+5)c}sANs3W*g&0mp{L@Bx@Y^Ae4akEkivJzA0` z@&s&)$8@|bVNu|+yoormemUKQo2baYDB zSzYxk5GXvh`le2VN8g%^e;QnmFA`qWq?|jHO>kB+OL!)shlYPZI}O;Ol7F||$Bj~7 z18tbxJx$ypJz!?+J(m>4qZn=1>o+vzl(Nj`poWV1i6#c?q>S`i&bD8eatik{sMq|Q zk3&AeX1vN)7rWIo`@DD;X+a#@X(RMI6?)|Twj>@lo86o`|EPl8g&`^aeDi@HcU`R~ zX^kw>9(UNmSswdw66_DOZ0DVDi9!^_JM*n*5*471pdY zizjP5mFH79E=EO;mAid0-cbA0T+-~|&Tl&@#S|@jovun8F9Q#!SH7qIq6VJa&%2cJ zLI3sZA4|{ovlRRS!@=0$^3gVjWuYg?>8c$q(t@;gg@ez%6U6e>&EtY@fn&qHFt_y1 zD`LS%`R;!K0+gnMwAby{dz!$WGaWI|tUXHE!BFqIly1Ex-bsZAq zjXo#lhY{Lje_xsgX}9S49N2mpIsn9+~*yB=lA zAjN;%=7oSozV;_0Lvr<*>@%@o`$S~n{jNV-&)4p5P&Pgq&$%oZ^i5$J{n%*3Q5D2+ z3mx3;9p7ZU$i&~C;YMkU2trNnJxA6jHmtH2U?iqX|EgYZFKG3YA#@D380$Bg8)8h0 z^nhfuCWc^P+el(i9Tv-g$mWRu^Gym-v*@bzBsYc;cd!%s6Ltd9#WOYm;$%a%Td2!yB0@kSU&n1fV9dnCG&Pu;fuD4$tuhlzh$ zd~}!xXnMQhhxEe@%_RX?J6x#u_DH+4qPfNEo!$#+-sfIy&V383zJLUpn*u7`OBrBp zzu$`W-^_%6j*>bFGJ;_9ufNZJg-pce0Sb5!m=xls=(b=Bx9DdVSx)$8)sxlLHLkNJ z>V1*3=u`HGh6mkPtXV$mS|2^TEK`5*37jOE3Q?zAmyLj)ARYqvO90kt0IXYD`FRDq z{~SFSFO2hw215ITW6(N_9|MOBtvS|Y`sKw29};-av+L2DgQ7Jw0~bVXSW0>`j$RC) zzM5y>fkRusr3Np&1?NBy*m_~W8P~OnfxLUIdVxlYkJoT0!rgyV`-Zk$ zmY>xzZf4O0_5khFV@I)dKg>&Qce~5)R6WOc@98?6=Y(p2$}ruA$%Du5%$)t3s{tC9 z4jE@jrx;;VcoB^OI7?F61bIuGXZRWz>2rVs|M3B`*(gpV!XN%zenp)SMP7t{ktLyw z7dU2UyC>|1)I2eys}#*%>;5h4(jR23GRd}WZ zrj3mGiMv8pxP-Ptc$0}sIB5_&4S&>)5No0F}cN|Tu$d~1I+fFqBBDkUp)sZA0yS53T8yk&?84ZBVaw)Z@OJWo|f;KXDG zj)({Rym1r8Ck-JBm23@ZF5fj@AMUwoX(Zzub2gaCuUE%71~ zEP03@t81Gwd}UD0=Da~n-;vQo>Obid=s7GBvs6+%#$w4)5Z-@3d-DE_;)W#{rju;c zkVmVs$hHI0dqB<5w0F9q0IZE_x0MI+4wc3cr1C&jAZcE)Sw_JuW|b7CH!m7HvFvH? zGjs@&=Tt1W>xHm3tra=myVXI(#05$Llr%r#eUHF?YqcFU4{ggDZ&c+>Hk&fI8z%XrU=%m|)>6ky2K<{4YbLf8#R@w0)Oz_#3@|-jD^&N%WW0#7CVEZ8XN|&ry?wr~fTV`e zcUD4sRcdFNbC?CyhGO`p*?Ck`^zE{Gp8!%Q{vat>LRo+6Ar7rNLFjwK@>bSkohP#` zPxFUhCwfB_FA&-d>icZUza4Fse}MKcO@OE{%6)F75?slstl{$>VL=Od1JeZikCST& z`-jQb*4NL0QcQNIM=Hm|mtELAYZN?{XF##-&|U8!tv9$bT%UmFks6NsJUldG2nwJW1ChL2x%#&J(*Jc#y*6B!sMg;N6$B zCvG4njZZ*y0nUr%-i#o`k!w|3EMWB<;ZS=3T{$WMZUa`>Zg8M055wiMEF#*@&$}&0 zi8#=479v=9+lr!@7wAaPM{16AANn>e#-za8$sQ-FXR`Pw2*c<{~f z{IGv4y`2nqHwj8RGK7pYZHhgb8bhtVv)nNtZ2x-5!x@HTuAz*DC-TZ>@IKs+5L{g2M|dFBy@y@!u4oA zwO))buPp&yJibJ7U4$D)avZBODcV&{3>1H}w=#|na78(q}rs0J*sHGU+pG(o)!&Zq$TUKz26J(qkJR9mRiQ zi-@TEhJh=m!00LXc3<$Pi_b;$NTNFvtWtW|aeYK|~?wP^im`zSg1lZbS zY3Z}>Ggbu#l2Bmb1;F|(0P8y-)@OgQq+n^NG?pN&u>e?Ka|`!nhv{6d8Qx0v5#@{5 z3kf=z*2*2vxl+MQMuZq~5F%xBq4`EdYluPpk&TzclWRFx@S^s#G6Q0Ec*&wLu*~i! zL%+Jm2A0{jz%u)LJZ`rrXN?;dw4=@Y2Pca(!deIHc@woTW7>~bF!j+OtVw^--GErD z_8;Gte(DLYLo<$3AU=QU#auZb3E%pK_1+&?s|(obBwj0?{t>gSj$qD{6btarsFS); zdrz^R59X5>_QI-~uJ%ap)63}+d74T6s9Mr$OsJUR2WftGb9pLMe>>OzNNx=dMfJs< zipIg|T|1kGIbBzhSx~S~l?i_rrWT)7|6zJC`BQJtKo{^5BlB=t7q;c1k*Sjopvq49 z@Z{nFUKVJA^40>q?5%)r6c-P%d}7(c6tIWpfzrbaH(}}*0&Jl%gsX5j$kuOhxf77A zBdKIBpb$4Uk5jr>^2PbtiHV$&q{C9#9Pxxxk=o{qD=^~DZGj%BN&p- zb6TV&&OLk$7Sv9e_W*ykQ{To;U_Y4Pp}@nKhxn2GXb=1}$42Ily>IU6E(bsg^g1_wbp&5@9ef`dTbRNaBJ% ztu*RPY78^|A9~zA89#lsk4e%bCvA}}RhbHCAbl6ouVh>&yORg63Q%TWs{``0R%F8u zsU1*$_wo%B42^$#$dUvgO|FB>gPP2l>Ov^p8U{1KFl3r5t!L^xje`KraJG-(cH zvKDTEl5seYCfD-{=R8iK03Qx#JF}g-3=qjck^ z@~PJ#uxExEv3`Fx&i+pVcI*Nl>xR++E#TKvLSGd+AG`jil zOO%!WJcj0Yi0WgO@@Gp0cnh~IPy^;e5mvcE7X`7ilVAp>eoH1$!#77FY4mt^H%m#U z@rUj{CCu#*l#MHw+ll$zU&{V$meK$f_C}-8n;H%zq6sP7>+C)$wtO%6rqvQ`7ON!W zem2l1_ZojQfeo}yeX{iH@A2%c@3uk9Zako6x9u9Vo#XZw;a%K(oKp%0SCLBF-pg0n zQV$g@kJ?{z(9i~y;t@+8*QSrUv#7GdK6Ff;A0WTVn`PY#reAl7Uao^ddhLSuRz(=$ z|ERO~k6J$Jut@qF5`&+quLJ7rGQSOn5%u<6buE9Q(B>S|r;SLb!^Ei+vuS443(zVB zL*;wx-(P35|I?V=Nq~$3(Hako*!ZH;o8&1A)7ZC*GTQnKt5EOv-OL+ah5TbHB)j1dTyvYb11&mZyMZ6V?51 zvTaE%%_c@ct?}A|&%ip{kzs7589{#oP-ka;&FVU2Q!@L!e3kQy>?{D;h5)jkRyYp3 zev;k&G*6uRWD2OW*+F$SP^fEZq=JH%)V}Zhv(A3S2&}UohiSLTv*_&TjPwXGA~s;2 zt4xgX8Nv*LIw}REPdAB9hk;XfQzb@4x1bZ2;;+vRe?QqA|BY;101{MYmok5qkE#bT zMI+0Q*3H@ZbCY>XC|jd22UwOGaZRB5DwLG?LnGjJ*l_d(@{pN8`hgyx7Ax+ z^-;m_=a_TyB|9K&7wY8uYVL6u?456`2bM2dheq?tE`tkNz0_U>_RzW`B4l35sW3M^ z7Mfg%E(9|VBvCp5^6|_YP}mj@0ETUszK?1#s=%<#St#XBeS_5tDe8Yd+{IOU2H`4A z9SY3HMf?pv2nt|S8(pY(oGLf*V7N_QO$QRqje&Y-*+r9}9$F1OZ~5;pvpN59)Mh$i z+1Z~UnO27m5h3wGg<#8#|7P4=l>WDM_T^|nMo>62`=A*rY+f%!0|}jzqd}VZf($tGNBqPKQByiyg{)Cby061Y_JASS-|U4~&44R;+R z&lK*BoiQAAAQfK~YY+bFrtm17d;I<~oAdt#*yW7h|L5=;1$M?` z$WZ0(>tfkiX?~_>^5KfWnHPaDw|m(e%4%7;2*@iNlEIwch+8!ngv8`W?;nb zUQ`>ElKp>bPq&c~_@Z|=&YPUIk`GXJvDms%Tqef+0{f|0``g?1Ah5L-Ebf0l*j)d3 z=5+`ktPp#h27KG1M-)9&7(z%Kjc?z`{_WcC20QR=3jo>e9nAi~{7eYB91RPQi=QkF zX>LBOT_ChQ$2CSTQ|K~5(ex_-aLpOlLzAYJ{uzHYUq;A#I35n06TsMG{o%N|!1mc?Lxy};oev=nODEFBT z$-sa1S)3a;TQslI>~T-&rw5*smo)i$(a4XH^n!OkyW(6+6rAkK?NFs;r7pEpnY@Kq z*NT@65mLY^yR!8P%ypQ05P!?Q%$ufn0P8v1L?x&ze)6ciKPefT_eWP8;Kx4$&F$5F znEdy{?EmfqTz_Zozl2)lNfFN&oez%q<1v5vy_tET3c93}_ndmS1~rL9M$9MG_s{$b z9AoLq$oqR9R{GGc6C;=LI1STK2DZbHmW8;|8)pT=2Bq=+`mfdw`L5FM(i(p}-b`D2 zJxdBC=*1}Nj*85JLV96?L)5L%CN%px=Aifc2K}{{t-DXJ!ISd72+ox84Dx&~{O5oE z)zPL4dyhIpcLOwLye0ah$J8rG}@x6iRKI;rPPI;$-xn@zY= zkt*o#`4EImicOTI7ulHE1`8X9zTJOItnp0etA$Ap&gh<4ERyrR9(f;>SbQ5%zc(xD zA7F{_U8K^gK?>JZi6sS>gsV`{NeHsiiud##d8f{_l!}HZoN98;E?v@H8@BD0w3yHd z|Kym#a;2+AfyRahW!jm#-nUW)T1-srdA0?N#mQs}wlgv*p`A9iilvBvnLKfdC~r4@u9e}5Nf>~x;x zI^bYudHY=)GX4xHH<@K`KO!HUf7eewJX>{rHVCa_(tHb7VxybsjUmsx_&d#^lP?>y z#%nFq2&_|I?}|-tYa2RP6>)!a8z-a|>|xhj=mSbI9OBRi@~N64g0bQK3HE9BgGb0H z&`b0sSGcXHlGIgP0;)P%yf+n8^7Y?jB1&Zv2U(ZpubezB{ctxQCaPS-7S`sCylkSM zad<4=;82SW2-w2BqMM&?rMeCO9IgK?pWOxJRJCdrJsx8))~#cpRwIA#fTvFnk9DC% zN!^&#Cb7DxAagn;SVVRe%0j3Vf{SJ7!_t+kMALYcujTotp=+>9F1O7H){5&F*(7N9 z6k03a2)YMdg832D>i61d@5^WJ*))efQ~D-1Z;V(l48s`A4B(sAN!d?vUVUrvz6?EL z-wVWAd%4M3kPB|Lig15pw48v1dK_7GY2$g#<609C%P^{$l=6TPO?pm1Ofxtma(+Za z>go4pwxGt+dN~FW1Bd$BMDS z0*n#(OI?<&CAHf>vTub1*jNVfNqe#RgoP8ZS}4i)u(6O(_GW(yxm1}p@sOgUZpMgX z@=RGHuzTP0=1|8p$kK2mxqLcT%;p#urAL#GRSBKrUAjqx;BD9A`BPZ=T$idBs+_)|SGT^X=t(Q*E_bo5h~! zTFuoWJvKVoig`{u9`V$>mZv~3&~B*Elsg44#ItAJu>a#bz&|~jvY_JMY3>*x0HLdz zr?GPCR%1^y2oI40m19*;M36lwvRU$ITl-tmlEanwJtcn@J{h8?Hxc=}9thj1z=D$L z3!PTUX0N7}=QC~Y7=*b{@?Bw(Z;9;v6o5&ICNL>!X_d+V?~qpl9?7Z}iR(jcK}3Ol z+e@9(#0Ie3{3`fjrltdm9U|6fOKZLpsmAikgqZIt(cugs!+`O=6TlG0jQx8@DAO zrWO5VOw;&xzkq)(+IbOc_WC|#Xa9=`V!Ld)xG*CGoIRijt?!u}wERDERl)yEVAjqK z2-<&$KZ&fDX$xd|6Mz=MS>u3etTaFZBc^_^3smD}0@Zl?$okZV@OA>DBy>cD>VO2M zq#BUGXnT;t#J7ZOh%nw`l=M1_j_LUFbSfp4FDuaREsz{uUGT==-pj!U*;v&T;p?=2KKjsB6x`ELC zMQcg&OY-G*DSoS~iYd!%7xiTD)yjW#SFtG(tdw8Sn8wU@qAnnxIvf#Q4;9~bC=3Gi zI&eVTuf{I?fVf|f*!Cvc18{c*;oc&@*ah7yJHj1}SZX;cT{O-?sVP>dNnIvO<(MNS zQ^8R4b{0Bo!R$hvk|K_W#*y(hu+EO$N(6xoenMV^f91Hf7zOcBj#;S-%zA%ptr?v$ z9ChI3^;?xUy4(;yLc>m^@uBKrInlPpPT{th-V>~<54Vv7a80$~%8QX|bBZ#4idD0# zxbo}hB(i#9C`q)Z#lCxVdF}T6{`O&k1vWDI9BFZjGhIT~9Sryl^dC-1TK{I=|FK9f zR*Pg)NCwFJLL!Rv!zL)u*N*=Sxs=I2fe`Y03GO59!+lMM>bK?Qd<3;}Lu1 zlWasl&jJtiyx;yvMpvUuHh+@OAft9JBwFylMS6{@38U|4U8usmjI)2wi*a=t%Nh3v zu-0s;4sV#E*cspLSCxBaWYMyPh1*zMRS@kiPu+&kaP#dFem<)17AK@!2C1!W2bZ}0 z1jTwOqVi~PwC_a9-AE6GfeMesr!rx)$NGaJ9QNoHJ|9B@Lc3+-Yz%9RGpeCo5?x8p zZrhI_`RxI(FQL)^32=W5T;5gAN}S>IuEK%N(3oZ^Eu?v1e7+OO@+4&{#avBkY7W#= z9vpZ6tn!pz?Q`OP^xHhcLEah ziU>o&4?^7omZ%}2QkFi`6I(Hi6N=>va#q}9sX?+`;#oODQ&{(K(_Gv2QpPZ1^eGPh zFt5VmKB_EAO``=MKz^AH?IO?}&Or#@ZQW)USyn(2Z0z@-Bbon2xYxV2hvzNC zD%odP803mF4{A{S)OWOSl8%z=f6XD?6JEb1kv4ihF65`xv%UGTpGSX1U1T5)`Lxl^ z!)JO-NJ4+zyinZf=W2ytSW%5*n-E0gs_P5aL)o{2t(LLTjE}|9W3}%bwhZ)V;u%&s z(a}8Na}dHp(%7ev92^QogHa+5mf!^mc-33u)$@9r#|wQUum{J{c}dVk$8xM@H527` zce@}?wQ{odTB$x=ttu$Xx1(lW5hXw;dRg&U2M~X(yF@O}cn5;H;JoeD>?V;sYZyu# z)3wzy>DrP`g}Y;#=Kg2CXfSjw`jw5_s;G8F=otL|cCsn;ji^?iR_tKJL$Rx3oY7!2bCcyq)8z z7sXxN9?mr$6)kCCcz%j<4HIN{1}X917ze^tkAd3(7b})bFAu2DD>J8s7yfj zK3Rs_oO{J2lO(vr5+3DvbH&NOXdfwn4HzT7)-eh*UFGahX-nozRMmYW_x8OnkamAF zyCNi9#*lIV?Y+XXI)nX7fI#k5SFNkXu%*g)^KfEt33iP4s&`uJ6j2t z=LPM}-7k42F0%pE0rVLCKy^SasVgxl?SB#BZ`W8bqxTSDQ+pH!kYWMXYfyl51~J{a zw)`1$!v_H|a5ib++2aN*PxTd@AZ`6E$0*~B5 z+eC!=1st~IV@QzCOEP%~XhDCCb$kjY{H?xA;uASmfsexNP{#^E&1(=rxLA!#C&MnP zcaJBxFZ9r)R9uqq1X0djW4hC!_5k(v1VFw0O*`R7L>N*TkQ^UHfkf(>TbRm-z|_wU z5Z@1wLkiy$0OEUM4C9nyIj^Ku<5-ml$A8xETDosL%m*p>^nGZ734MR*(Tk300oV{~u;1u$5SP>G^8|&eJ)bID8`aQRmUuPIlzkg}I{iA*# zHj1eP)$iaKZeM;k@c%^S_w$5qpzv$-dtq*#>SN#uT?1({Kf$Oey55k&UeJbB=`kKq z!W&l2FPX*z&D1ko_oqVS@#GX%kEoiLd8RM(Qzu2H#UH@G8UcR*|1xg(7x3yPz@-~0 zoP(jQt?O_`uWUd<50iY5_Nu*buZ4_`O@&PJq>NHV>|7A2{rb5m3(4o4MVC2Wbs~WM zG$+2J$yR4e3XJfgS@OKcSqzqX6MZ1!r{5vtt;`&%Fif*g3Oa(#rOziZ zTD3`q?j?UAfcTqV#B(*?!MjRQOW|)RG5Rw1uKIbyCdB4|Mi5KN`zk#^q2GTM=Fhy` zCI5Ti|CLi&f13L*c~^Qb2YhM`e17qDjrYqwDM+GGsEU6tL9ozcUnFF*6bNCi+ok6- zi{chdh$!wU`OQe8%vO<(#c+=3;EJm$WU3^N3^y0-k5XrEPR{n6pPlvfMt7wKxY;_a zc*1jU8lMY@!j199?U0%iN>x&QiwQ7Bki)*!T1jfEp~s)DDlYEe26t>rb~Qc`01iUH^;-#wil(- z@9%?rLTm;j-d=B0 zG8BIi^<~EGz#u40nmj>A*gnMmwN(@QpUJG!neB80#p4(B9`>s7? z(jvh1M%b0@d=BQzELzuV?NOvREql+q%qu)US;whbjXJEg>j>b~gvNf(=HuFsS%Aem zLKgiZ%G`y=AAstra@)mJ)gy5$fs1S#7jzqBm$YeJg#$C+x83y3Qu=`ykzm&_l(T=o zW>vbDUR5*HZ4NUp%1WuI8uO}#e)uIGCPTn(elk-`?uBBOOs^V4MCl9NPz&zybg_dt zQ^xgr-&rSKjXd7d_wl@<-mQ0_UYV2Vf%+r>GRMDsp-t!C08Lci5b&2DWb|DG72jA| zJ6bvXrEgW5wHg;d=Ud~n#gpccB+h^FOQWM_Gu{CgfkstAi8~cA>pJzO7-nVTtl5C9 z)@^e>CxD5X=>iAl)+Jc}tX~w#g|l5YUu`Yfj||=4Upzp0@WIW4vI-nlp3!-}>f17+P_C9aOP^yNEjC3;EEa;~Agq3l7w zY?@t}Oz~e8BJr%L!siGT3}t_~`Z#moIh9q+ zH4*L2>QNCs^Lj~_c=);#C316jS2k%uXiTG*%ay{=;fN)vm$MmvfJDkC1dM`_t1NF@ zE^GX?*lX0Zmfrp`Gvg|gLf!V)Jzwq3QS*;sZVM#9WECY`^(MBJVRdBNPaX7+7NMP- zplOlH;5gF^@RSw4I5vMYTtg<;Rz{^+_jv@I0%EN!74p?h-HaBPc&JDt$#56?a15fv zY))KE*XuB38bp+s7k@p{Z|g*yNwtE~%pfYQK^p)J*pPn(gZ{q^1915L-{67H%13`{Tz(EL)7W|}AW5)W z3dM&^8A0*`Ot>G7A4NYI2naS15WzBFzkujf#iJ1^@H_4tTG&`{8@?DS{lV`EHq$1G zsZ^I^KpsjWxg*B#vXxG?JmI5HMaVonmt5Toj`@xY`1v`@37i?FfSpg4A70nqvvYt) zhh*r%hYXpKd!K(3=OEmCWP%Tf40O`FLC?^;{iu)gC=?)EK4Bt0wV$q+WR9EQf(g&l z;W5lZ@!?daQ7W9Pnv%zf;=!ZS&}H`A=ehGm3$5QFj<3g$l~+uY^=nD)!hz|>4J9kr zHG4bS^SgMyZ5yv8Tqc*I(yB3rvQo3a zSuHx36O7m5UGJ1WxO+2oc@Lg^rJ zUoF#_MC{{ti*u(bt!LGbyQb5nIbpi0wSM%7`Fd8Bo1@eXR;&@{EkYx46pX7K(jJeU znkqxo!vFDGq<*Z}4A`sQ8Ou|es;#LOk`pULi93IuG2IM8`@Vr|uweDL>dmbCI#m~q zjtV0i{~lx&`ra_~%M*yt9oR(VCDH9{T9MI^Z`0~L18(2g@%6}#y9%vZ{XC8g{zO=* z2>9X)|MDd1zv}+Yt^V8Ye>_3aj9NcW0{7j(7*q&yb}k9k#>dg1jps5k67Os*2H_N2 zygz@x0V88SX@feZy@49I_!1?mT;LakJ_7vQ50jHWx3)YzvjN|GE1i*%kt6~`o7^~p z{7^x)Hb6#JL^Fz=%eR8NU;#bNV(~t&fTb)DUW~(X@T`7=qYfv?0UpvY>PwjGJ8Nsk zjH+~foaPMYQd6h|x#zGZRE#om-sFHkm_$C%cb)aEng zT^do!&i-KI4cKC1*tS#Ks}nR!|Gs!ZaEPiD&J)ppS7i=Yx`7*E-IzXAQ5^9dLF;fF znjs~3(e=Pwvq_}=u|{8ou=kusU(c6#5yO)c@}w{pL&by&3vqV`@U;gwtM1%=L3Mv% z? zf#KDug5QbXIsTNB<5Ng8Wh2w>82@TP27@KZIRDAM^_zm}M2P-P6b(y$$?`#3!A5EE z^r4umD$XfX8xiz)X5)xWS5Ez013`b+RaDiKZA5xM#Nr(~CX)n1U`1a{hQV{CK7<4F z+wtwHk*G-Fyd&ERRt=ouoiVktNQGVZ7zi47pO$y2-m%ItgxGA{@!o1^WxOodO?aKd z;d&dyPB3|B7V$KaRl{+rEiW&e5Gx)Kl1JnpqxwW);JQ4RXxNFsV+>YaMY4aO_*Z5N zY1O34$IJvW3ErRxjzx`r(88u6CYN;gIrW6+y-*{6wWY8M{d0yZr&ms`I!;X zTNpF?;?Yd8P-P@}9^4S<(n;M*&#|I>s9l#*k3^M)2u zzD1k;^jRdbD|5d@f zCe(>T$GrbJ!-|Fm*I_}i{Obz)p;;eE@96DOLbZhHOo;wNQV6q|;_;zQ=OxDxJCXk! z8@6g*8xh=KPS&uEab|4358sxOhN0Uf_?f!!*%;LI543S`~RF5BT0&|I+*aD?-12 znDrMc{d#m$O(P)%%ucOIKr;$ML^%Z7l5GkdjXnz5E6JQEF5bzx5(`{zc`zwI80>o& z)Ny8*X^j+hI2qYoHjDjms(s55kLlL*(GmZ1x|eujSXO^xOju%26MehvO}hBbj6_1u zoU`gEOEI&zT6pOPHr}8k;ka7rn>W>v(`mAte{+xc*sQlbfZK3jvpBoTrsju-(T)wK zBg_OH7OtqCcJ$t{wnddgYcUh9A&l;Q!)6g91X@3Rfc#WGbU?aKZfK%aGg%RWPC@jR zVmlQYBc*>!g@hxJ$efX-6xfQIE}o&o%3M8e*E? zJy&O@N?4Bn)^s?;fSK+}|BXdD75qYLLi+X)hnpT%qaVj=4KLeiYds-R`^d6>p7E6O zETexSEq5fHNX6ovp%fGy60jGOo4ggCcYpO|l!qaR(o zlc*b~BgADl9KnUJz>!m!Y7UCGt#qGhaADmh<;YEcW=r|^NXz;M`ua?hL$Z>)`VR%z z8O;oA_Cd>mo_=A5!Y#zEk|c+a@UcE9r89qer0on8avV0}SvGJ=p0k#%``1Vg7J-q- zv_sh~B$69f5h(n^l$q3@Q;-)YIOXfHzv7Z;=P|CmmJW+cZIdSb09`<$ziy$~W{rpO zG(pjPS86FmvO&p!lJ6IuojbB^X>?T;6~tOC+O#8q%A#|>PXt6tMZj{f8GuyGUxtu> zrBC^P->DsbQB|8`JSgMm1GWk|=Tk(r3MouAsjhUdWF~m8pL-y$TGN=)jO_xZ+aoN4 z9z^ll8_AfrQu{d!8Cj2vlhbgreal&z^(7#396)(<6=g^D#QE%?bKCHgHw7Vh39O0`^i5>KSJcH*ev2n0c_Fvn7O{iC(VJ=IA-%%NK;Ind7vAQN%5`{1f zfHnZIH*_yp?y?)O6Fw1deX0Q`2C9y zw*#tau=X@^PTOH0<{Jj(=^H&`dFB#G{Wf>MS&nQXGELT5;<-n%BdkmjEMC&}P6Gaa z^BfM3K(~pGlu!DT&RUk?N0@Y-&hrznWA$yw*06F;0t+-okooZAvuC@r4fOB^B^Z~y z3dgmWMpBZ+mW=DKQpMgXH}vtz%9z-f!jbWDO+8LUnxWJycb}#;xRgkVFq^V6pCz=e z(J*5hs6P=&es%E}J29^Ci&tHy&`=)>y@_=kz`E zIjHhDs#Av2PPdrp<_uT=6hIoH?~s|2`z5dl+Lg&qYMZ};VO&aZ?6vIc1|E%n!2YrA z!E6q%XO~>i&4TYqY-s8v3+E8qphY*($F{ZMVof{N)sL`Wrw$zOMC0)c5cFO!)(Quq z++J?xU7~pWh)i+}>QbZXB~yIU_R=v5rtQTX3~|!JV%s8mf`sgE19}=Q_4*phQ%@>l@w0#1qiindw7l%66mb+ns)^n1IT(u9q>iHc+j5mv!{(pH zkUx#)FOrn(?QoREAv>XUoN{FAVo50Gs+4*NN|u}MQT7o;Zs)-ih$DPSp_DNt9q5Pl zMRez0rLZC=O-B>Wtf;=VwhN?umAcj+k!@1#7_!Blz<@1(b{p}O!PJZEES7cn2+}N6 zLiE@GbFGDc_3;lgb9-PJp=)9X_@wO_1oa&pjO{*1SONZlgRzk)@TdQ`Z(Q-$YhwJE z?+Y*HUC*XM>ah5z2{jaGMNq2MB<7V#=NHNQVecw`y%=Z9KA!^X^MX0{L-N(B;3;T; zi4+bCtA190cBt7pL1{~wIGkFzeb8vrf&3T~9eF=H144wGouGz6egg$aQMy(IW za*uPZUmi>%nL4QTt!+&r*)75zbbiMC4)T0oqX2&p@mzjQ{Tm)*BqXJJ?`mAr(d|jR zx_wuFwY$CKkgAlr(^hfaKN-xUK?FS#r*3jau=hMvzTAQ(dvNHT~LI}))DpT-R2q$97PIL298WTp^ za-Ojv38g5cLnpacoli=(NFu>M5>0eIL5=Y$AB(pe2E=t*W=<#89Y7Ci(XHdmXa}T? zC+yTU?7Z4>jO^7k(1Q=IP`OI=pQJENqT*f(u`(@W-+C)nG_jCt6|19a&AxX_LjZq& zsBH1wfquS!7$)%kUCB2hQl?wKgW(hcpDCqnlK$h96=Y|cCG-m+*tlT}Tdr+qGy6rVNxDY1VARfQCnsNh8l|~Q*Y31W z`HF(&(r>IhB8L=A_Vbbqu@{7Y`LFa`zhgKWTtD+yB&AGLip33u9B;O%=B%vmz%S+4 zd7ZsjX$}?Mv{C)aN7|Dr($K*Taa21g17R+lPj5y_0qgQR|3RErF8S$$-f|>FI%eNh zFSr*;o7}AqIlYETg(=lQjOqGX=a2T5>r&%Br@M?0;tGvDNO(hGong*@Q2XaMSee@E zY5`&`nePdBrjYT1JxG~C8mBXhGV|=E9U=;NFFmonO^UOu5&Gp*PuJMaBfG%aV8_zV zMZZfq@y~*bD{vqxGRP`9V&!8gO$3Tf_!<{HVq9cMUJNo{Rw*J3MCE76v%S=4aK5b^iS7=7PIDmjkyO_mj?T2*Ml5P z3TSWEkcip>nbT)$q9(}OmnnEmhi7kwQ>|Mn&-Sh&KR?4fRu;u~HXbs3)5Aw6%IJO9 zp$(g-+wNw>+a`pfi`f~1O&E+(XmF`6s391jKf0MvG9|T8;h0sQGQw1588Gwddlf9(;6vg@W@zT0%dLDqM}GO0jbHDzEY0&H%>aXZ5tiiwylnh-CxhMcI~}R&2O!B=B!h7 z|9S3u{*7yld+-{rmQu|lO?5hNOhVdrEGB#$kjlrsm439XagJ%*_gii_w}@O2#ev=ZIp7DREnn zV3}#Q%pGs!NR4b^OQ=#d_S^@t9tM~yj$tE!P^9V~$pHpr4%&`N>>in;(k5DPQ*DVR z3O|)?xnV|skoPbWsNCwr@(PfL0_3R17)-_=sf5I&S7By~@9{kHP{wengwMo@TeT8? zNYG(bH4d>mJDlhHnz6l#`jk_(1VKV-fLaYpsH^?x1_U@^DAa^$Kx#qVEUVh%p`%2G z?+^{5@CXR>a13H(eVS2XvdP8PI@M)L$CE23_%cR+lxxL;@C+mU`H{j+p zpl@S;RYjb^u-n&v{rENmv@$+__XT)sra2}j1+bYdviubN;Unzny>k1An3)8ZW-+uxmSko?{Uj?*?@1T6N+ddq2gzEG({n zzsrVm_y-RlVS86{iX=;9VNZ zR?CKTpKH@i&M6@~OB|oNGmc59w|x}44U7L*)A+iRfB-Fuv;JgP&BJQMz{kV;m>Q6O zoBdo54IO7oBE9X!l)E z_OK)$ERnh)5}CgN3UQ?umHZ)JuD0DB1aqZ51>~&`>af{J0sVc~@$0(AIpFIip*!-D zh|?fWS;|!hHn~x5XKd1J#KP0GuwXrZg`99KeNhIC3C}bYQ*Jab-VTQk=d2--Q8j4* z!Sz7&jSuI#gqK#3r0BQh3VadVQt=m>*|jXJ*38Hz#d}wNdWa~aDa0}(3p})>8ffeA zdUP^R0u5v<^=GA>O10fadxgG$C>L}W7HbwAYyG(aiE-qt4>ci(m`{H@c6#W4qI;tk zLHkCOzCc-h+pP<}(To!W)fkMeMBn~Lv6MOM{Tf`dXaD)ND7M8XO|$0*NsbUIe1`nG z(Sz)Z-Hvfy*Z3`wDxT>6+SxY{&tw6)Ybz5OY^k?4PN3r23_Mm<`yz}>`{sU!+}3Nv zLUt*NkZgr#pfmK?_%D_#g9+AuocI*Ov*$F_GOQUx!P#k&!9|ZXn;%6Mm(^)>rX>r1 zl0=|7+u;|#-NVVR|IWPY{|kPO&W;wwW+wl=Xu!(quZWl3!ZqEw(W3HRp|XiDtzba} z;is~2x;i#wz&zNC1lfuNSKW$^safzFuwOJp*Hz$OBWasHIRw8kXmB)t*_q+=E4A`%4P9oPp!m72+<#z6ckr z7SaC%nm;x%oef)Wckp*w(c?4Z(CgOY1Tmzy?FG9lb zMs*VToDbX+-L^uTdj)Wz+1PMcrWK3A7q`o_e(~O)Q1IfRS;8i5 zE{?Cr0dfU@lqF_=PL_;xI_*(Vo`z?8zoZf@b<2&GQt9*^;^OO1mI>VQ6H9>RKf0&| z#U%%Be&cZUZ*llPO}YFh910s)SbHejIU892EdZ5lnfVO-I>YX9u*Px+3-|Mc~LO<~Zfoys^VNI3m2<2A!8 zYtAWa?RD>{`4`ZkyyDDPodF*naoS%*-pb?pY=O4p61VcUljZI~Lr8qFhovmgP-v(; zM#G-HtgVg2+EdQw7jZq^Y?y5k(HGC_4{j}}p~mHG7=fAxc+FJNQ?#Qj#@)5R^iam$ zCvKo_7WKk^>4ck();}kI!1?#2!<355vAvT5qP2ZPa_f)hL4@p98U`Y^YpB+tsx?tg z=()Y-af;C(#d>6a+Iqqq)S=_pt8KXjPxId9T(Y-F%^i2l)VRl^vF=>7n)bPA%aKDp zAD;On<3q`@w^*?D6)hR-`x9c;VHPM8YqN+c;=o&2-f^0&{8X-?f&tTA!eT! z!FMO}2T35J$W%!wVpRr|q(q^r;z4AY&QAx5ikDHyb>3Q2$y~72q72`$EeBXNdzGFz zz>&IYO8RH#^1W3FjlE4%>!aP`#PL&l$HZZc z{e)-E;CoJm!f>*EpsgYNMmb99S_BQo3k2!396hdh3tl8ortonHF+Y-LFo$!NaW&%X z2=mQIShaq3U&BmI2aKtGX2qgpH-=9J9gFRMuBz~Fp918$GHiriyaWGRh*Q8mqoR#^ zEQe2kbdzd~s$F#MM>JmknR96-8>67jchiwsVI!6ap8KDIa|sq=Y;4Of?(-?y8-tnl zS?w5~%z8v=zaUEGY;IkKCX*vbsW0}k)E)7V{V2Ua?v1cp*^_uMr7kVW&5TBrYK<#@ zGuP3jy3kE!{^8eCxQQ13mH4Ol+eSLse@&M}Y>nkil?4_5UX!%skOeS!zuGj@LbGV2 zqKF`lim0Lp(B{#gQal14NnP6_pop;WK z3P9m^{VK*-KMt57j0z&O+-WkheWk?t%{^o{0K7?QgLjm2RvCze547jsA-5313Lkig;_ zk}GS34C)lL3?Z|!dRW7Gj{Ajw_T)JnD^&z6rsczsb^WhraNAw1Dr|SlT}&vlq^tGr zx-fKii#+g7vX_RFB~wr%GB9VBP~G2}Q^?p??q}Y(BAzdctd@`#y}%!*5=R|Nf4V2> z6`*!EB=4MVupcM;@Nk+H$0`^ED(M2Rl^tK|b&iV5+AOa*M6p2>e<=)qC3Gx|eoS6e z0n6zrvBGc};qA8%PQ;Jl8OY$wWgJ3LKm1!$O8?RnlRg749qBzVjrv+3cE&t~{VjtFA{Li)HWBjk`G6~NKU6=rM21tpTS`kb@|ebM z>o+Y6tglg(L|9x{1DQX6-gP41Strm*_#35-24$V-(K0MS-39}OjCw?=Td2`^5TPd< z0@{swp4IJ}P%|Px+W&SnY5dX*L->Qb1mL0ap?^xHN zF09@nj!ouQ;Ukv}_9GYy5^!Vuylp&JRAxfMH?G>D2f#$tiWI?rf#Nm#k0;Pjb_A+B zFmVXT>t1NPH&FK@TnE#R2exQx6-OMC!wkElSMS5~RZdcI&xAtqiB$oAsZdMwr zVJixA1gvl@Nvu(SEErg7tj#5TOZ5eP#=F*D#+FtBoTZw|=R1(E?Ss?t4YW&pNzL6d zdJXw61~6+%C)RY#%`GgfZYHKoW7FK7y-V)vk1))9ebo6dIvV-L4pVL*eeY3nLuFMX zm5MxCO}KVJxf++icNB7ZRJ)l zV~@fUW8ob(sFs_sel8l*qtT3gOdSq@rsZj1ArcGppz$z+u+umkJvPV{Mw=tbu?$BU zUm#H)sBFT2P805;V-!|WcL7m1vIm}%a0Ns%P)xZBFQOfEF_XJh#{~lnPXj!mcF+Et zflLuWF;^t|*0yKu3aXUM?$)l81Fr zK?}$2^Hl~Qxge~1OQAQd1?(5~Dvf!|Fm3Ck3v;SGIzcBgYN^=DCK_^*_LC0MGbR%? zmf9D812#d}$L}*P9Gsy09Y5-p5j3cO5slzZF+!2XHihmkuxfDytltLJZ{~2U1sIZL z7lRoch!k<0a5N!{(^*ID!?4rHsb^$-bGNk$vU3<>s!$~GbculCZ@jLFGEGtw-Za9H z|6wpxU)G2HSSE8c53TB2RtDFIcv8xguFr9Qhhs?;pHXZn4g>l_s*^V9$NkR@T5J)y zHj5PlXG+fOrj7{oBJxr>wso))(8`flQ9zduK@#q&vsMnEZii1GR>eC{Ct8M`Oy8NA zsR1(_Cl`9&fB{DU{b7e9I@Twnifhdt*vmwN+)w^n(RfM{R!7DI-^&o?cfZ}rE&3>(PrYnS4J1i#q1_>~XDi+da z_P7{UQu4GoZmf}^^tgDLk<6%lWSNoQM<;6k_vi03BYIO>v`^_N#Cp@jrSaM1k7Ffx zDO~2NzGA{EvkemU=`!^vWa-B2C(t%_Zoh2B%*>KfSCZay{oc>$ z1t=gu6)Hl5&2y)TAOe0Lg8w-3^UQASGSb8i+;ADKTf9!c*v&58CdV^>=|9`N@W0X1 zH5h<{{e~wwCqT0nw-2Y7LzKf1$01rF8e|A#$RgSynq&xM2s0XGh-3&wEX^p*2w;>% z+!uS#dB}0dImu-0SZD;{q{~%hpyf280LIo+!)L2iMNVUAqJo@aX?D*9$>A3EH6Lvo8^6lX92`P;Y>0uG}mJpf59nZ@b0(wIpZ zWeHW{oeR625ZqpQdqv$>UMn2TaFqxli(BaR4 z6m7&kBazxpMH4uGulmmLpl=7%)fGhPlx2jRf67dPRd~w9MO}@p+BNCaW{{PILaB-< zqG2}5*3Ci*GZvpjK-(5G7`(?R+C@=pO>Z%yEEo4(>5D}>-Yl7Zk#^#?YKyZMkJTc=xpRGhS4JjvC-cjuW9$^KHd zgmH&kg?t&*$$5}yqwn^=5gwPvN3iVrS;S|H_!`@GOe5Q0+)&7~lVeF<|? zF{6RH;l=cSnwt~gdz{g0%bJC7Q=@tZJxC>!4Pl_Nj})1M_DGuHa9A2N`whfFUmW+| zGWU$kL1bT1Rr%_(zH}BIIy1_72Og_ZmpPdR%&WD??cG;6_h~ih zk$heATg5N*KW3;9YzgswE>9|y=mlx>*$TG4v{wRu@Ct6R4%UN(oZ*(hwi%+IwB*wq z8`xS;RIoOr={&BGSu)qJyZoLz(qLW6*+(|3o)bPhO`aZ*bS+w>9xzwbjJM+6zdbOo z*ctoHrjXUS7;BBV#$Av{{J3A@6g|BF(GXoq;};!kZz;AS1VwYUi2`nRj-s|#T3V#K zN~&sqq`CrBHBw%+RaGi&v+6)o%g;34L#4De3HWDJ*(h%ZRM{x%i!QNIGgMin0r#~v ziTIaP*{E#SRPh#e^XYhL`d_p)$$XJn%2LQtS;`{KNqTHjTtPqLlh~%W4|VPk5L_qu z#Z59ri*zi6WcEd;B@k~t|7Wrs;=s{yA38>V_Yz06-7)_mcSips#$XIba5h38edwMV z$rbnD75Lyaki=UQGffbRRs?0!7mFrLW@~Iy4emN?_QPe}7q^psPFDzYb#}TsBllR? zT~fB7F>927Owni=qNySU{acDS9I$qf_yYw+iN^LMj{AZe1@tz`O2PBG(K)hk{DhT% zHN0&wt@c&KyqQi8QR2_cA!zewa}m5>8l*8+CWxeZ_%HaB0MG`%ngHWpWdjU3qPU-b z2=c9-XMF!^RHlRb|HoL1I6B%n{;je84{CffVFY2D<{dMQRP{f3o1K~l;|TU!-Oa9l%#HVt=Qm(`Kp;m zQ51ms6IsgF7I(*ByDl|WpK9E{zP?p1>KMmgVs4nGF|`JIpok9<{TQusEV(p)1+-ls z1CVNub7SvG8z=5ZnvHB3BSA*^cyXFD`Lk+H?bh^kSuo1}=LsSkng?d>6Aw}d#j)N= zdww9&s3!F&REecnxfg|PInq83MYi|%O(!Xx+PDZ27L+rquddVMU$t7T9{&*4AnxJF z5qtpxLi@Kess3}J$rxDJI-A&k8vOqFJJB^N)XM(vtp*C%)E9qbM+Rn;C%~vc?`p~k zrtWmE`X&EFlv1Q*hnXv@g_>mt3mK6R@45gtfv*^=N}b959J8zkK)}sI>WG<4(GNA)B#RHK3GX z!#63k63MBD-}tzA6%p^XDun_&iq>iW&iK^H#3Wk$z@zL?F>;wy^@y*YE)H$vwzyV> z*>#3M0&0wGr{_u2VsC}w3wp$uk>DO3b;Y+%ciSWMi=BE;1(}K*fzVGgoZgEqjO;>d zAB!*@Wn-^8NNZwY6-OC=c~F;9^K0y|@?K$5urhGFoF&EC1a;~WAlk5rLLe*iWI(23 zdj*V)6KK=C5zX8_uFUCZ5S`YQS+r5 zr9QgcgJsJ^m=&(fwBmFt;0+|K%z2LLNc=LABPi7fhy`eyhMyz}G0`DGIq}h{)8`g_ zZqMHRt~sJ%3>Ugs5q}BK&v@Hx6%mX#SuQb(EQ!<6lj}CMj!CSbjz$5Ra`4=+oH<() zT_R$CV64B4v%Lg=f2h?2*~#ywqGHB$RmV01xp#=AnbGb3rXxV3~A^j~ooPR5??SGP;yo-&!lCyz-vx}3Exq+?Oe^GY%f2N$` zCp0n&P{jS~>||yYe-Z>i?B)uXC@6mebmU3!NPuxRvEl{Zs1ekLf%AQj5!B{Z)k;)O z2q4{>c*McqI(z<8aA`J3G}v~;RI_i4v}(~6{K9VNG}oQxPu8bMk+5&8S0ewiSxyfB z*C?Om(xc#i1n`f%TH+E-p$( zRGQC+{p`jVM+Pj$I>02>PEWatc~yH*JWTaPmAbkfX*Ioz!wxh>9yPW-8L@9&HLv$0 z$zqtNnj39&1H!bHSrkMjgmGB`=$}5rFfkwgx7R!}sf*DZR)9F9^;+_-*%3K2=5@}^ zij$Oo>5|8z%p#xjff+*DX$#Ogju0ZroDGE}fneKJL8K+*?0mBZn!2$BjeX2#?^o#M zkb(=66+uOsT@($c&F^#O{X-bk9Pt4*r;|VQEUNuP52@?2f2={@dO5Ssf_j<->%*4y zH$-u=6h`IO7x1dqhu{7zeGOfI{dzhcd`d@u19Ai(P!8RL9$zK(j|FwvNWP~azft-1 zZxdt+{~9utEo@BwJD80BQ;8Y+L~nAT1|@_4s-SS?5Bnp0mpHTyQ6DM|g62AL)5c9} z!aTW&dFAN3(oPyAivA7AmtwEgW<{D7GR$_xWA)R`X|nZVN^i>#NL@f67?4htlvCb+ z5`2IHX0MgTJzFu%e>r-b#qwC_k+Yo}AO>S0whU&M6m)@+~!L1`9~Ywz-m3YqM#TCW)0L&y)r}%N z+5-m8Ex?;2lgt$(JiGS7z1y3pywpa0dw*~41?xKD;;C6|#T!op+pi z8)h9k#oP$<&GmD&em3ulNF8K#NfaS_vlpN2u@YSFc;>q2pJ;hjSyM z@ULhD?ozy&lMRMi1a83WSbQhL0`!6|b^Sb;c@d0{nR${(no%m5dOl`i&yAn-C3h>ukOnTXxBTw^>4vxjmh=Gqkwmimu ztCvQVX1%}c`W)feYzNJD$zV4+texx<5i3l&3*tqQ)E5Qst_@_BIAblkS2#lcQRK&{ zW)B!53}e`=Jac&LATs~my^>(#!X>h46R{l9p$>mS_3X&EG9N~Nh?e?eQK3H_941bp z_^*&XF7eJZ3CxO$Tw(lti?#AJqlgYTp_JrV(tyzzmja{^N}OUbVp1|Dhle@;_3OZI zp4=Kn@$zFUK~akqPDcDmU#Oj%iZpEt^CzU+I4Ph6U&na_eQ54)XW^T^H!`-37|v1yv8A1|v90iteG$j{&TsUhe;4VG;clHwO9k0E+g72Ux* z<@vqOyM}pB5R>F`e~l6x))S9YHcg+2S~#Fr+O|ii@Xc!QwL(?pO}dShbkseYRdZB3 z##HXR#Zre5J5;!IedpVshJM5Hm=liIYX{mUN~+TuB-N&W8{xfF<)Cw3Q8gMrWL}?6 zfBO*we_J;HpIU3DKTd<*?_UgT{$o(#ACAP|k1G6C?L+whG||vPqx56%f{NID(V$OB zX&|g61uGbT?gIuqeJdJkz}0qT=dLGtI!&MYK)nA#|7To*hnv(fLar`-JoR>BoO7%7 z{pJ0g{5vNPEkTR~v>Wtsk1?K4i`kCv7t(}R#$XF*W;8tY6cY+6M5#-=Q1uZ8bv;de zeR@o=Q-d59_&cyiYuE_qGIP+J?8FS(DZoK-!RrHZM=*}2VBUrUcLnF?>fgqrYdBNAF+`pb=*DR)^n z?;tUMErRe&0+jf~`9bR2h*A4STW<`98-rz?WD+PMIE^9=itgyyV9O= zB#3K=hk=(e)RRW-EMa_9ruZWpw*eC8VdzY-dG6!S)@hE|`7Of?-pW}bRb0wM*dj2@ z)*o&SuaXfPg*J%hD{**B^V)-*phJT~Jat!p%Y(?{j5OIsrj+yf(V8}w5OU0sSmJd}!nB+>L&AQFmJg>e;(z*QO?)-(B6!7I*@?mL%5x)mgjEHrR?-`P z!eVI#5A}|^a~#&i4l|NbB1MHdYfP3`F$8pNO7SE<=M z;4&b{Mt@B-Tu(NAp_LLeJTIzu`nB#f*=bhC@8|RSMgL0-((zyefE#kW`&a<|vTUPb zb)wWnw+~oI%^=u65yLatW-NX^F1=$XVt8ie1F!Epxpq7|Tku(GQzPPh)xh+B3nN&k z%g3x;Qt;Rhny#H+Ei>Dy8x#^t4X0A!MoaN|8YO%#I0h;ckNpbz7}kzs)z{&7DjQJA z0fZmR4bsm+gmELbOv1?*R3@(xMWmWYXC3PZl0#MUY8efbw&eMaLw6WW;aPe|RSHhQ z3_SH+#JHD=>0oXdU|WSUD(a!K8sB{*0 z9b9<^hAxDO(DMWyXwW5?Ma*VlTt&oK^Ifr9iA2AalIFEFTTvN|r=o~aB;sW<$R>=N zZ}y={CHoyN@4nBe z#%@_zG28cgERNww`Ws-);Lqfg8)4WC@bCi zOLr!G@Yb^a%i1^Je?xbEyCY5pX1{$B0egGtziwpyaq&-7qf-OYTU!M4)6dH|Zo+D{ zK;~q&sHw2QBHmRir;sFT53=wSa z7KG+!dB7SdA8oeV)AnE{aCYoeJBis(c(=Xp=RT@8eB|j!ko(Q;Cd;Bi#u-2#W?svZN9yQYI@7;lX-mrRq=ud!dcAu0OyH@|BE**cn zy<8|fkL3_9Z?WxmK5zIK2yeY@a6X!W{J2k{(y5q&njzy`BmeBD8esm!^K8hs^$?X7 znQaHkQ*>ZC2p-BSDgR;+UzMJRH_dH!U^!?W;;V{oJ5XQpD=&Y3h&P38IpC=g4L`J} zh;BX553(zNH-A5fH>GV4e?Q0$f}u}Zd*N+Jn+b;2cK* z)F4cYzQ~hn-#+P~xUjD1D3Ddj6f|kF*`%zRmwWfYtKJX7fMYxOU~bPg4^8Y>aA=4F zor@j&v%?1l1J9#@mr%T6^;-8FDLK}9s2z2dTrJFhIRb4xj#a~W2VO+jhA2(Z+pv&6 zA&EK5Nh6RwPp*yG>C{PK7v`EFmdI~hXt;HXZ6jcycgj>%F^*=-;>GtRv2YDVikWe9 zCd_F|<$gh}xzfGiu-Ld^vFcn++_nv5ND@-b%a|6uy|TQF=43{JUwDV$f|yGaMi??{ zg9adfHW5#VnmXxif)d|U=jO#cTr{L;5bGC_*YC$(AhYxxYqp+D55S!ANkWM&vYb;y$fyDRqozs|q(3l0NRg$nQWHb$BRm$EC5)M&AMTh_rAJ_s|GZ7WurO|C3TM`J znb$r0*s|5Hn%DN$ByuoIUJ#B83qp)txsW!LQ*l78XF7ott+aq4rwu$yHzC{e@Yd}l zN1I6TB7}(x}ZQ;-RuVW>NM6CSIL?9B}=jOEgpb#RcnyfXbqmuQm-Fg*Hon)LRxG za8F7nK|(LZfl3>~B9lL7&S=*hFb&0}Lqxx`P62fyb#fkRkcrEFKthYETs^}i%&Hk} z#cG)&>dP+I{dnG$!mKq76{V{9y~fdUEvCjaE*!NgzN|8iNX^Qf*bFpNz|67cm_|@P zZf55tAy6}a$Hko&y%o~Wc4kh0=v=86AW^*9&j#NxfE3sosU>BGyejDrxw=thEn!U$ zYHUP zGR$dBc){kVPdTO&-_1d+8OlKsMZ4Kz0E{~&@a z(NC;7iO>)5Br@!W?rG|O;Hi0&&hQSS34p=|#nfq&6nfKTxykjE47SAG!5F3A*!5w0 zhHo&6;*r&%URkV)R7og`_p3({xYn}dNRmCux0t6vZgQit3kst*X+#fv&S-LvlT*`> zX_pGRkiZPPok;O^DulM2-0#zdz=$ND8+1T?l@wOiCuj7Lto}5AT+h2HQiy<2G@t!3 zSv$by6(KV$KY%o2_&Sx&R01F5_J{`dY)Grpf0)dePg#Ogd!-#meKL zI|lzl^o;cC4H@W2I<>G%)kxymr05dtTejM`nF$IGxjf?Y)kT?}n*~OHuNw287uI8L$g^wTU4{Tj{R zHi^*m+-4!qGlCp6LfVoOM`|0s4UU}C+vitCGC8TfI~1$cu_F5?W71YRcs+FV@heNzrzZTIwCb7L~MD=Ajm)PHog zJ6&E!w`?R0rN!OZ%$f!&ZtpZbdRUaVN;V@LwI_tA24ENO5}ogV&;ijMON%k2!e{^^l1nd_^?B2Al3Fzeiu&>}! zqZnR!$oWd?Ww(u(26XfgLh~XPS2^t4E*}?DkrgX0Q=w#BIk~I|NNT#->H!q@{bYZ)Rrft$CYj z(S>hPUe~FXw%f8L#t=>$*bdp9d;Q?*h8{P6@sN`zrZ1mZoz~tZtDagt%F4P=r@0Oy z%BR*pF?)t6-Kn)ymp;7_&(}Q5gYz*E+M?$TIrL9| zcZ4rLuY4h0zFwxaU41_SLJJeStf(xh>;RpE zHyrqW9&L1B0D3s)|BRB7jqH!QQJq15z1IQmYr8dM>%;$R4PKwiR+!eyg3fmL?G1r# z*R%>4-}Gp!ckP%s0~CM2z#C?(m;8!?ZzQz^erj9E9j-HLqV-)h&tI`S0_Xg(=d@gLuo#L$gLb} z->Biyek%B+0qU1YRX=j?toI2PCA=;q`t>v1x*<9pdA|2T)}^5&niS$Z=&2??w{$ zDZZGrjyGDfCC-8A`cM_RJ)Vz$QGp69jG@!1yu}k6E#3ENJx(FZ$rg08HiwU!)6pXm z57nfM!eLg88$?zQo20j5EM9J@D%Jcm>$uxDpvfJm?vbu_Q%*r{?6R0|lh$=BunWx| zq$?Su>FaUUBXPylH|sQ#@tT<@XP1JSK4@Y)9hYDe8!&0Q`g_l^QqXmd;v9 z+Ihp1G#*iPRn$^lTCp1*SP#osY-r}ooq273T^X$#rqv~v^7|edH@D$1CL?R8n3Hj0 ziJYAtiZ9lb)KCR19&cHHr^Q?JM-OXXr5_iiUfytg%JcLRLs<2Vo_T}yb$>1?yaaTN zaA%C@rn|Xas$3H!yXo^L$EZ%eve5`5l(*PhZ&%Jo$-HUQVmeswTy!L|FSBh{WNLG? zU2)=d;`6!(>EX-m^3V|y;)tY_O-s2P=ZoGsA-bd53 zFTFG&-hLT$@WSNhlrkF5G~aT$D~O(0ZJ>sn+)fe7Hm6JH`L@%Cgx5FJdSu!m)e0fH zV~{Xlt&ku!B?F3o@#^@0AB@13jM1f!%FjQuGE~F1-BPeXKqy52>fG-Cj^q9>ZW4MS zYda?sHAf3)6Q$oj{J#17@UBu(M+#d2g;$L|EXqoz0e?|7!fp`!QJ^q5DWHIY(n1hh zCVOb2CED6GDODr)vlQM&00jT-%ez7$d%B3EJk6{}i`$`p{bZ^a{o~TFF>0VSca7kX zV)&XMGgKP2s|@-2Sqj9*!dgl4kjh7pmv1Rnr+=+N?Fwbq=zT)SeN!bJ?If12W`6;x zE(MQc*isEUH|`_0fa_Nn9~RUKv8G1$lM3G90*)=J zeHu;9ZBP||o(0R5jaEs(+-Ygc!L*|OiE&^Y0~zU!bGwO97V7{(K)%1sYcZ)j{Mn&t zxBfivZFRb2-ohwQP<@%@-ku^(VAC)rH)~Rw;&HwtFmX+CnFrOZR}8ftwd1NbKt=G8 zzgfcleJZ-$Vik{YX|~b}#<&4|V^Y`Z^Xm3epnQ$+eBG)_f4z^z4v!uoNkK5xDOgV_ z#UMjeXz!T$uNAq4QP9&d8B9a98G$A|`^PbmDPpwj6-K!Tc4&sb$cwt<%-?@DY&Nvg*ka3|d9f$t7s zlC4HJ#EL4q#xr&OWdFI6IJRsaTqIIz-yN~whkWoT9wJ(E8E=46#7kVwf2?w@HR+yHsocPGXyStDzLRFp z$a7X$G%l6U(>jX;K?D1=qNgaR5H|FLi#t)Y*lswykwqj#!Sx#jP6@$GucM1DchXL( zs;cV~KXi7H0eFxhfsNRy)WI$Duck6TpIrK=Y87i@n+}-q+4;O{^`Q5LJ~*jNikYs8 za*40$e|{zUM}pc==psCH`f~$T$`F;GYa~1G{Ny~*dxydv-`tKchKwOsD?Rsw9>=aN z@;8Xir&v`w28gP0?cmvd2xa;B+d-=vW|A=*oz?Bul0URwXid9d)s3@dhkNiCoXLKz z2~bR{iClo$9ML}lgWfV#e?(vO&|kW8PNHR}f6_BszOh>|vzUMR!xSQ0u@(3iR5bn; zD*qk6uzvy-MH2&Kq5t#dPdfGQ0n?~zqlB!6;%lp3XRNV_*x*_+TSh2vXhoYK9|YoW zPGAFEYpK<)L1*BwV(rFG@h;?h5^@T$>RPmS^bz=xDm%4t9z@a)#brwNxXJs-bHsCW zf3Ugn^YeX=9!O7LuScUo_{ShEW;1F7A#x9c>VTyTj0U53{YP;6&FIq@Mwn9*t1$`{oC)Ihe*%p~{Ff9Sq2fNBDMsho9)@HGYSM`?JI;(D zo&1K2l{BHr-87r@RX$p_)^cvZMItVH7I%Q@6COJ<%=-{8qjkopWneJ4h(T{uadaxF z*^WjZQwJxY=~&%gKr)e?Q%G*G=1J3}c{tOh(mbw!Uult23+o^<>uc`54K|(7e@@i8 zYwMXM>85aGz!F6qfNzp0RT#-pee|L5qRHxW`f!gJOH>$2=#W%6!v-CbJ&7jbclK;aC zrmsp|q8yNv=OJLxa>o^HyE?MK{`N)*J(qVd)o?dxf0R%pxA`d9rS0I{WgN4X9ZO-rNZWGWY9#{Z?AM;5ehOdh z3h3G-gaj;?y>MIfQDbw9dVf1ndsBk$<}htValIAH($#jT<@b!5+PW>rwf6Dr!o;3`#^W@h3G8_vDLF!16?a{zk-;~1u^Ek(bU>HCY zjwtpKB!VWhK%ghzLQmTemhE_z=n^J5-=%D27jCJuf7t=CGmiG7WVIttK5!;UlDEl7 zJj(i?JDOnhE_((=NbiJpc!f14ZOKR9-WQk*)o zj_38|VP36W&}bRml}IvQQ>7cjaJLI6R~_Q1Dz;1~FH+D{0Uog*|ZBsX#iRKy^ZpAvuPvvlZ`SzsN=;Uez~P9f(I zCyiK+sYyz4gWVvDw1iTtLzbkVrIj@xbW*?=!{7YfSA$Ji& z3|FGnhHPf7jyN9W)uCo~J?@>hC!%Eqczp>5&l*zqrZMUBPdk8#p?YU62oMkg%->m3 zt^eG_f@n-BKnXm7PcH&3+huE& zQJXuTyeuN7-|pl1AdG}%=IZ<~7Cp`1Ul}y4Cp@!|&$>w@u6= zX@Jrkm(o`(k|E3 zGRqjX2yoV(vs@a52Hwr;K8ag!<;}ma!KjRm%zZ=#HgYNNG-Bh9-ih_8HCgzHUZV0l znzO&d6_eaxO>fV#;XqMmw{AD#Aqjhn8_oio~tSlf1KD!%Apzrx4kdN4@^dP$6DCTCDEQH z=$@xKmT~jX7fuwmP^p&uR2`zOOnhsA2Q};}{>JBYp3*^kq)n%v67(1YbE`&0UR7JfSE^hB&|{zt&|)=7Jqi*S8sI4ZL~Fgg+``aVfloF&e{&dW*w( z3+P%^P0_Ek!=z){{Ehin8k7{TRGZwrT1_oY)D$28_#w5^(Hp~OTbs%nUESRD$5m*& z?Ne%f&g?g)dOA_*BX$Ap7H_={ z8Ttu|PHd<_MgYsPXt4&!(Xm{@oe9woek45$={VS#l&)lR*Z8{tQQAisqDPe2ufo|+ zi}80dGY}bh#}=c)s=Qhqfn#r~J31Zc{i(UJO9{pDz9+9kJ{!Sb^a_8y@)h-Vf93Pb zyy4tra`db12#KnmzY>6ky$ z$$kbpWz_i_l9%MwE6^;CKm) zE#qRZ_2g@RR*-%ajBw;5@t_Zt110_=y9~T!go2S+??M!uGWyxCCzo{&7-1F|A|DWl zLwfS}{^p<0f7-Y^2`3-4ap$_`l!e}#8%d2^YO z1R;@UoH(e6qi90V0|cUaS)zNJB$S70RSwx~*V^P)m8%)z2WH9X&ut;CL<0YQ_-(N- zk5%M^b&)j)v5rUM*rtcqp>25$(+YV@fEm=LV>kSOaBKWo@_9)Gm8wSqFGrXd= z){@qv)@V8YTNz2r(d&k16bPbca`8W%uPxSbEJdsW~H=u#A`|$^I8@ zZxvQ&yQJ#^fnWo75ANuaVYw1zx~7}2;h*)di>;FiC*UlH6TEM zaf*yt;Dap|e=au4WiiiK6Pd09(hC5C5vt`Kx_SX91DPYOTE4d4NNqfat zF?ojoklqsoVXw>k6_^t<*`w zH?|G03R7jr9);!AKhImw*I<{0P)bumV{xKmXqnOX0ajPtjY58w>dMGfO=KDNg&fBc z%s@%68U2AP@oOt}3vYtZ6FK-5s?R~4GO{{a6}%EjMk-j%(t?=c@ws0SEyHEJ-)Kwb ze|g_MI9bMY#Ww}m{`mt99D`1tuBxwR`WUb=M#2D=rpT=CTw1+Ded(P+McVtpw}8;MF! z>nGOvS}_>?pYzrL$@#?)kdV{1=!|oj)8k$0uP`lFrUlvj$3*J?pz=s_&-# zJBzhtH;Ue#?rG7kRO$lZh6TOmjcAIkWka-V5zdB)i9=6j-|eww6Rdo`BT&Iz6P?Q#GE+=ahMV>XN^1 z|9p+ycn3o*=3QaUj(uF05pfFaj8M~FDHb1MV~>&6iGKYQ>OP7yLw^95z6g_7pfMPM=^_DO^%5RJAXc>xtP&-7CZvln*nfMv4njH!WK{n^ zpdXTh*&^cMccb0p5I#hVS>`Cl0Ev;@MKTnYO!Py9Y6KcXQ9d!67Lt@oe^GWCR#}{G z+d=d~Yq;}Ls-x?vnd2Qy=~nU)19M=ohAm1#&wCG(O(hF|)d%!NoqP5G87@~^rV=q` zmk>q@D-aA#k`n4D$kTvC*}9f>#!&2vvBG47Tf=hnis;tZ={vI!$>>*tQ6r_s1M=5P zKpcaZ1nNL+qi9Enp?GpGf61OKVVC8wi0#H+2u}iWI@TDok0id1xdc^5RdG5TxB`;@;Z{ayiqwf;aT2rBX-0HLfX0EUiQo+|_!$&t^4 z>V9c1k%UMt!?YCd>$4Gc`5CX{w_pqN8}>S$?X>ivGA5Q61M|>Xe;eoiNt^5W*}blA z2dKL6XAuOOdjl8`1P7`D##{q*SC4ExS>J5EOhRfAJx5b5@ael%jN?+k31?4J?EY|c z%O;yEHc`Z059ZU6jtobFsJ9q6;0t{iAVsX+GAIhG`F52}s6-eF==g=Fp73&Z9Of_mx+1F{J_EXp(Dm_#LAqA@w^qgr5ZW;g0-i@~ne+2?g*~iyZyfucsA;Uy6O2RlR*8$@G*`} zh(to~i8^>0e>x#C%!o-Bz-H(09IBLQkz%204u<1fvWeF%X!!)_ZkmM zCyYizCzo$wAtcJanbG6m#dVX(Bim1}I)6$kP4pV@STuIPEu8q7IG2(473<^+08dun z)06v?g$xLt9!ayh9a1i|I~`%+&)j2cNY}=QGz)ure+6~C)h+`5btgNqsLcX92sM;5 zukJB`v(M)e$K7f+mx4b09#%n-6Xa&|k2f+CMm1T{Z^5GqTNW>te*Hu0CV9{@MmbB) ztDg=p)#F_W1o7zproSS5wVbx}*V4AbQFOERO?Rz97LFf5GQ=VO~WgsGdRhIFX>Kj@OP$N=y3f2gz+#lS=XFG5;JbH40TNb}=ckfBws8x%=d%X8N@?ORv;Nk2ih5p`VS3O*iEY%=T(;7sctT*L5I^#qOW7OZFYaf8r4o z1mx^5o8^CJ<@x_)f5OK4|IE%lTUq@xL38|9FDvVkI0}gU9aAznhnf*8E6e;_8F$?x zWfT+;8d_C()hulH17j@sODA;u>EK@E^s{M#^j;vk1J7GVHR90uw9{?Loco4f*T(_- zd;3wAAhy-YfkB0FZoqvs8r2Iwe+I)PGqi?9^$apyggfY)7zVV05N9fTTD1GdfK9Q0 zs|wj#Pcckg4Qr%U25V;h<_Z*>o8|$l$XR=uVJqH5DN2 zNL5!^?Sk+dq#~NIxfI-HtMa2NxEvM<4u@&YstHMW?_D?g$TX`bE`w)tfAvP8B9}!p zDt$}i+sb#dnuzdmZ3`>;Z-Fw&E-h5%`^;=276rU0myo=e`j2wfWf>*yR|@1CmNcl=ss#v0z=S95U?7DKH*@mR6^3=)G3g6rP%XA3h9AK8v$4-ko$Pt=ZC z!6Xwd>>4I{$^nm+a5x-uf1NbeVIr+g4>RUTJV1bDh)7wj0xp5+Q0tw;7-A5Yy~7@_ z)yOfh56{orPKYfo+b%t}T5Q7qHk7I9kIwPG3`O@Z4Mpm|YbfT9hJVLbmB+39mR25k zS6ZfH=@aat`s%N%C0qcVLxzb$S(L0v7ut4du?Rnse0pYLDtW-|f1dr*tn~ua3p=aR z&84L{FTpI>laYD<=i;=QOtYBz_iBzMI03MYIQejMg8POd7o23qkRhyxXc9)BzypN*Kwop|n0 zvV#Q~L4?F*aMkR|f13j_;MN>PdJ%{yn^e!Tp+$t?7k~m}8Vxcv1iM+=wWcw1kLyc<{68qpX0Vbf3jJ;n$e{f|W60rTFE|6-e{5uBc zRa0n-I@WRT5w|@_D22gtw*%6Bm7w{;JpMe*D!l<(y8d%VZTjXV|1l42kLU?jj-!3z zDoXoE&@N+H#^zuV;q97Z2n5 zOyIdVdDAvpf6Hadx5SY6bDPPrP9le!<^%f;WE$yd9ud`#5LY!1(q_M18*?sa!wc4l zA+ll)V-`mtgOH&;;x~nzzmtP;Sn`9HXr1q(M#vt#Ap>qr3&>SWe-9~smq$z$lWwdr`lx+&yo9zd zf3yV+*|Z}?e#PC9zudq0ueO{1mpT8_)d`vDTUi;~nEvZ_(?2g^)6r_VQw|G(>&C09 zqauL|n}gD#i_^qnqQqqbjAdF{me!CT<-W@I5Kr|IY>2&wu1C1KBneUp3tCO5a5L{` zK65ZXe{bI}oP*#SP)36H8yH0lAa&(pvPc&t$A=9#Fp`#=n~#Yfhv1s1@TgpdXV0NU zc8wf&+ry1`Wu%$vNdZF2jGOV<+njYOLZSQ!41mGDtDxHZF ze-9$1wbaBf3haImJt<8uyJD9Ze5ir6md+}pNU*yo2j5A8@{m)tN|lE5Ntl_`{q!nj zgVD)npJI$8e|%!R^iy#THJFN~y2+dxin;d+vOExM2n`3)?6K15DfFN@F#$4b5G5|O zg&^rH-F)@o)a+%1;B#YX#xAb-EhZS;e{JeHSH?#&QZ0jM)aV^+@)ocs7+ic?gkHxg zD#~b#792{c0oxd@J~AYERzz*l;!OM06_YgQabIrbpoCQQR~&c%lh1OKII5EoQf8pM z-kPl6Bi?4c*2y+sQb@ixg)orNMex>6o13tRDF*3fd8^Y$DEKe~k6A20LA)CYfBDf5 z3cveaiyxGEeeNmbS|3MgmmIq%vzdFYe|@>F9&gx3)rDxV50al|4-@_IZBMzm?iM8C zSw2!J>RIfS1>u1u1C%8%X8sER*?F2gzd^zf<}mu{i}>0-Tnzh^knr{4EdJ~VmLX1; zZ*ET@V*`ElaqJY;nAP=2wiuWAe`2Swx&7k)PenJJU3QD%l!8)TEORvobvnRa=zg>E z$fC+ht1T#F-O4@ucn=XxSrw&$19OSqqc}5eVrchbqseE!x2`|a9@SHUHSoUzP3K=` z#eYW<;{T=dpG&C!mKg4GXJo095fixbH9;6wlCfA4*MiWHOv zBz4g;AG~qn4!MkLT1KtF9!cMz3CigG5Z*xE#ot8^$4ro*{gAm3?#Fr49ru2YtiH9i zgI4*wim1D>hM|=$7cHt2(_j`SKrR0s`dB~Kg>n+6n9G?YA(CDuIvC;U4}uExMl0Dt zA#BjFMk&*rO$c}d!tC02f4CAkOQnN{)3D{hufVYFbA2e^QN|K1)qiTAJd>l%w~Y5m z?GZu|CXF?xM!3QNy z4Xy1}aEQcBf148+RjJ2e@a`U55&qfrya~aBx-+>Y%+JV^ZpJm&DPp+a}!={5wu5wpp6|KO6{iVsbX6w#i$1b4?O z$}~_Oe_(pT%6xYnVqE2A+Alla%P#~yjm=Lpwn-WV0xpND&RLn(B;^wt2w}Qp_8T3{+WCsM z;eQJ|NKj*=Q<&y*BLSl(h;bw6xjX5hf;&Oejxdxf!#+1yy!Pp$Y6P}JapUTvNaDJ? z6EIB)=!o%`lU%X3l_0aMKL8UWoQ`1QUnV!mYv-fOJ|~!z0P6>5EzAf?KCe@k<6Mn7 ze`jFN$hEN+p?zS12THUY_bMnxz_1=r<`z1@0)%dG3ifZ23n(=E$svRIa#?>qM0$r0 z1uJM?2^$|0Z#KPl#f4tyA#B8iM)R;UE^nA;SMD6X0%*r)+(9M|Mp2`>zU9e>GS~6ctR~29hO`FW=+q)j`WYA!>f20$T=? zG|cv$v``8~qqd2&Zcet@IxA4@Wp7^(eGpK%0HvbfLY6ndHBGk{^#SttC|s_NDNffu zq?(wV|9oCMw?DgYPSbsRIr9Wz-x^^^H0bo{dJe1tzYnOwxu=@!hSC#I{MaKOe-kUD z3E%8T_&7eOuMQ8yy$hK9_S`*akcUm?0CS~3yZIGDHJQ5}H{Al20lW7D%pH)C;KS$e zp?f|~9?aga#Ru68`2EDOS7w+|oAwZL6da%A4UZGEjh~%H*c|pEAFRO)N;^l@$7}J% zoStf}KHulwpsZrDS&^GYSl8Dgf2|dG8AP#_h`>h1M36Pkks(TAV<|bpB+^xt8hCnl z(;2Z)a~U0a%(5}{$m-NU5ti&;YgmWJ)!G!&5X<4X%+}O-4zi-3(lD>p$0Y6 znknk7@aK@=YKO{Gj?R6j~PEBz^ zNJ729F)1V8t2o;lo+GXza^Qq@C$2O-3^sdC&TYT|F6RZ!UIoMS7Salai>R_Qk25Gy zjn_^ZCwmNBu@FJ=9aMw}e{TGsO95B^u1OzN&z~@NcWOu$e??Q8l43?vy2QpANcbI) z2!6UZ?lLYmndQf?Z3)NU$$ zmTq7AKDTCXM2E6pCi*p~wEFj)K%x1nUef(US!9wKSF#6hC|V5GLT#e?6*|*oJGNQpTzAkd8Z< zge=H0aeK^ozMA1RerawzGLfERJMYV>q8#gpSc!(WzcO(`jg^VJnQP0X^zh1|B54(S zt<0e8#CIkt+btWHAI;(p?l}g!^@-42!6^k0iK4^mEs*yIl!exhM#wR#Pao{>$CKd8 z!=%S{xN73Wf07^*1+gZNz?x5O>-~9( z_FZ&);d*n@6GE0B(^Igd%8*)BOsy+4?98Ib3lUE-dXRJ1R^zen416t#()BwN+PoUg****8t( zCaBtXGtVs_NlN=k zmz0`vfASs@N-d_pn)5{oylYUHB3fNyAX!inwd(ix2f{{f)}~k9+L!4Z^CQ%C{M?tz z>KmOGF#Iku9+s@qd(tl;Qx%-*Ea^Y}0_O!8^=Wohz}u-m-Q%5e_G?&^$^)o#d3OJ# zoS6*(P2v3mwq{SnX1@T^wPYnV1+EpqC#;|9e}pG8p-wGxz>7#rzNIR-^eE)?XqjxB zKQnEGV6nqN{lT%WB^StvV@3HTI-n z=k$z#_?;k`ycgmM9BnoGyV%7*62b!>4k`&f!>u<)!?*R|qJ`VwPIx}=MU7A%Z~0-Y zjvH6wAM*+M5$paMRN34T#{*w3>HoIvML4+S)id*jmwlcF{Mt(l@X&{&Vl_U&h3E>wk>F!!F>L2iBt^ zq4q(>UwtYB^Xp2UR78=8y#Q0-9JC)2cg-N!2OUMqL1!qKf3)Dz=iIm|FGp78N`Lpm=|wH%I+Fi znrGeiwYsZQhY7G}E#QbMw$bUJW1|!XW8-%6O8~laHfklbabu2+r$L8-R;Fc|XiIduHCw!V8f^zF z&`rk8c$3XI@T$zn^erWaO1Uo~(zIn5s*6GTXT?IXL>Jl!Am*D<@`7odCJr7`)Nu=y{7Zck=ce9=* zRole94W+euG&4(b^~T)2hw_XLUA%2&l6_WDB&#e^5;Io#Ro? zyhur)LULo9 zu)yv*{G2})kx@QIwYfyv5m*d6EXv?TiQR%GM$1!~$T%)X(}O@3xH35fE68@|@UriI zt+S6g(&ZA(8>hC#%6pA>Ln%8}GuGRs1E^+QhQ{o#J0RWS5=Fl70-NU}zO9B$iLe_N@ZmUdSGQ67BuI z6W9i*>a;jvk|2H{iOKXqw-wAg7CJiv?9y6R;A7sK*4N%) zO#VP6VkB9`+Nju69v1J9Js18T?{7ZHL9Mal1WoVaJLfwt)IBgl$ZS5h5_+wn$cTlu zr5Z|2RNo*sSawsD0Oz%$#Q=xEXsvE;ehzKK8jmjztP@W8+m9Z?;luIiCUGmb z7fxDEPLkygL&ewHZ^jDl_B0}l9C{C>p_a|vMC>;Puq9MUx(fl+L)QEu&pX*DgNk*i zC9U7Hya~hjdFLI_b}c+8kJ~V4~A8C;{6o+`S!JTGf_U7b|SA z0bv+k>>jHEXUbNb9Y*n3&4+dJI!}!fYBVAXBtXWzsSiNu#^ZeYM=5(h2NqJzAhW`m zxG82G4hT;SL3)u-^2Pd^%(Nh)e+(sO1a#Yy!kJ-%%bvYIUF>R18#U9oftRv2cPkHR z@MnVrjo1|ie)6GO`94v}-QJ=L*AJ8|h6NX(mnbAAve7Sd5(Jw9p_E%DA-uTr@F@y& zs92703lfK-MO}jeaB+=j&YU>TSTkIn={z%rW!~*8$)U*zl%?^=ftOLif393w3FK77wL*g8Ye$O$2 z+41!DmYlPY0^bD0^+LZp;8039me-F*)BR|hKPy0f5BXsCd8-p)LyV9tQY9M-TDdwX zWlin6wT63{fWN~V@&d$le;LZ|l!(o)EpQCo22mAHtNaI{R-ugj!yTIM9h6ixWx84* zL5Wp2+$cIy>V#AFt7G@p{9QC+uSst}f-r^`!%)-`{H#6Mu%>}xwTc1Vz9!%$#3i7u zSEheh^qj_V=jNd|X?U2INF_1l=~G&IhLWL6%^o%>X(5C*e_}?#b}VKnvIN;sgs1N3tkPK0kTFRs0}TTX>P{F{>K^!c3%5d` zKfU?`%K)&Wx(mw_OKopyJT4;2(P}^H#6!jT_RmBFuN&n_A}9!m*k5*&|1A^wqZs=) zOl0D>6CLP4s4q_hgAhUT>BDi;L$Kg6e4hYDNa_7+4;0Yy<=Y2Jvl|Jq+)IL@Rn zze0wjMY{Kcf4;91p^g~0ZjD2Q?ZqrbsBk8mfRg$iYR)XactUaKBwcbTFwt@Qk%cj^ zfebb`n@aKQ)HSLQ&KBx6-h1>;o7|!E_%!3)17VR=HLA6mj;3pxjLE$sv}?z@TD%%- zC1CxywA6MKzwKEfqx9pEdda53hp5W{J3FOwqT0Q>f6yh}dw0eG4k+ridHcczt_Uvj zHk(2jH`WF9OF-Dw_Rh8*ESfUuf>Faat(=*;6B0IIXwtZy;p?pL=W&U~A#=sSXdw|l zbVM8t8iBXSKWR5NAko{$s-zYcH|RYfT}_wj9!3_h>L2A?45yvX|4cW2r8bI=`(+=> z|F%@+e}85l!sd?F=8lekPPzQ6IQ!2_(^f6D%F$s^TM(^Nzv67GNCb3zDhpjSDv5$m zbT+_v%*BB%AAYAF{`pz`-Gl$tBuN-4pV~N7{^iqN#$8hQCVXzcwUQh1eKIG19 zpkgaoJh2GxtU)REM@?XR%}H@{;cSk6?ewtwXml}j8{JO3T0TC4!=q2)I#LN$n|P2S zeK8UKW3K&xWm=wl}z^r<9(fGkKX)r86&VfU!Tv@5(%lM!& zUUi;LQme0SE@C)!#O^#^S4?+yl784Xv*SDw)8nv*!GKD7s#Ibo&OjXV^N>`G+=5_z zmJ57&_`K03)Cn;sG@w`F(}Bj1B~`GGjI%T>;W3yz82;sQ;$8>c@J@Q=YoBPv^NA~Uhe`fV7d?Nm3_*DEiY+uC9$=Jro*ywK+SN}*dXUMG@ zt}4J__&WLIRZ)>Zp%drT6(9Yg5oJav;f{XW#MhGG^V-q#zC$6+jGN!4oh&;^bZA6w#e-uA`scT8< z^+LYKdh*^(SzSiTwB@>U$?xrC!<;^jJe9H;!LxxN`nd&aD1K3ZvKT8La8eA3pLBzl zkLJ-}uw0;R9K3hM4XAc5q{DnFDWGNZ-^;wnyygv~@>eMo6?5Q9zH(tCLy*qWuQ`H* zJHvX;Lq$Un}B$5f5=`nuV|fR+MB?ok~xtc%jJg$!WWW$H(hpgLK+3bwDuKGPnVy(`)l6M zkB`*f%y-b7HdJv@U<4<399r-sr2EkukhEdW^d#pCjbAIYO^iI~BcJVg^bQ;Xa~%z( zI4W#X()z$YXc>#sX%!sX&#Y_#>2sW!7=W0S8tsQjf1%Msp$recMKr7y)@bXS_?MIW zMEd*AO84lP-6<#NLPkp^P{8q6o6y3q)?yqJ50Re}&SF&x&^cHI-E%Q7@0^nK+jgE* z&dgdO5mQUm?s?LST~znskFzCSVvIkM-mS?6SK=7frTBL&qTIZ?JcTe zV~o9}f8Eq}Q8VZ%C)YfIlF`Omr$)#13`M52J{uve9a6Z%!z(|k@)g-5HGnQ^ZscUb zOc2G1;kPh_rxJsTGuh$=6!ycwU2fw`^`xBV32TonwDo-|y6i0d6NI$*i}X;=(b9v@ zwzvo?G#fFYA{w%}YJDO%#p>M*J$aYhCy3w z1Rm#kkW7v+NKU|ov(luAB->n3u)72we`rh~cQE#2hhNFy18cb)`Jx;W$(Q`d*EWWT z7IvWL6qNjF~KDqaQcp3W>nZA7KJ)QUkSjqobVJGAKdy4sAr({b1F(oVg zq|=FG{aLkFYc^S+xY{IJB8=n+fhqn^=flJ_q}4xa3xO3TgpBVSf-%obMIZ|{fAr-< z3bX0B>$q!s%H!qru`7scRq|(SwV7Z47@3XHq<;#FN6d_lPMTkc28ttq%r#JX7ww~} zi8!wdj~K81!O$){W_V5qE#^n70TfFGN2x*Q_FYAz!Mo$twT$ zDN8XJ{XkhmH3)5>pe7HLcDtOce^LOUZSZ7l&LMTR#yu~o_kw0by!y10>I!reCKFt? zh2R;dvxOah(!1%YHPU=O3WY9E6%amx`f3vAxl+Dl!NL)!+PKxro#fLd?OX0mnwX0R z>~Mij7ii22tXq|xOOUcXCX$al4;Qf5OblAM1QM zJCzgRg24L@Jiny*!C`2?2MgPPX(Br))>H6f@H>4N#OYc;M^DYWGXVfWR@;IS$_npL zAm~;*aik467Za|3iF!XYsY_d~Ixm&hH@xgoXTZG5yW4UAOLUuaQXJ^%5|W*i8KBD4 z%i^8L@=5{>P>pLveRLu>e|k1Iof*FzL47wo|d>AGfI zd0@I9cj8B|(Tz z<^AT~o0oO<05U+$zYQ9BgGVLBN(Il7c)P?L*}zX0E8_?sfHA1ko1eU^J%7ri@8p=y z)z3JUa?aGZG8lw9m!TLqL@(|_oyOTuik4efSSjwBZnLZV_(wrY!&M*Rcgqj*e=HwU zGIsj^&hPx|rr(S_=GXB9RaIDrxGmGf$PlS8$mq=l zu`t5e9ANapYSnpdv?j{5Zi}r7V>CODCMWmd_AEk_DpU=SaZMH*{_F+&C_}Rq5>kk1 z@K8BC{ke@{&2eIcS_*Hu+@f}Pl~Ut&k6Bu0%ZQ=YwxZ11s(<`sk8Qqzjr|HRlfN;>hWYrFqDq`fjD^kxhf!+^$>((O1Gp6$1vC>C>O|A?R_|_J!uspZmhyMuJ<8 zVnqCCev+Lb!ko*Q$qDhS?A(UV>09Js&SD9FAk@(;&mb_%dLaxx&qsV$4ZSk=ZSH6h z2h*zGCGyV4tbhA1!+*{WMQA6#YQ+h!-wgjDGI8Nj$?VZ;4|a=OJY8TS^ZPALii-mT zgbZ?P5EQDtEgUWqc`<#1U78=9S`Wi&wmrCOuJAyvu%V`7DlwdS{}JiW9mEK7+*Zg9L?0+vGivCNB4gWhs|GL?u{Ewp( z1+`x^hwDNq9InCgKT$iNAq6VR$oK|;g**uWT_~iM*T&9hV%~TBu>*xs*1aypuqLe7 z(QtwT7V{j((|Olj$GuEVecqm)@H$yC2d4ZkG4b^T{qe<6@cR)5@~-eHZ6)1jEK;Tz zO7$bNdwppMZ~2 z*EB0GIwD7td0d$~nrtB5upaB6xa6(RAa{SK?MUm1M{F zYMf}z)HteeecT{eTTMJH<9q3V-{~k1V1IrJf|Y+KGs6(%ewA=pmwQspHDwXjY%wp4 zGd3bVRH};lx(uh8`?U&-x0cKTx=~`*No^`@1=NiQB#58zCL1)3#~*H?+WWw^*X8ZN zef`@hCnQck$VW;keT2hg!XG{BlQ+%89-($$X+gV_cAY$gIuczx%`1NABLr>0fMZ z|IfuICw&_ueTTo*FHrnn{Q{b>D}Q7WB;n7?Ib~2pe7X6UmQ*3d(TIEpzxxF%YbQN} z9n->HW?SU^kGbKd^$Fi&%)(oixS37Qe|nBDJ>RYjOn{)<^?VB{rlG?Y*V7ErX7`Am zSX~kD!lKX<-A;09Oz*QoPZZGo?xn?bJd9w~P^U@<9V`acHey2!WlXJ|B!8PXeTs|- zhPC9Bt2#(yVq&vG%iT&HJ-WL9p*Ujm1sb<3_u}Mv9kjH_BpXDbqoGiRuhkf@xg?tiEb4XpN2p*U&~f zfLC_wAm&M+Hm??)i+D-((6gi^?$~B}7Hp3t1KJ7dJ<)p}-*BR+G1?k{_-oK4Hv&aa z7Fb&Y6nx*0k^~NQM_#o}tE{Yw<-Punt`mG==ud;Y(mOg z@eaNs^XoQ8ZLj<$-hZ^vVC&1b3SOs%>Yc3hvo1HsPRp1a0mhF{?g-KApZY0HWBvAq z%tJI>gVBfXpdTyZPRSlE@OrE(@bEsaXY^s#MGTaHk6)&AK1MRKn=31FDy(HA%jzwIj9) z>Q_3#C6F{=t69Hhos6Xvlu5a@p^{mAv~mc^lt9k>0))+A!N`v@x~Ug({$yDtT|SQ2 zjd13-5AR{yZfC~XM%ji!DVsleO(z`BnkINB0z2MbPhCOSH$@o(=b+~8=tB`M^ugl> z!wPRH_yj*E<9{H98#0H|dg1nvFRIFi=LFzg+OUUW@~K>;Fz`hwZg@lJQar>Go;eIm zj(s_66zy3as${Bi23BkLIPk7rxj5Gh1x-CMd=z1C+8(On36!8N^lY8Ci^QCUXwaC! zv!2-0c8pkVH$8?g|9)6+eI#}xziZRSXjQq{s9BGbZhsOyWF;bZpGwy=z2sQ;J>Fd1 z#Gui!02g_uFo%Q~tB0x87?|C=N+-mzP~-r-^wYl_Gie*mh}B^mV%9KI4*s0sMzZ1x zZ1eVKtA6T$m~A>fVm-5{pwSso<=KuN!DiE}EQ&Xa@Dw@2#YU5SwJ|u8Ub*u9nyQ_v zvrt~Ls(%ub94ih~-qPT-?%5+d)zIR+dXRLaryZ0ZruE-Usk_-QdsS^oZkC#rMuoo- z`oip7S|EV|(dv~tOxz-~Z^FRA%>OV&HzR2{OPv6T(@cx;saoFIl3%&;GzOpzp^L-{ zOjsG0$T@3h9I5xr(w=?2tUoRWIm^7X@zMC~H{IAc4{QSkxGx0ij#^@Nu2$Q%iVlsG6OQ2*fo^2^G@@l};Z7nr9K^qMH7O zK-UK}vLlkpPEP77Wfr|sH@M2u2YC3N)6e(WTX5RSG2L1KYI?fS{i3`$63Z2c%|n60 zOn;l&8CL-NM?|(YPVI(o*Y2|+dKuA z$Oq_T)B#veu@1Y;hbrTFpE={g%_8M#pfmeNjLcb>W5^$w7pnm+g4@APC2mTQOdx9Z zGB0TYV2*rlU64TpL^nzx+%ti2u2mAFkku$Y2(Or(ItTu6VX)tF!0!-JgUoc~#((+y zC!xCy@ZTVa$>s44YK?`zim(Kb2U|bb&Y^_ozX?BZq0e zbBBPAwwe=eAalfxZEHBRPr7@J41WWuA>mw&e8k`Zd6=2&6@YKodaht%*MOi7ow+Nl zd%^Vc_yazyANjN2IysYP*X1X-5_&fg(cOP6(=gmWexms0s?1^kugy*U|J>Ezn=4e- z`n^B%Rxg928CLt9A}9F1{!>hvcBq+_kti*n`bJlSbxXWinvuidAiaIRnt!ghJS6?L z|DPS2SfDJlGb&3)y4F4S^C>6!^Y(tjImq6{r$|hj0R{-tNbcmwYy{?tWaqwgoU|l+ zwSF+6Y2<=ooR#icz9!sFw(finH=>-W2(|dxk?M+@Mmj4J928O>jgc)_{A?NqAgNIEQG5J!ynkxt0mL1ypXwC> z&E(MzGE?teWLO)>CJgT`enjjC!~w?@glU7eHc@;^syZKmQ!v+Op|Wfz%& z%Zy|f1Z2b_GxEsX^*@nK+KahUPrYF*8wKwb!|5=gF%SnR8At|Uv$J$8T1^YRcn=Qw zG=&@muV~z1%tg6kU%~FWwAiGXjvx#<#F(aZzFlM5+cGVi&3{75J?b423!Z;i+@vd; z?b7MZ|HPIrwhmF1%UgxqZ?`lc`?MI1D*XSj_D<26c1^c%(6MdXNyoNr+qTuQZQD*d zwr$(CI_YqC_w$c`?~||JXTM{gUH7=pR@JPkS!=GUXjcM3oCCHbiUWe}cr-%oF&Qu6 zXCz`>Q7@dyD}TWk=${YgtS94NU3+;5H~qjt@;CiTH5+S(^`XCxVkzxqD4l73_r=6` zp&^POOTB4GXO!q87k?2e2{ou)d*|j%I)#Y-(hJPp zyPCaY2A_Ebk$s~g{qg7haZc)*)z+`7K>e>Xa{e2b34iE2IT<^+^IO|G+x*8~<+{y0 zA3S#ko4ujd+IM(z5DC9IVj6}+S`-43PBDJJ6s;}RQ5I$gtMT^g5#C#X(1-zGydF`4 zAsJ+e^zib&xoTI_qls+xhS&S$Cp-Y${X9RWD&CVp~@yf`cA*p|yqkS3sYlHCa}qK#zLm4d!0D zY4_5rHfZ0HUNj5O>{y3TLowF~irRC;{vawShP588)lJZk0bAn74M%_(|m*1D2)EQ<8;e3V_Y+h>TDK`XbIsiJz#Lu0)l zBeMpzT&-w1skk}5hxsHGP>^&BgGtOum1~+Cv-(roqwvGGh&9eWLHklQL!E~wY+#3x+Z_T$~XB9 zF>m2JsPDWJQ7a8n#=0>L2f=X#)Uy_8T+pn0nb54}l{-ri>^y=Qg~l>ThRo4z?|35^jQL+t4t25;ym6#Cn-bJSLdno`d=Sj1vECcQ0AJoN;IhHYfYg$-Is4s zTo-7Yf#b{od(mGkv?$FNu?z}ML4Tw3?fi-HG^2~M=?55BwLxjFmp}%SsYN@W(>(=L zp0lO1d*d|=3^FC=S}zwC{0Pk92$a-E1S>>NRllzKnp8t|lhVkx&atldxTJTiTRD{AI)AH}hzW@W zuTH45bB`mjJX+h}Qq*Bw)Pw-fK52jjGqz^-$iG*yGVfB%4KCk)D@MCJ#pS&v1e`Nw zjb*O04g$vE^`>{M`ANV^|BWBm`(&BHc837fi5gR_uRaz#^oY-=0!#p*Mf}UE7Pk*c}>u^k@NaBn}`-V^|N0BiYH@;NEY2nSmJi^AMIF;tB zR2JYiLX)VcD7m;{1=>b#BV3w5)3=Q8ofK=W=tE|Po;`X(B|0w&9!6v%q6Tx0p)wVr z3Bv1Hub|28Zy4RJaIlKuBGA=CdjwN zp%!M*elNDmlGq51XT&7vr`fQXXQbeu&KdC*x$s8o-ggvt@@PjA-hBU4HH91+ruzOu zg4$mj9pe8D5}X|zjDKyM1oR#Ct^TDL=)$Fl8f{#dPq-uZcMnk+-Ve2~@U9;f@%?ZH z_Rkmzs5r74bt$P1p_%7?u$#O{(`L)6A|ZhdBh%xF%S1swSf1lO3%$$q{TjwrqVADLCr;g-17+ae^Bw_mf(x zE>{K2qIK3>X@6`K2{D^1zw#D}3$ww}L5LO*YfaB8IL~rbUCGDR#oIad@ytLCaHpWZ zlUd8NfoL{s&AWVuN1rR4kO;yW#IM2*sKhEWE$i{%SLx}e&t|*)BH1jICXri(+h(x1 zu6biwaG?SdtVqP^S75fJgBExgpC0Wm9BjkehLry(*MB5!bZ%|;QH6cTzc%PlY>GC} zc4axcU0967Qxwjlr7#U4;!X4F$c^SQ=Ko)$Hbuqaqpde6i{~0@CR$Q}z5|{#@sb zKmYdv;0L?}6n?Z$Vh8#XmfRWv&jl2w9|_E|;78j+qjY+s(L_Q#pk2Vdm&kc_D2Vnj zb5d0vdta-cS>dY<$c@r+Yr4t21;#@#c`z#<7k~7NFn?eMW7VN;k6mNd0!!B-9(oWB zM2D<|E`(y23yN5bWV8q;$9O@okJz|L@dPJgpKEXgdj*;~T%eC-;A+u#6aG+T-U|d{ z7#WxiLm1m}u@livBID}MiJF0Jl(8ce^xu*v?hkFGH(>vXF*~HtxC}zGEWwOgs171( zv41o23TkJnc(d7Kx%WrH$@x9v926J;Am^_webN6OjsLNoUzG5t*BHEQ-b}ragbI(` zfv=N`Y$RMA&ftfVV8I;x3ydt^1=SliH!p%leD4A8%;@d)dxCsprX{ zPx~%#0}R-l%a6v2X>@`nz5SoNgp+pb6^W2CE9J70lXhkvFe2;mSXxT(+yqX#R)5)` zwXWhUv)Zc%V@~rZymH>2IoM$ZbXf(ai6R!OvQlp8unyV@{KIdeCom~$P)t54HPCz} z88>@wy|@99F#63|TD4<7l!6Eh*M_1IjBP0*oY0S;OtW^&CrEp1a)WyN6OR|YlEFp;F!7knEH==;Ue_kH!w4*HItK2IS8}PP@Azl zDp;Wvi+L+~4xv@zl0FAtJ|u)G z(Jt3eY5pKR?S6R2Jvtdy-3^fN&x|{av>2MKE~8Id74y1Z`6~g3W76wHkIbVMvU*>n zZ;H%H;*^+deMBiDb3l5G_6=@*E7>~zrzBSN`yT9fEl080MBS_){|h&HLt_bdGS2WU#!FYiR zw&B!r{n2t1zNLaoAAfALIHT2Wz@}9&l7GCzvJ50zGe1`cqpX@G9h@!Y5<{Rtf99`W zTX?otwq6NY(N}@#u0T>CGRQ8E&uJ%;1-xiNo@mwFOJlr^C{VXJYnfg|n;@uC*BLMJlTyyA-A)$Y!jMQ_eirkv{stXn(G~!Ys**(_fzifL=&} z{)_#e`zRWpEsB1fFp(KEFE5@cH74;r2<>R^zM2#$Z-Nd+YQ^rCf4^L2*5~+6sM*I& zS$!5{3X(GhwT4oUGix==i%#2i9F_>rE?$Kk`PIH+= zaRSvIX6q6xzXcrQT@M|f%Afybw*2j0EO)*uS`peh^?$&<9(gX(>H0yn7S3k{B%WbA zZ2(=o6@?Fk*8LNtC6WrzjTS(Zm++1!P})_m!1{u%I=HT%*K;el)=;}vUP`V30q-?@ zMM#WJYTAo`I)f>Hh;@KR5OVc4HtTs^FC5YT1R5a^;$=$Fq2|Pl%3f}PQ+pVO&|$u$ zhhF>+wSU;3)FgnEaMlhg0f$Ct?b0;XdYT(?;vK2bmEeYNxmDH`WVnB)w|Xb7dPfMI zYXODpTy*oFR@w>DNx;Z2G&%egP5%u&5;1qMcGY(K;!bd;oa;a)$P^ zCe!!mxqm!}!9H!Zwsx(O%#Leb0Jr%j*Ps&5WDY^~NqkwPkxd=Y{9dbP0;efiN=+_@`@Q-BG_Fi_08Qct) zZhxUQ?f8}Qgdqfb9eVmqNM~?rH(g!&}7e*jYAI^Qh{rK63ZBu2FMLWY}BpqO?FL&*v43E zMx$(*pwrN@q9c+t)09>luFd7H0;73V&A3 zK7iO(GArhLH&;q1*=wW3PUBK&bc~Jp1BFSBZ>qVt+17Rl7yP!;**!qsO51D>(Wg} z*d+L5V*DJN^4snZR%j|u+Txl_mCT;HZ$Dh`;_?EO;2K&-ry@<#>D)BRxP~%jeX)*9 z-#Jzice-12m!BU*TekTDf7QIj7m$~d*NDB=m7JJ&uM0GTZgkJKi4on<_kY0^-Egnu zAEarqodQ$|TtqoqKT$49N-wnQ4dorMuj80OL0ZD|-njcYbqvZBqZ;E9tBgdK#z$ha+IN=`X5kbDD(bIQR}xXfZR6SFI=R2z-Sazn#X&_4|e zi;kxwLMk6gz6wbcZzPrJ0o9G4Co?y*)z^k9Q*NgMWox#}fRa7em!ZK{)aOp)B?%Q% zVaE^UTNpG?$yE`=JCqEXE!W6e64cySo7Z=*@r*>nRn`}w@!W(uReydHkNUw>{&Hda zJ8~QcHMZ6KDqxTQx(wsL$;1Cv%vF^5r!^S-DV>#`8rVcph&+~eI71A>FjD|7V4)bx z2dK<83F4Yzlz~ptbl6DsBBKScM@;JmkPSgF6pbRV7S5tp?`q1ueR1(t@P2!~?g~J) zGLyUK0u(V~F+xzI4}TH#WyoGsSUzZqo+8NdPDZ+A?t9f{$vX4}hG4ms=G=a=>OPL{ zz^o^Fz|phz@J-9HWN=jYgXYHKlNN!KdDB{Uzcys4yYW0Hai&2>V zTb_B^7Ey4WRrOGA;$^X3YH4b++pg<*U)7yQh{_yFJO8P@M1TB+nf&b*iGXHq=D0l)ZPKsxe8i&d{ch85T1Z-P~^RJ3C&{nS3coOA!>rJV=zw5 z#KJf9c7RnKfgG{MH1reoIb|H`68IVToTF&D+wD%dB!Esfe;>8?rJ4J9>e|X zU59;XB7YtN9m>} zkp{-;Uq~(MUq4<}R`QNcZ*Thor1p;^D@~BqeSaH7PQGCaGvSJxt&dbGbf=swXPPc_ zuhx_9(R2SE$X$YHOEpKAjaTA5Rrtvl%}Rc2lmxhVab6OENEF zw0}h{MUc6ayP^}>MB3CJIn1&MTVJcA2|PL}LR#Kqajv!>r@Y4mLD^;NAjXbrbE$}K zqH<#x*RHEk9gy+1O(Rf7yvnYXeFVztOvQaat`puxw%T-%UZ3@v;UzUxq14*K+g!qh z5oG<^jzQ-snC1%GFZ5DRrPf9=#sp;Dd4ClCcy?Q#8ReiPi%xra0VKM4u!RzM81EGg zWWk?zrQ=B{&seDFf0xy!WDnV(K%?Gp3Xz=H-en?g%jLYP;Q3t}9;+=ekJl(u(e@{W zsy#3;WId(BirkIBAStP`Q@-RNYLl|lc&TW*j`>UBsVJJ@5ij{zt<$065;YZ_Du1R~ z%7reKV?iM^=m@=M6q)}~TXT1lFJDaW8*@%+9M#xl?iy1_08M|E`pB`ER@#`f?4|QY zUW#Uss&X%Y#tfv#Jb6TJ)<A=2G{0#(1UdSLt{uV~$?8ow>k3Y|&4<#7U0Dk2i&Hv}O zQmXn64*E7u?!R&9@SocGzon4q+=@-wZR&ykDhPBtQB8WPd(6G5i9q7ww?$~#C6{tb zR<5j!?Pi||a26fJJkP*y@_$3N&C-JkgakHUQ?4Dl*d4pFa=N=d0dBrvfhx3Q3~_I; z-T+jX6UWWREz9erDhjM^m_wFXOrr3TpGp->*H>qf%(h2EIj&FFs&_s(yZ(0dY|OL|bZS-dyx z_|tdk5_~ba3C~SIU2vyXYW4iFWj*X#*-&gqEckIlo!NUG4R&*F?F`I-ifbeCU`7)- zU{{K^#Lnqss=et3__8kO$0HQnpgetKcZ8p2p=;Y+_J6A9?%6&}I+O#JMuV zEi@l?e1M2LgPx(k_MNxT)Xo0tE6H|^NH&5KLB1LL#-&DqCnHxE-}#Ac<)Y*x=;Qe* zh-SCP6fHxl!i`M99w^pyIj35lYf`>ye2?=^DQmuRvuRYXUS ztsdU~0`z3r3VW1$`XoOPsvWzBPmBKrycV{9qpX-0dcTQ`UL(Q}%IYXXM$geF!n(#dv$;PuW$V)m;6&Z$^HKQFIE*+ zsaU%r38Qz;+cZqNyy_qf1bhQBFM|mOZvvNA(1D}~DpUe&w23FsULiieDwg|%*L}ms zCNDj9d%obknRe@FSWO@`M}|DeoS5Lb-#C7py7+jUzJK-wdIrh>{jukO9nq4%U+$-4 zwC{!|Y2hplGj7phvjgg2L4-F9t^&O=a0bxT+st8u@hc+XxGwx~1#RwLz76oRuRML8 z?eVl|azg$h;&r;3+(5~_U9D_OOA8)K1r(5`u?SabQES2Oyc#kjYZow=dsUL9ari4r7s>Ghr>* z;2_B1$h5pCpl7anggL`pu9np3U%x|kzkX!K?Xpz8*30gY=Ex9bIu*Ytxdd%`s zg5QHmr8m!rT9c}t7PX@PSgaJ}yooN>*H{YW^nX=Fy$NiL_^s9C^)lH6$)_M|b zM7$KMQqmz5T*RDm)txgk$cuoo-|2uQmOKesAokQ&150J0q4N0XAn3f6q`FO8>baZ) zwtsq4rc&LAM;ZpQRpY#xuXhq>jO*Y8gja|@Di}k5Oc=zQc|8?1RN41M5Eri<%=BuBx&p( zQPL#_+rA+Pq$m1<{VoVF6eKYF5g`<2oPX-DoSoAf=`W@Ck=Cw^`)WLcSZ?@sk2p)c z1NvT8d&pfzFgk* zY>t+zOB~8b{1k27PR+uEoikrHJz{lh+yPSxI}BiI##>4tXW?_aGZGeBHs&&RC4a^7 z2N~a*$QZ|Xv$UtQCM%x!)Yd)pIK{Up9IY#(6lPcxUyX4yAW-;*yV~N{tZonuW`IPI zXv)WfJnPXXq_2=~-&K>~Fe8;=(#4#VF|4!+wFQh8{ePKwK+X0f%^l)~U5>Ml4iy9}X2*mDnL3d8g5F~< zCAyOaUdhcrU4ygYO`}#7_Rci$U0+lc?rqMGdj_O}VF77DVFjBv(1Y#zCva!;OSa%R zZjMKI7tKJlE&q13QK*OBoINSmSYpy5H;j=Hb2PtK@bu}a(TU)Vpp+t-_GuBoQ{DRR6iZV9dtorjDq6@f=F_4GyN_2yT#Uh zs>`rFW&`$O=8>qnE&4fh1iJ0Kelt3TF`?2bd)b05 zjJ3(YikiMRTG5|n%0%6(wSPICyyvOyh5MCD$v4YvXpP1k7LqYbtBH&>(x>Ju4_rq? z2h>Gl&Q=z@=L_ORyUBaQ>Aiyj(UdV|qzp|MqiZgp40B0w=0{yfR!#~Il~itkXl>s_ zIeU?`d(i}|BtQQ&fKl2`g{yvr&%wW{zgYhgLY*Y%sL|Gv8BhYBPkNg%F>DW)kVkw>$Be&GD|(#XW^zS#Oq00c!? z7=fQ3gdcg`m{y22`^T^85+*wIX>Ear9i(Xy5Kf8nC?6^ zDnwAIi;zk;Y1a}HH!evO@vxCJ7==X6NOUcwbIOz)6?TqrAAq9sIsduqxV=qmb_&#OJc z^ro+)YR9#fbZcPO5}H5X_LjE12+Y~*qN1&b@5&BxGa52GE(a?8Ia8a0A)MjQP|Sj| zrZvSqXAwV;qfe-eHWp$x6ISELN>~anqoqjCHEhCPsDCD|8ovU|urR|n45b*p2Wd?a zBy1@Sk%aW1GQ^Q)r8K{C*WpAP!X$9Sj+!8Dm{Xr|8np)0O)1rr?XQWi6POzlaxyJ6 zB+_z5jO;0q9@5I+Ff-T4-?$os1yU8QP(cY|S(!EpKOz%$t_CLQ7_w9JN=Ep&(hG+{ zeZujQpMQw2U*?m3UreB#J(yD%ZyaeYQ}4qfOi4_Vu`a1Cl19RET6&o}8bux{a&Sp6 zb_2YiwklNHHt|e-1LI<7JEmGK#8|9f$`WVmXJ0OsY1`>^Aw7kiQ{{e8ZVNQS3co;x z6?Itr))~XDnO-c#QMXxR_~ZPAJJk-6B!YQ(O@HH|IVR!(KroZMkS2Y5ak)rNbx4&{ zh0>a{5QEaez)tPU)tEs&20K;Vs>^UkQ38(TY$GG>CX1OSFzzYp`Y2-x1j!H(o>*bk z1@vE(VP6;tlKBUaM@L^;uqAI)j4@3x7$X7K33t*CQfFZQjXGe8x^E z9}mTQqa;kqq)=oks=z}`txT~LNR{hp)Xcz6YLX;$Zu*(~pd!BryE?xpG0bQD>g5|( z;Ljdjlp~p09{rn2zlK@M9d<6;9bGq--G7088BXBOAt+E#z7t-z*&a!^)gIs5a6eVy z9?J(p9fdJD6o&(?2lFvg@@`18@;SM5$U7Mhe12q^bRoEP`+Av+j)@~F7fTT(3iDZ- zbAvgkV8~rk!BfIIiLz1kBxwVFY$KGi3KUGz@a$0c4>`)amt$*se6M9>Nkb`NWq-p` zjY>u(wM7id{4_-2i`x7K{&55%f*@RTREu5yrNUSP*pz0Dw(eL zlkj&46uWpt{u~YAntBtn#@0z6I}VMBFz3~3>qiljwUS~N456{hv^l#v$D4|b2$Mc^ z5;bs4`|J=@a5HZ)xVYtT`gWj?&CBB$zrPP=l4M(w?X)JNaT*=S1-TD5`F|lAZf!AU zdHI9=>uRSKb%l@m?S$Sw!>D+T=jc#d2gRuxd)E-NOI;a4M4L*3^HRo=>)5ns{F^lQ zT{ws%Nb>^fmlhgHWi5`Fr`52_&ds|wR5KK@uO2mw@;%r=50cN}r zKY_lhGmW}6gCH!DTM`hUpMSjzBA}agD`bg>x4q{G+TmRO_3FsF4Zgax-a!w26)Vw; ziVeW)E@Rs@HDt$y-=Q4Sf3UY&^pm2#3^)!n_1bN+w4`L z5`J6>$Rd7E#>uMQoae5O(AZ~8@)B}iEiEXJ?4?6o&(1PUgJibK*c+dsI^+g-+L)+g zgR;M-hQ$YI3KuM=FqU`83?O_+8M=FfEW6)z^w=&#nLy2A%X6o~<_vURk|_SM8tV)6 zO}B5psECjWhpHA4vI1On2YVuRDMYS2q-MxH)3T*I*!Q?5WNaU(`X1r&$IoborPg7V zn0=A~gUqB6GmN0Nbxs$GVF_D%4(e!;TL2b(z~}e5B!nl)41YC)uiXO!*Pirl%Ya-m zt05uXBLO$~3c?zV(Z}U2E`sCWlzV2WF_xvh$-X0ek>paKGC4;ak46-fo80c0BUrwpE{;EUki-_8m_PxSn7{lcR~ouC=WZ)zG7u=ygLy8H zlH%0?8ey)q*TrF)P>dV<06eI45`dPd7-_1Xg!N_Bm4E0I^Yq$M)66wByG(Nq5&opK zmWSS7Y-5|SNpuhJYOz_>qo4^1M&24N|EZu32u@#v%M27x_|Zm67i&>O{|ZIqk|3H< zW>#|`Caz_7Qgom~lbBj`$Wo(^Kh2UzH0_H?Q;6&SNu$Xlxyj&pe$uXbbFK@kNezk} z^6-VV_kWkFDo*ka-tF*s>Nz*Dumi3Gz(WQNgx>C~oxVF+zfV zfK!hqQG6x?Xe&Xe4MV0&uSWc_FK#f)XiK||&8Z08tRVsGF5g+jIyBb{W`oTZ=8LSW zz7?c4Kfw-6q_fP&DpfMTB&g2~ZG?(WXfW18-GAH0@7Fc@N9_f68f=Hb@gMsPRJOxG zO^6lv;Gs%vr89dHTb@goleeNUoQvAUW5glfyHmJurn6TYluqm4ObOFit{YiTn;1_U zTTdHm=S1JT18eo5h^IMAe2kBm zvJ*Y~HiH!r#3we_4a8B@6{h7yzsSyuvTme_9S_ zJBUIZws^)=!zQ3sB6ABVISh(Y5aXdPm9e1pQj4}|w=nC5m4|7iI)CFL(Ac7|xP#LI zsjpSwDe2HsB(y1JG~=tJI&;d&9- zt0W=lhC52t?{$@H>t4HOOWf3-ifbZv7C-AP3vK!FKu;<(UW)y6(!_m3XVisVid0E@ z9Hg2)v$ipAL1X*?(@VLvh}^;JXl5qmWc1k?1<^0rrr{@L~6e4C%1C zQM|Jivm-n7(e|GB)}w?iMeCk%nQl~|Lfk5ZW!mv1z1Vc^v~T9eTL_*pj5}m*qQBxI zbTmY=f^R7gS$@&g7&3+2(jF>-=&FpAMSGk0szdR7XTKrn8Gf>voiTtUd4J+uyXPM% z5co8}@J6F&#qksSVb{&W7?$X3N}QE}3iCe8cRe!88~yLQ5L;xBc#j<~b)SC*=0qS^ zdLlss0Jx$5jfimk8zLg8Aoy>&h|)iL_;u1cOK6xBWQD6`QW`x8$#2P;S;%7IuQNc1 zH+;>fEDVL>2W(=(Vq)MBVSlPVU);dKiFv-o2xM*w;S*5OMt3lBaypt!U9jnPd%pnb zAwt1g8DSI0HPWBu;u!*OWG<{xbY?c~n7fO-Mp|B0E|Gp`Io-i_(BQP)_2=7Dkb}#o z0(wuo(Dqa7sw@8jD#@=+^L<%W$xX9*!E9CDBGLG=8XCCs8pBYY*?$b;K%&Y;ICx8= zG;tY{a4PhMup4Z^^%8fYL}J<^bumYP|I9 zCx4MzjFNEByd&J(g~{_|Zka{p!aXbDVe>LLMh)wkaUaY(ZdBlS)Z?Q8Ki@>$gJC1V z%u^3piZX^cplC#VxqoUtrFQa(?zwekk`1DtZ`rWA#rOXDHrx}R%b(I%GUpuHR>QDp zXbdFucPTp@CToKv*iQBss#;ng_fem>ls+^)gUk~xH*v1=J(UsXExUW9;iyMi8v^3} z(@;_$(WRqDrt@0DR9qgQnsoKc38Gn~zNc(Jqj2#XhR(Yqe zbT(Y7=_E4K{J^P(AwBL}MU^$_r;olOQkjbgbrYH53(#1`Dh)F@k-O4I6ALCt4XVO~ ziqx2zE=XI4b_E#B9UTZsaxCmbwB2zI?W9D5IuEJHjSr*jE~$8VFz*liCs@aA37jzs zazmoLd>xF#?SCz#k+UM<73iz*8{-vH|)ZgE33i+zw4RV{uTWG|Fw7u#`ey}j!ypr_>y8f zW%}ungMVT&nDX*w=KM?nh(q}{`NZJEDCm(FHl^vpu(zj&?_P(`vA$7|0%AvcMS5F7xRI4B{ZQ&zUCn}Ok#8jSldqI$D~|v<#cCZ{ zO&d@qyl-77pUpa5lfv*bw>ncgyHP<35-CdSOn+I6g*CQr(BiqHEgy?VtSEO7fn&z- zq=qjvDkvv6YPH&*UTv$k$eIbVu-X0q!Pyv1!tN8+-8uP8dz715AX4lj z@OU$xJmY6N)#6qmaP95vegeAPzG(&fB*m^fPXUq`~R&89PMmv9RJ4v7+d$-2EsKNOn!1^r+st) zh(e)X{bKPE74^tV+cS6&3kIq$3K2gC`T_@fz;5KhIgR+}@ppGSU2C>)liogVUqJQz z?Z3eF!xzA>L-(e|=JS}|xICFa`{bhz(0@w>6=oEtCv@%K&vEQ48Fysb(_~&rb<+mw zvx!S5IO1$u=C6cyl%{B5%`w=XJOl8&Ko5V48K=HUOD8~4DUeluoxtPAII!ILhQ=YNdQ z$*1W6^UDC^e>K9_e`5q8eJB0Dr=KK+Q5hh9cyI0r!hQ0V-7dT@OfphjVGIaSWDohb zdu4v0L$$`JNS~ttq_kmRyge~rRp5vSXG?!mu2jb>Jd`(UY^Uh}n(8bB`YXfOCx-J3 zdVBKyNI)AWyr*)t4lo|HOHQ9Xq3fKEG6le@>h;8sGmF_EFok!sZw<1z3W8L^mZw|K z#W)?xeI{?wS)g>}4y(28gKD`;H15|o9s@1!dukScGUo}Nxlwb)s0v5-RziN}E}DPc zn6O((aeR;MtBw08Q(HHW;25pHU+x+KOUhiZMCJq)JeuY*kpJwr1GC^DYSweZgQf9~ zO9`5sSJ_D(h$A|d`Z2QIaiF@<2e1d4OjC((%pbx(_Sx_yxJq~a2?B-q%wg$+jj$g; znj8jB^WhHD8_dJDEFo4T^ubeRf1|BXSTL);N7ZYG#)PR5wWoA7YKQ-!Y8|5jptA4eUJV;?LUo;@~?mTTZqU8Txfcu}KdXMF7l>gULnQrdS) zNr_96&1IttKfc7cEG1!rarcIgz=DeMC5kMHrwQ~# z_orZ(UV@#dC~DTlOFVz-#O$Bfy1%33;9mjC_-{-g?BHPg9}2`Ig>jiaK4fk|NvK91 zfNfh^HUU;l)@o1;2^hJr*3!>pXz9;lTF-z!iMKN53-D2GX`Wa68=hAa z9bMer04qb`K};sp69#{@P&oIbs8ZBlje-)pxNgq<37qBi>0LUb(XJTG2ItrVwq&DJ zI-}Xb)|d&V-KvD+ycW9;svK##56Sqstvmn&6k!NcBufZ_?0}}NgSBaa32<dajHTA-^}brYSvvm0=J^wZ zGRn(N<%d08FmzQ>CV=L{iTMk}!6f38Oyx zb3%DQL;IshiC9|uxNDc+k|$U#>7@ph=dXWzK=q(+N9-@_Q~ni%4FARhB#qtw1Ns!T zZLx%rxsk5draTmFH->_Wi_9hKI&BQr0)fQS5!-3(&w+m+;USc{r1s1^MszQ#;e2!Lb-12LhxhTMp#1tr}wt zPx%?g0WW`6?Ws+-0WXFu$q6JJg;e`PS?%1J;{bJ$go<$t zzD1r3rsDchIir%YE$wXQG`%=u4F?OTXnD#I^?ZLjAC1)~q9j_lTlWI9gCbHZ&4}}d0fVAe6EK_@#Q4uY~a&D7T&QrxO zU=4pPC(*pu?u|{WvkOz?5ZsSAn?%z$Tyd}r;w+EKS+$sFH^VG1^f|%M#5;NbYOM9o3gg6LM;}p$Cfw>As_+4UZjqLqYn^cttL?Cb zb4jZCW6f?8G63r`o_PrQhS-D5P3?cqlRJc~Yev%527y?8t>}3MQjtG0M>NG?Ej@Ln zox^19;80(uqnGVMJ5NkH1uNB+I9z0#C$qm$v~ysXYL|bT?EWJ{;_Bv<)&B)%nZJqw z|5eTP2he}5c#{;gEq@P%N|?MNU9b8nr^$P!TH%uLT|2N#`3n+4cv+&-%Upkn_*Ze2 zc&pS+l)D@+xmpCT8?fhs0nP+r!B92z7RTwsY|i72tUr4g>_WZ4*f(5n0O0OxZ^ew) zDKE&MSB8+VWHGQuhd1pW!iO^n9OX^Pr3%@0<*5(SPQ(xx)usdN;k)(dJI2@rn-E+; z9+?B`+%h891iJPw36#esYx{pgj}(3#Sv@ z=noXfwnEJ%g%a$r!-x=<(Cmq@qr|eiQWMkC`)ZHhtyhRsLkULj&gaz@61L*zESrzN zx;2%><8HsklChqR}#{@jR0lV%RYz}`_L&2e-xwFxh zm$t4b+QGoGzvLX!V}CSs&RTR3&nWE(2_ak~SwDqeVcaR)R0}*DOI@pRvKH{qL@W|U zFRD0x2jBEFeaLorIQse!$DUPnI{!s+i$aI!V187o@df3g!G=oiyVI;dTt25QAA~VS zLrXLkg*z_^*5KSQiG_c@pT%48)_{maXRbx?RQsZay=CwONn|>=V3P(F!-Sqr-%CNU zl+sKUEDZTfDCf$;KI;+D+%4t$08P~?%Of?`8_@oI{MZI$K;%#*q2{=eDT%wJ>*nj9 z37YyJl9F$~vd8^jvj@|^aW*-9bBEsxg8wLl{wIQ^sQvqS6L){g=4F#JzlKJw*ez5M zjRgN2EuliW042I=27FF(Tk>Lk?B&t`neH3d2jG50*e&2KBWBd}2g0Yn?Ae5|VECQF zE4`!X)kK=(kxlpK%L7UeMIxab147ZfISvJmX@2M~b%vvtBag%pP=)}y{f~sqE_4z9 zcO`W3A1O{!P(pv<5m2f}Hac{ZkdaAPlj(aAY1}SBNp4#>0(h=@sKmuHzcjiXtg35l>%C7!QA6mjtPFn>RGJ9$GtNt$h_b zI#e3ZP{tkI_~?b5tCTaYKhpTdNO6{LOTN6g5YU^NP%T{5un}_`a4@F~xkaYNvF@f{ zsy4Y)8r6SaCnqt%1u27|w9w^0_OSFf;84QTYF+|n*d4Xt&Xr;e8<2v!j$hZxvT{8_ zmX1odl&*iV(6x6H@)~|8@5fph)^!`}F`fXAY+~)}!4C(G)?4DEdx3s1?Dm7M&&2u) zFB;?bC4<=GOPdR1K3uDYu49-QVS+V6dyCh0^^4Gl)A>Bgxk`cj%BA62n1pv{JGXn& zS8kclG4%KT##3ZP;1M#Q9HSW6WI(5*^eB>!U zVDFDCB50dHp5Wv7>lAe!r_l&865L(}!jRFU)%xi|(?~bt3CE)vS2Pc*zVhcbdBq@h z2nT=kh)lf27Ey0EqJiT?x^$F^r+&vLc;Y!7xj#x4o%a#Xg85=|zfwNcSbA^gb9DirkdK zP(*n3rm@h!UMU&Uff;X*?00Hhn2QZ<=Fxv8%CYFDN}iFnO^{e4Z60BTF0a#JrARSp zh=sD9p%dZY^zsbT)4q@L{st%heKP0ovX1MonSlA02QE2N(BNI-rRf;gZ`)!$sJA(gek*}y^=0bLbn#d7h={B6#>WL{*Z7+r$pF~+S(8|$4d+my>Ad&s{! z6FR%qgb5VHf7g((77MAbo|CFpmtG!Z^XVXIpoS7O1>zT2ESzvur%vBYv63Fw7GQSO2m26@R2P3%(N19aN)S1-Yg=CetpDWj&;rR0HMLoQ7J7WN zc6`EI8~_vDSp#ZCxN~7pVNdO~(Kn^{d5U)CE0~3fvSQQb@(;B-+(x~J{1qBI{z|R> zRbl<>^#4O)EjKCA&xf9AJtt(y+=!;zi)TUZruc=%EgZM#A&F^rGirav^=?o6 zW(W9LZm*dk*A3z6X40#Hk+b$1uf`T2nm%-g0CpCxjs`xnRAE&S(AL$Kawnz&1Y)3! z^0ZuMN^E;Xy>|@1>Zm?dqH1F+ylXNE0lm0*s!+y;S>8Y?dEK)N=2U2jh3+7H)ks-q zUQl`n7fJ|Y)xJ?{%whH+yMceH%!0cF>M%R1do#rKPX5PE0hQfN465I3&K09cnPG}i zNN|JQJWIn&hw`E}s6e?4^0e{<+6#t!Bt?t->9Cgu*-e?NczECtJdsvs+u z1m}byje^^E8(fyUQgBNDFz_JqK{LKLCUde;v3e|1)1WspUUD-?$ltHk-Ao%2)e<$j zH(DLpjyHxUVsdo5fm;HCBe179TXqP8BG`@WM+c3y7?vwYwH)m>dtrj#5+zCA^;I2l zf}oo@^qCII+2sV71lfPFPbpOM9-Bz>Z9Ox~Amr^NP=|;2#1lWv-IWuz(*-HNNKq3O?F87duc6E!a0S=Ei?JG9Y`rK3#59V>@%3 z5ZSPXE=0RgPWBw~PR_cGZ#%-_-a(&#uH@y_c-q-d@DB>2FvB@-JkbPT9dCG+qUg=Y;|ngw$)L`wr!_l+v?bzj%}N7y7!(r z@0s&^dOtIhFTsDeth(-h)vBshWtGZ^EvgACl(belG!z?xUn$wmJhLjFQ-67aB`d^u z9kf&+n~^^`esDiCmY|+6J4k_cuuu>`omzV8>y<|mh#KYsvrM6Ig9d^#WI@B{+wi$P zHe`07HyC*4C62j+o+ng+$V=EPY~qToK*#hh=4{R~TYrB%Hnp#Ea?^8#jRpbLC?=e` zYGAN1kezV?(FLk_+h&wKKA~9_r?1xXmcANpB1!wI1{ps-l@v3(j`4lv_jcK;n(uQ! zzgA}cv45KTf56_Klg|G+h04VO2Wv(lhrgxK8F~%{L6Az2NPxSrq?h76-DTTqcWGf+ zWR&j`0EvI?@>lLTE(&EB?gg zlm5`1siD^z*@(Yyq1v7hNESH1xht)VEjD zzaM|l3c8GDJ_@{5ku^me#HqdmZx%z>h>C!`BH@rOv!3$U%H}O&@ZU4bH`sT`v0J2F+Cs71R?1Cmp5r(VO!@1 zg#{h(Co&sQyvd1sZpVdh&>Z~u{^-hU^5Z^wkqv(U z90HjA;2Gm#3FSgYDYr}!(A0w*(N1(X0pzKM>Yz0%T6}%PenK20899|)f%<1tuBP!Q z1kON_OktEs8pS87@v^|VASaSzs_(mT+JYM6N$8_A&0V>{X;RKK2n9-!qmNo>vwNWX zIIBqwSyP3z(2d^PcjvqLCq2Td8yA1N>7YSA4yGpt$CbkvsYpQw7eha0eXD=Ad|45$ z@M~y$2D)6)de-V7bE@ubxM%sQ3{pY2kk;SpL3;wzTZ~_F59_Rg)lmW`na%TSmNm2rVTphM0>^6V7^~{vO5CZmaj|m<}zB7j3ejSeSYEy4R|3F_c$Fn^7kx1$d46@u2y>jqk51TCDtVC&c4lW9=jy4?zVh}8i3->=z7^#p ziIOge<_&5(REiEhl0`HQLgary-cs`g!=F+o)5*2$oK)w&h^UU*EWM#}yTwG;!lP^Z z=D(k!VZ1|T)j@x2BQrFT!pQIQF_i`Ht=wPUrqe^MSnc>7RBbO?3W8H>J?jFi1x_9r zd=sZ>U+{uNX`gk2@Te^_DqkCq_+*OoAJaJPSRvi;T6@GlNM zaNb-kK^bH4lIeu#h&#G%%a1zm6J0ZL9)-;?1rg^NFbqS;*S@dK;Uys$c2=Fi5jK2sZ}wTRR9EiSK+< zcVnsEy`kMJ3i~Q{do!SS1Yr4@@5`m$q~k>tFn0t9eYEeSsK0+DdiR3S#ieyM19pWw zh)yOLU!Z?gm9OHo-lErq3ys?;CWRQdV+X%D+>!#grxFaWHRyyjSd(D)VCV+n?z_%zz^tS+GV3BKWh8!6aswQ!!Az%)Og9I*Uq zdGv(1?3zA3(8A-~fuc)vKLK34i7*s1QP6?PhIhN-ZMW}>LtXio6y{O)0Oi z4PvNAhT-oWKk6DC`Ve=`3H+Cjt?ivzG*?2d#?f3Y#!SM&8#E0Y-4xuA>juJuY}qs; z@QjW_+~TeQwg%{`fwp<`+1h%-PT;(jfK?1+)lz>u^iV4SB8|obLSP&sO1&5r60zn5 z%H+pP3OH}A1Ltza916$=f(aUyuow2is^OlyTeTpc9E{bX%e$Yf0$@}0gs$R!ALY}5 z3J_a{O9z#lS!M!|(g~$0Ex~6ZzJL>sn=kS9XJ0N1qG_Rm*|99emG`M=0XOcYF~nF3 zATNIgS(jMT%_L!sJ}e{B3opl)YaxD)Zz8~@AVfG6o92p@nIp$I9J?CSZl*gK?X1RL z^zYHaci9JH2*B>eI{_CeO_s8e#nK45Au5L===zI}w_1BHEm5$DK*$JQH}b zCtk|N?gNZaW`^4-V(>GD0<(9-7-X*_+6=mXn&uHam*aC|)WWDJY77uGcDvF3Cnfqzp zp4o^NNmkl;iWO=(h$JR>B}t6Ml~A09-gN(tA=P-3%nm%Ix0aIJfjnh2Qy2-6J5$}Ecj=j$a&=pkTp5p2DOyJxn z2@QVjDhYIXqxSlkL7o`8qEPi2qO^ZEiPivcv7{^hkxx-EDAxod4p9jS)#|l=;F2m= z2qRQw&T_43R0o^wBC8YPi*ns!hsVr!QBJg}iUqb)5ydmk37-_7$d2_Z_jBW5acF-G z_mQNti`1qDORjAp#?e~EwoB9Ae6}u}ATKYE?ErTMT|G=Ws@rUBw}0n;`dhd6_RV^loO&??ze1o%dU zT_#^fTsB5qc0zo#lkhde^M-#xR=&eyhJJV_CaWlBe}zXr`O5*VMoVRW?9Rj|Jg>35Z z+i0d@o%$URO&p3>w8yk=!Q_&i+g2mmSwxRnWC!Ek(M4HFZ~U(}3(bGBNtQGCr43ob z;3%HDPsqv(ecocQS>iq>ueZ@|X*=i(@$V_7V&29bw^VmwXwH zn!GQ90RY@X{mFUK|FeJd{Qb?;LEp~oUyZ*|gVxhrRDX-EDxlWZ=3)y?RPrv6`N>>s zq+S!>T$*XrkeQ6db!iYk2YKi~yE<%PBz_)3V7~ zd(z?{g;o1^%U#&*mY%QjjX~#p_ZljKO62+C(Gwi^8Sjs;(eZ!u?U#q7M9YM6SRIKv z@`r3J7CGw*hv8W62a@d%)_C5*!Rx!5_sm%N>-(GV%uhmJl=J!W_*4#MnJw~E-JWHY zpO_*SuC~74q-DQlu)X^QckOIexjh^M1a-+D+Ok;WssdrWMFn@M9#T`i`inGOol4(C zbH5X9OXTz(wo zE&W=x;eEUGBb>o_+wF%`CN@j>Og&Yk;rA?74~u^XaGbZePTu%6^=orr65J+<{W?m^ zvHDZ!K!v9mb6MzC(oa`k-Pfdc#yrUwb?A(*Q+*YM;`*_kkDyPs-yM^7nF?vuLVFZO zGCIx=7zMm3!wZOOrv`WEdA`T%NI9tRDh7d!`UfI?rw$C1x@sLtf>6oo8^w?vH!Stj*hlh*Fu*ZpV1%I2T+$vG;GJZx0%0PBXdz}n5ASyALT>mD1iZzi| zMw8*Ju@%I=GbRZCw12wi)$n;0^|;}^CqaLi#uVCJ6Loy%;VNv-(N3Ai-U`O#)At3t zQZ4F&j)+R%cW_7nX-sO{#0%JBxVmvp;&MWPxZ&DFpflsa)yh@_C3tc9m7n0rY?u!r zLwPw_ttcuh%rv+)M1cEhSy0Pg`V`7bd&f{}=?uPS67nwqdml=SV&UNh)|k{9^T&Vt z!^bkxjaNu(l5Ow=Y=BTyZ;qp1QA(0wO{^__CX?rI3#KyFANq2IQYTCeUKC2WfADoo zKh7P=Ss;?e5e9AihgOeN^!NG(6ZP&;L!lPIql~%yIC`diXT|pIrM&`Ws)*F7VRU=I zt?@nMH$_u^0@WH0SCnuSJkvC-6vuxe5Ph?j3|J#dinK#!?4e*7V%Q`%oU0vVQb+yXW*BZdg2h7w)jERS=kg!BL-D4Rj7Fu{~Qy#9CfDT4l@UC z+$IGicL@uq(3Upu0fF2GR}Uh>ISiAmbifiydrA7YCse6-GH@cCl>cl=f{V-Z`bGTp^a*ElT?Z z5CsLbNvA9g)2pne21M+`>3Z{o(ZA(Mqn{eY%M>4QIe!VGE7?-fb_y9UYnDcD3g-e5 zK4ujA?q^9p2oHP5KA>96EKq+uF>e!b_VZ9nZU9Ytg|ZQ7(T3xMLPzZQ1_ITI>MCY` zlUsZ05CeU80=p8gHDs!pj`LCFew_4xZCVd=dRQGU?MHz;tGN`qHc{p5{VY7h(evF* zR!*C$?9b*M9e@?pnMSHs=U9ZFAPvK;K)9NqxXV@s8RSWdk?PBMNsWK1=sySG1T<|Z z_{t25>7M$v*+_IVYxBajZvyDfOsGP!XKL?ky7=vEI(l|SG|mNI`j=bQ%YZ2_%+2JizyW)iJ z>WJ5+&pzHWd`r(EWx)y8S!Ca2Ta?inw20t(oJf>~ouv2{C(c_~1Pxy6&a|&oOOkD& zG3_vyKzlC5I=Mx%yN^X2F}ZAP8Kg_ULh1-B=u&<_^en+$9GmkMa2xq_>qUwKnfAiP1b;{}|XE4t}#_)2e z3q0#9;Q}{{li5<;ejDs~0lY$ZC!T2(wn#ZiBi|MCjOC6e*v%x?^^BTBe|^nzlM1CB zkLAO=qi{rFN4(=!-JJ!J`P`)Nm6HNQ|K}m=vS5>9##v0eEBno1JxZqOy&>7oiM11$ z5>S1jR2qK~sOzF4lrB#U;&?puwrWpL^tw^S`Yf1zyF@nqj%AxvTb{nGr*FMCJXsAW z)My}BuJSLa~D1Hhx$QJlWgZ*wB1gaxBS%JUK`^AdjwK}ES}lWGE>K5%j>WxK@!UjUfs z*-r}{+4u8tWLOpYuu+uE!F+`I0tAcqE%^NUpuE%bYCg^)Eu)wP+KAgVGTT++k~1S- zIXA6LkflY?d__zr`AS1h#}#+fb)8@rzzaQ5YZTl*4Yrz>Q}lR|#Zd1YV-P5?lC(=S zZhe0Phdg~W?&V9F*cFy*8{IU#fL4$KO)H9F)fpgK6opq-47l792E2P7;p830o6pTF zax(W;Dz$EC75lQlAps6UfEfmu!aZPqpWU-BmBix4od487pOo3cJhKRTA%%B_kC;Un z@F~2Zth)UwR!@{iW^c?xY?-eQ;%7`!;AwwSTe#lAWcHLi39V2e-$64^$V-&F3vN71 z%^cWQoehlm$k)zlwiC@9O_i|*@wis>ZT$-z-w_c+b5Vfh{CZqUzXtZ5>hdqQckRwK0E2 z96krMRDb7z5TY=IUP2o&P+VdiihgP@OqU@~bu{K?mE3mPu9+@}BTR0F`$>x$q#3#G zXYLwrYNyNsN#d-su&*Q~f!{quXN`h;#gFN9H1pXV zqE#ps&OP(%ST}42kM#5l8{OD4aj<{xSAdb909i~5VI@Moc=@j4l&s4B2FM-hcthhX z57&5K=+8Rg+weS}1yb%_Z-gpQfNgS0rc-M9UA3@r4%0T|diEekM4W%j#l7f1Auej- z_q(Fqt_d##6`pb9Xcv5oA4gFq7&BNp(l{pXP_Z)jz8Y%z1EJ;1p-hROcpIB$1AEG$w>nTPBBX0is$)qa6f{m0vT+mYU_Tv;(XD zbUp`mT2_MF>}AJ3HEYOx@xFhJ4AwB~j2Fo^HUEu00WYL!eA*_(WD;r-7RkCU#~$&` zGb9c1O~2or7K~SnZ`)wQ0To!5*pzYKn+jpgffgPt>h`Ls@|zjgo)l0qyeHik_YCCG?xc)`Y3;{O}wE=TO566 z(tWg}Yc5&ZL2S#3p^{KD$BTIx;3^6gz)?fpciLjH=OS=EINomX8h%6aOzWx*DiAt5 z%-`|CXD20nJ=rgzmynz11t-O$?HyRe9?1^3GBG_t3te7Kp6!($9oUieD|V10l1jd<#WUr1Z9QKE&& zVnUpI8}1FSFnu=;IU*AL_q`pO9M0fWU94Jvtje#c>*kCrB0_It{^Q3b)>wSsv`I2P zEHB9g9>Uh@1V;GDuk{&3kT@uT5uuHWH>1Q8%j5y!kI1L*tGYZ=@N1zZI3$m22CJtgBUpZs^qoP@U5eR z!=ud-m+bw-wEkBokc$IVL+;*CeLgaN8y^Ck4ZjLXuO2xB$G&0hqPuE(9Ee=iR5;5k z(Nx1#Q#QW_5I)$_p7H>Xq{%AG~pDi{Z zaiDy>uD^rmP^PRxO14!VnSPW0i(kaI^@rcNffMd(p-OlFfE0rNU2fpBv4gpbv5};) z`@etc;fjnI|J4K@IGK=yR+3Zl&}BCyYrs}H*UWEdKvFwZt*<<)7Q`=EL1ly<*Gl4o(Ni!O6t6{Yd{ovB<%qG)8t3Y zQNvLy8kXdmtQ6UPCn;6ic7AcueFIn0&Fr?_CR|%iE@4re_LGLwe=|znT&&Jz= z^>jF&U3K`OY-ltpocKZwIZ0XdKT+O%LjmdeWz$gd8XXF46qqp%Ci4CFw+xcMx=^ak z34;@fYSpBBH2{x6tr*mDRe<$(3UNN+umPW5QouZ|O`*nKlDgh9FayE|qQQS7c9~~4 zbv|J)#}p(c6vlFLnotDQY*Vw5;z|i%E$+)I>83ITjoEbc#aM&5#^uf^dAXzVu`8@Y z4HZj#!))$7hxitEU6R70jmmh!oWF#ewr)x3UeI1i*d=ykdq1aW?m+D^Q~x&R-KzP% zc;nLh>;)LCxH(9u!WGg$O|O6SDURpM(rXq51U8xk>lMXPig2vHN0|U-S!mjG-ub0v zF}b!s?b92_6Qzk6BK(N3SQuuj5G#Q#C$54?f};n$o@{B3)U-q(T0;_pDA#j2B&rf6 z(^x($&;@=slL?*=z+=5y7KKjt7KpuxmR2f-jzn7$-|tG;`&Hw+&4+(oZ~kc4KXhIi z|9Y=MFJNc)`{9O=t&#EXAO4kr|Fg@0ZJUf)T9GcdKx;}kKsmJfitJ1C4JL1C(z zD%k-D6%|TCTxnNF(H?)?Qhcs3|GP1dZyV%_VTd!0w^KjEy5}UH!|GOJE*s5RYdTD6 zqxsSbHm6@M%d1!Uf>SV<>y2v^LaQYf_}W*lN;@ZB47Hb-h%7s88wgb&Rt#p+D=Gli zrciD&oZ@qaYE~i7@AcBQ>H0O?#QEAk4CSz1=|YE@r8Vn=I=p{2+c%%l2!EJ#^?li4!ZS$ykU}*=bDL`>lDblDn5h*HymAL>YY&S(oM90pbx-s*d6^G*0`V2 zC=eFsRD>8|wmBDi8RKF)eH|sTw*py&Osi_fYthE%#JLqnsTrGXuBE-V7}MtkYi`7B zRMTC}tUZ36Ywmvx8cXJxh%FpxbJhofXYLkZETMVx1L!3*s2Hi@eH{iT#uTDh=r_w8`CU0(?KGtrWx&bEfDH9+@NYrs zv)M5vu#0~qy)p~uy#)qrCixuQ{hs5Tsd>d{|7*+JAD_|k{}bcCcP9R|2}{b{+T2Ol z&CuA`$k^zQyeqWH^zkEPkiv%}5VWr&$z8_S2?-OCKoI!Cfci2ki8`bRMOm-@2)R&I z5<~F>zzV^G$(00p@p=e#f3iq% zR7=8(j1JgDq@!d&#P8JYU1l%d(innevY>P7EHP<@WwcAiAeSSRx*@8*4I8xd$Khx5 z6t{n}{J7V)qy+09YfZ((!#U7kLTXYOs(ly@|2o(d}}Y0eXOT~oayuN zNqZO8pQV-_Za;yKJKepT0!SWg%Wv28&|H5}T(k|h@v=t@@9A@QkAap~OsH#S`+)E; zjOC7%qb@ZJ*9wS)^I!%sWQ^zgLy0se2gpn!=mf^q<%P7D zi>f_v^(#M-5BGczKaKP;-eQh?kmwdu|DId>=8^^$^~ge|fouQm&I!XY37db?`=Lzr zyj+L5bwSdBNzP+=K=)BLoHf%2S9uQN^!_HT`f<-0QuAO11qEQ8kr0@?&tEt}F3CsO z1^EIbR+8kwpJ6D^fz#H@@Da_4*bd2AJ+u28YOFNm6Km2YaZz~b%~W?pfe8CLQEOW{DEjXg7O(`Wtmq;_SF-%cZz(H&T?% zYXfyH$h|0BD($EiSa-Si9|t5yCF!lDA*QY6TN3D{GwZGw9d1gpo#8D*Ada#x1MIcG zIao8@mK(s+{z#CD)UJP@j%}l^2$a)NdM9b73$tLK;_w9SU`@)>YeEFR0rj8;W@Rt~ z3XZh=YiO*PQx6{W$MGlpu_5Ol!;t^;e)rEG!^9Xy*^ko?TxT&?5X=e5^(Y1s8t(=( zpkxrH`PE@=7AX-i0r?&d8S0DQ9WA&N1PckN`K9&#a5d8jKihxy9ALsuj-W>;>J>*w z&_y3>RtG6Ae;brA^9L$&P@?%mqlZ@Q%Hi%peBbE8m$oSbzjt5rHpVDBjTW14!mH4A z4kjJu+4byb14JrwiS`ZFSe2SO+Tac{6nl;FX|_@rOizg^ya%S*M8eq&uj_WbJCi}~ z1dO4KU*1qQW8Z(hQy0g$Pp14pol9^ z2nHj%wNIxhjjhRVK)#gc{`y%F^7puwv1OZpxH6<9?&N>EkEl+^`~C3}x*M6BuA84Y zn&^zekuBT<^uTPVy0E=eiYYkh>b}k`W`MO%f}o&pH7mw<+vEIn5ymQ8zx32YV7Q}t zXthR+_zgoyCalwr%z)pSwQ%cN>_#ZjB#SExxl>Opy>az~@xa=L07C+I2-$WhJ1Wp~ zC|X-^6t{m%HZCK8QkI{G+a4%rRfYl2!Q3lGP|cT#8&XtjCL$?jCOPR;y7?GJCraeB z?=H(PixDM=h#NtmJ9w_xfRzjXF+h{~?aL&dwbKS-a=vRzhvJQ6ttdJmVwcbw$ zYm}1uf!>_oC@Mee6gN;+#%brDgxE!TmO6tiXz&S_DRTwh(GqD9Ymxz#BEm!ymY@)}hs6#Z6G#A#%$|y#h@mqr8gA?)W)ZH;h&GJeqJ+{l zokHk*HAguGPP`QoXap#3^=O#j{E2d&RJ{&!cEx+ui&+nTCS*TGY z-bWO6|3`)W!z7LWO61>bcm70W=6|8G;4gnF<=g-RK1;;x5>$pCVuaad8= zQq7L$etTJ^IWw*qs78V~ytw2a?!H{PUrmNNVdJB%$}HdwH8JJ?Wgl*d-=Ke%)N z3L5IrGjRNiOGErX-ef0HNwGum@?)9DCCrYC*PTHRDDP3ZYT;&jzpp>%$_*O7;6Em4 z8lEky@Fhf9DoV#%tW8u^rGAr%I30gCrMT$`#R*f5YL!3rtg)W|!H@bAY*dX!u7|2` zIZwxQD?(IIVN!8~92OYujQaX(0CsULluw9rQ06;Erv9~{iY}ozskBr!X`h#FGxJH3 z`(5lrr{*Vc9^KUw9j6TF4vbzf>uiDJyiKg6YM5ofQ3bVJz791MRidg{b<}_4kxF?N z{$`QRIbJ}^#i&?|#pqnGa0u1mq)-5h62(652F*cIEz$zSS+PpAQ*+8Veffd_1(d~_ ztl<+;j;R;O*A0+E2a_PHXD$V%ozX}31&XZP3un5_P>Ol6iIBrkoId9jF%8X~d3BA3 z=UV=WcOjX{kx0jpWug{0I(L8Kvew7nTMF}O6K(N7umt{Nb2RI}i>0%Z*}tij>CXe! z5@}O{ieiv*#o*^Yd_w(*&< zeb-kMEDkH`D(cy>+`<=s8a$JlzUnP#bH`%x0$YzWk82iSE+aJyk4k@hJGKLRaujnZ zzQLIIJo=Lw47p74(g$v&SN_7({YFc0dW@M?b5@U!OEMb*Okvb%Skq>)BH{X_VsMPZ z&~ZEox&Ejj11gMlwtm-kFk12;IAy@*&jkhydvOoufP^e&Dc3PvkBd(*L8seyzP%q( zNrQ+3xxSCaQg$#tA`RVf@nST)e|vrpEsVKwu^MXs4TD`Dq2c z+_JJYi&9N_ZiF%{YQ?9D@$e2PYf}Oemi8$RjYT~@*;LU2jjk!B2VPdpyEj*}pi^o} z?ZEy-X6jXuplFfaLPpn{??aA{{ab_w8y2nZ^A2CS5^>F;q%{7OS+yW4 z2gTcATM|2p^(q6-wU!B)2w5b$7McDHtP?S2^Aj;IXow3VznDzP3v#z;im+@J5c85C zZizf_|63~s>|xVu#^ir#rC4SLvG#;ijJ21jfu9x!Ut~OrtlR@<{KV%33zA~#!y24E z+Lb6x?45ay4=8^>iT;Li_%?87hr6XYrX5vz^%43Pl=0L!o&+CIKK)TE|1fv$|AF#< zAeMi-@Z>OXezAgj1-VgRUoo#0vT#GA6Eka7PZW59X(gag_>Fvox+v`2`Ws)d)bBqy z997b>zT!3cghagHoxUQ@C3QupJ|{>@*H=Js2c#lyz+1Z=5SZvT0V7BAj^tlr8QshHmsm=c zZ{yl8Vs?Lq^vXNzY6tQeQ!Ej!pbK5m#&`fV zK+3-{4zEh8oA5P*)vtVgOjcTA$CM(kN7dkOwUqlyEja-#zu^(jm*EOMV{oQ z$rb-1Geojk;y0P|ZpxB1FyX|c33<&y4WCW;CVU6s55URAl9`Z=G}mL&2vjFzKfE|3 zl&;B4YKlUCM3V1nCP?A zZjS|W?`$=0GUKrgQyb|+6*D43+V3qSTy2Gn)`nYuWL)=IT#jcgj{9#FRM6~KnBFEoI;?At$Q@x`}uYlP*^?d zAUM#U*fr5BgnUq`+>3Vg*$ERVSh{zsp8P~^`-bUoGoP)~5G3m&8asABuK<#5 zuEwtG_f|Fe#Il$UQ4qS}1RHRLl&Y5B;9q{lmN@0OREHc+WU{7fFyU-vEZUuLXE3%g zmd{?s;o7C;srbki2Nh&{dZ`rp3!gFTV4(AVHO4!g+63iWC0oc*k<**Adw`MQYlLeP zCFMJAA;MuI-`kk`j`$$0aWONbRBkm3+^fjBTX#jA+j+Keu~+=Cnog*PpuTkOd)B%m zwDuka&ol&>&Tf}=f1#8)6v>rkEmAl)10v%UWW6!Omt@W(8&^VFl<#IXlYk&)5aMHh zVY~Vs%VK5=cU@11z?tI~XI0}3sG`dyl-KDUw38fSm$-n0$Zrm#)q|32F5wVKl$avo zz?P>^C-RBrs$S0TC0z|?xSkkh&bynvnZGQ7SG4F2HPm)EPBkq||5MQZuooU$OjHPT zYzZbgX2_?N-c#SN!Yb#5PBZcjZ}bj-7GjlBB;=wafuTEv2Xj~WzwoUl#?_Gez?bfi z`11an_$nGZxR@In%YBgRYU}V1iJ$K>KlxF3(Bsqs`S_H^a7h-EkqEkzF4%kW9YFPm zV@UoYdK24QVsIVJ9yK8Ps76%6ZI`L~MoJ&x^fKaNtehz1eqiiY*V@gY;rw^9#lCt5 z?S?AtmtEK8y2EyC41vsxQy&khCC~e^02=4B$z%X(j5xx0-yR~WlF>GQvNl3Dzu`he zZmO}Gl8gz>b+uN|RR|mrAr*2vOKBrRza;Qap1p1yp?GO2F$!?f1`>0#e%P{7$V`4F zlHWN5u1Pf>e*4+%U|6TPj~g=ZAN}mV8~iCb=$l&^JN#MCer;7kc`I7gq0sDhxb;Jm zGyiUkI1SFii$Z8n29K71j*t~}+8m+on*KxG?_B~JFh7*98{e3_P7~61uwU9`!g#{9 z({Un0x2x+Nq}q3gbV&`Pm*FgJTLBtPF#wcPJNCisG7$f{c&dwoF zM;P3iu7As!ZID2Ldk)u1v@qP^5Js3pvmjn5osdb_h@3;q`5^Cq;$XZF8E|Pf6N<(2 z_^U}rpPqG)b`QgHoUa?Q4>y8EGXBF(X}zGI3wurcs;kD6oCwVEH;TJvhc#-#46!f4 ztwX4&M-YXAyC)!`E6JqGMdzwZYWGr zjJA{5)fUdPf~gsQ>FBK#4Si}Y2AXMMCSWn&(#BZHHkV5DRt7-^F^lN0Squ+d1M>oW zD6^HUD>elHk6G~y{Etd)aPI@kXUj!XjMbjk7ckM@Ae7CN9qt zYG-P8!DFp^mT;3F1^V8P?8e>&B3mAE5!oHaD(|$T49&%V!-*Hk1yL>s_{z%9>6aNs zCCwL|j&6aCVgOo0t7Aq?%Wg~Ggnrg=Vhg3@EFM`V_DR|?+lHyAaq^Qgd<6MH52+V4 z0R_l!PNUU_piZ2y!|7f|8F64kX33K_RsEUiGvQ+ogJ zz&(!Qb1%PDtpevxMd3r$*#D?%|CsENv32?tD%v`jfBA>>+3(~f3U`w^uz8Lg#h6qA zkv`#47!@Ii;v8v7+t0Lq3h9__h6`1xM2rUjUZ~4|6O%k7B)qc@*G^Z{$K&U1ZF3#jW*srvHA|Pv1^PokjTwuWS3_F z>S6%EIdggZo|=&gZ%#|_AuW&pyNu?4FPpf0$cny!)t?Ki3coAoJo(oC4HjPW zYzGtI80cpjPztCCOM&w?TH41cQT-%iB!N$=l_2QeU-3!T#GP}6KaUwW?Cq>@nA)5j z|Gb9&>Q#Zt7-kGk4W|M+Dq4ZoR=llALt>GlE4{zquS(O;h&X?|((VNu^&+a6bC8=00tOxw|1M)=&-f(%-EwQb zw|X0I`ij$+1ivlz9A1A9bC}1OW^ns|6ZJhSex>6R&IJW;G4Zm;i|gF8m-Cy7h5?m? zqbP0_R&V1H%C?1?07ev0m-mIqbtrbZqPllh;H7SeXvAocq*$S>bDMr$f3W_4l$B@% zDFC4oq9txb!UO1W^r5|{e1g8Bn#l-w%X5syZ~$kvP4qmdEE(FNxL4VaBIlbB#cqcE^@aV#$hJeJzwB(~fqQZ#odsc!@ za0AX{3*v*7%nC18^4VFc9TpBu6Oyy4_zlrrx1T*+I$WWd%#iNhn}z~b$*UxWCHCJv zK`+1*KN)>uP!ol9c4sqxVhiL)cx3i74Sb}bs)AlSwekk{LS~Ols?gb33>w}8v6eP+ z^L?~H0cAL9$!e*!}B*I)i* z|H%KJAQMa}xR5OqZ2~st(UnLcO3JyirOZ)CQ*nKJpe>Ss`4v`wy15W5`+>r{PVQf4 z?pB>g%K|hVfM3{IM6+d&_!I57!~^06@m!o!G;eB0E!}4k0VxUQRthnSESs>*1BxZNJPYyOU93*Zm#v-=irb)ip6cj4=K`9p>_v5tMCzENyIEZT{^}7lrS1ARjl^ z0T5p&`4GbLx_w^0d$O<>Q2=J`H9Na!!}UT24n z=Nw*&zsCrxFlvgh6>&>>q!227W0v?VZC(*}JF>>=dk5)ttM*grpq?^M3T@guL~dD5 zqcA;SI&edOVg-s1iSy<-wz_da%?b(X_CX5?45)Bd-^Gz^yoNnI1ruru4I8p?`^lfC zAbAvN0XRLd_W@l*V!iC*lXSqQQ71DQ>sx5&!e!=~L>#UvS1`^T#DEG39v*~0uK9!J z+Bn}FL4=ocmn<(bj<@ZK+8bqrSe)1jQ*-P>n4Cs`HZo`whZ%B%w9Bb^iCj1{6ZcDr zq4;}xmTmJ&2-9p_+vq^{t2rC>M6(}W0;HwSGM)bJVrLZCSbq39+B&jS?pLBNNiF9d z!_Rb3+d3vP>bp*BGgo8C2eJBWRGyr^T#_`$hRlmex%j}3pf_>@1kny=5PcPR`dW{A zWf;bP%t@M2OliZ@f6Y%v5j2VX`eF5_KkD&6mK^?%<^P^b`{yj0wd|}Miuc*_x1SU+ zvL~O%TY(pko`IpRmCyh@2{a_T^PObI1I-@u<4Y^}c@{XTXO#yz~|w zo`Qby?@)y~q3yGxzUT{imJhxcB?{lshXI?p;CJshzv?ytH9vN4nzSJ3>~l0oO*_C6RWAI-0IQ|8&yW7yG^NRRBsqILiZn z2eySoSyK#C?791W2R!>Vxo@)*Lg*}P5z2c|&Pg~y5C&SM<25$hu5Hq5(S_*n(MDrC z13pLn)&!_wqL?6LkAkyD%w+&u)=SyAbtCD>#sD%}D#3oW9|#RIiJT>!xN03aE;nYB z_gku41o@~{yaH{a$_1PXM&rAoTTmo_wR)7`j6_|fg__aV-gec7pftv&aD_4%{!AT1a093BEX z1FMuq)^XfSiS1~rtIxl0o;N;C)WjcHg8wmO|HlmPf1vphw*OmfO54uzBY36TVk?GG z!q)pX*2|I0d6u#R2wDIoh5;piPl@3)jcn1dADdbCWp4o>6(EVd0C=MqEU=aKeOEDc1#Vq2ooR4mr$=SMVv*(pepac8LE$Bm$rTsJQjNnKFSQ^ zE$LuRZAY*l1HK&Fh{ibKCjsrR-f4KYee^gB)&hMam{tGZyuX};-+1bHfBdl>!G^AujDezHyqOjzpw7Ce&&m3w8~CrWf1Er z2sJxp;Z28R+K6&>0XJP#aFY3H?hd~HYC|Fqr|(}mQUpz*4~o9=m5wAF?V#{>$~Bb% zU3HjFzFyWXw0)HW?6|^P_|S2%OTxvsnIIC%Tn&X*u|A`2y1(InWadOFF$!j})S$9O z6i1}<5qEcSsHAzG!y=QOVq88u|MIYapEkcGwK~2Sr5C2$4AsG#3|=X+e@Jm;L3d<6 zeg_-#c<*<^TR@J7`Ob&#S^V$P8h^v}cb4nls%f=pe}E-z4&4Fh3^V|72?7y{LWNq` zo+7ekpH6e;r!H!L+4h10Par_$+yASnMg1pKiEv`|4(8-#DpOtE_4Q&CJ^-HH&!9+U zXtaeiwI=xi3ux>?TP(-ElyvD83xjZdIz){tGXf_fL+9%I2;UC9=4#|}l3gm?3kqas z6nMkx5FeUgBJw*7tmwkHL*$^e#bcP^(|+O}yBhjLx6}@QK9na^z6c2W=gXL*|BsY& zV9zw$)^#eW*tVTiY}>Yzif!ArZQFKI$rszUjf#`g-FqKj-DjP(|H1o?Ys_apbKthC z5VeO~nj=o9-?%2%7-{|zh2AA+kwC&r zm~EXuY~LAwUWsW3`@~t43+}Q1g8XFGe&k$e!2Oku7olU$ss0}NtW$W<7kvB^E)`>~ zwAeE}N>q?(LV6LuhT|m9a>5$iweFYQwXfVzowJSP&$t8$(|mijXSW{`po*(;~->jw#njy9Bqca{QcA zdkgM3j`aw+q_pEiqnUq1piyX2te6=xY%_4F6(0_$RH&QrlEM*hf5x1hBQI>ceviIF zS0*!)oq1)ZnHe#+p}jz%ET$i1RF&l5O9ej@-PiGO?OlR4t)9BB{ zGWvIaQTt~4Hbz$FHl}o<<_^ZL`c_s#wl8KY?P zH`oL&GpA977Kg?lfG~p;EUtbQ$I~}TlQ1Qta@l_JuD5uaYyr@%p%v%M&)Z&}ZqM`< z0p@@ANB~0yNuGvw9rU!XU%PI1y57C%@qNI5{r1X{b}HCXn0T@KAJ3zzBTl0eEfr9HH4$2 zS1#H(X1z3IVk0j%(Y^wo1^thG27Em96uA+%xzJK0?#n?Y#+>Batf*tsstbsx&=5_3 zPY+QdkkB_RE+M3aoWu(h=(CA1aN?L^%v&!|!t_eG^^qd1EZjkD1qzI?^EO9cD zD)ChkTp9S^4c{?Q#G2arvx-E* zWQWsHaT?j-*EGF0B&U(@l1aGP>KXCEZMaiglvhtW|CF9 zBxtu}Gt@q)#_Xcw;25j^##-U%zZJ#k9jB2IH=n6%s@(`0BN7m+M3FrQ=VFG&H|ex# zJZ_M&D=+K7jH*7+A>vrjM`Ry;x~Ab17h7L+B`+-3C!^~4Tog1Ax2vv%lvJmGZ#Qln zlPD`f+o`2P21uj_u*<~Al zixoN2`(99S0%=Y9NR&De9LV|dkw)2wcIk+T zm;d_N#>1S@p2DcBe1oK`S_l7z+LW);f7vE9Obw+wWXY(jb_2Fm#7W@>ZA^CU8mtpk#Nf~1Ns^D9lrf+c+Qb&ZjKmSW+Wmg*S+ zpYj&cIKNt_}#aAD}eK7dsJbg|{R==28B{``khX;&H2L_~AC$DC{~&>4;4X+u=o5Pto< zCUK#lOh4Q6Z{J@q+4<0a`1`G4qw|{OX-FL@*frU3T3PT-kJBM*>~tuPNkQfemKH`y ztJ0|mnylFyqi{{{S(w?hJnJe;<~-aU31a1;6^`J97j}^xWZ6})UyP__9KSd)UFdib z@0=>NCer7!utjA8BDv5I?Z-fxHDFU(92RwOb6GPzjAJ~&5-_lT_b09#0bnxUEbMg$ zQB_SJ8r2D{@%5#rj|3-O0uL?+4n}MpODCC~r(h6$^5^PiG}8&kCo2I(C2hp9HaQ6T zvryL{I8F?cacx1TJY>+uboS;raBvz7Rvq7~^ zw-%Y@_~cGrUU>n36EKMz36nia5_>#U@kNrC)BBzh{PpR&(PyWiF5{M4U{d&|Eb%X?Ty3g9-u45@k z%1jiUz z*d6jv2kDrXi3v3mS3+(yAsyxe+mC{w? z**MDJzDWn}P*Y2O7?iTa_bT$aim)VWVG$YyM4}Ua0HuUxa(o+!# zsc#xA`hHM5_7Xn=TTjTSjBvWc{hCr%FtT{SVmn|E>)GUmC~ZFR81q$Zm0Bl$R)Px& zu9Vp1BD<9NbL6vXm5oEFZScVXFN%&d+4$!&Y6@Yr8i3=@0vYQ@3I!Dc3E5O%kvI80 z14?Fpd`sjNZvU##0<+|9se%CkZNUDUF6n<vcUc!k z33*~RC!TAPfj7@|_yK6~(~;z8k)a+p6eExlNZ1TYl*eIFu)84Q^0zyRZ!@5wbpyhS z7~)I$aoM(!m)wlv`<1hrv&yvA`}KJ|-5Yj)!ur7~$JE3imOC|T8ZdPhV$12W^U`q+ zz7=8(!D)IK0(AG_o+?Yjtj#wLsSd3wNS;-IU1N*)8JXyYw?isy@3Gw z9k3zpew{fR%bGDFOR@f1No&QC7tKk3llGGi4|OhNHMv>5<>zq5f*BpYhHYoZSg`^h ze)s^G$GG{r`VJ6_gvx4s3;xQbs!YLEtiqPG-jh8+Lyp`Fm>L0W`q_!}W~%!SL?@2u zVmAJc5}QMb&=;gRIwkUoSqioJ%9M(?_A~Xz3o3J`xXKo*CH~1?3hTD z?ZXDnQ?KaIcI|ndD%wumZFC3CQRUBkicBQCLa(Av1~mY9cJfDQ*F|{++=;0GbUCYg zu+QkZ+D6Ohnh&bep3O$A7XQsklXlA!~Hz3ev_vOrj8wWOFP?Hg&wPV*V z2#@|6_IIMqLYPWH@##0zMHV!(XkJ98`!5r*=7^Ggt1D3*@uy)8Dk>@CEYk4bV8mWA z34v|cu+$o8*LB;Eiq!+ys~>as^N9$`)baWi=a3dj;&=F$3ULY^EF$=SG-`_lyD61a z*AoE`NSHA#b^_F-4t2VEwBMLO1sWD;OEwD+%4Juj+ZVY{#Ynd?O|%2>l044S29wvN zJ0Pw?1De8N3tUmJz`YGTW}s`8ywfyrG|!S6^Ce`ku{tgic|)p#y~|tDJJIs!srh#m z0%RF2ff>Yr8Hg2?pJUg51Z=qc2CVBQ!${$+B5WQePca*?YC|G zj`!?6jPJ*1h@OzoMK(k12KnjY5Ri4g3frXX^TcQ-BG2>td)5=}syT!7im)FeoXY41e^R|RIq8&|h z%|XvpR^#;6agMal+sCmUkoHhUw5y|?T`|7tjV_v+V_S%S22;0f3H;QK&_w!XS9;C5 zdR@KQKJmBCk93RBdL)dR(Y$=2S_Qa52j@{}EXir;2c0KiI$acYJ@(1`Hp-tW17P2# zmb&<>FPqOLZAUufqT%FyF_VfwT ztXWFxY%NKDCKK1LMz|KoB+<5x^gjidw0Be#h_kAQy!z;LaP5QHaznCJIjgCtisF_4 z7Y6U0B8g>E)qvH{t?G#s+RbB(GVE z?xqj3LYRXKG_HoNjXJApf3%AYqs}QmAGwW4f^qh@{3=g?15>c4_iF@Zf)pGjNQxmy zfQR{KH!{BCfyfKSQBd+Ua>H0*CLq_Im(vdP=Uul?V7V;MBjT4o@l;5Z~*fdA$~jXGy2pt-223s=Vjj zFbcE5zt`P_Ux}?LB{`LQq06dUWsD$E=-VLALwZSBVsR_glB3#SFC18%+T7Z8mx74ya<2KymmVb zG3;mL>R%R+t9E07-k6n@ZobD=)O*?gNIJX@88vTzG62yPvfSA}zq#YI#fj%}EN<3; z?h#L=Byqw7jO853N7Oi0&zjr{H^au_4zw;`Us5v9N0`~)eG2m6cu>OL)4!AD?1s^Q z=;JNf^kZuPCf>x3RAU}8Qez2G-IRy*q<-{uqwvGA%b)J#3rK{Ul z;Ujj)^b`Ho*~H~EpTZ~eH<@wMNw1K93-4+ZX1$PJZo?W1{(JQETx6tN{j{|2#18i| zw`<9?7|nezB9e5fmTR_R(Ow^&3TT z=(RO87F&`P&B!1F38(}t-~=#%yG!ey_SexVa-VR%fggT)CuK}AKC_sAzKQ#8 zF34#!CHR_YtBx+$?o;kltB$N+?@#B~KwE%iGAM?qpZ&kGzx^0S7#0)y*=A`lD$Ee_ zEyoQw)al*a6uUfp;Zwc)^S8=Y6kNXSDD4%6T%#j<$v zPSo2wQNQUf%olJE=c@IhNnqW7s`8Uv?M|C-$7W_nR*ODrnJu-VxmdBgOLz142FvbS zm&kDy4%tE`!Wu#8C3}U9=~n2?(Yu^F0Y_8#Jd|@9dLfT;4x^Q9LMsmwT#EH-`^&M zRM^rG&{@9omzo-)XovJVO~E^b>-IG!hT^4fyIq#Ly_TLg}m*g<*6jFpEvJ*{iE zm|zNOiBwo9ZTr`cgUGsnE`tjJQNrO^q>SVYYB_<{ACk-1Bdjc7kX1C*x?3~q)Gx9` z^XcVfSx|M%qtDmfkkK-2cvM3hr!BT+4IFydwIgd^xn~7CTd6;zWRmZwL5#_}(d5i~ z%qdr}AUi|n=Iie|HhcMlqv08h52UtP?NS#X#+hQAQZ7mmM?GDC;)jgp+{@gqK>s>D zoH4rf%dqSPaA$f+5cjaZS_lGqtfAe@O6vgVn~O3YFSYRg2uW zwL2QkY2qq15PKMX47Frq0N%1)_5nf3t;_NhI-mY$ znEwPmeXP%59|#nin{bOht|^j&CUS;%l8gNww}f^rf*h)UW5GW9^^Q)0{TO*TiinIQ zSpG?Gn;DT1xWSWiMWP;ffLBJe$0}{hH$)(^Y!c%uZB&Y9~hb$^Yx6;)*@!LBG-h1Zevh*+)%h^ zx>KX_8tf*FWT(WZpk}9trn)8mjG9m?3zXrSG>KiN(;}mz(OdqM51t{3m;|)aF9pLm zpR>U>zm=~)g{edrPagjdn}P%JUwu#gpThLFV@M2tvLFI54ZxtUbmuD_jQ0nzU855|P(z!JlH zLN%CMP=gN6dG6H@Vo*|z1oq}*)RTdJB!*Vbdx8!f49!uo^ozm1K{?$ZAN4h)hosQx zu*sf(gdV0kL`|uf;ZLVLM?p;)Y7u90Ag8Y^L^cV={4(+PIl|J*?BxV4lr_g0yKB)* zklCZPf}5NOG8>yC-{a71_ju8J+MnJK<9ok4p(J^g<&e+IBX1`3JvTPHnsm@)Z~8#`>*MO|19$VzYSrx zy1A9|GA57fQS`POH<)4HPhdzcT@&sWjVSakxER=$`h8MJ62fUFc+a2QhFjc*BXhu~ zJ)c*#pA)fUNaB>RD%eFu(F11_^2qvca-jB{L8ba5HVxk)Ne)MnHZfOaMr|}* zC|9$SH`|el7?c8FOb#qnT^bv>Y6s`y=k=jam}1kIG}cj8=zkg|sIn$U89Ua0UMZ8A zYgPk`SeHwW*`Ti|H)jbv2Kg-|$~gFcH-nT%aWJznnQIyj8)YyZf~*F`=g?OrdAX9a zcycE18!qHzqCh;EGL|eRvN~`iHu~#Rd)_ASkMrBujMW*K{+N$CR8*S(U8R30P0c!q zF;_mJT;;1g6_c?PtURzmgT7wvWjvAsO=)(JMGs0(GX&w8!a|QyU)ymhY#Guq*Aw*&ZGfB~D{jDaa9d+^bTroj)*U9c<1}9h>3e+# z3W258FEOrj%8@~KI4!d#nS#Y?j39RwcI2czNkfOg?M|aNwZ0lw>J+~-iAE8ss?qG& zmJB_}WkA}nR-8Q92^lKiaGP>}f*aCP@mA!oLq*0Xu0M9evix!Xo|WDRKB+yGR-mD@ zSbi1Dhq>GZ5HBT%l(5D>XgEs(^(yUn$+7cAHPilx;OubX9vp0(C|8aNJr>^BuXfKn z!~3qhGq33#^}UXzYE22y2%LG$NDW%3f}4o)tSDhY8ehDFydX)DKITq;N6ImeN5*xp z5h;qD%AqE*S7oXw8Ct{P$!S@f!;q-BEu|wXnVX<7%zqUUg^8CpmDg}TN60^!(ZcDj znT!?g#7&noW9AYAd?{1TOgqxd*$yvf{RoLAN{R<S%zmJTO?>6{MLK|v-FGA~z`ZnMu5W^cBPtO}oqwfWl3%l?5%q@a6Y;&;-8GH-s z#SlfOPY^}7PYoRUH4in2WtVz}oM?)wKdVwrR%atY^V7er^J1kbIonmS(dxDx%4*cn z#Ufq}-%V2r+K>OkLP?sSWsLc!{iy7kC>8OeR<~8P7N2dg)qG`ti{YvxS#@BGv5`ZF zQGH8=FDAgadbUU zsZ|Hvs!6IbCie}{d5$E%IeT34`Aou4fw~4KQ$MH^NRrF7rhL@s?7kxUz z%3o+x+{3AbfAO{DV>y!{aN%txy0gcmwi0(atui z^Awc!P7~>F5dRFdo!%oFwIZ_Ga^ry*|IVmB-3!O;!kWfjZLNz}$(+h<$LfMgx%SU& zXt3uCH&p*`E&Xc_mtYY_D4N#4e33nXVnuBTMpU_f(JGIB|0WvKYzj`5yi|R_N`*#} z=1Hv(EA)6(!3dQf`&2=4NJQHv6xcp|w=8-=yVMh7+4}juT?jaD@&=*7!S8=kSpmmb z!%Lbe5uIJz1)iCS&=iIs2_y3mYkNav1=Pf#!S}g_O1(P&a$2~@4~hwaM_j_(@M-?e z$7TiIUTz?NC~gt?EQPOuVPH915D`JakRlAp`a=Rzn3^RuS@IJrNr$3>LSq@}W{V1> zwZ?JN0Bm`JB@@%G@sI0J0?4NiW2;~Yz8;OQ;K)Zh_#=q?Ug@=KlEQa*#7DNab#~M~ zYd`cBIu>pC^t3#dWT6cCYEYkQ9FV*pLBO|sE&ttrJR+q!A;si73QaU;#{CE-%}#MJ zA{SKqB~_7axnKko%ATp(tMkcPCL|5~BPmeAkmT? zs}W&;lsNkX-8qro*wZ^Pn-6l$_jH{1;Co+EaNoj@x2QK(1uy>CCv(rtJ1Ob9U>gKD55f{hKx8b()5H^qjv-{q!0SMQ16yu~A9)3{vg z{O7i*)5Zrv(GdAVDForaJveZW+(G~hiPBPkx%PFhqLff|s9c9ZvY#tdCagm;wu(ErjBq$|_h$9BYX-+Gh`abOVksI4;NqVFx3GF#QMf zbE{r;VmXsvj2x+%Mb_#?l+mU-xO41L%2DOrv&Om7U%=I3Z-+d*PQb=cy zRx%ct=y--$6`u$qhFqY$zzJkJ%k%wU303Lxd5+#$isa|fD)qRytA{J=WJgw zR-4Ko(M42DJ3b1-SP9;_2#8CBXvwy~LYUC6?I5t2Om>^YHXWR)!L42WYk7Qss@-I= zT(yj>0AZ|d1rL~pKHR|IeJSyx2wtdm$IZ@O7P_$S5e z6Vk`vm(;`HM0u=;UcpT074)m2uy580c(_m4i5$WQ{cJ4K2gYnH@(0CiEaC_ItX!4f zC!(`XJNZL2bpgI{vwg)0E!(4iSW0)h^+$#$X}kYpL}Y@>lE2Uoi=UB|raq9~SzcL2 zxNZT?I}%I&rFBACWZ-i9apG}-Bzz)d9UNE3ZgKni_GH&g%zO5X1JkjN!Px!Z`B?6l zm`_xKd%7y@#L=d#q1D*yFT_SNQ;L;HQc$ABZqul<*f2x6vj?TFnT&UThtRQ}Xd8z+ zmxV{;x|A<|Izdk`-^Id)p`>$26&IB!VOk+$GCJaU1`ScA3kB_i#lSmkkXQ|kxHubg zTZc1M6I;5rxF3m-o4AY;XL{Us3Sh8ElHJ`I z1Oudk@2Iw9siVRAWLuu#VLQ+Q)vCf$S^?^DEoRikD=B$-s&y)V>x-W!`*Qe}?W)UX zn!j%=WBHa;I-k-dJjm0luo@E_f4^NgPHnwiWafSx-(dr#?CQXF29^mZ3ROS^3ZU%e zAR$=6#(=Sf5fufl1a>oCApefze;TXP3jq=AlnZ$S_2$n52lb!`3v^ST5fZ=|CI;rA ziUJrt7v#l`-vq&b=q2n*=;I)sP-4c6-88X3MTO8Id+FG8#O8@5O3d5HV8j@5e)kQ{ zUSku6sL@$oT*JIP+1ijuTWy(NF=Qr-GU}=yZ>~1-LeS*`&+;HNW+@xH-V6X;Al0u@;93T@3rmNY^)LG?!qa#ptIgPLGrHSedpqT8k zlVM*wz_MLJ%!{S%8?PPln9tj@rNdLkAEr*1 zm8GpjG;udJq~rypQCATO7N;)Sa^Tr85FQ+ImaO-O_Ocm2L34?hVF7GpJ3%PdJC>D! zNrN!k*Yy#9^-uPhqty+pr^e=vjO^;Z~} z>Z#xN&N%8l090b#x&4~5P zr9u6FYPaoR;ZC@18bez+(smMdw&Usdw1*V2dJ1+cz2MG&4^0T9&S#eE8Fo=8n`A$x zMC4^jFbRtK6scKM8Pv3~&`|!k}$b247b{rbHS4=4< zT~o>tf?O+^6|yh$M+(MCtKON$1h{8n~8k zq1h3C*K-{h-7yzc7l*01(f3sFp>^~?bSEGeHLZ2qQ{#c8K4>Bc8dB=!72HREfd{zq zxVE!w*juK>a6lBM?1nj|-RQHP)tSN6ns)UEvN86o1k&kym4kob?2mIl!$#3P?NDRr zo%Y)rb&Uqr8oZOif4UE=dER7V>h1SuV%pyBR7cf5?wq@ck<^mMw$dB3TxS)*M`;TR zkTA}(0e_84GLG##p;XL|BY0 z%aKwD)|wrybfJWY0>(FJ39%uw5|CTMTy0?2L};gP$@VKy_H0pz+XNebWddMWzP9vD z>uKltPI^NQyhd^YQ@n&G!`)Ol;I9`TVL;7X6owIwIMp;Y85|97=d^o^ZkG*SyX%Bc@QB^+d4R| zZ=ysfzf%Jhl_yig>&6^^XYxS()Hmxv-=W6omxlLUB5@gKa?ukQN;{RTJ%wRfIEW29 zxl*O~anNx$bb=9FYCI&}P`? zgA}-k>0xwL@Cvm}>h-!|Cau^ERT#|Pm+ly6*+)3_2;f+bb%?=#-^bzWZ}(2Pe}Xx_ zh|DTI=8zL(=c99!?H=ZEi*~%$nd;7Uocf4ix`M}X@jbBf%mul!&0_IA?s_2?y9GZv z8ac~1*brrETdwF+h1!+Ph`nq=a8&|<(Tw2L498$0l(qah>v2)UdQkvJQidGp#AVe1 z4fi-${H@5GJj4ut;msT#ZsyyD82p|OXIS6^2HY$nPKlvgP|Uspr$6}#b52pCTLkSM zMR!c;DOFB>Yn##+rR#BTpZzOo$mz0Mj8CM}1D@=B?hW?`rs+xThL0rC2Nb z;={c}QlXl_F^74JeGk|(%2>K5`1}@rGV$nd-HlQC`h?DZ$lgM9s?AGjOL+%ZCTkv{ zZkQK$UtnkYCQ}&B0)l#1wEM;x5#wvPC2!j#>d`D2Cw~|fobP8s(sSwgJ|R%3MvTj) zR8rU`AK2hcGXb$}JKvcv2w?3$No#&^dy};12+_oyf;(G0X)-G(x3}ki3&>Ar%e__@Y+m0ln@>!U0SQEvYX-Bd!;tfSXQ8nv5{`$V*;`U;nzO1?qVJ#2K{p(}+ zCtKInje!g~=g&IT@k*TTn?ABv4H552n83xGigWPxnd1hI=p)>ZAiCr+%qH5?0vhv# zGZE|8WTfplr%Nd(F;(`$xT3+9HO8D|I>11GKvRWENNw=tyJEtcXKC4#aEM$rejxdB zt8rD>(a|=;)^FKR!s=T~@&pg(f$E1TRsjsGqs1r>yw>N$t>zEEO(^r0fgSJ zzHV%lr@J8;g1OtYM?W|@JafILIhfpkKej7$26{hNvPUKTOsl!8qa^M<6|L7=y%{WtW5X0(dY@4<4!LjF zhkM}xvt+VB>K9&wACf(;BQ(lp18y*?j0Xhr(0Y4cVbU~T1DY0;OZ#_}2joY8Cj9{Q z1eO+RqOo{PRVw?kky1}RC z#_>gMp*-s) zq$2~e#kgX5J^sV;6IhPCIc3Zu&k57>?smx(v#_QSUT+^w(!6rFI-|jV2b2I*d|B7N zB%4?aSv)G3RLh>NuRT$CE}5?bex^_UXQ?5C=}emlEGSPxo3talR& z-D5G&>kBSU;Y!HV5<(f4mvu)}LhRrfRPKD`Z6*3MK?JQSy8yZb^kTJ$;0OG~`Qx&- zn32OIQwgL}oiq*PW|Js?Im8O;ZXpNAoTT(3_v{JGwa5ig3L68=*(M!Z?4cTc7qke} zh0~>NEBj89nBu58L@%znHoq{~V4~-pPiE=02M+Pv>cM4AsuO3bznL|_e?-}&)6cL8 zrxi561D9K4aSc^D2gUCVAX?E3QPGm=5oHftM~Yz-$5YNdLnl^$F5T)cy*@$K7u$nM z{b~w2H<7_Y07O8$zokwRldsiUI5W3W@^KmQLC-ZzeYYGbl)dvM7LN8hS1=>+mM7gB$>WvoODr~gcW104GIoj5(XmzOp}3< zY?rh2zj3*A-}`7`)vu}cS%tRRBnKg zkiH-Yr=sW_l+*$=@3NSfj_o*Xk6h<~sH)`ZJ=IvqyszEo&0(Bj5=Bd{{ATbLoFwT`ff{ z&Ix$;j?pXm^!4tBOlHR@Ky#0uqF~UX>Hy%|keS;ySuoMg7qca;OV#Nv)!=kW(Qfk2 z(PJe-X*DDWFQNz=e~dX)>n8Jx=3s#poYtLi>9k@rPI)adbhFv4mD-%NHf-#sk={P@ zv2e74>9C{DFm$?4Y zGP=~QkiN^YY=&KClXU%2YV8sH@WmqQg4+7xr*D(R(b4oHf0Xcc;}9WuggD)jr)yfy zC=QF)B+Q|=bgC{+GL{Y7F}nkRo7)N;VpYLR<=oeuVvatHlRT%V5DnkHtWoIHVsy92 z3eP@xfnlHUIDwq`O6X;D4|mAh^44aY^BrwbS19~9ORH3YXG+=hM)1Oc$htg@9t=N# zC;{fYR#6;Gf2iUxSkp(ChEIN6Pk#Oul6O&I_{0Co*LAe+g^ED!04JQD8tb<+&JGi< zO8tWT@@@MLmiXBS5x~x!L@016ni=yZFTimQAt(@s$zmWTS)Uf(_)cmTrM3-)jupZO^$9;1Feu zKl#(Lf8*0eh>*-3Km4q(8@lejUKVw zQFzflTK?5C)x*KeED*70&q)8-#ck+Aj=0 zFKhN0To=@s`u=TCEzTkCjt!3bk*8o(CB8h(ev{ ztm_@|d`dr(`CX+-D#$+ly}FO!%DQS7jr9hO^|Z4scpYhzl~A2Hs#1BZu5S)N+1B-= zbO$B@QbJZ;fy6b^MkPIsK8ch@AcWAeN4DU4OrDiq$SH(9nDeNCQ$SA(v@z`CuSL65 ze`FJq%|BEn_aDb){(+70cdGKYXxVyM5C)hK-_*ife9dJjSdD?g6tsW@Wd5I zwI>f!5|soYZfp?vJ|RMFe+mP`u#4^bUcRX}z&W-bWDF`CiYQbll%b$%NevMU^f9}1 zb$C3n{((-q^x2-1x%Obtd}L>`JL_7+e}XYowPg(*KE%tU)a3bs2RdquaB2@U%XW)u zh-`#ySbYoQ+e-o*R z;+FDjlfb_S%JpQYh>w2+!0F#5&i;=;|7+cU=a}w4(dt2_f#LP@^71zjCA(Oh!v6AQ zI0^)_wXuVIIIg8!Ttu}gMDTH;5$xpgL?Q;6I?+e#>6bR$-){UgB7TU-j#O!sA+)Im zl@`DVP3n5N7Ym!6m$+U8-UVdOe|JRyru(sfH98)a;p_rB;RP)wH$2ZFTSZoH6M{{Y zB428iYiz4mGw)ov+{$&eaFK0eo}n#u>fd|tDFdEMMF)?RT5k_AMca6Xx>d3hK9cy; zer8Dsw($f1@(wpwHds^uEdGUW;g`DU82;mr5dK|M$p0BRMPqwsjwO}Fv>Nh zdCXnMYQynp!;|&x@-4L%$fYj%7w{FS9X>o#*nYnDode~FNUR}oj7$hKKAh!y zcHQ}ay_*{S#Zs0+>iV#he-^|bLnn{xh_%=Xn2Kh@9D8~ar>HyDTiVHcCsb<{nr*Ma zN{-0#{zr`Q?@rNX-e|&%Bss?e2iF673}4dnFE|3QX5-&n119P<3gJBTT*G|~6>qw# zTi5B{^WFnDykFNJQ`?$pX@ZFYs*=(S=4_T`sWYHf#k`<^cYUv9J<=K|}lCXSz@&l7Ytxm$c4KuR+oQI0Vt zo+Z;v>P0k=360mj;v92`uau;*V8op?Iq7p5#i#M9F)!FPyNnU`Nz52+MTDfO-xILV z^3BDG2jw%SCC=oLf3VR?D+ibA&6KDzQWGK_oh8oT;jrn(l0}-c@)K@lnA zToB7=Ba7A|Nm2`-L}iTskp6kCF=~|Mhv}cMV#32=XV``muSXaR-RvPAXa1??-J(Bt zpuWus=MZi;u||3hv6PGyz;I~TC? zvO!)Q5%d;Xe_`#e-tT!KWM;u4W5Hl!E$ErQ#F#>=MXRy%&{aa>ml-qn+aF0hJUk;V z%?bZ>mF;=eemphx{{Hv~?uUC(l&?R;kH&%9$ax1=Qb#qZ356M$V2Mx@Ol*%Mpp$J8bvz41xKOYb55m3Mkp*SjcBZ$w5bQ^$QZ%fqes zpCb#}dJAuxDG*p)hqEy?W>2x0W2-0?LD7z5vbI$!;=u?NL6ff|o98 zqpMsne`dAW$4#?T{i~4AMeW3jLgdsVSuPtuDeX6gp+?4ds+Mkj`%_Kpp=;MjL#S<1 z(vbOcaO>N#+@_YfmCdnw&A4P>nq6LtK`z;JhNwp$>086$dY15qsKc^IX_IZPz$ z+T+BKRjaEt^|xxJ*%98>E@a?d-e9_4L242})dGrN(^)_MkF;0Yq<} zMlyWm)qi;>mlhIIW41sblGh%qq0_~4f62ASh$(X7QBNQ#x)pqv!V(A^QF#Ts?3>$9 ze-+mus0J2N>JNgN2!bL@+@_3xKPkX91CeG25C2A%4PAHNd#@S6=r57bz(1)bE^W2q zg(;Wp`}?n@R;6y{@8W-CZsb3%;`99rnfsrGD53vA(3{)Z{J*a-xB+^Ez-&bdCqeP5 ziMqJp;P$ZOd?e2dJZs6Myocjm3^yP=f2jB$1Ylk2cdn){FCBb97ja~1WN8dPszyg) zB^6Dg30DE_ zE6%RSw54K}2a+_?Bfe;UriDV)1ov{HMwcRkg+K@>T(}Z}b;SmHGD31Bu>Bbze;#4~ zpu#^s_Xy~}I@tHWwH_Hr82;{bEC0#Rz~FJsJTD85zAd45K1pKGg`(&Yc;8{2OkhN6 z**WgK>d^UdIp-q$6&qBI#v{E_7dp z9efd`L*=*ilBVLXs9j^9nW3*nw%&0BYEGH{IOZanip`G@yYnu6!~|BHe?+a$jpY6= z@Zo?<`YPBmybQJJmLwxq9mY{8y46MV>8p80V5dA1Kj6s;8+1>>G0yE{Y zMUNI`%G3s_)jgMHP1+??f9{1Fh*%cxe$K&%LtPebSamfp9?THs9nDsDo(-D|$ayt> z?A&e)^%|14?JdNT3vvB77~(JB@xXE>iV`8ZVhO3zyVP!?az3}^)D#E^4uor8IF=XjADR7LTyB1Hi+f1t-C0`Drs4gkHZ z9J!ftk$cjsk^b)Ysyep-@m=ZyG5uYVW_zmdTZR#9qjvU4%XYXBV&6zF!ROOX5qkg^)(i7RB{!X+#U^T(J^f$+^f<8P*eyorW{3_cuc zxPvhm+YnzzAGkM)f3yUQ)cUJ26pV$|8{1^OqdvJ@>9G>T%)MO7yLAVlmiB~t|60J& zXxe0t`a>c5|6NA--yHzPzrEi62kiA>PHe{!IYd|v#*=j$)+NGQ1}&%7^2^4IrnY(vlwlF&4FIprkz#rO{iu- zyuyFG@u%Dg7iQSf6uRPisw5dWOzxTpo9zSUn3z2UMoEWaxb5j=@Qmp@5mC`>Gzi{f zdx{GW@OX<;f5>KlY_$$mQ<0KLy|vD!Zq^xpmN+%%M?#nL&^7y_V^shJE6Jk@$sqf~ z4IVx>yB&{o-l;xlC7dRjZea^5O=!Nk_d9cZyf2yUMfoJlpeh3)r#OWS!aPi1kbcW1 zX-8f#YlqK;(rb|K?RFe?6PG*0K>`9|Pop|S`6 zOK(Odm*S|nhj^m@04S#ret$(aW z|0_QJe}7Mtzgx}Hg!Dpr?Ed;lAZ1#GAryuPMNy58^Mni~xE-tKCm0PeLWa?_Z@^6O zpS7 zn)aPAcjEon_v7mN`sphaeVg+W1+jYfTJph*e^*Ct+i4#5AwZgL%&9XoO*RZ51^U3~ zEmfjs^xBfCTYMchb=^@O*F!%0H1q~Kdmm_E^>}S?6$^br{(xU_&9}MoP+IWFbo<;c z+#7e=yU`TqLpfh7yj(l9&&K$%B-2~CJ?<3y{27?}DgKom3&<5dcTT@@p3gn?C3)3j zfBV4y5Gm*#dthTrjvLTT)yKFTyZwo z@<T}Ss9D8OgcV{!f0z!^q0o^~UNRK+RLO8%lUCvm+wI#IRly(>=?=bNrzZ~o zQbQ2sw|ND}Og`viSxvBv6La)AJN5Y7+=K){ zHdh%~@PS6#*m?7k-?^1E{p1z%;!ch#%bD5OWhY~qhztaj_u;u{YW^xnf4lJ^*9?gB z&tOb|nZ9%%((fR;H%kz5^qs7FEuG#WU-kpwAealHfsGU^^q~JI?o)ir&C`-3JHehkZ+^#!3Qv zsWbuBhuRcpqjX}z6+5XAr7seBY|FQ!Zl%09b_s8#-008de|#{e_cfGitfkp8e`sxf z!2-$7@!Ou?T8sewe-_-?rnP(NRX@OEu+NcFv0s9B2lgO9Q_?4#3dDg;gg8%cXt7|j znU)AhMVqxhn0cb|!n{^~c2Fg~QehwQhQc+eT~%GIe=M(h9(tNw?Erw7*6<63 zq+a4-Zb&_(bP{~213-e3*)9UFq`Iz-g*DB%>sGM?csNSz)9_)1kh=UWwES=Ohp2v!=809zbs{n(s6U1b(z7}GAU>${FVm#ln68P3O z>lq7RKDY*1f9EO&Qz57yRC{89)SFr(z)o!5ExZ5g9W;EW_9jX&F5}%a*me&_{F6V3 zcL+yBHwP_2@)JJT_GlwdwpV*E_Wn-_H4r)shTNHU7i<+Bw-(xt+o&k*B1De3UG&$( z^VN&fMX8DAbfaXf*#{h1j=A(^(NL4U+=JEnp4=O4f3N0#>>WvZSHgYSut9tpimMEN zh^#X`wRB;VJ;8r4@0cJ2?vcm7keS4DFoSpK^|5R}J`WYvBX984scSF~!Qnw8gl{ZQ z?G5Uy|M*%46inJoI-?bZcUVvPO`zd7v3PlojsCFo%V;N`opncD|3@rIrWzRJPLXNz=i z_62rtR5oG^*;g_6uNt^89`YwDa~sQtR@N4)f6d>&`%`-;>&J55CkDkW7#sSoQa)z+ zGkdG&SHYO@Arp77dPQ{|TVSbqhh-?fp>x^s%i*WxxBRIT0irDFc6%8LRIl#m2vHa3>^Z~h~<(uRoW;!Q0KW8iqGEi7mu=gZMF~=^q z@kY5cu3H(R!SWzg^uOpk%HbO-G(~f;P|d6sG)`0UAZ6;&Fypzu&gR}|r{*_^zR4UK z)x4!s3_MPhvQ?CBT8J9HY@AM4m_;DPAu%T{KUx@g#qR$-R2s2TjEA+D1e3;Zis;!`%cleF}YtRk5mlox44q%+FNY8!7Y zFOkfSpU6&}F16qhj+9nCkLbAcDOSYu?IbipZT1`SRl;&IH({rb&Grpl z<*CustQCo`vCmB*-mYbh%3Mz}liD$N2`Mwt(s}8h2u)Ajc$X+068~tB7(QCHyirP9 z)R7P_#x<+KjIjLD2DoW0f7XzOiu5eg-S(uKRhc%ah&3G@BvFI_0D3TB@4gOtXUWR2 ztn=VQ+D7}mOUaLh1)pVs9UK{=MHF$DP?S+>vOrEbWwn z8FXZaMuRTxCH6%b*hP%EjyRhCQtX`Lz*=u>%K`z)RIr?zJ`7KyfxeEjBx5sA@;+-h zK@tPujoKRHjOZJ3erY~7(EONv8W&nyf)O4T5jm8_sUiH@f0b^7cZAVIlZW*U-$qH1 zlb0P~nB)np!~Vd}^+*?T#`OW8L-a!RN#`~EmRYm88GY+Wv2}W>Z0(J3jM51kvvEvl zi7J?C7&C8)4WKE~!0uNiqCxkaE{w|%9W zTd*!;v2GhJf3H77pTQ_7yg^YJv!GSbGK{)ZpqwqaQCaCIa@M4cxZO6$RAZ2S66tab zmaMj+(iv*rho8YM3gH=vid{G?i&Mvjl3f-oeiAx;UDjAfuk? zSXJ|Syht+dqVI(76PgbyVVECpP|Y^5xPC^^WE3W8ZNHTZ6?eoTRJ$FL0JK)p z&NYo>!bSz|&`55&CY;T8g_E{Yx^gI|X({)hwhUoyVG6yN9um8#HlXCmCRQ<*C=ZyX z73Yo@e|5CLoX|c5!2rH1k>h}60QVjC!(%r<;NBv9L!WN`!q8k`6*MtY-c^EjtD&xK z+$hH_%`_|TUXL1`G^lLh3$sY!>Bii#3N;@>ueqtH4V20ma*kfLvELZF$}1v?Wf!~H z1~ZRc>H+_$KZx&{KwlZ?nWf_OOQ-F(MLT4Xe@2Uu_gO(_c}8Z#Ehj%h!XUgJ1bMb#cJBKHIg=;;u?q1)z1q0)!R<5fP$QW67p_yG5X^Bm ze?K$314EQuSkJlIm+vDOA=BE%y0)(T89QuDNzg`%60PHUys@uskV%vB2De*Nfv){J z{E0hJIC#WfxbQUzdLxoxEMwmVrric0nfMTxISG+D;0|mc4Vv6Dyf;`UvVaCbq!zjt zuT%`X_s(hFIBRHy(Vj)phT|FfeXEkDe;50wD(BYKzJrD$^!#>Q0@8#I4Tr*-x&he< zEZNuJ5}_B3(0>b|TM!`5B+y0zuvNpF=``0aA~9>=rRX{R=t*-_8h$Ptej(O={tkU4Xjmja(%OJ>Tfe%S&X6gu)u-hb6vBIFk5&p_% zUK+O;)#w?%){~L51)Tq7&(nFMe?cdANdqQj{}Xz?J}?2jWQzORyaQ+0Xn9Po@ZuXJ z{yv5AMj64tlZD2cz9Jjgk~34(n~b!y+B5>^rSLEdK4t2vdTohjZ40}>%b`+ zFYza!^n(!ol$A2rZsx^U@seD?D4!gZB@;!7#E|SPtHE%B@~o~(Bel|@0{Tkon?}OJ z{jQA!b}R9%>?&a_3*kP?e?n|&OP#pY*y5(Brq{)>qiVh}(Fe-$7mNQnTl`s@vPhp0 z$decTH6DPjUvbVe+4$F4vvm&_jn-Mj{#FLXmipq5@2R>|8A+DKMC-~a)em<^Y_Skn zbfa7NDo4>!vt9Tp5onz>0UGBkQADdM%+ksc@E_M9b{gjtqIJr8f5~Sw?%znoBRlkO zu9_k?|8YCR-L3R@Im?nZ|3Nz?f2VUsR}z>_NP%48YzVO34CWizGHfKlE{oN`P0)zk z#6@7bNrW=ovdf+&307Wl`4$c>uH>ICEs$*P+dXyU)|<_d}tPwLSTQ+1(z^$kG*tdo;jwO)`WN z$lkmdqI+zSlo;w7RV#8B$z!L_W@;h&JW6!BIE zlJdVEk{0*4BZmSk0Zm1D8gru`339#f1N^$n_qY3xe*tsP?zf66Hx=X*&={H~CL(NG zkxR}iClRS?GD?qt$BJtbmRL^cCo>gAGL%kAlFeKzvaDR1s$-GcS}x%SQ5BORhen21 zQUGNvv>Of=yGOGBgwsk@2u#SoyN6yJ$})!gWR{{ABpYW!!fZt`Zp{nu(yg|XlW1Tt z2{TG8e{MVK>@8Vp5|BvFXXty)n2$D&^IAwlmYVz0d&{dXrdC=NcS#WEJ=7HHbb3`uzJtT3Ca>u9xcUKvSM zf9((Z6C3dcJ_h1VeTd{O35EKAAshaNtw&Ft0cM6k_Fkr+a30AXGDOI_Kc&&~-a&jw zB@ONHUh^i!J!%tOfs6cHZk(9EG4S&^ML-RYM>T7MvQhSDJBx2Pa>t1Ip zp&;o+NQ5JTxv|ttCKiIz$n`7cDNk|= zrh*&fn&$&A#^I_GpzUCI61ByMfBRSRyfLoN2KAT^TQ(w>Pf=} zA(gLCe<78RDpPfhHx7|we?+fdD@duZY`dvag&F#o6X@@nCG`P&nKOC5>%J3e%&)e@=}T%%x_sWKehbY7VhS!% zxIbwzBdl*0At%L|yMWVSq@;#8TER2c46gN%&`pxV8;H`4ChU`{fBWcFqYkauWa==o zjhfj8R1UcxdK;8jbEb=4+4G$^ZtyG;aPczdf)rwRkfUe~8HYky+2#u`;Zi#yiaf&> z!W((vzaf->TC_{!B>uK$JB~gs}%Xabs+z{Tdi#VFV2~N+ixgQ(NbFCNB&7|Ev6C3 z-&XDhC~WozmRCL|)n5>#GpFL@#aL{KNe-4!9Q8X+f}6&7^}Yu?kB(j2+kXS|cH+)z z4gbK;F(u7vGL!4Q%r$#6I(f5ImkBu|gZ&o&yQpAJ7$ zfyy}7``d(XDZ z{4jGKdJDf{f7mWtJ%Ae}WTbu`UIV9OQV_Bo=nDDkko07W`$9C3Rh zO9SJZeT-f)iV;JHouWwWiyRMEKc2BcnAwGn$Ut`#e};NoeK;{XD|}LYlm?>BWY}JI z6jIe>I3YehIbkp}nyYrN%vtn3rp$u~mbz|vrjl)i5yRZl?Il7lbb!yi*y#^}n zGWC#JX)ZP3$TT(}!HXW-?EFtMZDkPn(wdZ-95C59WI|n*FSqPo?4!)ne@&B$J80$r0097W{>LdNq5rN9 z{u>S4(eUs_UcveOF=fq|;p6}Z`~wUz-oPsRYNtPwSSii9`J1eSn zW76`xs<{POQ?p69S&5QNlH#d#Z*E0*f3>riDwJO+PSN)KY8q!P4lev&H9^+r@$}jA z+O>PUY0$O`TkJRf2@7tb4mFQKSg$-w(WfA3UG z7s~e00QvUysNBet*`I2MBi#pWs(v5b?YO)smp*uGT=;!~f_|YtUyA-=DAiB-$ZSy> zS0L`f14X#WMnU{yBiS*653~m7b-?b@`>YU`btC5vAad^XO7`MoNw(Z1#oRZeOb#k1 zZihiTYwq{dxlTuHfm5a+THEfre*;j0=TU#UiTmw#-g4%@Uv0au1(1IBNB=_poDbyP zn}PT}?4x|C3{>G#4_iV03*(!hY!MpNrOzgPpwv}rO%vRb#i)AH9~Jh>AaJ|j9ipRU zszr7NZ9dSZS9FUp(54AoQk-cxo?i<5!nF$lS520@3Px;`d1}q_qLa?Lf4OCgUT5*X@=JV)oDUjf3eD$Ai`eP56URX9p_=1fFTUMw9a!k`|8V6{Cuo=T2$+) zu6#)_b^>x&`5qMvK`cJ74T1=ZP+;qPzA7k3bbTKq4J4?vCSv3|ok8M36Y<6>I#@6j z7q%(N1~q=QqCqfNz(tgOx;L{<3&+s7QHVQr*TD6%X$Bu`4fqZNf1LZO07gN9N^AdZrx_AJ#VM`y@5p~O4l)BHigW$zo{&F`Zf+ct{;JPi+D!;;f)DcDP zNQpA_APM-6LOnP-ewNyK@9T|!WbfV$Me6}>;3$vsC&Y%b)hH}5hjMp-7Nx5pj7@Z; z@1Zub$6apZ^Uw7Ve;8%$7!2jh5g)ej$(NFXf-ZvuG^q+Wy^jAsncRtzrWvyyeMgJN z03gcmh`_E1N|?R+2m-c>z4VAf!EYG*fJUw*j=}mw1~Zo-u%_@jtkwKbrwvo3{BSr% z1C$m`Q<3~hJP{zVY=PjGGkl{Yt)vpU4oS#1rAfS4iIcbre??NG@?wkDrc0hDs4v{JjfOVTL|ommx1 zX5}JtX6}4}S#JfiP`b~;*k%K+B2sxnSzWqzo~)LWdJ`@nmcOyc`~6Q3KqGZ zLL$;_rot?s^Af+--;C5rrLAo*%Szen9TKytE+2_Z`_2xAxCY6Tr^~A|Wmc87xf56i zO@s!Me+BoF49t z6j{2%>E-h}$5GM;48Gkr#bj5<8pC`p^`U^05W!A%5LwQ@s?WTE^@Sk2nLiUN-w8Xd z8Q}rkc6SlnL}UlxW<*vp4n+nmWG@A#c#&$a_b_(n??BHoG4`^kWLhrt$OoAHfa?Qb ze|5pNg-32krX!Dzy2G*=S$T|XDTIbGQ<5Z8FqeR|)F!*U9xpxX9pmTT{^qdg2QTjt zQ@i`bm0b~K?fRAW0z+b*6E1ilUdE=-OG3b6`zAoO1U($Hxae`aZM+ABZtHusZNkDM z*ta|y;z_8w16b2bjGLWTUJb9$J!Bi`f6JAZqwaDULn1UuQ;8*DH^T%KX3}JKMH!;( zC)^X7pwdjl9~@@|dQcxOxbB*XU|O@zQmqbjPU~j`Al~^cHot?`Vg$8=h7T0biS3S0;)t(y_+(<+<2aBHDVuZkA$zr^ zol$unBP3Y(D0acx+?GJvBPCezf333`HB8eePUpJD^P0vBKIqb~MJW#<(=ls>FgLSq zZQNp|$I-#c1XKNvqxIF#TnVFn_B7t8)c}CHp+$Vu7F0Wjj~2P;biD| z98*YMsvzsFh&*DIkl{@ck)b_FNaj)?ZSPVeDiD3U75q4I{SjG=dq#$)TaTNxrtgkc zD$L;G0{LlSCD)Ckhdc62f9xsh-3-B`v06<|D{WFz8(}dhX=iE#Eb0T-(=cCEw zHnGXVc2iodt>^0z0VejuJ8~c?S9@&4f~!XiPoLIhUf~0NMY}Oof~7oFb{wNIvSU%w zBRm^#Xi7W27_&l&`=sZQ;GO(*GN+a~E$gC@+|!u_mBAam$Q&oqf@ks^VY*mMK|*1= zC`NsnlBTT8V2P#~GaNlLR!XI87!>k{k*f5IjOk3?57O|#afq*pQ0 zb8WW3-4x|b3X?@1cQEYud$S&{EZ7MlC$U_~&?AYnaBpDj1dOw`Z9$DAnN5;i$;~59 zvruoC>m=L)Er(>+Nt#7mciKCSp|4oRp2OyuWDyW8+l`yYdA=1ej-yQRP^}~9VWz;C zc8c@%3O|{)f6O+KFc8J*sG_KedH_IMq$Fl6EHHtDS|Kp0VDynIf*oDnX&(u?6EqWw z`dEA!KKCKHB^Bf3DBfseP`Qe}P(}@YU?6O$n8B-{E2qK09C`>gBnmQ~p~M>FFSW1k zm|va-B;--kcKbhm{Xx|OYb?av&8WR}dhQ#TCnS^{fAdOG>UeAcdE`&5xtop!a?~nB zOF~?NIyw|dG(Trp7Lor6m9M!Ntwi6c!_LQYWp{mmxQ3lHJ`!nfBk^)-j*EBgaQB%#r{vZ0ptH= zZt(AhfB!fk^p#gy&WsbgC+^1?N%`?5{rx9`jRz~?hfRe*n^>5r2PnIzxf2s6x*uks z;iFuJYF0Z9qo8bU8c=K05zCt`TR>V?S8q3aTpwQVy!@`}c+Ps+v>rpH;S;)gyk1Ur zy+YT1U%sFK>aq8z0x7d6W~gl`J2GZwux%^be>u{!p4v06@=G(t{@Lf2K)5Rp76ffk zAD+E!EjucXSkizr>vac5VABKsc5mYw6ai6M1ln3B+Dib2|4QPX)Jc(OpZZ&B&nBTD z);jn9(Y76fx^^!BQai8&V?DxzpldwR1Y15Bas2{+rRmi%<;Vx>imC_m@_1GNi}@gaX6)kys~(9#v~}D!-5#X+o}N&JpldoB zBks;ltJSZ!f!&UUlmo*)AM?ji0lV!NKy?-$%m?yp$jzdmu1UqAIBXe?rD?I9l2E+XhVA*ChkcolCckzZZpgeK?eX zZAY{_Jw=7EbKys~J337QFR{^Nul_I+pt;6cR3Y)l_c9l;gQ8d{#}p|yzq+`zdGOHW z$-&k8ZI!|C(Up^93v7ClG)X&zr8p31V=Dz43Yr05g3w_u4K~V3me+1Mx)Cnee>t+b zy12bHf3mT7b6L!1)ilP5fqQ?9vGl6SWtnu<0rROOIerCyMz-(2R85_9nK`y(_Fr> zfC&Yv+_i2{O^PVSmBp1BGZN#WMG@L_^v_SYFvNCJR1E za_pVmrs9@S3oHf+c7n-jS@`fj+{>sSVT|Y0-APh-aA$%)wTx<%=H&(~++oXgrL^T_ ziOi&U8VrVn5d?2Z(j4P*j?byIq}@kq&N@swTn3x?EYm3;_}>Lfnmrzl#|G zb94Zf3x#7sCZL^V1`u32E{LztIW(1_$BwQMsb5*OAq?GY_Mc>sf1SLJg@Y^al*0h8 z$OdHTL)L!tq3=QwSS4i)?MBU_|h`2Eb zJGh1h7O$%#;EnsNF@l}gJ?YO7etJGj4m;Z@=&GaP_Tf4Wf9qVkZjgVlo0L1;1wLo- z&5H%HrAGU%uo^I7;n)z*LCnDL1p||hl^!>?sT0IqI;-@%D~}gFlUnX=+$kjKF2K!cazHc510VkBDZO_$~6ki1CkgW}fQyB~P zG-etxbw-sJwqgT#gRE?tsdR|FmDx@K(k@4`izxdCf7uLQ+Sgj;W_ieV+e*<12K7>S z6^RVB(z7UOC++@j+8n|s8$^BJPj|x5Ol<7`0(o=dih*`SU5e zcxx`bD{UlUS1IT4IxWQAYNMa~0E34W=fa_5e+GCwrKQH{B*cKXX$KH*gUSLE7st;a zog!^6o}8UND>Xb=U0YQ?JS)4gy)wD2un>1?4@_?w5OCvf0KDPycWa?LzB$J*F~fmB zKJs2RzoH|&t1CpjY za0i8ODEQW?VkX|vJyQvkWRq{~b?aVQ-Mce9J~xcKfOQgY92k6YdhrkNyc9+A6N?pl zDaPKAeZ$UhOGY#napJ=^kK_kSjJ!Z{e-rnF-NZvW_H2V+6Li%ObhgJbF@{OCuvQG1 zSnfqJg^3x;_tOt^yR5gb@P2xuW*L1%h`eM+YWL;QMeL;i$SLkf?Lx&?CM&fa4UsGaPk#M~?cM}Ke{aB! zFgf!RYZ}Y~h(}P%UA!E^)wBh%CieWYHXk)ERJ2l}ptDs9M*NKiL++3QLvLg)-0iBZ zH@fbq?Y#jj4#vXs-qJ-&7%Ifr8>o-yD2rb5m||{tJpfBUw7)QcHsuAlkR;@7N721f zc<^rG4Ha?7ZivfxA$c9g>&r4&CuX-8DSxkt@dv68naRF{yrOtQa-sN! zHTNXSv8zx)Rcb^_>=Of9#@U8$h8>=h($^R%?tcv= z@JY_cM#n5RUpp~;*hsY0CIaCmz+D=pZdE&dIwgAi;OmKB9E;hUfO$n0GRGAFJf_v} z{4ANg2_@VT!(j+TSSL=*-1;oN2wHqnJ2eDU#6}#WK!88y&cXgnBF;2MY4GdCUnZZR;n9#7@CS)D)=!7!HnLk5~vJPubTE+$F?`B~b|f zz`|9cz#x|~k+oo86jk?3rlxyw=2AuBvlN>lj)|shmtyhRA!2zEJe3nZvR0h^a%h?C?>Od+HV&NBYnD zMy05nNA>2NJ_(L&>o|5PyC&M|Ssaj9-y< zEl*0-z(ZZlIh9>X%gYy+Mc49Q$ueT?hIyG1Z(xx`ixac%zy~qTGU?#aT1gJC5v%B2 zG}g&5^K6I;bJs-zkI(fkNPUjBPoPGYO~HP}*r`d};Ac6$c+)|Y=79c^A4nnS_`?>d zU|ssG*P%QU@8C0avVU2A*{5Dhr)%?HNET047QQ-|y|ng^O6t)UD>R;-Dp9$+%guMH z481u&i$prn7c#V-p7!Cnxo3rabT+@fA6|Z&Urf(wxOaxqaIOn{#xHO~0ta)i5fJJL5VjOOnVmtzEquE?kTSSO~S$?=t+`eUCA zNNN2oFVXa4^4W&^Ef$X!obFKy!|jnpWhRA4PcRFwWy`ji6CM*Bl&``qc@%V{m9HW! zg)mn#iT|}2*i98-GL_K~S4b|D(`1V?{oJuPNQ7M}5`T0=jnf|a1|^BQ=p|eY60aTJ zDkWYZ$bqr2=2iXzh`)#7@3BI%9vWag@ki2di|ji6Nqz0Qtco3oR3JYdVNjna+yaJc zf&kkOp~q1Z0I4k}Aeb0abk_~Wj+2dVI!oAcG~ePz^!^4CmFfY0 zUY{ufq<<}}c`lT@q>u|&ImtAl_Y??RNZO}Y@1h^cEXYMA?^iXfgPCl=IoAQxm z?G4S#2-!%l%E^Ws?*QcBKruZgtEkwvKWdUM=YQBV&5RnSTM(T>Cc0OgAY(7S%UBlJ z>qmw0$;j3KUp#VvK^u@XE z8k;GXaRp-#bWso73uKqcTK;DXY+1atOMmiS=L1h-e3B1omYa4G)A0a0P`~2^vLkko zI94F&N__5U zK3~dm$m>BaGhe1DWBeEhozhIqFz|2D^!HziynS#Mm9uThNyG1iMsj1h!N6kGoV1L* zY&@pkCPs+%zN?cXdkzYxT1{BBZGSiTZQ9JI3~_13gq!P}Cai2Aqy4?@eQ0=C7bY>k zA@pnYuSo*?>RG)nNt2(b;$QCb;H~prfah1*1*{i!nS(#=Xr%`%@=S>J=YqJOefL4g)l zyJ0PeU-deHc;6w;nPYvF>6dB{$pKP2wI62&@aM*ug-7{U;T1QAl0BeZva%}fYzA{jb$q5>KLHW?Cr)3)%v3vphq#GJTG$>|{q`D>~ zp#m7kolT2)f7#8A;3aZyLqB(NNKc=MZ!bdAOI+VrzD9-HHn~e6b^ea!f7z4bc9NCc zBM;iiaEIL2Mx43bdm+VXVXyJO))(2&Hl>XdM%?GaAIROurG`&BiW#3D=2g3Ba;oI~Fnvt{x5%50%h3En{+bpn z9d7&o;`|H+K0g0*K>C>qY|O^G_Z#|E2aubBdGkA%Q;l@PZU~;OeftgSOLtdAbPbKy z`4%e}FObKi@%&)!9)Fk6{jtP=f7u51*h5sGgn9ctutV(+=>YWWmoWNcFCg0=o^FOA zpwT@`83lKoA)0Dy3uWU_vGA z1}Q9ZUJp-3$L3I4U_Bv%8l>s)kiKu|$w<6?niJO1zceBk8GmI+E#atuA1gP(k|sz2 z)sBMp35-^v;pl@pH=cRb0G*Q>-Y6V_Qpg2d=v2Qw$f?myB1ES@1i34MW`pylqalvA zO4%N{kLv%R*RruEnpP@@iaKz1zjXipMfgSYgS%HkHOvAk+v&S;uh|V-_s#XM;+@8O@q0(OADWb!9{Gi~IrPbpr))7R7lRox7J~9|C*cmRU*@2u-{` zzU?rZ^O(KjdA)er`vIVjy8B2NR{j%2|G^Ng{b%WoK7RmXn$j}Xh!-#xq(vLEpYYL= z!k!w2e@qN}3OkQ}c&HO6TEbsCAkRKE}%5;7cwbx-PZ4vzX#&aFn7vHCd zc01FkYfDswfogHDfkxw5d;^ll&$^SpUaHk9YzkT`qgG**4ZXQgEeSfP^k&krN+IQ^ zvz&97!+*jv)t)ujuId|CNojx{xswH>Blme*l6+8Ap7_B=kSB-1E(*thUC<(w7f`sD zB&aprKD)C1mi}1R<~2NYQVC0FSFHVrMK}gFx-Y z8>HUV`Y;=`QeBz|j@bi^i`5#-*}7r6Pm1S7`AUQ2dZpr6iyo8?rWw0mcOfG*&hwb& zUw_sMr8#Wl7Gz01cw@4agl*5AS6}nIXl9N>FV~s-KS!n3?giU+K!XLbe21CU4AW-Q zv9Tu|1X-{SJvN_{!!Apr&ZG{XkhtTXl0e{!+%thLiE;orD^7bx);Or?J!&IKJLW#;t z*sC|pP!~^~;FFKG=qWLTtJ~&GiwS(ocEmgm*BHguSalx7^pa?s_&YY% z=HfCag`VepflK+|;hLpAhs2FYef}nR`DSd19zm<@6963D5?2|m$co}X2qp9AJbz{n zs6I;SzxipjqWP&kaISbga0TDcHg1OmhE<={Z>H}Lcl%jj(O~DFDBm75B|L(G2V})4 zEdBRr&)(E1U2ouIp7wWpePnstLWFpE-ieXF9a5}f7Ogf3Jv82UJzhk0dt!JsOvta) z9_(U@PxKA`F4~0w?ch-FMb-wf+S^`vVIc8eE_ctkp1rpadljE`QI@;4jG! z6KW0vQc`m>aU2gVYuac^y8aW<`$G11t=Ti|TEqJ>kGJBQm!X|sLg?Vq=x92Z>+}7R z;q!v$_w&K!&#`Xc?H>X@d!z~c)Q&qqXe&-hkwyYCg+Q);F(R{_n7sw5ic;)ZzZ&!x z{C2dH;?!zOrdSQ83P1231Ej>{XjKKzyC-Gs zT*6}ln~TgFwY%XHjO0#Gfrhtq}^+k&<^|flV#YpK}#$s26#S zGN79j6EaD2q~R&}*)7xHA{hG>I#A~*CDP(tJJP&&5_c^Gb$_igrEmyJ@JX_;+N1Tf zNk~b9&wN*vhD5`gkb-)PS+~5JfPtH12 z>USGj?5}t5>6YX8JjdxBN$u5O$t)w!RJ?T?!*%Q(<8*Fu7H>87l*bCUkNH4NTGxfB z2Kwq)?6w~8-@Y$xFb z`-<^pgr3T*!_thh)p2?^N9>Ct&WVQ@RO_a@W*4^NihxnqD$mf2@pTcr?A6!wC+x;} zZz8j*>lI=)815Z>;8M8A1GMM##f9_p#^Q+=ta9Tt)B1;gQ zXCOi(HNQVuZy-2y7ZpHh<~O7m`hSX=bD@guF&O&Gidix-%ct}ptP||f1fOfUABfb; zLuYX$q<>fWozvu|{9tza1Uv+5J#`7T1275W^!BA+Kt385de6NcFhAV>3774^yX3~Gd?A+N)mnxo$Qy<00#jAZYBNA&xg^6P^i79tVZbYQWIA9Ry`XujsDDZ)u5&2-oIjyRm!uF6o`YSmx*+9$ z@nXbh&`Mos1pSl40?ir@kS72w0UkSX>yv?VxdE-j!4Kqw?uIbJqn)4d4#`TM_ZbG+ zydCYVN+q+xKt3wkX>uE%C$q*3t~O0#?2S)<9aWwBl2MKh_F@nWa z#1Mojz!*7j54VE~O>~Dsz{H_HaB$hC{c zaG`8DR*rVwbL*mnsE+>;s?%%gcFr|8o!(DmObzZb$|%Ig5lioNR*4juYWO09*2JvF?thte z5o70(FcB+RDjb1cYc3IkUJKDnLV<~Mnbubo;{$a*KVM4d&yMw= zHdkM60Ori!fL(d?+&S$kwq}ERjDJ4y>?x4(9R;1u&r&T41JDHGt~MhoVmqw%#(~R*h9g?9DLduyLQID zXX0Ali4J43jB!{ho^j@tdv)&Jl1lX%iob!EoJDP`k<(_mZn4{79(stp*MBr+iLo4v z8aU8;Oyh%L)d4xmZegJQ79&%U3S}Ho0%cgA%yUbm|MRy8L@*+_lLJ7aQ`8t@DXCv% zUM!^fk6?faK3gYTD%O@5`76o+4@#tfrq=|*`k0AkU1E&31IU^`zY+z;cbI+7i}GL_ zaf%w{E66oK!W=p=4YQ|zE`QQ9t{{{Foqj>$E7&^N@LzZd>~GLS%b;R&G7)&TK=RaK z8AU?lc9FUJz5`u$;b*&Tqrq>{4LQ#JSm!~QBiH#nu6C^T#dfg+d|U#_jjs`ghzjv% zvVW-&p8I9d)E@u<$p1E>^Z%n7{ks4{1Iis+1?7h<%Q$i7f3WsWaeta^%l2Sa+O{ff z+m*I$v(mP0+qP}nwryKod!O6g|Ch7xxqbWX`>mHXXM7PcV$2nD1e4f2k)^=Ay!x8q zJdx)NffV_}kF++aTIxaMaA_6+2Ftqki7OIIlo~%gWDt~If;@1)CBM?RBw3I`u7kom zdDqeokM3;(zwgx4%zq0?DNLg6=I5yl_i6TT*A4q=57(E-_A5{uKR47Pla3NU*a_?Nl&FMlhN`QO1AAk4`15g!3;X%x*kvZIdUU_f&070U|pRPh0GkeBv+Kp z$|9OF1#_W4Q-68j!lFrR*X5qVq*RCxL`;tmnU!$2004x#S2a(fIc>TTI-lLx$#FQp z4TZ7d$O`g|zF%t+3%Yz78l$`}g}knS6mia7Ic-UdYoMLJb#3!FO$XzWHNuubQ4c88Glei z_;@IURCraAGTsW>xv;{NhPh-|U=uP*rq-7-H^7L!S2SS1obXf69jj3?!pKdfx1s{w zIM62}aD1W$L#IkteKUlU13wxxEoM!zYa;`|JU_4&jJ zQ8j@d9P%3>>qxt(h!gDr{0oAFcSf@J|#x$6r_ z84r-~p`F8rdIHp>A%=m8U+Uyet#25VNnzQHG^jXRCWe0F(Pt#(f=XIWGr)n>DsW=T zMujI$$8?``yBxY;nmFg^qt{%eS~e2 z(SO434>%qtj!#2rDuVfZxh)g<%hJvUY0ZmU1!sl(%N03f2kcJ0a{Ic6N9^4G&Ennz zd&Kg{kGP~ZdO`$SIJFa*pxfp40p|59a)^aQke2iAX5r$qv0i#)HPB%>c-#y19K_L- zlPhJ|#EoNw#b}D%xR3~s7q9ndcS)E6+JDDXqUpqHcTLmDdc8F>AOsIqu=h_occ)QDo0`$-9&&v0OYe(l4wE*;uDd=FXo-*hLU zte*1g`m?Cs?-g9~?MVYQf_G!x_;EG-L#IWGi)k5WX@6Yqe5ObbMcJGU=z8`>x_?8W zpPWspza3$rMp>CPPr<5S;z_38j4hLTz9w8*HK|JgaGJzGlP0B;x1qB{kDJ9*)i;qs zd#(oLcqSzF+5?6bs?TqJsamHwONjbesw#)2J@G73xX;6GOtUevRg8{xHHBIu+Rrr= zDvDl8%pgrZ5&=qk_J+bMSN9HlGJictXHUffbT~$f;A$C@|776?i{Ab%b{z&r<5mM^ z-S7p+i&o~~1L&({PX_ZVLK?+;_D1DHs(;()B^cWCr8p?_B_{}O7aQe!?#8;KXzv%M z_OSOb&P1T!CkzbQjuZ@9zD_@Ji(>yFpegGc3Ked$W|MtCjp}mkVwX=^RDV^eSWzXl zfk89MsWWEGEt;HmTBL|l!Ag^e>+aB{m1BM(l#x}`JDamW;c8_|dKaYh*kfi)+(rd8 z;Zrj)j`7&=0{Lp(MyA1wompZ#QFoORJnG43o0w_*x%~R0^7Fi$lcZPxb$<9^UrpWG zXd82#0Y5vj zwj;ztFWbem*xgDlDe6a)YQ>sMOY;G{$8FN3%uc%pZTxg3##(4npnn@enW|qrhohec z(;YaMsmqz%_ff#@MDMOJ-W}wZCfZ3)9aEXExoeEHj8lyVt09c+R(tD#Bgc?6WH#_Z zzT(Jmd3ZM9#Ft>XF#3Q$C0voh(2vNa@3W&aq)#+xJo(GuCnRFTBp!Og)=Eb*IOQk25U=_i>} zN_5ab$z(~q68~M97kNDlX3=F<<(1h@@Iq22cJgQa)uL$qgMSG}Y|pS{%ei0hMKh@i z{xHF^^V+tOgAM*A+&-r!wyyF(!C@ajY)=)uUwFv$TfT|{_q+fUi-~f(&>R)9K{N%W zVyZ^azP|RBs^RjwuQ^O{D~I@Pi!jbmjiv4}-P!fmd;+}Z1Qvc4BO&TBA4#1z76kteux3o=6$v_yVGdqsO>_ryD zU>x_SCnip6Jgu#e9I{(S=Us?|&5LfpDR@#ib@E$rRe!{D6LPhW;;xibr+ozn%V{b(`dIXz~oInD|LLtnSJ`vYI=q@ELUR=hIw#G zP4m>K0e@S-Ii7I)(aGz5&E4oXIzQogZ%02Il_Wyp96G0!AIFNzt(eewwYc?4gWM1T-*D~U8Uyc{(}To-($ z?{gVIhmuKrH>}H93Ub<$i_9WaB&TIE*1yjbK&LW`{oE@-;Hz zLGk%WM!#+19J*wtzSK$i%1telFhizqKko~)r++&OK!#w#3Bn*b2SfSMm&Y9dZ?9Ii zuQ@jFDTl9t$?dEkFKmE7K7n|?<9&OS_7p%*vc|a~m9jF%G_RyFV;MM#N0p3FTA_GC zc7H=nO_SX;R&f~h$PHIdan_plNP8IdEU62bor2lXmcGAuU=ez8hA;V;+#evo7U+U= zpwsLi*wAVAu2BiE6j$#`XV`#;uLIq~>W{)pBS)h(GP@b&rgce)(2ug3;~iTiQ=5azYzhgU6MvXHQw|PlQ#{zprI44i&kbH=iVCd zgQf+Gx+g3IyRQAzbHJ^i#UAG_q`|a(CW4zJ%6c&rhVNHL1M05Sgl-?9*eY$Hm&EE5 zOQj*tJ#m1Kj(?m*(_~9_AGA+Tr+-6{ z&Z1Ic7;~a$q{W$FEZ~+otA7}?zktxbsWapkPf{!}5t~u!a34@@h`tDtiZJqcM2pzdSSQZfP{QAHK`XM~j znACSXT0xgR4DG3_mJd37d2ug0ln}qhT#VQ8=*@_jrKS(l8IL)SFH+BSet7||45=eA zx~%Y`M5htqw!7@};g|xy(HNyMG-r`NSu<(O%jU#>qM%b1>Xq%{+ z#(pByjLW){Cr;?lADqX}LAP*-7lip|fw=R-84*3n7YZg6yE(f(MG6F+X}bw>PXx+` zIuEMpoB(affS(4K4a5sn6+RB@GXE6qzuAK=EMr43$OE#H{)MVoU4InBeXjxpJzac} zk(&oKNSDFZ#yPR$&9h}edpvu}Gd;9#*7b@VN|jv7K$8`>EdhlS+B}C#Bad{Rm{!S z-J7uqrtUjb^Bo=xB|y~EZpEbcoxjz+iQRv<&HMlW5co%N6+plgo}Rx$#D=^v|0by*pb@taZGQvwK}Iix2DWX}I?n#gt@8}#149B4 z2W-$+QOZc`dF)hJfr7L&?th-p@W*Qc=gS@{8=@*r9mj>2sd##v90?@ri|RqH8zD~i z%;Sa*>RO5tJAcIZ-$c-!rud2nXoXUqGw614Y$qsbJS6d;XMPF=;OBMeA=~-~nVZpQSDU{BIli|KEW6_bR^s_pN$)eTf2;vXEy9B~vJ~aVb98lATJFLg=ZRoe4x` z@Sp+`a(|gG*iRsy*PaN1x1D^rFS6l!De}bLUcbwOgMW)v``4-D_{nLV?Jgkn9!+qB zg1(SE)(E1vf|&wQiC752a4!%by*tc=Bz!ZBq%|pWt44ibe@J1J4Q0BanY~JME3V0y zvGzlwD^pq=e5Pep?OX8;+ra!v8}m`73M0#?_G;ttB;pLYuy#w;Al9iIM^?lY#_5@i z`ea}MB7bYuJuz2HIW~KbSt1Gdt)*7>X&iy7@*!i07(P$3eR~pTExz$C(6AxK09Hc{ zkli+qRQae+6b9Nv$*-UU=I!N067j;021Wl*P^#Kp`Uq?uC?G;?())6cOmh;_76q&} zGS?u>*{r%I{|A@Z{kL*JTBVVkWAXGR=0mooet(-b_idL@Ix>%Bn^_vpwiFhk_*gCR zH$yzNBC5>>t-Nx)4itB>-j*;Yhmw%psIc}FS$c9I*k?saJ@sBs6u6t1T!ZX6imKhV zFcFsuf@r@m(iFK{hZqE-`1s$z-zFA-6rzF=h+_J1?Pj`MdSP0tCfoeA?*5-+GyTu7;kV@ z?W9WF50V_?F;?Jj{GSW3BTMVXff_8GT7Qy5-bZ;?Lf`esvv%h*y)A;<9c1XzK0^6- z==pHQK2_+_agWGm`=)un;H8Ov`4e~Ln8hngoe-_^^YoBO$8#OJ=R%qIhLP0I=0@7H z=}bPx+KpfIhsx-#gLecUnNMEZNc|qA28JsA8S-+Jq^J)y1{MGrx`4``o zj@>Bx4UvKrjp>^dY8IkiQ^njk4oeRv;%Sj%a#jQMw8IV;fv8yD`A)?@Kv; za6g0o(&K*p$M19h!&v@z2h){GmVe+8-m6JyDyg3U&kr&WnTpyjkyTC`St6DM1ThS6 zV89}}5gXe%xjpHm`WDM;slGSq}oPQO7a3sJ6 zVwR5J1SS{Gx$lIJD#B}^Feyf#w|5g1nm-;?4CJ}bl($+i2pO6ZU5;){R%e5u!!%A0 z?>rH5V^O=6-!w~Zg@R+_F`(Si)_k6+!mp{XGxIRc2*TO#g9K)rOq$WORvr6Y1>;Qq zsYo}(5JrM3$?3jNYu7bC=6|T7(%wF?J%~%CheIreZ&LI-VU$~D#GISDhr#+bE2!`U;gNQpyqx^Y(782qpAMCjfW3;pd^^q&8dl3Ezt|ZX+Vq#Vki3_FzgVn!x4kfa zbKcJqHBzZ59ASN8k$xG}+0lO6A5zS_OQzuFVQQ63HYxR@7nR*{+WUX#m)56ll$Od_ zjBmpQJ*hq!uFY3F?jpmi6Z~|TN5cJK38bnJzv1Av3iM#fM}L{CBAQ-QFW7fGKw9(i z1Mu22oh9zk5Qu7@Vzj9aWz81mh8ZJr_L##;QNL4Yrg@Br2d^dC<%4hq|71$+yrZTd@VSQ-G;6q?-bQtfk1R@5agiiH&?=&VWl!Y#b`DI~m)TzL) z+BJU#>{;cJTLGKwUPZXRG!^?y7<6DD!qJNaTFxY~Ge#qjcXSC6WYHhHXY|rVyZ~$6 zS}@AYm4DveuF3Aktw`b*wa-Y! z=RjkWdUwD(EKA1R=8>&IQ~aV*SykgtmR^9#aq!i^h@MqJc_`ZZuXA$7;RrIUKI+9C|X9!?w>-x~-=l2UocqdcFSf%?AxM z%6v7eL7*@Ix*`p2Y$x@ZkHtmT*);qRsfE7aQef~lm&I|-`kVPOmL#KO5U~@Vd}fJB zzkhA~#4~iB&Nhh2p2#wmM|fNE6-%}C4y0D5Aq-#QUh`m`4-giiEv0zz)t7aO08TKj zXzr&E;40|EvVd{d2S)AKk3H)K8=nD{49sE)0(Z9HFK}*e!RdWKRDw4lD(PI(Z+^HC zTtrWA$WKHXk;GQSK`mk#JdrrQYl|obiGTU#49RcMzkGNX0;cf54k-{ zssu%8dN|zebk}U1>z@EtbPOXfQ4pOwCWu%nNYb>pOCMuPwX~P}cGN{?!Ka-3iY?7lF5@oLmRa z0!-{fhWEQ1K|@^-Y9Y+BvHvC@mQKusBxm#4bNh13%T#9i6l|T)uHtyX>rUXiBx{Q^ z6~0FhiQ?F1+bMaw{kiLX>mb|v`vZ!X)Qds{Ns{C^MUp<0G1XX~UW`tR!GAR@v{IiF z8>9*nh8%>Ef`Yz$rz31JrIMGCro;tvn(n$DGK;eRo?>YiB+H`~n|9X-q*`%DsiSDe z5k+I?W(Nkux~ycdLR{avHnbU~BVQjY-A$#}9WWhs5NRmEOlsi4#Y2>%v}L@LelrDe z=8alnt+wTgEskgltweLGZhtNIDZ*?-)lU_MRS(JmhOHE0Gb*dGFoNS~pdfw0Qa@b! zY{?}SnXc!1njR=u_-&DZ`d0ypxU z$j#yc8-t`v-fSJ(V>55C>pn=b&A2b`F|6Ui=L$0(P|B<-!F(uRxPOm9zKNQe6;q;s z>e)tr>25`|Y-5I6U})biW6RVE=o|{YXC1@5_&O?3QS58wxm?Fn7iQ5aEU0s zzL|YehxLQnUlVne zhQo~*nT#628V$GIOkxaesS0Vc6h)nhd3P6@6edf7SzYgakWYn`a|?yb)b^~|*jI7E z6*9)b3a1b&ZPJ+vL|R%}0?z8&Jh05CLS|TxpP5=~FrDo9Qh!PBhM5ZwozSqjy-8zf zc`?y4$H>#qw4rHROz8{FkcMe z!d#xr)Sz`@x_`|S>5-~4U-WyyP_N|XrXRPZVE5SiT7p=_sr@S8&=gE-te+4W9ECrN zo~_u796^k;tX$QHq-=3rJx-D0aI>Ay`@61C9j5 z$w{sjq@K>rc|m(}60dzjjSV#0E!V|sLb-@+LHk|9M6_g5Lm8ySgyIY zsc1{{xG&3qf$}Q(2bDz&mBkK|nAWPlJG>k*aEm6y(<9`^B?}GtJ}vQ41hxv=M1Lj7 zgVdlPq7RU1XeD0|GDh$IL3)zCo9PuJhK?g?Frpq?KhsAB|waPlUkU>Wr^CFNz2M(-e zkO}URahP%YKty}TO>vvJ$H3|!Er0$<{LPC*kZVU#blN@UaR2uiY-9?3i1VM?S0Cx0 zP)_PUKskp$C};OK%GuM(8|fJeSX&vJnK;_%{VfRh-$7ublD9RM5WJ^3C(oW{d`yEF z1TtXZpp#@2e~xT$!iQ;i_$DtlJ0v1Mmb-z@`ATu8z2FPUC#q0hDL=8|*MDKQ7vaEq z{rP~cfGk;^6*nU%=l#~i#b&nm=M$$7dj%;S=y0D1grJQjeD%ITy@$RYjV~JyPM=AO zRnl~%+oY(DYD=t7WJT=+)_5`mu3C-Fe4h&7>_!+ZU0OG-bKyMXMq9k|Cmto8szW&p zMneN)i-(1KSLL!%{u#2l6n~B(nu~tNhJ{7@Vp5Xtx&_r@`XLy!)+Oh8bD2Enx;pu= zb9rM={F=&IY?ey0J2J%>t@$!k+M2T)|5ppjkVDe@UBK)9y;VO9D)1GF%$Qt!r1&Ot zNn~xwLzRXy^s=l`(Kv23e;E8}}T5|UA7VoL6erPfwdtGJ~SZ|I_)N5(s(loOE7<4%CDe#)}dapC?1 zdht5Ic2eV0CvTD0t_q56wTF(5TI97Li?a(6kRT@W4LK0;Zyv>IfG1~)jIMsBrKxaa z)-R|v`$1lYiU*EKv44%X(h9El>E;^I&J~N(y0*)-$y0CiY_)l4ENk7+<@*}BaP@KS zdFuK`3j@Ss%ZUAsp0{r~bS%miqur)R&X+Y|SZ7NQe=gd^TD4la9&W7im!%=+k#$u8 zxt%G>HVMGfc>)|q++V=U)W6={mfR7w{R-4*6_sXmD19RjPJao#lAQB5uN7p z75yb-cn^^mjej6vf@`pYb|rX=x=cUN=LkTEZWII+;ToEB`efD->Fgt$MuLhU4k`kC zE!WhJ>R%jrz(Cj)O^Jg&&B?}M^2PgsPhy;fuPyo=rfU3i>4$c>uK!xk4^R+Xf_r4! zJxOGSA$0B@S>S2i>-`O$AkLych{YwIj{c6065XaaCx2?w2_9}#qZUH0UL7|41~Y#QOEAiGh)$qjp8`Sb3!M!o&{zMjT32zs z+Sv^V03hQZ&zF?`KV$(>GkXVXJJs#S1Zi$!{>7Qc5wC)W?r6vd1YW1u|pAV6Z()mHDmjcKFk-CZw8k*0Ze7kX@(R7^hZHF$D2FZx8Cxb910X5 z4HNV=d&e2sN)%$)0%Nj-=fT_^y&bm>NsW8xRe!1Gt8hHUxZTax%fLF=bN*W`V&Y{h zPg+yR!ot10)d#_FzqExYyYzxw*NR6kR>b{slY(P3G4jrxH>;YF7^*2N#)2d)<~eNg z_AZO(4&pLge1pRv!Vb$^&3jz`QlGJTUfad6g;zJd7Vta7@9egi&oLYVfAQQTde?3%j+37 z*rksVmg~^cwbv{U=;XGB*=I=+S4-YATEEI~Gj^rEnU^9(_euoC(<5cs?FN}it?Edf zr(R-2U{&r$49KDZg)xR?Hr3?C8zO`-Y=43xc~~V#Y2xmHZCT6S=kQHWvxVrSoF$X4 zGJrqLn#l5Qd+4wS2_4qy7%3|a0xIyu5NtL%_~z1h&(J5{f*#h945MOSuw#eJaEb(d z2tm@vlIZxXUs+I8Z2hyKS?Mv74+j|BftJu}qB99j!5gMyz&H*xTBOu08O~#nvVW&y zCAdc}XRnY!ZP64mVZUSpoKad$!r)yopTCPfw+_HkLPzfdFsm7s7N%~E9?S#e#M5zw z;6{}>x?GSCf01bL>BP)Fdx)>DZvW-<75f~fdVgrM6N8*si%SewdCcUO) zF3wMLTd{C_Y8tGUfu2Mr`IeGrkFv(;Gx~_>#-!P%a`gzJ@2w9Ebg6tHYk%uuG|(yx zbR^T3BT&6jZ@NmqFf_;%gTcHz#w=(+6!3-Qu`;$?KVH-XUK%V#$hqe0H}O?p4OQsz zIk*Jtal6%cxDqN$3z&;RnC2&8$UW<;3MS^s}yaLtu^ah>vfT5D)(*vwVn|W<=YU;9I5t=uqu8bOX1+0{wD$}fy zp)p$^3}7;N3QO1@;RQWAJoSX|q-ng5iKm~|SwZ866-^d}`Oe=WtA9g0Vph$!kDV&! zB5}f=qlai+k%iRV$*_p}0yKu4(j#_?655u&4EzO@3BaiI_!bo8O*K&(=d zgeLl+&5{#)O`)7ANPj6?jH*MFAZOp`DJjFrfc;=qem;%q(V6KQ4p1vu1+MMhE9vi^ zs}GdO*Ru@NIKc~TV4$GD8JnM%kBL{4!m%p+%k}k|v(~bFfy^j}{mb`po{^2HT_+6L zKcBdK4Y)a-OvJN9lqE-GuRC}tJ57vA{A>!!!ghz=F>7(Wdw-uQj5+TySC(`$kXjsH z(DyM5u4ukD{Dgd)CKUxM>0520Q*|9(OV?j3e-ORY_Fzd-7hStB-Pws4EFY1zydxjB zXLyFQO#^5tZySK0lk3|@Bj||q<%z0)o|n{1SM?-=YK7D%t%^%cFQ;5?#f9y{$RpL3AB)|SAh9FkmFlF9QjL^X-`v8%oon} z%p>6yifxEqN+TkXCv4%@Un$3~HhTE-56&7v{!_}4{vW0s6+1HrqyK5S{jU~?BI*hY zG(ifN?th&`)C)JE!Vo};-(^IoeAy0d&_)dxR!&VWucUWJzj_8F76wk@LqoksU5v>G z{lZG`Y8dUOQrWkkCnvIA-#$M@0E+32^Kd$;S0Z?Th9w7LnRQ8Ru}PsbnDp?>^B~kN z*^PD@Sf)(#w+om}U@{nOvhWXGt|F+E0CB~qaev6&rw9jUvb;x*TeTpJR;MITj?mR1 z>kjT}5W$1y%5HSEl>j$D$iKw7YD@s}Er=!RbEkob0n^{TQhycpHpoijea=87Xa&1; zqw}rho0}d4fj7F!wlQGqx6IyiMyOp$Cl_keL9MC5_jWh{7up93*t9N+&&5NB%2}rw zT1-i(Y?OaZpa{|Rh8x{E9B>CGle*$HYB`ehsfoGU8E66Gt3>-j{)itbYTdJLJQl)>IL=Q7gu zx$skgz_wL7(|yji(o@c^4U|5hvfu;juLLcOe(#I)fkY-1Nvx3O9b`8qHU@jl6EKJH0WaUo1e7Im3ct=t#;jD!U5pJ&ymOqOH4b!8ItV|ODqT#z1 z@KbhH@$Htw%`9Dc2N{J6*>(>f(7!erK+~09e!xa!sD^hBHVy*e?$5zUNBxx(`j(XL z$${<-#uy|c+U2X%s9}(DHt!m7ypo`2Ju`%A?iQ63xOO>U1$Mg~N@aUZ`eZQh%5s03 zj^_ktlT%cm{Q+hZgN`(vwnqTFOLxl2ZvZ5vY<^~gC^9Mi`OSy9(4b>97wP1BiOV5W- zj$-cO>iJ)8(w5&P#YtaXoX%I$Nvr%a@$uGI8^hP`-p}bBPuIs$2($8UWh7Y_*;OJaqMg=6hMh^5ybo77gREkAD z9!!1GPR707Ab&l-p3-OH!p$H(ECMvn#(TMi9cM3{V*I*1E;RvqV18@MhP@f*%M}0d zyI3H?Ic1d9<&7N|N6#){^xlhOXc{f0#Q0osmdf;Cb)!1A zI%do4cflZYnO4?RK{zGdGQxlLhR<-B1*8Nc=p2T@K(bv-J^E<(+u_>1y^1+*V)*YK>ZMmjLO){ zBkQveUv5@)BjHrMzo2p~2Y(tqjDz$nJ6NDfFynmk3sXnliaIeUER=uX%SlFQHq)fW zBZ6EQ0G0Pbfek`{N<^643mM15qxUQ#VlEmOd2%UmwI{=^SaVCfOfJ_7TV(cZV}@`T zQ^@US@()m;v4$`ussfM|9D5Q82rKkIaJk9m|&P=LRU$V>e#56fu zOaalOBlhZG#D5_^fM|b}jpjBIa>1%FzX1()vx~0O?y!&aQQu!NtA>dE4Y_|R=d)}q zA_7GM`lZhzH&M)JfH`?}g5AR6>RIPbkcx5MWW2i_5TE@_gfC1MoJ3PnBhbYlh$~_b`Hea5K;fT9p+@|o~UU}s@k?6 zUpim)oH=;L{Iq&qtyI45>x7X;HM2+Llh5mJ5X}>i ze|PSDddDMmFmu{}Fu z{9MU6^;#K8ig4s1aXHoLGASv^UO>9}U5Nd2p&*vmc_nsmBM!Zh>vQO-r1 z$za9ZMcIF?ArHI!!HwCO>S0*^@#Kb}9k9O6K|+uW$;4&6vGKq~ImyL}1of3}*cr+9A=5DZVQDS<2?cG%=%)VMU2llNhc+L=GVYpb-M_eKqCXWU0n2zZ% z!ejrS5ioT)^Igr0hxzHH*H(BJuBBkmVsfohb- z{(!?ZPNLW_`fJ7Qho_hsPl~u%mu#B(u=%QFlO6m$B*v2fySXQHxLwq;bro8KO$d!S z$0<-FuCSA73C2J@IL z0Q($wAK_eU?My%t=VfN{8l|JBGX8G5x5q&@C zd-EnaDpV&Dsaza#X99$pQ!R(BSTyVhlGT6dzr7%Z4es3o4x_F)znaCzse=gH6AwMW zRoCq%!*uHRmZ@IJ$6s|@@sea!h~IyhwdyiqKU{Y}Mda%hB~sA*;DxK`TF@KJ(Z>)h z(I&4*ku_r{iq**5O?CJnfx_gvNEU}3&)I8b0s~BDZyCIz4>F#|+&3Iap_oBSFCi$9Cje4`;(QNRW0$8^1X{HjXj>}JGnNi}0-Pn zl07d`URbSV*s98ex0tkBG4vU2==^h~mUAsNvw3;>K!84VdGWwtX(X0JhoYm<#55W% z@DPq4w7Nf3<%c7oO|V=G%bZya%y=ELImZ}AFucTKRl#o+`9{i8RIyUffJT4r>)0v< z#84yzJNycrB51J$XvqOkePcOwauoFMU>*m!_QGCXOvCxLw8Sq_?>M-yc? zGia0H(Dre=%HN7Dk%%h8wA-!N(WMmFm}NFALG>6mBUub!OkHvP9A*)%1T#;j>M}Fk z{o<5WSnXF;l3{-RTvKu8q-cL@X3Yn`D+X3~(=_+b9ts&+BTPe$siK!!4wr%vj9K%- zHV&x8}&DvZ>0$hynr=c3tW2*vk9=GZPzG_f(kC~bL;%5ELc z8Wi?Zm6*D4+%|tiURUJRYSrJO5Xx19(QYkPGj%0W-aRzuc>i`Dl$3v+8d**%-IP%} zu}>BV@-j;HGD7nZY+WT*47HCg*Qz^XS|6mmWH2{U4AxT5E~^;_n)%{eIn1SSs=bEy zm={|BK5|{gzG8`b15;J2KKaE}(pWo&y$%&4G6ThRrb{QnFk_3OLztdM9oB2*s^%mP zx^>Tf!sR}DD0o3LoE(2vAgj(zR@oh$C{aFmM-T8Ts{IxsamkUa&RlTz0CmK;OO!$7 zuzrdn`(CKFZjf9@nK+Fb{;;a@3z#}PXkvP&ZtdDmZ8693JW<_BMQYd>L%WhdH2^_q z9anl4Mw9Jut_O#A+XH?r0Xsrn3A#~UdkCH8^PF%5LF$oDY2x{;sykO)D8BB1F#=XAi%VM z4;vT514r#1$5)kIdJ1z!?rzlh>6nf;ZzCzIEQTNVE@J1Ms zegsX7+`wSd*k^ybPFe@`Q0eVoD@u8c4W9%^>aq&!g)U3W3lb@=7&=(hyc;TuiND~y zIZr|L(pijpSsW*u*wy6^)@!25M&&n8+_0P!w}Ps(4_G?Heh?d`vD^?ZsvVZOA=Oyp z_iQ<7D#1WD@%1f*t$Eg$V7AAIqWXgg0l}IK@=&qtPt5Y}0A}w%?AOSAJu~DVSA*iKMNkP2P&P;#R5NI77G?1! zgcfH=d0PZRoxB*#L1D{EuZ|BIrZ4RjL5(h^AHPz+5n02(gIit+jlTleUKtO*#=kLG z-OC1~oQ;1rJ|2l|?aSRaGL(p|wtie}Bd~t69k#rZU1@~-l2huCVRj{-8CMm0Dk5>b zUm;SLeyqHcsvkPz_yr>e!@oVO8-}sQnp8^v{1v4Fm&LO9@@-r;S@SIbXo=Z-r#I*M zK630SZ`&~Opq=;~rmC%L)lz6&(J*su(=JWf?ZtmI`N+|!km=NfA+fm*4Wk3BP7T7; zIp+8qLm*!!%s%_=Z#@&RiVH_pC;$LM%zrA;8UKS4UC`0S!pKGRFWUWY$#mcZAFLl8 zGVsi6iK4ARN3g>_Lc}Zzl#J{S6tR>UBy-keAlQwp@Cv#Xef-4L8%PL{R04}pNm zkpj7?E#186;Zi-4EEnTqUis$1fp1-=0M zZ<)$J8-VlCdYK0l6ch>6$q7{136w<`v}%9nV=nJNv3VjxQ5Y0AdY~gAV}YQvVxUe? z81!*(?qPu7vmtLm@pEtDAtKIiAa8Gh;L~ryZy{r%L(#LuP8jq@4CrUZK!=0pcR|I% z0bffW}n9luO?Ek#p`yaRW4?X|?&-TQu^sODO4F8+IS$2Q? zcONe@w~E5Bhz6vWpkw@Mi~X*+S#O@~iI-%REs3Bi5C@~SHFrHM z%eqqGt#2od!L z*xSVXA6QPt(cwQbUAt8uFMI}Z5ELi@!5tg~%<_z!EO8zlAUWcv9?KEcxy66xYKV3I z4$z%kNF;KIpaA_^sy^;o_WUlmZUkwdYHt1vF&CPZoXUBgQ@RXnZ-Hb=*Cb;-BL^$Z zVz}dw7;|bc2eY=fyD^SMTc!9ukh|7eoc*~f?e~ab3&Ftkd%*Y@Dh=6#pf^gR%uD|f z;5I+}9s!Mh%#Y?-KJ%PB3H!c@Yt1RLM_d z7p7tQFViLYm!SP+x_@p9qxla^C;MMN{*BERRoy)l7c;-V?slX}Sn;9ZasBuy;2Ca;hBn@FM0{xtbcai4n4ynoN!KL5bI&&>8d$M%uBbETEk zT)6S16~7rq5#5(z`Y1&^Y$-wYF5>al_Ema;Vt$u+d@YCk0PwCf_Rin6rj(8BzTdmP zg@Zi(iSm-o^ihv?ZwY_-oyYS_G28obXS?IY`D4WYr}+yUElsV=M={`6GTL`!Hra~I z;;{*C$Nu2=&M|IBIYfsl@m?$SSp%%VTb%tNKxo;xMKn@MaN2xa5b7rN$p&C z`n7|}g?b}h0XsR1|7$}sMCCYHaS`vSWjygq}S;JJ3B==dW zWVZtbN0&hL3dMBCvnx2ovBNrXPi6Bu;rKUkhcR_2Oyp#*N44V7H}QuN&_-}s<<>q* zl`-MR)-e4s5^?Hu@@@;c@p2S24Q{*0IA@JQrZFd}s>eNL;$c`?(1boOyk#@HPBc&& z3Ys(~vnPGoOw)hcJu(`%LZvmPR=)Vmw2Qfd%%YghvpeoI2h%z766th4d$vu)h(S=l zTmwH!j=BC=T?!i_BXnN}CI(Xy|I&t7NNCXgT~#JrhzIFDQ)E*h!lGF&55bxycsqtP zrVtC@w9EW~J5}IFMRnPETP7DSbaa;dT3!(*OS|SgR?L6U`>X_f(~P=K&mj$`)dDQ% z7$n5fUQq(2ca^6j$D4Dt=5x8(^!Y#|9IMG4SdDm1+ z*u91fsMxzi76k&OWJVH&K(ILDOiJYYO?rfuxS|D7805W67#QO(k~ySk3Z-W5Ot{R> z;IPOEG|PS0%cILzXbFu(eGfUUIEDr0E~Y)Ak05_w`T;K-h`G8J-gGER=3uJEu)?Jk zK^Q`7=aLCLF6JkyCUj=AHCd*~B%2$eSVuMt_VTjo)#!8bO_rxFk4;kge05vgHVfdX zsN*O@IQWES!brBu?3IL;7<9BK266jN$5%=s`#_<)E-S7w*9bV8wriw%B`0(#d|B)q z2fBYS7^e-7`kwPb^Mhh8QcQ*9{28@zaO>nG<)3j9Y8m7=Z`Nj9i0=p#^o_ zIhup4Yjp>*^^hq+t7-2UtjG>6T-U1%kmL<)(QOr8&47#W3-qsMw58MEO^df6t;6+j zng~~pTP@uuB37Hz#e&JXsD)?>#sfi`vR| z3a{GjrZ}dT+dAA#5i3%VnF7Of*CXghT8VH>#Ys4k2Xgt$w@1J$E%@(j360a4bnvFL zffK;(34>O-$qlHgbTr6J6h(?$X5QZXXbG*wOF|5BLSlVfb4eH`y){9LNP|IQKdyg} zM%!cr^pc85A%v>U+_G+r*hVJLFXw&gWqxjL4cJf^Zon(uHc=qqu#(+z;0_-Hn}<<} zxM;dLY(#OMyr?~;$(Qbg?8yy-UoG6i^W;g;;?CaIyk+zdrahe2!9}0Fkl`Kzr38|- zT_gjgZ4^j!V=G2r&)uS5AzP$sF)V-F+IsL0Z?=dG(?!iUueYnWajv&JU74Mm@XsC^ zvrC#jcXefMvLxiTntspU0^lwjqQ2&kG@l_R{Ltb@TuK#IjOiPpx28%HpRZvz9RyECCX~Egk@gwoqxt$x`qgCQS3Rc788$Q(bS4ITbUgY|Ve5`U zJq!gBUKfmBHX?9u!-T4Ql4!}=*l>Aietosp#Gi~GdL9>3K+=2~hnR?lvXan1(;v5V z&_dG;^>Z!=&;qMe(Qh#&T{M5fCf(1JA#XhM4*!TIspFwT*Nu)vUs&K2U{HcMPcQ0p zoti#)-dMlnvIXS?_5Y&nEa0L}{{N2%NQr=SNq2(+5=wV>yTH;cuyiVdh?IhKs)Qoa zDS`?}iF8YMBc%e0{6Fh?-#b?C$D;i2j)%KEym>w6J@0wXd*(AUpDKUaJnOp!%~Gep zUtZ|R2&$XJzaYH+x%sx+bKSL`S%0q^+CiM>-bz;aN>Opr>QoX+)6`=2Uab8q?~sZ3A92D_^hA3u&FNeaC+HOr^&C<^uDZ{my%d^Yt!ucDiKcAh0RP~jrhki znpM6A9JgoqkQX*fMQVSaYQ*0cWE#|Cw%9m3$iud*1quGt5z;FhEtJ>#1T(@XOr?|N zvsh!Q(m@wN7??NAPJ``IXNr$71GPeMvqSe_?+wr!mv#E88UQZ5tUO z^nZX_B^<{(lrjz>%XyG<^Hcv&T+GvFjun?1106(H#&n2v<#}i;%0HL8dbpL9ZI>05 zZ(VjlGpU`^kCi8-v}`3c;bThBk&d{gz5h_eZ+iO?M^BhuVH}FGo&GSZpJ?ez((uL} z%_=qF+x+>W&18SEA8E?&IeJ_UVN}Va4RGbfyBi*)m(_^<#e|N^>_BtI-}HTRBvS&_@wDF$BisoLJD~g z-1OsBbXa5Yv2SDXubqj#6D^;cZfqLUpQ4rbOb96xk5>v=o*ufgw7@dm+4xc1e}2 z+Fxf%8ZXJ7O|q#%8S9Z z{*I7T&Gmo5yPQihIq&7qYBPEd9lXeV5iYEhE1Rhp+mP2_K`zWGYsfgI(ihz(>E&Cp zbG?Khc?*9-scTB3El<L5dD8NyN}WN|f=Q45>g}dxk?r@|=9Z^Jin;v$2*pH>jth z%9dQkh&h#WakVn7)+!2;3FzYbKKK_{$zJNUtDt{nFFNncRL?!l{E!X$$lHtA5@kFi zlzpA)%)VyXkS1T-r@Dx}ch~*UaXKg(jKW?X9Jm+a+aw@8ReR*E-mai^-yve<3C+&E zi?712Tzb}@B7O5>adw$Zd2)aA+%VaYx8XE~mBq9}#NFA>FC^DjZVDAJtT>C*ez#t9owREp}eyuk|XA9=L&W#5{} zx?NvnOBnVcyLdi90PVu$)}5+r*jVIW&7U~v2?R^~k54(X3*E`xf0@;9ar&-toq20x zVfCaodj*b>H(7jy`K=n0B>jTzFH7txNoap|G7D##qsKj-qZ&&oa8#UozG z+!8l!Wdpuug_p}4g1$DPHFwO}1j&Cv!*5uFuJ{$Z9p;*k9k=xDC);$tlt)e{xlIpV zij-;h9bTO+qi8Ie=Fb-{Ttm*k&`{oEeK~B--?SCQz|R4vJi@cy^^Nn2$lW>T6%F3h zQ|4ClReaYPp!fsOVp%6DO5`S5vFmrF2KJ^f?(*VarDL=r#?tob*{WLYk+{N*B2AO$jP7h|2e+NX6(i zg~Zd}A~9*iHJSBAc1{sTc3j_14kuJdeIX}b(SAM6nuQVL;qW>o9kfHKW$ig>yrT|zJ``qT<0)UyCBa`^ zEn7d}kG%T0T2)JO|DeuSw0zf_cW#-(;^j-)cOEIWFH>z_1S32+HjhXwNAuC$*F|raIep&V598CM?L+Mpj>Z z*k6$lKI%%gKP_mT7Y~2+Yc{c(zJJ$1%e8fb-@I3Tlizkj!%ox1t?Io(#spE196tTd^L z@O&%lI=5K7tLv7|q}l4{dD{%;b4R zy^`g5JidRD>g{4~GE=cdtE(dY@)FnPhY61@YF%aNmtw%@$%Mg+?ROm@e_t)EZ_u|qhlHfg^nXq1*%6r1|8;l7e@y6OHSJW-tK*6)R*bF|Uu|Ie z@L2C^9`nuvLY7tJTsOtRP#xuFje)96f?|g|R}_C09?4`(mRxDR+n6{U5g>>Csa{Bk z&uXqcb!>lQxzz)yq*>5gSE~S%58%l`i+Qm>_+35Eem1<*q zmHU4|$iMC5d7rT~!;Pnqx_se}G8`~04lk04@SCHOWivar<%)5J zWE?aY1?)?g>SNitaKE5k%*SFphkqm~XmNk%Af_d8RDd&&LsmVvsAP5z)hbs4PkOuc zRqVac`SMghCUxhhVAky#TOlE@Pv@&#UNAf^p4_1lz^Q80wrZLkF-=`$WGPtcBc?aH zJbTRr8u)bigGiN4@29ugmm40dJQQT=)ylyq=(v!3@o7YAuRfE>13Z48ipls9@Lhi^ z2S)}7^a`c!E{5s?_l92Gn<4L|gvRrf72Fva=k_n7k)V+VlLV8>kjRiWk~DUys?N?( z(g!KVj$W&I5A2-vUWQ2b+=hNVLw`R)R*?oMG#!qS(PvU}{d;)EFh*8Mb zo=U16t1iYz1{ES7Nhj%=R~&^WUx`1dFsi&0)ZFt3<9R){ki?s}y{-pLQaIn#^CvFd zjTElq!yaxXaS!#8{L0dB?O`! zvL#^@Qszs1tBQbx3(Jk6ANuLdqj9<0N!xQ_(EDi?JR?%Kjl=o7z{IhP?L*RKcedPl zWFCe|5xh{6s-^mZ+g+P3t=jeI2KQy_Gc~TucCJ1820lqsMDI6}J{2hseJ)Kczeeui zth&DceGhJH$u0rzX(Xh+|MP$7>Qw}~p7mb~kS<)}PEJZ7FECUM>Szvjarw`yLsNBz zG{|KMM9<#DtG{MnM0$Uagh}Sv^a{>3VRonzJJwBfl>34<5oA1`{CtV1|_d2foUq_oT{`&OMIRSry5iKW0X-Y8- z^}F&yN;#D`76mN{GPU?8Whg4LzUmo_M3v|Z`97NB>}Fk~$uPs&!W4@z7nde4c4mLN zgRKZHV!z^_e~lsX3vc_`ML+HKm-os|8#k`j>SDgsc}+^jq%@2T;q7HQ6Gvj!qhi8c znyqYTQD>&&875-Yr9ywZN-|bA{bW)pRSU)32nEs&ZuO*5eo1 zZ0wtv1unvl7##yl#sX~>K>{Cyg4g|;$gKpI2TR=BF;>5dzMn#c`m!aCO(YvtR2p~A zL&@vV8&%KpnkI%TQY$!*>rR1nu{ZqKf@|MX^6}4mz0S3XOtXJ@TYqgdTJU4yX+K_F zs9`_?<^TzrO2lQtoM>&ffkrhbTb=GG#nOCeGkdG4v-Dn)N*iZZqxVJoiHB%d(n2K{1)T_e zGipyyp5qT1)LNITH@D}(CRI@v5LqiQGz_rWxvX70pWqe!jZVL-=ivpxhTiPL)4?xM zLFg`;Gd_1{Tlp(3$|~MzJE9f^tp~9_EY@1j3;r-+yF-6<#o9CU0%`uMrAZB8E6qgG zI~z>${TgSY=!U@QSq8> zALcR&6<%g&c($@uNsd;`xv*&?m#@;2H&;!4z*zB)2}PFPZmrO*JSHt2BJKKEb0jGbZ~_E2=U_))dhXGH;QB}G-? z%ogUYZ|1yL&|29gi~GZ(aoWSk0v=8aQn;GzKfc&+LBD8m=c)eixk?U0-;mdR)|dV1 z_rwT7$Gn4_st8#W`q?$qEj`u0*{j`=t`Q}@XUua{NKoVx=~ghUQzo@ZZ<60p&maZx&KxUqsU6wnk3AvX{I`; zaczH)Go~n5%J-Zyo3PsXHU{g_vkav%PT4{I#wo^Bamy|*gdvu`0P#^^bShU#?OfR_>3yn`>sHooBi^n?vps}bb%0&2Ob@0Ewp~I)({y|-OlDA z^j*+wVx(QrGgJ!4Nr%v`K=!eRvWDRzD${?W)vD~ixauTLZb@&N*CqEZ?|wREk_Y@ZLB&WqDMmEy`CO3k8!9Y%(zTB5zCwRN zLVEjuZYLH$R`hgpwMHm>X6X$1oYy8e7`5z9&OR?EKy4p-Gh2}i_gQzboPfN%<^p3V zQFe<1FMlEi-+cw=Q_iMh zT-sB2m&Z-7pLRkU-*G08q^S4ropgVDZuE&R81K2!23@53m87V9tqC*6vAq}NBU-^X z&7;jj%?*-X);b$Q$7eiqPYJA-r^k5+TGDSNZM$nGjYr>2GO`qkreMLTRlBYt;5v^S z$TT9>_5eG9Woj*AIarPWT2hzPYgzKfCNf!`LpV>r%9oRmkSSvrdw$xTCQpCAOGq)~ zN#0{V6_XNsko1` zD1!8}2~+Q-(8x#o`{|I_FiC#~^Pr^}idK8sNnpS18zjB#o=$Zty_>=zxsdhJepuuJ z*SjeBYjs`GTNwspd6Z>iw&&kDXA1FBTn@ax0MVGC9Obu<9L848=FxGw6xV2%AQSz` zFDnR|bpOt$<;8@_kkZ1vC!{SMLHdQ!W_t0)#n%m#Gp96t8#|w8 z++{O!HX30;A6DOZF13G$<(o6bCZe`+agAqt|L(?P@lg?C?5I=<9HLEq=g-g<4oT07 zjQUQ4JR8y_$o9b6n>NYz&SD}Lu$eWh!+x5Rqejx##!{#3=7XHH9o##0JT3MNmPRF% z6&;Pz8Vgvo4NlY}CVmMdpYAn0D9oga4d5J>tDNg)%4?`Lml=P^xgYq+m@OVBj8vZQ zF}clDbKx)pcLa+#<7KykcaAjG%XW{wbp-b8vI|$0S2EV|vsxebamSFs6x%_2?5ak+oz=F`V=eXFBz@B^4A8wdd~pv#eM$*X zdyUy1tS%|*Lf(HHafsJno;hRZNj`+u#ae*eK!nynR4Q;Q(p*qtoB_L|Q#SOrdsVuP zUu4>&Qoi>!lve^d&a2;^x5@KJ^l?tnDa*WZ-ZQ{Gi7`k%EPO~3s-r5ByT!9aC9c2r z^|ad^IlQ!qI~TamPf9b3hWbJ@Z@x6V5-pRNi_W#bd?0^y6(YUPz`R1d<6UD+9~9Zfxq4bC69R%oXZ;+#&P7XEa)&b-7*0sCAzRmr z?NQeHcVkY{<4obN)(ZylP&B$lzr&>`3y7h=H-|wT$XhL$MvojXUZ72JRaoCgJ_9dx zfp!T!pXPrigc(1OS1dZT8{=J;$|OS_D^ftuw%bB&>zj!Bc^~9k8S@x8C4`}Ets9t4 zxfE7+D&)#{om3tp2e;}T4u~Q&=tX~BB5u1VX!Kmy;_WFOmdU6f7L2>3nRVpJ zR;dobo@3CrPjl>(Q`q8k@&_;Wl~(5TmXa0NUe+y+$mqc~CRH9-(GS*oHvMdeG0<_0 z**Q2(#NpZH7pRbzT3FhlQd=_Wd61{sj9)D~t#tXrKuboUp-%neW*3X53|0BJ6$68q+L0gN(W!q}4n; z-;kt(EUOZ~4eIpQ;4yMR9q#g;X|FV1Yp5u#7?E!7`pD(-g3^nbs3W~Wet>^g&Mv1R zKFkqp?aiH3`-#ogO#24^eV`cyd_6kFH;(estj~z6oXRWeKyA$hE+XbSB>0 zi^dpF`L6DOHuvP;pOIbjF}#AWu1Rq3`5{9dQ`t5 zK18un@{}ii_;d0xP4cluv}GGMp*b9mZ{P0#V|pgAg9J=Mzy6<-P^sf|y&vzbuyKS) zySReP>}_1E|NA=Hm|;lIRovi%h@MIw90vmp6^_!)Dm7DTj+A*#% z>gwu!&KE9HqET_%@0-%)+`T@K`0&!5ME-Am=xv2Nx1DwLgQrRiVwoAzJQAB>Em_n<#`G7~3 zFOZ#1SW^u33&pFKO6H6vz1*@HV()Kw&9p?%6v@4KG;w$Pj9N29%b(gU-1j4SOvPil z^lNkHH%p&TNap&B&!O19(J}jkUvzbYwGA@{l-RudCK8$#=_#Mz{6fM+3C#TT9{lWUY1R}|^)Sx=o?mnF4I zCL5=I&^GICWo4D-W$Etz%KytY>T5a?6`EV>!Xtm~lVtuhF@mY9OP?C zIL8|5q_9<0FzcqDP_Fw$+cpW}SH8e&tfGm_Y`Zq&h<1P2_pT-ekv1Lr*;Q@nUYukc z1uDk%*Y&7I+fGzzxA~#iB?r=PYBSGV(4>FL-sr3imvy+TXxyW@NP@=UbtTeb!tpJo zkM|r$z0tWR*okT!x!xqXmf9rshFayfB(lykPduG1=&z8b+iQ|Z7AdneW+lhFYqs=M z%gYUH<5g3&6AD_|u0Lo?RuMIq+CDS&?hf%XJ&9tqQ$PQrH_5{!?D{4GyXs(d??`_m z@3cK$(qUz!wq64r$?IgK+(xuHO3Oig1d3;_HQYJ9O?da7=Qz*1?m^Yy*CJ>()gx|H zv>22v61;md_m+`gGLqZHehHsRrc23<5qofetFl42r*NBO=T1u2V?4drNNMN0vFbc` z6=RG9-Xf{j+{_J1dtDa!!ENM$(4Bwe%3GjlqxXt#I}_huV;Yz+>8JzvbHy4~;S)09iUOdydzIG`~I0=Yt-T zLlVSYIi7!XAqg^=o%~*~`&vnuG^5Nt54KgDNcO7Z%V|plQQ_( z%Q>8s)KsmLv%NEtD>RV{L;mHn3AUZ5H<{KiqM9}dSomr-R#?1KP}?s`fP9kSZ|&y5 zSXSmB3YGQIC?_FIU5lblAJC*r0x4KiltzQvwp9|V*2==yOH(_Q6a{~3#Q92~rm3 z)oL*RHfSM2igk7|F6)2R9p5*pQ5PRI)QwHHxOjK28N{~AmG>~HJW^B7*b9^&EoLa4 z%jk>#gS%3@^~z4N;Q_7ms>I|68h-eCVPLLdJ`AwTKnyyN0O<; z;>|1uPfQOq1sSy3ElGnqXG65g@K#sc@rDO!g=a&#ribxa>#9V(eX5_2DAP_6w4Y-~ zF~0vIXQJ>tl^|8e%~h9kjctXx)@&)5wsDkQ#LRL9(i|Ta^eQA<10Z}lRTOLBJM^a+ znh7yh?SgSxBW{03(uTM4D^Q^BnsNZY|e93Abmq z`c<;wG8s@}zg(}gJWnL*GebX2$PyqvA|6-o8&&cjf)O4jM5&&pYL0*LbanAX6-48S zY@BJU&};i(k+|A6)qC^qv4x;0o3**=JS&bD9~DL(`$&Bo(eAw16n$%8x_OGSuNDis zTA{^|MZ)uu1~Q<0#_F@}o}Qpi)(49ZMQg9suTOt044oR!;lWtbc9G+-dfuWI6C?=-fPK0%H9gB*JpQippNO_U29 z+Dsl}Bpa9|VbEp@_sq~fd~vTjR+Yp%x*0V4{N4M#Q}u6f_wZ<%O0vU09eNO86%0 zJ2dvZ&+k*&)9o_C@hlxD1FO;6${aVY>u!JHcKy5g(`Lz?&eUuk`bw{?tv*o4nfao1 zW$^0WLis>e5Tn$0sZ?#x{$V5~&7&mIHum$Mn(Reaszop5^Q&^aSDEa0NHVZ(@e_?R z)01Y&XN6!&#PPh2Hx<~hTt-H;EBv{6neaeait`1vJYrv`tT zx5xz_Bi_Dd>@pbBIOk-XZ$L#E!DGcCG{vSnAanPENlz}oTRhmNg2usG?!$xGV!TsI|!$c%h)KjT?vnc+<9?rW*_qCVAh_b%u zYm5aFJ0Wp(Z5QA#eyAiqcp&sG%-@DGf?mlT4Lmb^LmXTE(U%b1*W5mu%uVQHNPNwd5&$4%v67=aNn|x!<)%jp%Tf*vB4(k8}?&?hoxJl3;72EBfM+z z8|8TiQpV~+?a;P{(Q{50?AD(3*ic|F**+lqJR*_z*mk+Cd$|tuK4+=M>{0|ymr=`N zp-i*5?tQONg|v*cZjLH*Nu8H`?fyAw*m{FjLzErG!&l$58>)%840?Z1rka(8q&si% zXsvIDRg%X|={S*(qwA00*3=|8q%uY9+q{g=Wf)JW*W5bpr#JDDbE_Q;%4-cSHI!1Lb%~ECVr>0P(o=8J@E?q{`X@=?*h=7Nq|IT z8vn%BXf(jiZeSNzT}OYY-T!ettc|BuAE|$bMRc+fC$1Sjr5XmRn;auH9619j}6qv#*!D>W+PE6Y?Un@jkdo_@#$^HvM+PvN9i4A$h}-YG4{p?OvvV><;awz zkl0*(UZrxa|AnuEEVoZ@uDCzH%&hCt+-040R8-;D?+1n$I+Tu~y9MbULO?3Oh-`}^7erP=#p{ab+_))eBa1$|dg7iV>F1BXhU7z_a z|03+lN_&*FStK|`k%zBuxz!b>Y)JlI=efwI6Nmj4O%fVjzQQB!LmyvEizP_pUU2{r zYWJ`OO`VsbvpSagN`{G-(OC(_n?sV{H^{J0^OELk&1I6$ld6XEz}T-Z41O%kg_q%f zwACmSjwZdv0-AUH)?M0d@zKl7R6H1vHvYJqK2s*b$4{G`sfpYgp6Z*$aJm#caV7Y| zGD}N8|K>#e`^k;_4NO~)JthkqC>EO4*rfaj?;*8PyrDUMCOyB!eOs;`tC=&Y_OebR z!RPYRv@TYFSA<9BrM1Msg%3?d=;7W16E}SsqPB$0D`LB7-s3Y|m3vqz?A+RQq+V*x zsB+smH=5CpFZ`b6?;kR~exah;^|LQnUScmvZfnbL%wk-~bM`44`<=1hEB6XgxNN^e zObc^iH$L=V_PZ`TNq+O)j9_*lD8NfpIfm|0lY9rw^9dyX-OsH!^^=Qt+H7hyv@yfv zqdn@=R7rjO$t2oqh4Y9`DG;Yyk`sO zPx+-=)8;l$eENPpoT$G|yoCMItMasWh?^Jh`s#yO%@65JSL@sEXO9XEeXrt^Z^s2{ zhXWec5{rz+inzBgU;HwtYqb=&Eb^6;wEHUc3kc_Vg>i_x{^OZ_++>~BQ(5NHbBYH= zl%dFsbekDpbH>-Hg2Z=d5@%j^s+SrX;VutZB0o>V{KWN$Is&(Mh%M%ZJO$Y5U0J`>;4j17P8}i_k*-uOkICxJ`9J`=LA;y#5l+hUpd?nh;ct>Y3^hZ0qyLaA1Gw02W3 z2J}t*YrL1kJB^s(EZqVfJy%R2v~yRw2$D2_PBLSI&RNQ?e^ z?f{oj5O>er6XurNfH@^q?k2BhCDcm4z`{ve_(z%>g&N*4{-1nQDkHL->w(|Ry!UHn zZ?C(=U%iW(G$|??dOf#H%6{iA4zJz_ud+2=Sm-TP!L@Vz!uHeS+PqSkrb6!zOK^NG zFp=Oo?&%c~qJgz|kNq5rJnQFI(|0DG%t@O8tnn}kw=ENt6^j>(Z?99B}~M)GPt zj-isyMfvfnV(!uA+fx^RI~Vo>oxZHM+J48f8az$WU44;Tf5JSpD5^quM0b^y`pW9G zF)IHeWaV8%T8CwX*o-K68!u((pWw;2P6n~z$wZBf2P|gLat(Ih)fl|qeJ7o(4wzR@ zFaAWxT?PhgGnTEr?n+Z1gGqcB8I8{>U7M-*72Hl-?ek)OzO}#-^zh5j zsGfDM|6vH3@d7m39Xjg1(Y|5_uNs|ZcA4`xXpa)CXzZOFA90l>Pw6|SelQfh%}&R~ z+%?iLO&Hnu;iaCxYcj!0tId@07NFozy0TZyF-J;xf?K4Y<%PYm#Tgy6PBzqFm}?O1 zDQPIrsy+%d>N=4gc6*vhe!C!PlPxvE@g-^8_){tE>^igGr(r@qO|I!yW$$?t9f2p0 z*z$0k4edst&88~>MJ?Ws1KVM5Uzof#qO-B9XnkVfR&p^R@ybMJXB5k#?E)C*+cdCz zn$%)AgV*E&%OVLAZym$?VS;dB_mYUtEss3WkF|hXTCA~>jC&{Oa2yp`^r~$0+<(`t z_!<}|%@Y3e=(q-Fkmlsun$ppm<))3j;_O#+ZSU%sd)1aC#0Z?ZcD!=!SnDXF_2fmG zB}>QKLX$M?)}RZ4)8(%dqsM`o0#r+H_A1#EeSN4pZej0p3aaMQx0_af7>=@%h-ZHw z^~HZGR=uU10vpx&EEr7_2!HQx2UI9 zdC(zfUJ@!1zo)%($vgKqj%d9-yvm1atQU3dt$6VLodcb^t86;#J+C}qRyV3n63eyy zHE|pIh8;R*;K@;sRxh|%&<@1uZz^$Z7tU1_4Jbp={No_R0N4^pfJiyPna<~(_$P(EjfS5D< z@#rAT`WnBl*l*{J2T7|Py}Y&BXPnxt488G0wsC^B_;uUQ5voqEdzHE$pWCBd%mv}N~P|8lG%<#x~ZdCev^X!x% zxN}>JVE&aveKyd1AwbphXx&-(*NNINpBqoeRT10Jg zTB8>LFD4DP(=ZRT7#T6avL~vxiG=sZ(5MPTS;5!xxZ6b>?kzK%?S=+f3aw`zY+R2y zjEJakqNs3I&6NBzul85w9d`f|1_E|8vzu)jet-U)O$WV;6(_BG+rt+O1`q2?%#W=x zW%7JqIX587d0UsyAmq+70Hdta>VV zRx%jLLp|yri*q(1dZl}yly81(J1qM;%NI5rU3DZ?5==UeW3hN=S|@M@kXK@18q@21 zZd#JWBtdmYqYOSP{`tXh^V?mdO`9g6CGPy3o5*6%7f7-AV5gUDj^^AJfOTfn2b9D6 z?sPHN)~tzUiMwpjyagj>#L$9P+gY9W999WaUF&=#)kcePe+^R(RVap58r~awgdH`A z)Hi>Mci!<$YD+%glDHlJJQ_cF7*p~e#Ydmg6G*z#0}q@1$EM2Dz>lFwzA@X zmz=_~WVHd`ZciVQT#eg+DKbE}o_fAkvMYDIff!pFCwj*%Oy)ZgcGY3=iUb2bQqM(1 zvDpzbKAKS-wU{MLTu%e8*KujJUVwL2aO*Ff0VCFGNy?y$5DI;i5C0|B*h};aE>G2q z{LMo|u<9RYtDqF8zv&Sj-+~!7LqicP-m1SfSA6{#3^y)^BjSn2t2fM8F|nejb*m>o z-5S@aoi)H(kwH>()aFDqkzMEfD#ZBV6<-rUTm8l6{OK2>!8JEf;sefL27PB#LO4Vb z!14J;A8WDuc;{*!c=GARO<=hCPjipA#GT!=)<_8Kkl2s?FF#}L`yi--+zfpro3;uF zOafVZ;io470zn}>SP={&!RMucOOhq|j4*~uL76|T%93FRdbbh%M#)X+_8@URo zr9Ae#5&?)2P0lC+J~Vzu8My(-jSvEwpHVbaJALP4VmK)K(ZwRB&kI@DZ)1Z)BjKo5_vRKOo5ARxe zB_CU%{%yZyN~>@WO{Q#7W62sMq;WR%>v?Z<$G66`>SH%fO~`);+;aZ)Gy8;aW+%XEjbcv3au9p zrA^OSEiI54%p??nyY9M@dt(zmq0@YCJw;hhWYwh74iKGonsn_OlD*`i55_kzne5W9wGWm^at5 zAs3Q#V$`|MKGlHN$+Lr@r-~551X+cpz~ds zd~)IY*Oa=U5=Q7vJ?B0yqtL5y5>K;~*7-_o>i#|an*<I#uA7c1j|bvy-ljgU{`LBf%J`kAH^(dWho_+5G0j>sYY9MZ0iL* zOQH&}WVwkfEy8yR1EHXIT5Tuu;WvM;*So@Nd*2oRl@3-inxxk$6Ulp#4yE z?zqSa!l1y!>DwV57`shIT)uUc=r%k!d>i?lmy2|S({XBBl<4%Z@e#IUNZ0A~WTq;d zH3cK+Q}ai6be@RU=HZavZ}N;%pDxLZ0_j|`z&lS;DQCXV@q~-Vy!6g6Ux{xbU%b$= zW&(p2ifP=*Cs0| z*fm1~&O7u#xs4 z&nu%t39Ix-AKDnMsyuc-d5G-SFHNHia>|@s{ZHVWjsEEsh*DJe;$>+_UowUQf)xQw zmyF|>Gs-I|2#I$p2>GM)2r+m}4I0`c6eGeLL-T1m$r#VYbGU{)DvMN{6ueu>X=+6DA$8^}MJoOQ-_6(ch*+ zX^Myy6HjYura>ACK3EGpJ_(w)g3;7t!?+h)a7w(gL)a$Q5Nx-28LGFEa|4jXut3n= zzF_xFq0ST-6qp!`hpKTBnq>(V3z>)R64rX+b5|SjzC;XI8Nw~@?9(8O-OypxV8@-7 zI$Bftvqp8-N+>rH6+o2c;#Ue*H}l3z&qm*&g@h)K{OpY@s3N+T@VS zAbJqVhZ~TPy)r2Lve+wn_Axu=aaCMdBtuJEue&)Yfg{MMFEL+&vjF-%gShQk&$*cb znzrVB3QvyqJ;|VKPr=G~pfnU1U29E@#2^6NFd)a>JEAao5het?ibs02eSL7 z@;eM}RBmIX7^o+)nn1?}`wCMJv2==r`?DFzZ*Z^Nr=QKAFY$v~+px*e2D8bWKEIVv3aSQ+&Oz(=5jd`+2w3oVR_?}>IPBcS&qW##! zJExp|?@QA>2zre36wX-DlY`7xO3S|^?-n*{>8{;#$_)*I!ISk!OzvC3xRH2ESoxQiiqUbaq;HOej1Mdz+qXY5Y&+kPo z98Ct0R`GeC0b^D%IOpqo;mt|PTlzL4JP=q$UF|ZRq?XrYgxq=RDW_Qc@fbDYrd^w0o3xu1OGAZ_I^qP26AAm~!n6Y3rm@u~HzDDbzq9W87F zwfXzU;1399tmWTt-1cQaxu=gh;Tur7fNVhq{9vfIPY3;18VWL*gut`AKnTMpiK)iM zfNVIx+}&m~Rsg0kiqc+2lDS;o%0$$$3-s4txNQ;(5?if`meYZHb@eVVh0oxN*gD={ zeCiKDw~a5b+7AApDTH}VJdv#=Q^L5#!Er<>HJZB1avr`15y#pc?2`IkpEC-#eZC*4 zCjrYp3ep`SfNSKpBQKxl0vI8#2Ge9z-!=hsVwOBqMhM>#5yV8E7?1cwjPK{|yR>vF zcy(Kd7Usvic(kL*=ChuUrB;nFzjps?!6})8CkLUbz|Q_p=-bCJTp8@-XrKw5B{bM0 zB+0?q~2F93_zoN zu6blRMlYr{^1}~}kuUph!O)>J>4NN&&4yEwy=c4*3iJ##uT8Bj=~q1l_qI4t!P84) zo0pjI-3`H|jBK`zi!Gt2+So+Ik1N38Oj$GGyrv~zG4bUNlF{&wx-gj|ZIwiwUzq<37UC%=(m zFT0rn0hK&Kq8(;&Iat?0u`kmFq$IPCr&Lw5SX5QfBkcUlZbaiU%1_P2?)?ckLvToy z^q%k>p+Xk_C^~fif|NXSP^H&R@Gznvqv=f!9!bO?!ileAV!CJ*KSN$G0?3(nzT?Dx zF=(sI#cB@~N{O~&((-az1WxM3IUHBNcEKK4tvd9TMs)GK~; zwP59PrikW9sfxNM4R!hBgSc;g!t<4jupXolR?Km z(~hyFM{r{z#bWa`9G+4{0h^m6Y;(vo6%tXv^n?qdf6ip!m0`5^c5`=FT3fM=L9UTDoG( zClfjg@Gp|Ws>sJ`>)DD5YB}Mp5Q=X>)_)i8t3yIQRUoy+TfMG7(V5rcSo^+LWm#j^ zD*$CQh4R9C-SlJunJFGwxD#ptOK*y>)Q}Nci2j%ek4lB3fZF*8b@pT{za6`fo8!I| z6t3hpwfb{^*<@rGJ(q?lVn?8Tul+L)*m7yS<452+q!e(f(5-c=c6)y&j2+60f|$l% zKA%Y!Blm_**S<388#1NDxQ$g{QB&xLrPKZz+bd44-`@me2nAuKO`#w_VtSm#6 zdY@$L1dIglQc=KyU8Hr?I$`xW)%_H?k&&!fUzXv!e6zQuKKa^E#-f!?+_&N?C2^vb zrkbP~T^u0q4gsNn4%Q)toYQkfR#<`GRp-1_5HRh!?5U#KHbK+5n~OqBs?+D$5L^YF ziz(z?l3ayXzx5CPNJ-kmIII`W3=^?vm4}7OwF|9a?S$)EUkpU2{)G@YMbdQ+gWcy2 zov-~cY3Lja?~9j|+Cr*VkWHjae)2>Cj&C$?PiMkA4hupENeYQ(To&ZBi+2;&73HqMLHqwd!vHIH48G~ zTC88`H<7T3$kTv%z6Y_Y^K+34ZIy&D@y%Y^o5b*aI~K>c=TsM>v>JF&Ubg%EK9=CC zkHG`Gnx0gpEi0xeg6x@^(sUW`o#1Y%#T0k{hlxi5MQ zq!eQJjkAOCat>1Di z=vHb*qSz<1vAi9Qt?=k`ybGn(`8ro5gQ|!R%*Aa+(r}Cdgr|kSMeOp z&)O9fl5*t~lB5Ficvpz(krHL^xueQF>2dnbnQq#>?N$y`ki_3SSVg`AxB^vBi2(ML zUy@lvNNNcMl1++i${Go05S=SM-rc1A@%@6? zS06Xz=r;IJ?Dk&20o~)0mN=QOFEiyj6Jfzse|oTBj~VsP0NJB)^rk8MMzmTLdvC8m zO)YGhwuNurV$_kM%sKCXPx9yMO?Yk9=HFrn7x{&a<5RDSl~w%u?SkY{OiR4jb_WU+ zGx4mRDKQ!mRLQ1Th@_wyr9b2EcyjlV#leehJf&#fZeM(qhKjl|_!vV`?1j1qjB<4w zh8R6B;#8M#4neVRv0&nRie=~i$b3IU?1XD@gy@n0=jH)BcS|^cOm)Mw&RMiE36fC> z5$O2xw|}A7v?Ae!&Z8o& z+`^1vyU4$$Uyu`*^^rQwCK_hIcUzy1&Hxdo@b)elRAlkqvUlDunDQ_G!A*6Q-1;Tw z@H}dv2E{%VaOwK6Pi=oMpQ;B-D~ z#eMC#tO{lD#}@GfG}@027vKK$aG=%CbcC2)e)GH&s|EI@74*{nenb&EDj$%M-Ia<8 z{T1}Iprg`xHvKk~D-900!>FzuTUIU*3ty8>2H8^>Bz$a%i#biy{NLLGq(z) zWCUj$wo7Kh`}d+);l8@&ewHARwmKLC7X*SpKq5uq4ZC&d&!2)HtTgFubSALagJHRi z&hj54Y8##LKdADb@ed6@AjpHWhIlEDPulG^x;Wv(ZH;&poV3|FbdY~l8f*uh`{_TA zR*vT%c%Onm$$V%aOwj+m3W9Iv(LpcxJbgX2)zQ!&ga50RG`C%Jn&;0SgFzPd){gxD zFa0;kzZB^IClB_2VX|fL~DLy`M2WR{L5B_`N|G<_9=x*~r XBmWfxUVaQtL++xJV_}hjAEx|Y-jh4& delta 179032 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 Date: Fri, 6 Apr 2018 21:51:55 +0200 Subject: [PATCH 40/43] Improve Travis build speed by storing build cache --- .travis.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fb247942e4..03c280f2d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,4 +21,14 @@ script: - ./gradlew -Pcoverage test jacocoTestReport after_success: - - bash <(curl -s https://codecov.io/bash) \ No newline at end of file + - bash <(curl -s https://codecov.io/bash) + +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ + +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ + - $HOME/.android/build-cache \ No newline at end of file From ca01fcc2706a88c24db1e75670465a0f4816841a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 7 Apr 2018 09:35:21 +0200 Subject: [PATCH 41/43] 1.60d-dev --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 72af0a8020..15015ca255 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { targetSdkVersion 25 multiDexEnabled true versionCode 1500 - version "1.60c-dev" + version "1.60d-dev" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" From 2fee7f3186cbeefa66d05131a056f6dca3de4c74 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 7 Apr 2018 16:33:37 +0200 Subject: [PATCH 42/43] fix NPE in Simulator --- app/src/test/java/info/AAPSMocker.java | 9 ++++++++- .../androidaps/interfaces/ConstraintsCheckerTest.java | 1 + .../androidaps/plugins/PumpCombo/ComboPluginTest.java | 4 +++- .../androidaps/plugins/PumpDanaR/DanaRPluginTest.java | 1 + .../androidaps/plugins/PumpDanaRS/DanaRSPluginTest.java | 1 + .../plugins/PumpInsight/InsightPluginTest.java | 1 + 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/info/AAPSMocker.java b/app/src/test/java/info/AAPSMocker.java index 209b78e115..1e11a5f401 100644 --- a/app/src/test/java/info/AAPSMocker.java +++ b/app/src/test/java/info/AAPSMocker.java @@ -17,6 +17,7 @@ import info.nightscout.androidaps.data.ConstraintChecker; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.queue.CommandQueue; import info.nightscout.utils.SP; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -122,11 +123,17 @@ public class AAPSMocker { when(MainApp.getDbHelper()).thenReturn(databaseHelper); } + public static void mockCommandQueue() { + CommandQueue queue = mock(CommandQueue.class); + when(ConfigBuilderPlugin.getCommandQueue()).thenReturn(queue); + } + public static Profile getValidProfile() { try { if (profile == null) profile = new Profile(new JSONObject(validProfile), Constants.MGDL); - } catch (JSONException ignored) {} + } catch (JSONException ignored) { + } return profile; } diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java index e1204c104b..4617335c18 100644 --- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java +++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java @@ -257,6 +257,7 @@ public class ConstraintsCheckerTest { AAPSMocker.mockBus(); AAPSMocker.mockStrings(); AAPSMocker.mockSP(); + AAPSMocker.mockCommandQueue(); // RS constructor when(SP.getString(R.string.key_danars_address, "")).thenReturn(""); diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPluginTest.java index ff558bff2c..dd648ebab0 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPluginTest.java @@ -15,12 +15,13 @@ import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Bolus; +import info.nightscout.androidaps.queue.CommandQueue; import info.nightscout.utils.ToastUtils; import static org.junit.Assert.assertEquals; @RunWith(PowerMockRunner.class) -@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, ToastUtils.class, Context.class}) +@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, ToastUtils.class, Context.class, CommandQueue.class}) public class ComboPluginTest { ComboPlugin comboPlugin; @@ -63,6 +64,7 @@ public class ComboPluginTest { AAPSMocker.mockConfigBuilder(); AAPSMocker.mockBus(); AAPSMocker.mockStrings(); + AAPSMocker.mockCommandQueue(); comboPlugin = ComboPlugin.getPlugin(); } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPluginTest.java index f892262494..3963812c78 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPluginTest.java @@ -66,6 +66,7 @@ public class DanaRPluginTest { AAPSMocker.mockStrings(); AAPSMocker.mockApplicationContext(); AAPSMocker.mockSP(); + AAPSMocker.mockCommandQueue(); when(SP.getString(R.string.key_danars_address, "")).thenReturn(""); diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPluginTest.java index 645540d5e8..1345915391 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPluginTest.java @@ -66,6 +66,7 @@ public class DanaRSPluginTest { AAPSMocker.mockStrings(); AAPSMocker.mockApplicationContext(); AAPSMocker.mockSP(); + AAPSMocker.mockCommandQueue(); when(SP.getString(R.string.key_danars_address, "")).thenReturn(""); diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPluginTest.java index 47595c929b..f794936b8e 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPluginTest.java @@ -49,6 +49,7 @@ public class InsightPluginTest { AAPSMocker.mockConfigBuilder(); AAPSMocker.mockBus(); AAPSMocker.mockStrings(); + AAPSMocker.mockCommandQueue(); insightPlugin = InsightPlugin.getPlugin(); } From ba83f7f499cff46094e45c3720d0fd8d0b80a4dc Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Sun, 8 Apr 2018 13:43:37 +0200 Subject: [PATCH 43/43] Correct lastDataTime handling --- .../androidaps/plugins/PumpInsight/InsightPlugin.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java index 21a59c326f..6cc856d46f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java @@ -242,7 +242,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai // TODO review if (!Config.NSCLIENT && !Config.G5UPLOADER) NSUpload.uploadDeviceStatus(); - lastDataTime = new Date(); } @Override @@ -283,7 +282,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai public void getPumpStatus() { log("getPumpStatus"); - lastDataTime = new Date(); if (Connector.get().isPumpConnected()) { log("is connected.. requesting status"); final UUID uuid = aSyncTaskRunner(new StatusTaskRunner(connector.getServiceConnector()), "Status"); @@ -439,7 +437,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai updateGui(); connector.tryToGetPumpStatusAgain(); - lastDataTime = new Date(); connector.requestHistorySync(30000); if (result.success) while (true) { @@ -538,8 +535,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai if (Config.logPumpComm) log.debug("Setting temp basal absolute: " + pumpEnactResult.success); - lastDataTime = new Date(); - updateGui(); connector.requestHistorySync(5000); @@ -621,7 +616,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai TemporaryBasal tempStop = new TemporaryBasal().date(System.currentTimeMillis()).source(Source.USER); TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempStop); } - lastDataTime = new Date(); updateGui(); if (Config.logPumpComm) log.debug("Canceling temp basal: "); // TODO get more info @@ -950,6 +944,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai singleMessageTaskRunner.fetch(new TaskRunner.ResultCallback() { @Override public void onResult(Object o) { + lastDataTime = new Date(); log(name + " success"); event.response_object = o; if (o instanceof BolusMessage) { @@ -988,6 +983,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai task.fetch(new TaskRunner.ResultCallback() { @Override public void onResult(Object o) { + lastDataTime = new Date(); log(name + " success"); event.response_object = o; event.success = true;