From 79c2f0dd5a16688490afb9a4e23ffc4e0c8332ea Mon Sep 17 00:00:00 2001 From: Pete Schwamb Date: Mon, 1 Oct 2018 14:05:15 -0500 Subject: [PATCH 1/9] Fix issue report crash, and track pump frequency. (#821) --- Cartfile | 5 ++--- Cartfile.resolved | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Cartfile b/Cartfile index 19c5b4d835..e7cea4930e 100644 --- a/Cartfile +++ b/Cartfile @@ -1,8 +1,7 @@ - -github "LoopKit/LoopKit" "dev" +github "rsilvers129/LoopKit/LoopKit" "FPU-dev" github "LoopKit/CGMBLEKit" "dev" github "i-schuetz/SwiftCharts" == 0.6.2 github "LoopKit/dexcom-share-client-swift" "carthage-recursive" github "LoopKit/G4ShareSpy" "fix-cartfile" -github "ps2/rileylink_ios" "dev" +github "rsilvers129/rileylink_ios" "FPU-dev" github "LoopKit/Amplitude-iOS" "decreepify" diff --git a/Cartfile.resolved b/Cartfile.resolved index 46a30a96dc..d716f6e80c 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,7 +1,7 @@ github "LoopKit/Amplitude-iOS" "2137d5fd44bf630ed33e1e72d7af6d8f8612f270" -github "LoopKit/CGMBLEKit" "bc7c6bb2aaea48e501ecdbb379cd3a533f5df42e" -github "LoopKit/G4ShareSpy" "67208c66abfbb3bff813f047b6c40612338a335b" -github "LoopKit/LoopKit" "1c23bb5fd54c0b0aaa81dbabcb35f2d4c9c2e8cf" -github "LoopKit/dexcom-share-client-swift" "27fd38c28dcb16093ddf660c2b6b84ae34733352" +github "LoopKit/CGMBLEKit" "v2.1.1" +github "mddub/G4ShareSpy" "v0.3.3" +github "rsilvers129/LoopKit" "f113f050c7a4a13be1594133a886e43848beb3ab" +github "mddub/dexcom-share-client-swift" "v0.4.1" github "i-schuetz/SwiftCharts" "0.6.2" -github "ps2/rileylink_ios" "5df08f32f11ac2cb6097ba1411349f05b9171e72" +github "rsilvers129/rileylink_ios" "58be9aba533bb18eb7d38c7759693e0e059390c5" From dcd71fdaafa77f40c55657913d80aa37022872d5 Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Mon, 15 Oct 2018 00:29:37 -0400 Subject: [PATCH 2/9] Loop or LoopKit to do the protein-fat updatedCarbEntry? --- Loop/View Controllers/StatusTableViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Loop/View Controllers/StatusTableViewController.swift b/Loop/View Controllers/StatusTableViewController.swift index e6730f4cd9..27882a8e50 100644 --- a/Loop/View Controllers/StatusTableViewController.swift +++ b/Loop/View Controllers/StatusTableViewController.swift @@ -898,6 +898,8 @@ final class StatusTableViewController: ChartsTableViewController { guard let carbVC = segue.source as? CarbEntryEditViewController, let updatedEntry = carbVC.updatedCarbEntry else { return } + + // RSS - Do we need to do an addCarbEntry here for the Protain and Fat portion? if #available(iOS 12.0, *) { let interaction = INInteraction(intent: NewCarbEntryIntent(), response: nil) From 12e30420f88ac5f9772ba7288a1e5e30855681fc Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Tue, 23 Oct 2018 01:28:08 -0400 Subject: [PATCH 3/9] parent dcd71fdaafa77f40c55657913d80aa37022872d5 author Robert Silvers 1540272488 -0400 committer Robert Silvers 1541300201 -0400 rsilvers FPU modifications --- .gitmodules | 21 + Cartfile | 8 +- Cartfile.resolved | 10 +- Carthage/Checkouts/Amplitude-iOS | 1 + Carthage/Checkouts/CGMBLEKit | 1 + Carthage/Checkouts/G4ShareSpy | 1 + Carthage/Checkouts/LoopKit | 1 + Carthage/Checkouts/SwiftCharts | 1 + Carthage/Checkouts/dexcom-share-client-swift | 1 + Carthage/Checkouts/rileylink_ios | 1 + Common/Extensions/GlucoseRangeSchedule.swift | 4 + Common/Extensions/NSUserDefaults.swift | 16 +- Common/Models/FPUDelay.swift | 39 + Common/Models/FPURatio.swift | 39 + Common/Models/LoopSettings.swift | 22 +- FPU-calc.xlsx | Bin 0 -> 42696 bytes Loop Status Extension/Info.plist | 8 +- .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Loop.xcodeproj/project.bak | 2983 +++++++++++++++++ Loop.xcodeproj/project.pbxproj | 48 +- .../Complication - WatchApp.xcscheme | 2 +- .../xcschemes/DoseMathTests.xcscheme | 2 +- .../xcschemes/Loop Status Extension.xcscheme | 2 +- .../xcshareddata/xcschemes/Loop.xcscheme | 2 +- .../xcshareddata/xcschemes/LoopTests.xcscheme | 2 +- .../Notification - WatchApp.xcscheme | 2 +- .../xcshareddata/xcschemes/WatchApp.xcscheme | 2 +- Loop/Base.lproj/Localizable.strings | 3 + Loop/Info.plist | 2 +- Loop/Managers/AnalyticsManager.swift | 13 + Loop/Managers/CGMManager.swift | 2 + .../IntegralRetrospectiveCorrection.swift | 161 + Loop/Managers/LoopDataManager.swift | 62 +- .../ServiceAuthentication/ShareService.swift | 153 + .../CarbAbsorptionViewController.swift | 46 +- .../FPUDelayTableViewController.swift | 36 + .../FPURatioTableViewController.swift | 37 + .../PredictionTableViewController.swift | 67 +- .../SettingsTableViewController.swift | 68 + .../StatusTableViewController.swift | 33 +- WatchApp/Info.plist | 8 +- 42 files changed, 3850 insertions(+), 70 deletions(-) create mode 100644 .gitmodules create mode 160000 Carthage/Checkouts/Amplitude-iOS create mode 160000 Carthage/Checkouts/CGMBLEKit create mode 160000 Carthage/Checkouts/G4ShareSpy create mode 160000 Carthage/Checkouts/LoopKit create mode 160000 Carthage/Checkouts/SwiftCharts create mode 160000 Carthage/Checkouts/dexcom-share-client-swift create mode 160000 Carthage/Checkouts/rileylink_ios create mode 100644 Common/Models/FPUDelay.swift create mode 100644 Common/Models/FPURatio.swift create mode 100644 FPU-calc.xlsx rename {Loop.xcodeproj/project.xcworkspace => Loop-IRC.xcworkspace}/contents.xcworkspacedata (72%) create mode 100644 Loop-IRC.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Loop.xcodeproj/project.bak create mode 100644 Loop/Managers/IntegralRetrospectiveCorrection.swift create mode 100644 Loop/Models/ServiceAuthentication/ShareService.swift create mode 100644 Loop/View Controllers/FPUDelayTableViewController.swift create mode 100644 Loop/View Controllers/FPURatioTableViewController.swift diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..d9d5d5f305 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,21 @@ +[submodule "Carthage/Checkouts/Amplitude-iOS"] + path = Carthage/Checkouts/Amplitude-iOS + url = https://github.com/LoopKit/Amplitude-iOS.git +[submodule "Carthage/Checkouts/dexcom-share-client-swift"] + path = Carthage/Checkouts/dexcom-share-client-swift + url = https://github.com/rsilvers129/dexcom-share-client-swift.git +[submodule "Carthage/Checkouts/SwiftCharts"] + path = Carthage/Checkouts/SwiftCharts + url = https://github.com/i-schuetz/SwiftCharts.git +[submodule "Carthage/Checkouts/G4ShareSpy"] + path = Carthage/Checkouts/G4ShareSpy + url = https://github.com/rsilvers129/G4ShareSpy.git +[submodule "Carthage/Checkouts/CGMBLEKit"] + path = Carthage/Checkouts/CGMBLEKit + url = https://github.com/rsilvers129/CGMBLEKit.git +[submodule "Carthage/Checkouts/rileylink_ios"] + path = Carthage/Checkouts/rileylink_ios + url = https://github.com/rsilvers129/rileylink_ios.git +[submodule "Carthage/Checkouts/LoopKit"] + path = Carthage/Checkouts/LoopKit + url = https://github.com/rsilvers129/LoopKit.git diff --git a/Cartfile b/Cartfile index e7cea4930e..49b56384cd 100644 --- a/Cartfile +++ b/Cartfile @@ -1,7 +1,7 @@ -github "rsilvers129/LoopKit/LoopKit" "FPU-dev" -github "LoopKit/CGMBLEKit" "dev" +github "rsilvers129/LoopKit" "FPU-dev" +github "rsilvers129/CGMBLEKit" "dev" github "i-schuetz/SwiftCharts" == 0.6.2 -github "LoopKit/dexcom-share-client-swift" "carthage-recursive" -github "LoopKit/G4ShareSpy" "fix-cartfile" +github "rsilvers129/dexcom-share-client-swift" "carthage-recursive" +github "rsilvers129/G4ShareSpy" "fix-cartfile" github "rsilvers129/rileylink_ios" "FPU-dev" github "LoopKit/Amplitude-iOS" "decreepify" diff --git a/Cartfile.resolved b/Cartfile.resolved index d716f6e80c..17fce65aeb 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,7 +1,7 @@ github "LoopKit/Amplitude-iOS" "2137d5fd44bf630ed33e1e72d7af6d8f8612f270" -github "LoopKit/CGMBLEKit" "v2.1.1" -github "mddub/G4ShareSpy" "v0.3.3" -github "rsilvers129/LoopKit" "f113f050c7a4a13be1594133a886e43848beb3ab" -github "mddub/dexcom-share-client-swift" "v0.4.1" github "i-schuetz/SwiftCharts" "0.6.2" -github "rsilvers129/rileylink_ios" "58be9aba533bb18eb7d38c7759693e0e059390c5" +github "rsilvers129/CGMBLEKit" "8eb7b463490b76e93143dafec2b24951e4305a41" +github "rsilvers129/G4ShareSpy" "0448cfc3de9637c3b89698c3e5645d472aefb1e8" +github "rsilvers129/LoopKit" "4a7c8118cc53926cc018a127fd177d944c0cba65" +github "rsilvers129/dexcom-share-client-swift" "10d5739613f8b70946210f763a260e80a17cb1a8" +github "rsilvers129/rileylink_ios" "5c47e983f46ea39ffbec52898963f609523b5fb4" diff --git a/Carthage/Checkouts/Amplitude-iOS b/Carthage/Checkouts/Amplitude-iOS new file mode 160000 index 0000000000..2137d5fd44 --- /dev/null +++ b/Carthage/Checkouts/Amplitude-iOS @@ -0,0 +1 @@ +Subproject commit 2137d5fd44bf630ed33e1e72d7af6d8f8612f270 diff --git a/Carthage/Checkouts/CGMBLEKit b/Carthage/Checkouts/CGMBLEKit new file mode 160000 index 0000000000..8eb7b46349 --- /dev/null +++ b/Carthage/Checkouts/CGMBLEKit @@ -0,0 +1 @@ +Subproject commit 8eb7b463490b76e93143dafec2b24951e4305a41 diff --git a/Carthage/Checkouts/G4ShareSpy b/Carthage/Checkouts/G4ShareSpy new file mode 160000 index 0000000000..0448cfc3de --- /dev/null +++ b/Carthage/Checkouts/G4ShareSpy @@ -0,0 +1 @@ +Subproject commit 0448cfc3de9637c3b89698c3e5645d472aefb1e8 diff --git a/Carthage/Checkouts/LoopKit b/Carthage/Checkouts/LoopKit new file mode 160000 index 0000000000..74d539c573 --- /dev/null +++ b/Carthage/Checkouts/LoopKit @@ -0,0 +1 @@ +Subproject commit 74d539c573fa1f60108c0188ef608e60b7366ab5 diff --git a/Carthage/Checkouts/SwiftCharts b/Carthage/Checkouts/SwiftCharts new file mode 160000 index 0000000000..c16ddb6712 --- /dev/null +++ b/Carthage/Checkouts/SwiftCharts @@ -0,0 +1 @@ +Subproject commit c16ddb6712ae08ed8b30089074093450b37923b8 diff --git a/Carthage/Checkouts/dexcom-share-client-swift b/Carthage/Checkouts/dexcom-share-client-swift new file mode 160000 index 0000000000..10d5739613 --- /dev/null +++ b/Carthage/Checkouts/dexcom-share-client-swift @@ -0,0 +1 @@ +Subproject commit 10d5739613f8b70946210f763a260e80a17cb1a8 diff --git a/Carthage/Checkouts/rileylink_ios b/Carthage/Checkouts/rileylink_ios new file mode 160000 index 0000000000..5c47e983f4 --- /dev/null +++ b/Carthage/Checkouts/rileylink_ios @@ -0,0 +1 @@ +Subproject commit 5c47e983f46ea39ffbec52898963f609523b5fb4 diff --git a/Common/Extensions/GlucoseRangeSchedule.swift b/Common/Extensions/GlucoseRangeSchedule.swift index 4cd1712a52..4c5d83bd37 100644 --- a/Common/Extensions/GlucoseRangeSchedule.swift +++ b/Common/Extensions/GlucoseRangeSchedule.swift @@ -57,6 +57,10 @@ extension GlucoseRangeSchedule { func minQuantity(at date: Date) -> HKQuantity { return HKQuantity(unit: unit, doubleValue: value(at: date).minValue) } + + func maxQuantity(at date: Date) -> HKQuantity { + return HKQuantity(unit: unit, doubleValue: value(at: date).maxValue) + } } diff --git a/Common/Extensions/NSUserDefaults.swift b/Common/Extensions/NSUserDefaults.swift index 7d5d73edde..c73753c07d 100644 --- a/Common/Extensions/NSUserDefaults.swift +++ b/Common/Extensions/NSUserDefaults.swift @@ -4,6 +4,7 @@ // // Created by Nathan Racklyeft on 8/30/15. // Copyright © 2015 Nathan Racklyeft. All rights reserved. +// Fat-Protein Unit code by Robert Silvers, 10/2018. // import Foundation @@ -100,6 +101,16 @@ extension UserDefaults { if maximumBasalRatePerHour! <= 0 { maximumBasalRatePerHour = nil } + + var fpuRatio: Double? = double(forKey: "com.loudnate.Naterade.FPURatio") + if fpuRatio! <= 0 { + fpuRatio = nil + } + + var fpuDelay: Double? = double(forKey: "com.loudnate.Naterade.FPUDelay") + if fpuDelay! <= 0 { + fpuDelay = nil + } var maximumBolus: Double? = double(forKey: "com.loudnate.Naterade.MaximumBolus") if maximumBolus! <= 0 { @@ -112,7 +123,10 @@ extension UserDefaults { maximumBasalRatePerHour: maximumBasalRatePerHour, maximumBolus: maximumBolus, suspendThreshold: suspendThreshold, - retrospectiveCorrectionEnabled: bool(forKey: "com.loudnate.Loop.RetrospectiveCorrectionEnabled") + fpuRatio: fpuRatio, + fpuDelay: fpuDelay, + retrospectiveCorrectionEnabled: bool(forKey: "com.loudnate.Loop.RetrospectiveCorrectionEnabled"), + integralRetrospectiveCorrectionEnabled: bool(forKey: "com.loopkit.Loop.IntegralRetrospectiveCorrectionEnabled") ) self.loopSettings = settings diff --git a/Common/Models/FPUDelay.swift b/Common/Models/FPUDelay.swift new file mode 100644 index 0000000000..efbbe3140a --- /dev/null +++ b/Common/Models/FPUDelay.swift @@ -0,0 +1,39 @@ +// +// FPUDelay.swift +// Loop +// +// Created by Robert Silvers on 10/19/18. +// Copyright © 2018 LoopKit Authors. All rights reserved. +// + +import Foundation +import HealthKit + +struct FPUDelay: RawRepresentable { + typealias RawValue = [String: Any] + + let value: Double + + public init(value: Double) { + self.value = value + } + + init?(rawValue: RawValue) { + guard let value = rawValue["value"] as? Double else { + return nil + } + self.value = value + } + + var rawValue: RawValue { + return [ + "value": value, + ] + } +} + +extension FPUDelay: Equatable { + static func ==(lhs: FPUDelay, rhs: FPUDelay) -> Bool { + return lhs.value == rhs.value + } +} diff --git a/Common/Models/FPURatio.swift b/Common/Models/FPURatio.swift new file mode 100644 index 0000000000..93bfd9c971 --- /dev/null +++ b/Common/Models/FPURatio.swift @@ -0,0 +1,39 @@ +// +// FPURatio.swift +// Loop +// +// Created by Robert Silvers on 10/19/18. +// Copyright © 2018 LoopKit Authors. All rights reserved. +// + +import Foundation +import HealthKit + +struct FPURatio: RawRepresentable { + typealias RawValue = [String: Any] + + let value: Double + + public init(value: Double) { + self.value = value + } + + init?(rawValue: RawValue) { + guard let value = rawValue["value"] as? Double else { + return nil + } + self.value = value + } + + var rawValue: RawValue { + return [ + "value": value, + ] + } +} + +extension FPURatio: Equatable { + static func ==(lhs: FPURatio, rhs: FPURatio) -> Bool { + return lhs.value == rhs.value + } +} diff --git a/Common/Models/LoopSettings.swift b/Common/Models/LoopSettings.swift index ae1c5a33b1..24aa9a247f 100644 --- a/Common/Models/LoopSettings.swift +++ b/Common/Models/LoopSettings.swift @@ -4,6 +4,7 @@ // // Copyright © 2017 LoopKit Authors. All rights reserved. // +// Fat-Protein Unit code by Robert Silvers, 10/2018. import LoopKit @@ -20,14 +21,20 @@ struct LoopSettings: Equatable { var maximumBolus: Double? var suspendThreshold: GlucoseThreshold? = nil + + var fpuRatio: Double? + + var fpuDelay: Double? var retrospectiveCorrectionEnabled = true + + var integralRetrospectiveCorrectionEnabled = true /// The interval over which to aggregate changes in glucose for retrospective correction let retrospectiveCorrectionGroupingInterval = TimeInterval(minutes: 30) /// The maximum duration over which to integrate retrospective correction changes - let retrospectiveCorrectionIntegrationInterval = TimeInterval(minutes: 30) + let retrospectiveCorrectionIntegrationInterval = TimeInterval(minutes: 180) /// The amount of time since a given date that data should be considered valid let recencyInterval = TimeInterval(minutes: 15) @@ -63,6 +70,10 @@ extension LoopSettings: RawRepresentable { self.maximumBasalRatePerHour = rawValue["maximumBasalRatePerHour"] as? Double self.maximumBolus = rawValue["maximumBolus"] as? Double + + self.fpuRatio = rawValue["fpuRatio"] as? Double + + self.fpuDelay = rawValue["fpuDelay"] as? Double if let rawThreshold = rawValue["minimumBGGuard"] as? GlucoseThreshold.RawValue { self.suspendThreshold = GlucoseThreshold(rawValue: rawThreshold) @@ -71,19 +82,26 @@ extension LoopSettings: RawRepresentable { if let retrospectiveCorrectionEnabled = rawValue["retrospectiveCorrectionEnabled"] as? Bool { self.retrospectiveCorrectionEnabled = retrospectiveCorrectionEnabled } + + if let integralRetrospectiveCorrectionEnabled = rawValue["integralRetrospectiveCorrectionEnabled"] as? Bool { + self.integralRetrospectiveCorrectionEnabled = integralRetrospectiveCorrectionEnabled + } } var rawValue: RawValue { var raw: RawValue = [ "version": LoopSettings.version, "dosingEnabled": dosingEnabled, - "retrospectiveCorrectionEnabled": retrospectiveCorrectionEnabled + "retrospectiveCorrectionEnabled": retrospectiveCorrectionEnabled, + "integralRetrospectiveCorrectionEnabled": integralRetrospectiveCorrectionEnabled ] raw["glucoseTargetRangeSchedule"] = glucoseTargetRangeSchedule?.rawValue raw["maximumBasalRatePerHour"] = maximumBasalRatePerHour raw["maximumBolus"] = maximumBolus raw["minimumBGGuard"] = suspendThreshold?.rawValue + raw["fpuRatio"] = fpuRatio + raw["fpuDelay"] = fpuDelay return raw } diff --git a/FPU-calc.xlsx b/FPU-calc.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..67b245b06ea7bc00637da211459255b50c86f8dd GIT binary patch literal 42696 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 + AppGroupIdentifier + $(APP_GROUP_IDENTIFIER) CFBundleDevelopmentRegion en - MainAppBundleIdentifier - $(MAIN_APP_BUNDLE_IDENTIFIER) CFBundleDisplayName Loop CFBundleExecutable @@ -22,8 +22,8 @@ 1.9.4 dev CFBundleVersion $(CURRENT_PROJECT_VERSION) - AppGroupIdentifier - $(APP_GROUP_IDENTIFIER) + MainAppBundleIdentifier + $(MAIN_APP_BUNDLE_IDENTIFIER) NSExtension NSExtensionMainStoryboard diff --git a/Loop.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Loop-IRC.xcworkspace/contents.xcworkspacedata similarity index 72% rename from Loop.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Loop-IRC.xcworkspace/contents.xcworkspacedata index 1bd3f8ef6f..4062918c69 100644 --- a/Loop.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Loop-IRC.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "group:Loop.xcodeproj"> diff --git a/Loop-IRC.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Loop-IRC.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/Loop-IRC.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Loop.xcodeproj/project.bak b/Loop.xcodeproj/project.bak new file mode 100644 index 0000000000..23031918f2 --- /dev/null +++ b/Loop.xcodeproj/project.bak @@ -0,0 +1,2983 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXAggregateTarget section */ + 432CF87720D8B8380066B889 /* Cartfile */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 432CF87820D8B8380066B889 /* Build configuration list for PBXAggregateTarget "Cartfile" */; + buildPhases = ( + 432CF88220D8BCD90066B889 /* Homebrew & Carthage Setup */, + 432CF87B20D8B8490066B889 /* Build Carthage Dependencies */, + ); + dependencies = ( + ); + name = Cartfile; + productName = Cartfile; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 43027F0F1DFE0EC900C51989 /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; }; + 4302F4E11D4E9C8900F0FCAF /* TextFieldTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4302F4E01D4E9C8900F0FCAF /* TextFieldTableViewController.swift */; }; + 4302F4E31D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4302F4E21D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift */; }; + 430B298A2041F54A00BA9F93 /* NSUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B29892041F54A00BA9F93 /* NSUserDefaults.swift */; }; + 430B298B2041F55700BA9F93 /* NSUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B29892041F54A00BA9F93 /* NSUserDefaults.swift */; }; + 430B298E2041F56500BA9F93 /* LoopSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298C2041F56500BA9F93 /* LoopSettings.swift */; }; + 430B298F2041F56500BA9F93 /* GlucoseThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */; }; + 430B29902041F57000BA9F93 /* GlucoseThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */; }; + 430B29912041F57200BA9F93 /* LoopSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298C2041F56500BA9F93 /* LoopSettings.swift */; }; + 430B29932041F5B300BA9F93 /* UserDefaults+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B29922041F5B200BA9F93 /* UserDefaults+Loop.swift */; }; + 430B29952041F5CB00BA9F93 /* LoopSettings+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B29942041F5CB00BA9F93 /* LoopSettings+Loop.swift */; }; + 430D85891F44037000AF2D4F /* HUDViewTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430D85881F44037000AF2D4F /* HUDViewTableViewCell.swift */; }; + 430DA58E1D4AEC230097D1CA /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; }; + 4311FB9B1F37FE1B00D4C0A7 /* TitleSubtitleTextFieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4311FB9A1F37FE1B00D4C0A7 /* TitleSubtitleTextFieldTableViewCell.swift */; }; + 4315D2871CA5CC3B00589052 /* CarbEntryEditTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4315D2861CA5CC3B00589052 /* CarbEntryEditTableViewController.swift */; }; + 4315D28A1CA5F45E00589052 /* DiagnosticLogger+LoopKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4315D2891CA5F45E00589052 /* DiagnosticLogger+LoopKit.swift */; }; + 431A8C401EC6E8AB00823B9C /* CircleMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431A8C3F1EC6E8AB00823B9C /* CircleMaskView.swift */; }; + 431E73481FF95A900069B5F7 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E73471FF95A900069B5F7 /* PersistenceController.swift */; }; + 4326BA641F3A44D9007CCAD4 /* ChartLineModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4326BA631F3A44D9007CCAD4 /* ChartLineModel.swift */; }; + 4328E01A1CFBE1DA00E199AA /* ActionHUDController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0151CFBE1DA00E199AA /* ActionHUDController.swift */; }; + 4328E01B1CFBE1DA00E199AA /* BolusInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0161CFBE1DA00E199AA /* BolusInterfaceController.swift */; }; + 4328E01E1CFBE25F00E199AA /* AddCarbsInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E01D1CFBE25F00E199AA /* AddCarbsInterfaceController.swift */; }; + 4328E0261CFBE2C500E199AA /* IdentifiableClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0201CFBE2C500E199AA /* IdentifiableClass.swift */; }; + 4328E0281CFBE2C500E199AA /* CLKComplicationTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0221CFBE2C500E199AA /* CLKComplicationTemplate.swift */; }; + 4328E02A1CFBE2C500E199AA /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0241CFBE2C500E199AA /* UIColor.swift */; }; + 4328E02B1CFBE2C500E199AA /* WKAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0251CFBE2C500E199AA /* WKAlertAction.swift */; }; + 4328E02F1CFBF81800E199AA /* WKInterfaceImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E02E1CFBF81800E199AA /* WKInterfaceImage.swift */; }; + 4328E0331CFC091100E199AA /* WatchContext+LoopKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0311CFC068900E199AA /* WatchContext+LoopKit.swift */; }; + 4328E0351CFC0AE100E199AA /* WatchDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0341CFC0AE100E199AA /* WatchDataManager.swift */; }; + 432CF87520D8AC950066B889 /* NSUserDefaults+WatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4328E0231CFBE2C500E199AA /* NSUserDefaults+WatchApp.swift */; }; + 432E73CB1D24B3D6009AD15D /* RemoteDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 432E73CA1D24B3D6009AD15D /* RemoteDataManager.swift */; }; + 433EA4C41D9F71C800CD78FB /* CommandResponseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 433EA4C31D9F71C800CD78FB /* CommandResponseViewController.swift */; }; + 4341F4EB1EDB92AC001C936B /* LogglyService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4341F4EA1EDB92AC001C936B /* LogglyService.swift */; }; + 43441A9C1EDB34810087958C /* StatusExtensionContext+LoopKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43441A9B1EDB34810087958C /* StatusExtensionContext+LoopKit.swift */; }; + 4344628020A7A37400C4BE6F /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4344627F20A7A37400C4BE6F /* HealthKit.framework */; }; + 4344628220A7A37F00C4BE6F /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4344628120A7A37E00C4BE6F /* CoreBluetooth.framework */; }; + 4344628520A7A3BE00C4BE6F /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4344628320A7A3BE00C4BE6F /* LoopKit.framework */; }; + 4344628620A7A3BE00C4BE6F /* CGMBLEKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4344628420A7A3BE00C4BE6F /* CGMBLEKit.framework */; }; + 4344628E20A7ADD100C4BE6F /* UserDefaults+CGM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4344628D20A7ADD100C4BE6F /* UserDefaults+CGM.swift */; }; + 4344628F20A7ADD500C4BE6F /* UserDefaults+CGM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4344628D20A7ADD100C4BE6F /* UserDefaults+CGM.swift */; }; + 4344629220A7C19800C4BE6F /* ButtonGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4344629120A7C19800C4BE6F /* ButtonGroup.swift */; }; + 4344629820A8B2D700C4BE6F /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5EE209D84BE00D17AA8 /* OSLog.swift */; }; + 4346D1E71C77F5FE00ABAFE3 /* ChartTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4346D1E61C77F5FE00ABAFE3 /* ChartTableViewCell.swift */; }; + 434B2886206628B3000EE07B /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E73471FF95A900069B5F7 /* PersistenceController.swift */; }; + 434B2887206B4F07000EE07B /* WalshInsulinModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6261F37AE5600C320C7 /* WalshInsulinModel.swift */; }; + 434B2888206B4F0A000EE07B /* InsulinModelSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6281F37B01300C320C7 /* InsulinModelSettings.swift */; }; + 434B2889206B4F0C000EE07B /* ExponentialInsulinModelPreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6241F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift */; }; + 434F54571D287FDB002A9274 /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434F54561D287FDB002A9274 /* NibLoadable.swift */; }; + 434FB6461D68F1CD007B9C70 /* Amplitude.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 434FB6451D68F1CD007B9C70 /* Amplitude.framework */; }; + 434FF1EA1CF26C29000DB779 /* IdentifiableClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434FF1E91CF26C29000DB779 /* IdentifiableClass.swift */; }; + 434FF1EE1CF27EEF000DB779 /* UITableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434FF1ED1CF27EEF000DB779 /* UITableViewCell.swift */; }; + 43523EDB1CC35083001850F1 /* RileyLinkKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43523EDA1CC35083001850F1 /* RileyLinkKit.framework */; }; + 435400311C9F744E00D5819C /* BolusSuggestionUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435400301C9F744E00D5819C /* BolusSuggestionUserInfo.swift */; }; + 435400321C9F745500D5819C /* BolusSuggestionUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435400301C9F744E00D5819C /* BolusSuggestionUserInfo.swift */; }; + 435400341C9F878D00D5819C /* SetBolusUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */; }; + 435400351C9F878D00D5819C /* SetBolusUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */; }; + 435CB6231F37967800C320C7 /* InsulinModelSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6221F37967800C320C7 /* InsulinModelSettingsViewController.swift */; }; + 435CB6251F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6241F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift */; }; + 435CB6271F37AE5600C320C7 /* WalshInsulinModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6261F37AE5600C320C7 /* WalshInsulinModel.swift */; }; + 435CB6291F37B01300C320C7 /* InsulinModelSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6281F37B01300C320C7 /* InsulinModelSettings.swift */; }; + 436961911F19D11E00447E89 /* ChartPointsContextFillLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4369618F1F19C86400447E89 /* ChartPointsContextFillLayer.swift */; }; + 436A0DA51D236A2A00104B24 /* LoopError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 436A0DA41D236A2A00104B24 /* LoopError.swift */; }; + 436D9BF81F6F4EA100CFA75F /* recommended_temp_start_low_end_just_above_range.json in Resources */ = {isa = PBXBuildFile; fileRef = 436D9BF71F6F4EA100CFA75F /* recommended_temp_start_low_end_just_above_range.json */; }; + 43709AEA20DF3F8200F941B3 /* MinimedKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43709AE920DF3F8200F941B3 /* MinimedKitUI.framework */; }; + 4372E484213A63FB0068E043 /* ChartHUDController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FFEDFBE20E5CF22000BFC58 /* ChartHUDController.swift */; }; + 4372E487213C86240068E043 /* SampleValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E486213C86240068E043 /* SampleValue.swift */; }; + 4372E488213C862B0068E043 /* SampleValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E486213C86240068E043 /* SampleValue.swift */; }; + 4372E48B213CB5F00068E043 /* Double.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E48A213CB5F00068E043 /* Double.swift */; }; + 4372E48C213CB6750068E043 /* Double.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E48A213CB5F00068E043 /* Double.swift */; }; + 4372E48D213CF8A70068E043 /* GlucoseThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */; }; + 4372E48E213CF8AD0068E043 /* LoopSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298C2041F56500BA9F93 /* LoopSettings.swift */; }; + 4372E490213CFCE70068E043 /* LoopSettingsUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E48F213CFCE70068E043 /* LoopSettingsUserInfo.swift */; }; + 4372E491213D05F90068E043 /* LoopSettingsUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E48F213CFCE70068E043 /* LoopSettingsUserInfo.swift */; }; + 4372E492213D956C0068E043 /* GlucoseRangeSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C513181E864C4E001547C7 /* GlucoseRangeSchedule.swift */; }; + 4372E496213DCDD30068E043 /* GlucoseChartValueHashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4372E495213DCDD30068E043 /* GlucoseChartValueHashable.swift */; }; + 4372E497213F79F90068E043 /* NSUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B29892041F54A00BA9F93 /* NSUserDefaults.swift */; }; + 4372E498213F7A550068E043 /* InsulinModelSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6281F37B01300C320C7 /* InsulinModelSettings.swift */; }; + 4372E499213F7A6D0068E043 /* ExponentialInsulinModelPreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6241F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift */; }; + 4372E49A213F7A830068E043 /* WalshInsulinModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435CB6261F37AE5600C320C7 /* WalshInsulinModel.swift */; }; + 4372E49B213F7B340068E043 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; }; + 4374B5EF209D84BF00D17AA8 /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5EE209D84BE00D17AA8 /* OSLog.swift */; }; + 4374B5F0209D857E00D17AA8 /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5EE209D84BE00D17AA8 /* OSLog.swift */; }; + 4374B5F2209D897600D17AA8 /* Locked.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5F1209D897600D17AA8 /* Locked.swift */; }; + 4374B5F4209D89A900D17AA8 /* TextFieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4374B5F3209D89A900D17AA8 /* TextFieldTableViewCell.swift */; }; + 43776F901B8022E90074EA36 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43776F8F1B8022E90074EA36 /* AppDelegate.swift */; }; + 43776F971B8022E90074EA36 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43776F951B8022E90074EA36 /* Main.storyboard */; }; + 43776F991B8022E90074EA36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43776F981B8022E90074EA36 /* Assets.xcassets */; }; + 43785E932120A01B0057DED1 /* NewCarbEntryIntent+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43785E922120A01B0057DED1 /* NewCarbEntryIntent+Loop.swift */; }; + 43785E972120E4500057DED1 /* INRelevantShortcutStore+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43785E952120E4010057DED1 /* INRelevantShortcutStore+Loop.swift */; }; + 43785E982120E7060057DED1 /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 43785E9B2120E7060057DED1 /* Intents.intentdefinition */; }; + 4379CFF021112CF700AADC79 /* ShareClientUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4379CFEF21112CF700AADC79 /* ShareClientUI.framework */; }; + 437AFEE42035252A008C4892 /* RileyLinkBLEKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 434AB0B11CBB4C3300422F4A /* RileyLinkBLEKit.framework */; }; + 437AFEE520352591008C4892 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F70C1DD1DE8DCA7006380B7 /* NotificationCenter.framework */; }; + 437AFEE7203688CF008C4892 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 437AFEE6203688CF008C4892 /* LoopKitUI.framework */; }; + 437AFEE8203689FE008C4892 /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F78D4B1C914197002152D1 /* LoopKit.framework */; }; + 437CEEE41CDE5C0A003C8C80 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEE31CDE5C0A003C8C80 /* UIImage.swift */; }; + 437D9BA31D7BC977007245E8 /* PredictionTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437D9BA21D7BC977007245E8 /* PredictionTableViewController.swift */; }; + 438172D91F4E9E37003C3328 /* NewPumpEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438172D81F4E9E37003C3328 /* NewPumpEvent.swift */; }; + 438849EA1D297CB6003B3F23 /* NightscoutService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438849E91D297CB6003B3F23 /* NightscoutService.swift */; }; + 438849EC1D29EC34003B3F23 /* AmplitudeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438849EB1D29EC34003B3F23 /* AmplitudeService.swift */; }; + 438849EE1D2A1EBB003B3F23 /* MLabService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438849ED1D2A1EBB003B3F23 /* MLabService.swift */; }; + 4389916B1E91B689000EEF90 /* ChartSettings+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4389916A1E91B689000EEF90 /* ChartSettings+Loop.swift */; }; + 438A95A81D8B9B24009D12E1 /* CGMBLEKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 438A95A71D8B9B24009D12E1 /* CGMBLEKit.framework */; }; + 438D42F91D7C88BC003244B0 /* PredictionInputEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438D42F81D7C88BC003244B0 /* PredictionInputEffect.swift */; }; + 438D42FB1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438D42FA1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift */; }; + 43947D731F529FAA00A07D31 /* GlucoseRangeSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C513181E864C4E001547C7 /* GlucoseRangeSchedule.swift */; }; + 439897371CD2F80600223065 /* AnalyticsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897361CD2F80600223065 /* AnalyticsManager.swift */; }; + 439A7942211F631C0041B75F /* RootNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439A7941211F631C0041B75F /* RootNavigationController.swift */; }; + 439A7944211FE22F0041B75F /* NSUserActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439A7943211FE22F0041B75F /* NSUserActivity.swift */; }; + 439A7945211FE23A0041B75F /* NSUserActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439A7943211FE22F0041B75F /* NSUserActivity.swift */; }; + 439BED2A1E76093C00B0AED5 /* CGMManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439BED291E76093C00B0AED5 /* CGMManager.swift */; }; + 43A51E1F1EB6D62A000736CC /* CarbAbsorptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A51E1E1EB6D62A000736CC /* CarbAbsorptionViewController.swift */; }; + 43A51E211EB6DBDD000736CC /* ChartsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A51E201EB6DBDD000736CC /* ChartsTableViewController.swift */; }; + 43A567691C94880B00334FAC /* LoopDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A567681C94880B00334FAC /* LoopDataManager.swift */; }; + 43A8EC6F210E622700A81379 /* CGMBLEKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A8EC6E210E622600A81379 /* CGMBLEKitUI.framework */; }; + 43A943761B926B7B0051FA24 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43A943741B926B7B0051FA24 /* Interface.storyboard */; }; + 43A9437F1B926B7B0051FA24 /* WatchApp Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 43A9437E1B926B7B0051FA24 /* WatchApp Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 43A943881B926B7B0051FA24 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A943871B926B7B0051FA24 /* ExtensionDelegate.swift */; }; + 43A9438A1B926B7B0051FA24 /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A943891B926B7B0051FA24 /* NotificationController.swift */; }; + 43A9438E1B926B7B0051FA24 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A9438D1B926B7B0051FA24 /* ComplicationController.swift */; }; + 43A943901B926B7B0051FA24 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A9438F1B926B7B0051FA24 /* Assets.xcassets */; }; + 43A943941B926B7B0051FA24 /* WatchApp.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 43A943721B926B7B0051FA24 /* WatchApp.app */; }; + 43B260491ED248FB008CAA77 /* CarbEntryTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43B260481ED248FB008CAA77 /* CarbEntryTableViewCell.swift */; }; + 43B371881CE597D10013C5A6 /* ShareClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43B371871CE597D10013C5A6 /* ShareClient.framework */; }; + 43BFF0B51E45C1E700FF19A9 /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; }; + 43BFF0B71E45C20C00FF19A9 /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; }; + 43BFF0BC1E45C80600FF19A9 /* UIColor+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0BB1E45C80600FF19A9 /* UIColor+Loop.swift */; }; + 43BFF0BF1E45C8EA00FF19A9 /* UIColor+Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0BE1E45C8EA00FF19A9 /* UIColor+Widget.swift */; }; + 43BFF0C51E465A2D00FF19A9 /* UIColor+HIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */; }; + 43BFF0C61E465A4400FF19A9 /* UIColor+HIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */; }; + 43BFF0C71E465A4F00FF19A9 /* UIColor+HIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */; }; + 43BFF0C91E465B0A00FF19A9 /* StateColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0C81E465B0A00FF19A9 /* StateColorPalette.swift */; }; + 43BFF0CB1E466C0900FF19A9 /* StateColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0CA1E466C0900FF19A9 /* StateColorPalette.swift */; }; + 43BFF0CD1E466C8400FF19A9 /* StateColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0CC1E466C8400FF19A9 /* StateColorPalette.swift */; }; + 43C0944A1CACCC73001F6403 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C094491CACCC73001F6403 /* NotificationManager.swift */; }; + 43C246A81D89990F0031F8D1 /* Crypto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43C246A71D89990F0031F8D1 /* Crypto.framework */; }; + 43C2FAE11EB656A500364AFF /* GlucoseEffectVelocity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C2FAE01EB656A500364AFF /* GlucoseEffectVelocity.swift */; }; + 43C3B6EC20B650A80026CAFA /* SettingsImageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C3B6EB20B650A80026CAFA /* SettingsImageTableViewCell.swift */; }; + 43C3B6ED20B884500026CAFA /* GlucoseThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */; }; + 43C513191E864C4E001547C7 /* GlucoseRangeSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C513181E864C4E001547C7 /* GlucoseRangeSchedule.swift */; }; + 43CA93371CB98079000026B5 /* MinimedKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43CA93361CB98079000026B5 /* MinimedKit.framework */; }; + 43CB2B2B1D924D450079823D /* WCSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CB2B2A1D924D450079823D /* WCSession.swift */; }; + 43CE7CDE1CA8B63E003CC1B0 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CE7CDD1CA8B63E003CC1B0 /* Data.swift */; }; + 43CEE6E61E56AFD400CB9116 /* NightscoutUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CEE6E51E56AFD400CB9116 /* NightscoutUploader.swift */; }; + 43D2E8231F00425400AE5CBF /* BolusViewController+LoopDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D2E8221F00425400AE5CBF /* BolusViewController+LoopDataManager.swift */; }; + 43D381621EBD9759007F8C8F /* HeaderValuesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D381611EBD9759007F8C8F /* HeaderValuesTableViewCell.swift */; }; + 43D848B01E7DCBE100DADCBC /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D848AF1E7DCBE100DADCBC /* Result.swift */; }; + 43DAD00020A2736F000F8529 /* PersistedPumpEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DACFFF20A2736F000F8529 /* PersistedPumpEvent.swift */; }; + 43DBF04C1C93B8D700B3C386 /* BolusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DBF04B1C93B8D700B3C386 /* BolusViewController.swift */; }; + 43DBF0531C93EC8200B3C386 /* DeviceDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DBF0521C93EC8200B3C386 /* DeviceDataManager.swift */; }; + 43DBF0591C93F73800B3C386 /* CarbEntryTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DBF0581C93F73800B3C386 /* CarbEntryTableViewController.swift */; }; + 43DE92591C5479E4001FFDE1 /* CarbEntryUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DE92581C5479E4001FFDE1 /* CarbEntryUserInfo.swift */; }; + 43DE925A1C5479E4001FFDE1 /* CarbEntryUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DE92581C5479E4001FFDE1 /* CarbEntryUserInfo.swift */; }; + 43DE92611C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DE92601C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift */; }; + 43DFB62320D4CAE7008A7BAE /* PumpManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C3B6F620BBCAA30026CAFA /* PumpManager.swift */; }; + 43E0F0A51E46D1670064F7CE /* LevelHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E0F0A41E46D1670064F7CE /* LevelHUDView.swift */; }; + 43E2D8C81D208D5B004DA55F /* KeychainManager+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E2D8C71D208D5B004DA55F /* KeychainManager+Loop.swift */; }; + 43E2D8D41D20BF42004DA55F /* DoseMathTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E2D8D31D20BF42004DA55F /* DoseMathTests.swift */; }; + 43E2D8DB1D20C03B004DA55F /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; }; + 43E2D8DC1D20C049004DA55F /* DoseMath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F78D251C8FC000002152D1 /* DoseMath.swift */; }; + 43E2D8EC1D20C0DB004DA55F /* read_selected_basal_profile.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E11D20C0DB004DA55F /* read_selected_basal_profile.json */; }; + 43E2D8ED1D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E21D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json */; }; + 43E2D8EE1D20C0DB004DA55F /* recommend_temp_basal_flat_and_high.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E31D20C0DB004DA55F /* recommend_temp_basal_flat_and_high.json */; }; + 43E2D8EF1D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E41D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json */; }; + 43E2D8F01D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E51D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json */; }; + 43E2D8F11D20C0DB004DA55F /* recommend_temp_basal_in_range_and_rising.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E61D20C0DB004DA55F /* recommend_temp_basal_in_range_and_rising.json */; }; + 43E2D8F21D20C0DB004DA55F /* recommend_temp_basal_no_change_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E71D20C0DB004DA55F /* recommend_temp_basal_no_change_glucose.json */; }; + 43E2D8F31D20C0DB004DA55F /* recommend_temp_basal_start_high_end_in_range.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E81D20C0DB004DA55F /* recommend_temp_basal_start_high_end_in_range.json */; }; + 43E2D8F41D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8E91D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json */; }; + 43E2D8F51D20C0DB004DA55F /* recommend_temp_basal_start_low_end_high.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8EA1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_high.json */; }; + 43E2D8F61D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json in Resources */ = {isa = PBXBuildFile; fileRef = 43E2D8EB1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json */; }; + 43E2D9151D20C5A2004DA55F /* KeychainManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E2D8C91D20B9E7004DA55F /* KeychainManagerTests.swift */; }; + 43E2D9171D2226BD004DA55F /* LoopKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 43F78D4B1C914197002152D1 /* LoopKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 43E2D9191D222759004DA55F /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F78D4B1C914197002152D1 /* LoopKit.framework */; }; + 43E3449F1B9D68E900C85C07 /* StatusTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E3449E1B9D68E900C85C07 /* StatusTableViewController.swift */; }; + 43E93FB51E4675E800EAB8DB /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; }; + 43E93FB61E469A4000EAB8DB /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; }; + 43E93FB71E469A5100EAB8DB /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; }; + 43F1C31A1F5DC87700395429 /* ChartPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438991661E91B563000EEF90 /* ChartPoint.swift */; }; + 43F41C371D3BF32400C11ED6 /* UIAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F41C361D3BF32400C11ED6 /* UIAlertController.swift */; }; + 43F4EF1D1BA2A57600526CE1 /* DiagnosticLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */; }; + 43F5C2C91B929C09003EB13D /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F5C2C81B929C09003EB13D /* HealthKit.framework */; }; + 43F5C2DB1B92A5E1003EB13D /* SettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F5C2DA1B92A5E1003EB13D /* SettingsTableViewController.swift */; }; + 43F64DD91D9C92C900D24DC6 /* TitleSubtitleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F64DD81D9C92C900D24DC6 /* TitleSubtitleTableViewCell.swift */; }; + 43F78D261C8FC000002152D1 /* DoseMath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F78D251C8FC000002152D1 /* DoseMath.swift */; }; + 43F78D4F1C914197002152D1 /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F78D4B1C914197002152D1 /* LoopKit.framework */; }; + 43FCBBC21E51710B00343C1B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43776F9A1B8022E90074EA36 /* LaunchScreen.storyboard */; }; + 4D3B40041D4A9E1A00BC6334 /* G4ShareSpy.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D3B40021D4A9DFE00BC6334 /* G4ShareSpy.framework */; }; + 4F08DE8F1E7BB871006741EA /* CollectionType+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F08DE8E1E7BB871006741EA /* CollectionType+Loop.swift */; }; + 4F08DE9B1E7BC4ED006741EA /* SwiftCharts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4346D1EF1C781BEA00ABAFE3 /* SwiftCharts.framework */; }; + 4F08DE9D1E81D0E9006741EA /* StatusChartsManager+LoopKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430C1ABC1E5568A80067F1AE /* StatusChartsManager+LoopKit.swift */; }; + 4F11D3C020DCBEEC006E072C /* GlucoseBackfillRequestUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F11D3BF20DCBEEC006E072C /* GlucoseBackfillRequestUserInfo.swift */; }; + 4F11D3C220DD80B3006E072C /* WatchHistoricalGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F11D3C120DD80B3006E072C /* WatchHistoricalGlucose.swift */; }; + 4F11D3C320DD84DB006E072C /* GlucoseBackfillRequestUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F11D3BF20DCBEEC006E072C /* GlucoseBackfillRequestUserInfo.swift */; }; + 4F11D3C420DD881A006E072C /* WatchHistoricalGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F11D3C120DD80B3006E072C /* WatchHistoricalGlucose.swift */; }; + 4F20AE621E6B879C00D07A06 /* ReservoirVolumeHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEC71CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift */; }; + 4F20AE631E6B87B100D07A06 /* ChartContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4313EDDF1D8A6BF90060FA79 /* ChartContainerView.swift */; }; + 4F2C15741E0209F500E160D4 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; }; + 4F2C15811E0495B200E160D4 /* WatchContext+WatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2C15801E0495B200E160D4 /* WatchContext+WatchApp.swift */; }; + 4F2C15821E074FC600E160D4 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; }; + 4F2C15831E0757E600E160D4 /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; }; + 4F2C15851E075B8700E160D4 /* LoopUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F75288D1DFE1DC600C322D6 /* LoopUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F2C15931E09BF2C00E160D4 /* HUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2C15921E09BF2C00E160D4 /* HUDView.swift */; }; + 4F2C15951E09BF3C00E160D4 /* HUDView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4F2C15941E09BF3C00E160D4 /* HUDView.xib */; }; + 4F2C15971E09E94E00E160D4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F2C15961E09E94E00E160D4 /* Assets.xcassets */; }; + 4F2C159A1E0C9E5600E160D4 /* LoopUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4F526D611DF8D9A900A04910 /* NetBasal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D601DF8D9A900A04910 /* NetBasal.swift */; }; + 4F526D621DF9D95200A04910 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DA58D1D4AEC230097D1CA /* NSBundle.swift */; }; + 4F6663941E905FD2009E74FC /* ChartColorPalette+Loop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F6663931E905FD2009E74FC /* ChartColorPalette+Loop.swift */; }; + 4F70C1E11DE8DCA7006380B7 /* StatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C1E01DE8DCA7006380B7 /* StatusViewController.swift */; }; + 4F70C1E41DE8DCA7006380B7 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4F70C1E21DE8DCA7006380B7 /* MainInterface.storyboard */; }; + 4F70C1E81DE8DCA7006380B7 /* Loop Status Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4F70C1DC1DE8DCA7006380B7 /* Loop Status Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 4F70C2101DE8FAC5006380B7 /* StatusExtensionDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C20F1DE8FAC5006380B7 /* StatusExtensionDataManager.swift */; }; + 4F70C2121DE900EA006380B7 /* StatusExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */; }; + 4F70C2131DE90339006380B7 /* StatusExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */; }; + 4F73F5FC20E2E7FA00E8D82C /* GlucoseStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F73F5FB20E2E7FA00E8D82C /* GlucoseStore.swift */; }; + 4F7528941DFE1E9500C322D6 /* LoopUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; }; + 4F7528951DFE1E9B00C322D6 /* LoopUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; }; + 4F75289A1DFE1F6000C322D6 /* BasalRateHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEBF1CD6FCD8003C8C80 /* BasalRateHUDView.swift */; }; + 4F75289B1DFE1F6000C322D6 /* BatteryLevelHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEC91CD84DB7003C8C80 /* BatteryLevelHUDView.swift */; }; + 4F75289C1DFE1F6000C322D6 /* GlucoseHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4337615E1D52F487004A3647 /* GlucoseHUDView.swift */; }; + 4F75289D1DFE1F6000C322D6 /* BaseHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEBB1CD6DE6A003C8C80 /* BaseHUDView.swift */; }; + 4F75289E1DFE1F6000C322D6 /* LoopCompletionHUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437CEEBD1CD6E0CB003C8C80 /* LoopCompletionHUDView.swift */; }; + 4F7528A01DFE1F9D00C322D6 /* LoopStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438DADC71CDE8F8B007697A5 /* LoopStateView.swift */; }; + 4F7528A11DFE200B00C322D6 /* BasalStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43B371851CE583890013C5A6 /* BasalStateView.swift */; }; + 4F7528A21DFE200B00C322D6 /* LevelMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43FBEDD71D73843700B21F22 /* LevelMaskView.swift */; }; + 4F7528A51DFE208C00C322D6 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; }; + 4F7528AA1DFE215100C322D6 /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; }; + 4F75F00220FCFE8C00B5570E /* GlucoseChartScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F75F00120FCFE8C00B5570E /* GlucoseChartScene.swift */; }; + 4F7E8AC520E2AB9600AEA65E /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E8AC420E2AB9600AEA65E /* Date.swift */; }; + 4F7E8AC720E2AC0300AEA65E /* WatchPredictedGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */; }; + 4F7E8ACB20E2ACB500AEA65E /* WatchPredictedGlucose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */; }; + 4F82655020E69F9A0031A8F5 /* HUDInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F82654F20E69F9A0031A8F5 /* HUDInterfaceController.swift */; }; + 4FAC02541E22F6B20087A773 /* NSTimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439897341CD2F7DE00223065 /* NSTimeInterval.swift */; }; + 4FB76FB01E8C3E8000B39636 /* SwiftCharts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4346D1EF1C781BEA00ABAFE3 /* SwiftCharts.framework */; }; + 4FB76FB31E8C3EE400B39636 /* ChartAxisValueDoubleLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F08DE7C1E7BB6E5006741EA /* ChartAxisValueDoubleLog.swift */; }; + 4FB76FB41E8C3F7C00B39636 /* ChartAxisValueDoubleUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F08DE7D1E7BB6E5006741EA /* ChartAxisValueDoubleUnit.swift */; }; + 4FB76FB51E8C41E200B39636 /* ChartPointsScatterDownTrianglesLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F08DE831E7BB70B006741EA /* ChartPointsScatterDownTrianglesLayer.swift */; }; + 4FB76FB61E8C426900B39636 /* ChartPointsTouchHighlightLayerViewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F08DE841E7BB70B006741EA /* ChartPointsTouchHighlightLayerViewCache.swift */; }; + 4FB76FB71E8C428600B39636 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B11E45C18400FF19A9 /* UIColor.swift */; }; + 4FB76FB81E8C429D00B39636 /* CGPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F08DE801E7BB6F1006741EA /* CGPoint.swift */; }; + 4FB76FB91E8C42B000B39636 /* CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43649A621C7A347F00523D7F /* CollectionType.swift */; }; + 4FB76FBA1E8C42CE00B39636 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B11E45C18400FF19A9 /* UIColor.swift */; }; + 4FB76FBB1E8C42CF00B39636 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B11E45C18400FF19A9 /* UIColor.swift */; }; + 4FB76FC61E8C57B100B39636 /* StatusChartsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FB76FC51E8C57B100B39636 /* StatusChartsManager.swift */; }; + 4FB76FCE1E8C835D00B39636 /* ChartColorPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FB76FCD1E8C835D00B39636 /* ChartColorPalette.swift */; }; + 4FC8C8011DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */; }; + 4FC8C8021DEB943800A1452E /* NSUserDefaults+StatusExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */; }; + 4FDDD23720DC51DF00D04B16 /* LoopDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDDD23620DC51DF00D04B16 /* LoopDataManager.swift */; }; + 4FF0F75E20E1E5D100FC6291 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431E73471FF95A900069B5F7 /* PersistenceController.swift */; }; + 4FF4D0F81E1725B000846527 /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434F54561D287FDB002A9274 /* NibLoadable.swift */; }; + 4FF4D0F91E17268800846527 /* IdentifiableClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434FF1E91CF26C29000DB779 /* IdentifiableClass.swift */; }; + 4FF4D1001E18374700846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; }; + 4FF4D1011E18375000846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; }; + 7B4282D3217AD17900026DE1 /* FPURatioTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4282D1217AD17900026DE1 /* FPURatioTableViewController.swift */; }; + 7B4282D4217AD17900026DE1 /* FPUDelayTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4282D2217AD17900026DE1 /* FPUDelayTableViewController.swift */; }; + 7D23667D21250C7E0028B67D /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D23667C21250C7E0028B67D /* LocalizedString.swift */; }; + 7D2366E621250E0A0028B67D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D2366E421250E0A0028B67D /* InfoPlist.strings */; }; + 7D7076351FE06EDE004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076371FE06EDE004AC8EA /* Localizable.strings */; }; + 7D70763A1FE06EDF004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70763C1FE06EDF004AC8EA /* InfoPlist.strings */; }; + 7D70763F1FE06EDF004AC8EA /* ckcomplication.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076411FE06EDF004AC8EA /* ckcomplication.strings */; }; + 7D7076451FE06EE0004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */; }; + 7D70764A1FE06EE1004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70764C1FE06EE1004AC8EA /* Localizable.strings */; }; + 7D70764F1FE06EE1004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */; }; + 7D7076541FE06EE2004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076561FE06EE2004AC8EA /* InfoPlist.strings */; }; + 7D7076591FE06EE2004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70765B1FE06EE2004AC8EA /* Localizable.strings */; }; + 7D70765E1FE06EE3004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076601FE06EE3004AC8EA /* Localizable.strings */; }; + 7D7076631FE06EE4004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076651FE06EE4004AC8EA /* Localizable.strings */; }; + 7D7076681FE0702F004AC8EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D70766A1FE0702F004AC8EA /* InfoPlist.strings */; }; + 894F71E21FFEC4D8007D365C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 894F71E11FFEC4D8007D365C /* Assets.xcassets */; }; + 9E575201217D87E7002D167B /* IntegralRetrospectiveCorrection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E575200217D87E7002D167B /* IntegralRetrospectiveCorrection.swift */; }; + C10428971D17BAD400DD539A /* NightscoutUploadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */; }; + C10B28461EA9BA5E006EA1FC /* far_future_high_bg_forecast.json in Resources */ = {isa = PBXBuildFile; fileRef = C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */; }; + C11C87DE1E21EAAD00BB71D3 /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F526D5E1DF2459000A04910 /* HKUnit.swift */; }; + C12F21A71DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json in Resources */ = {isa = PBXBuildFile; fileRef = C12F21A61DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json */; }; + C13BAD941E8009B000050CB5 /* NumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */; }; + C15713821DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15713811DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift */; }; + C178249A1E1999FA00D9D25C /* CaseCountable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17824991E1999FA00D9D25C /* CaseCountable.swift */; }; + C17824A01E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C178249F1E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift */; }; + C17824A31E19EAB600D9D25C /* recommend_temp_basal_start_very_low_end_high.json in Resources */ = {isa = PBXBuildFile; fileRef = C17824A21E19EAB600D9D25C /* recommend_temp_basal_start_very_low_end_high.json */; }; + C17824A51E1AD4D100D9D25C /* BolusRecommendation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17824A41E1AD4D100D9D25C /* BolusRecommendation.swift */; }; + C17824A61E1AF91F00D9D25C /* BolusRecommendation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17824A41E1AD4D100D9D25C /* BolusRecommendation.swift */; }; + C18852E22082AB1B00BECC8C /* RileyLinkKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C18852E12082AB1A00BECC8C /* RileyLinkKitUI.framework */; }; + C18C8C511D5A351900E043FB /* NightscoutDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18C8C501D5A351900E043FB /* NightscoutDataManager.swift */; }; + C1C6591C1E1B1FDA0025CC58 /* recommend_temp_basal_dropping_then_rising.json in Resources */ = {isa = PBXBuildFile; fileRef = C1C6591B1E1B1FDA0025CC58 /* recommend_temp_basal_dropping_then_rising.json */; }; + C1C73F0D1DE3D0270022FC89 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1C73F0F1DE3D0270022FC89 /* InfoPlist.strings */; }; + C9886AE51E5B2FAD00473BB8 /* gallery.ckcomplication in Resources */ = {isa = PBXBuildFile; fileRef = C9886AE41E5B2FAD00473BB8 /* gallery.ckcomplication */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 432CF87C20D8B8990066B889 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 432CF87720D8B8380066B889; + remoteInfo = Cartfile; + }; + 432CF87E20D8BC3B0066B889 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 432CF87720D8B8380066B889; + remoteInfo = Cartfile; + }; + 432CF88020D8BC460066B889 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 432CF87720D8B8380066B889; + remoteInfo = Cartfile; + }; + 43A943801B926B7B0051FA24 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 43A9437D1B926B7B0051FA24; + remoteInfo = "WatchApp Extension"; + }; + 43A943921B926B7B0051FA24 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 43A943711B926B7B0051FA24; + remoteInfo = WatchApp; + }; + 43E2D9101D20C581004DA55F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 43776F8B1B8022E90074EA36; + remoteInfo = Loop; + }; + 4F70C1E61DE8DCA7006380B7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4F70C1DB1DE8DCA7006380B7; + remoteInfo = "Loop Status Extension"; + }; + 4F7528961DFE1ED400C322D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4F75288A1DFE1DC600C322D6; + remoteInfo = LoopUI; + }; + 4F7528981DFE1ED800C322D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 43776F841B8022E90074EA36 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4F75288A1DFE1DC600C322D6; + remoteInfo = LoopUI; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 43A943981B926B7B0051FA24 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 43A9437F1B926B7B0051FA24 /* WatchApp Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 43A9439C1B926B7B0051FA24 /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 43A943941B926B7B0051FA24 /* WatchApp.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; + 43A943AE1B928D400051FA24 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4F2C159A1E0C9E5600E160D4 /* LoopUI.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 43C667D71C5577280050C674 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D8DD1D20C072004DA55F /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 43E2D9171D2226BD004DA55F /* LoopKit.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F70C1EC1DE8DCA8006380B7 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 4F70C1E81DE8DCA7006380B7 /* Loop Status Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4302F4E01D4E9C8900F0FCAF /* TextFieldTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldTableViewController.swift; sourceTree = ""; }; + 4302F4E21D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsulinDeliveryTableViewController.swift; sourceTree = ""; }; + 430B29892041F54A00BA9F93 /* NSUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSUserDefaults.swift; sourceTree = ""; }; + 430B298C2041F56500BA9F93 /* LoopSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoopSettings.swift; sourceTree = ""; }; + 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseThreshold.swift; sourceTree = ""; }; + 430B29922041F5B200BA9F93 /* UserDefaults+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Loop.swift"; sourceTree = ""; }; + 430B29942041F5CB00BA9F93 /* LoopSettings+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LoopSettings+Loop.swift"; sourceTree = ""; }; + 430C1ABC1E5568A80067F1AE /* StatusChartsManager+LoopKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StatusChartsManager+LoopKit.swift"; sourceTree = ""; }; + 430D85881F44037000AF2D4F /* HUDViewTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HUDViewTableViewCell.swift; sourceTree = ""; }; + 430DA58D1D4AEC230097D1CA /* NSBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSBundle.swift; sourceTree = ""; }; + 4311FB9A1F37FE1B00D4C0A7 /* TitleSubtitleTextFieldTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TitleSubtitleTextFieldTableViewCell.swift; sourceTree = ""; }; + 4313EDDF1D8A6BF90060FA79 /* ChartContainerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ChartContainerView.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 4315D2861CA5CC3B00589052 /* CarbEntryEditTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarbEntryEditTableViewController.swift; sourceTree = ""; }; + 4315D2891CA5F45E00589052 /* DiagnosticLogger+LoopKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DiagnosticLogger+LoopKit.swift"; sourceTree = ""; }; + 431A8C3F1EC6E8AB00823B9C /* CircleMaskView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircleMaskView.swift; sourceTree = ""; }; + 431E73471FF95A900069B5F7 /* PersistenceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceController.swift; sourceTree = ""; }; + 4326BA631F3A44D9007CCAD4 /* ChartLineModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartLineModel.swift; sourceTree = ""; }; + 4328E0151CFBE1DA00E199AA /* ActionHUDController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionHUDController.swift; sourceTree = ""; }; + 4328E0161CFBE1DA00E199AA /* BolusInterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BolusInterfaceController.swift; sourceTree = ""; }; + 4328E01D1CFBE25F00E199AA /* AddCarbsInterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCarbsInterfaceController.swift; sourceTree = ""; }; + 4328E0201CFBE2C500E199AA /* IdentifiableClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IdentifiableClass.swift; sourceTree = ""; }; + 4328E0221CFBE2C500E199AA /* CLKComplicationTemplate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CLKComplicationTemplate.swift; sourceTree = ""; }; + 4328E0231CFBE2C500E199AA /* NSUserDefaults+WatchApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSUserDefaults+WatchApp.swift"; sourceTree = ""; }; + 4328E0241CFBE2C500E199AA /* UIColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = ""; }; + 4328E0251CFBE2C500E199AA /* WKAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WKAlertAction.swift; sourceTree = ""; }; + 4328E02E1CFBF81800E199AA /* WKInterfaceImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WKInterfaceImage.swift; sourceTree = ""; }; + 4328E0311CFC068900E199AA /* WatchContext+LoopKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "WatchContext+LoopKit.swift"; sourceTree = ""; }; + 4328E0341CFC0AE100E199AA /* WatchDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = WatchDataManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 432E73CA1D24B3D6009AD15D /* RemoteDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteDataManager.swift; sourceTree = ""; }; + 4337615E1D52F487004A3647 /* GlucoseHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseHUDView.swift; sourceTree = ""; }; + 433EA4C31D9F71C800CD78FB /* CommandResponseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandResponseViewController.swift; sourceTree = ""; }; + 4341F4EA1EDB92AC001C936B /* LogglyService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogglyService.swift; sourceTree = ""; }; + 43441A9B1EDB34810087958C /* StatusExtensionContext+LoopKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StatusExtensionContext+LoopKit.swift"; sourceTree = ""; }; + 4344627F20A7A37400C4BE6F /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS4.3.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; }; + 4344628120A7A37E00C4BE6F /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS4.3.sdk/System/Library/Frameworks/CoreBluetooth.framework; sourceTree = DEVELOPER_DIR; }; + 4344628320A7A3BE00C4BE6F /* LoopKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LoopKit.framework; path = Carthage/Build/watchOS/LoopKit.framework; sourceTree = ""; }; + 4344628420A7A3BE00C4BE6F /* CGMBLEKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CGMBLEKit.framework; path = Carthage/Build/watchOS/CGMBLEKit.framework; sourceTree = ""; }; + 4344628D20A7ADD100C4BE6F /* UserDefaults+CGM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+CGM.swift"; sourceTree = ""; }; + 4344629120A7C19800C4BE6F /* ButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonGroup.swift; sourceTree = ""; }; + 4346D1E61C77F5FE00ABAFE3 /* ChartTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ChartTableViewCell.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 4346D1EF1C781BEA00ABAFE3 /* SwiftCharts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftCharts.framework; path = Carthage/Build/iOS/SwiftCharts.framework; sourceTree = SOURCE_ROOT; }; + 434AB0B11CBB4C3300422F4A /* RileyLinkBLEKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RileyLinkBLEKit.framework; path = Carthage/Build/iOS/RileyLinkBLEKit.framework; sourceTree = SOURCE_ROOT; }; + 434F54561D287FDB002A9274 /* NibLoadable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NibLoadable.swift; sourceTree = ""; }; + 434FB6451D68F1CD007B9C70 /* Amplitude.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Amplitude.framework; path = Carthage/Build/iOS/Amplitude.framework; sourceTree = SOURCE_ROOT; }; + 434FF1E91CF26C29000DB779 /* IdentifiableClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IdentifiableClass.swift; sourceTree = ""; }; + 434FF1ED1CF27EEF000DB779 /* UITableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITableViewCell.swift; sourceTree = ""; }; + 43523EDA1CC35083001850F1 /* RileyLinkKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RileyLinkKit.framework; path = Carthage/Build/iOS/RileyLinkKit.framework; sourceTree = SOURCE_ROOT; }; + 435400301C9F744E00D5819C /* BolusSuggestionUserInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BolusSuggestionUserInfo.swift; sourceTree = ""; }; + 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetBolusUserInfo.swift; sourceTree = ""; }; + 435CB6221F37967800C320C7 /* InsulinModelSettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsulinModelSettingsViewController.swift; sourceTree = ""; }; + 435CB6241F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExponentialInsulinModelPreset.swift; sourceTree = ""; }; + 435CB6261F37AE5600C320C7 /* WalshInsulinModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalshInsulinModel.swift; sourceTree = ""; }; + 435CB6281F37B01300C320C7 /* InsulinModelSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsulinModelSettings.swift; sourceTree = ""; }; + 43649A621C7A347F00523D7F /* CollectionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionType.swift; sourceTree = ""; }; + 4369618F1F19C86400447E89 /* ChartPointsContextFillLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartPointsContextFillLayer.swift; sourceTree = ""; }; + 436A0DA41D236A2A00104B24 /* LoopError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoopError.swift; sourceTree = ""; }; + 436D9BF71F6F4EA100CFA75F /* recommended_temp_start_low_end_just_above_range.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommended_temp_start_low_end_just_above_range.json; sourceTree = ""; }; + 43709AE920DF3F8200F941B3 /* MinimedKitUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MinimedKitUI.framework; path = Carthage/Build/iOS/MinimedKitUI.framework; sourceTree = ""; }; + 4372E486213C86240068E043 /* SampleValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleValue.swift; sourceTree = ""; }; + 4372E48A213CB5F00068E043 /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Double.swift; sourceTree = ""; }; + 4372E48F213CFCE70068E043 /* LoopSettingsUserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopSettingsUserInfo.swift; sourceTree = ""; }; + 4372E495213DCDD30068E043 /* GlucoseChartValueHashable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlucoseChartValueHashable.swift; sourceTree = ""; }; + 4374B5EE209D84BE00D17AA8 /* OSLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; }; + 4374B5F1209D897600D17AA8 /* Locked.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Locked.swift; sourceTree = ""; }; + 4374B5F3209D89A900D17AA8 /* TextFieldTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldTableViewCell.swift; sourceTree = ""; }; + 43776F8C1B8022E90074EA36 /* Loop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Loop.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 43776F8F1B8022E90074EA36 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AppDelegate.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 43776F961B8022E90074EA36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 43776F981B8022E90074EA36 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 43776F9B1B8022E90074EA36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 43785E922120A01B0057DED1 /* NewCarbEntryIntent+Loop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NewCarbEntryIntent+Loop.swift"; sourceTree = ""; }; + 43785E952120E4010057DED1 /* INRelevantShortcutStore+Loop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "INRelevantShortcutStore+Loop.swift"; sourceTree = ""; }; + 43785E9A2120E7060057DED1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Intents.intentdefinition; sourceTree = ""; }; + 43785E9F2122774A0057DED1 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Intents.strings; sourceTree = ""; }; + 43785EA12122774B0057DED1 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Intents.strings; sourceTree = ""; }; + 43785EA32122774B0057DED1 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Intents.strings; sourceTree = ""; }; + 4379CFEF21112CF700AADC79 /* ShareClientUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ShareClientUI.framework; path = Carthage/Build/iOS/ShareClientUI.framework; sourceTree = SOURCE_ROOT; }; + 437AFEE6203688CF008C4892 /* LoopKitUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LoopKitUI.framework; path = Carthage/Build/iOS/LoopKitUI.framework; sourceTree = ""; }; + 437CEEBB1CD6DE6A003C8C80 /* BaseHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseHUDView.swift; sourceTree = ""; }; + 437CEEBD1CD6E0CB003C8C80 /* LoopCompletionHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoopCompletionHUDView.swift; sourceTree = ""; }; + 437CEEBF1CD6FCD8003C8C80 /* BasalRateHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasalRateHUDView.swift; sourceTree = ""; }; + 437CEEC71CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReservoirVolumeHUDView.swift; sourceTree = ""; }; + 437CEEC91CD84DB7003C8C80 /* BatteryLevelHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatteryLevelHUDView.swift; sourceTree = ""; }; + 437CEEE31CDE5C0A003C8C80 /* UIImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImage.swift; sourceTree = ""; }; + 437D9BA11D7B5203007245E8 /* Loop.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Loop.xcconfig; sourceTree = ""; }; + 437D9BA21D7BC977007245E8 /* PredictionTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PredictionTableViewController.swift; sourceTree = ""; }; + 438172D81F4E9E37003C3328 /* NewPumpEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewPumpEvent.swift; sourceTree = ""; }; + 438849E91D297CB6003B3F23 /* NightscoutService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NightscoutService.swift; sourceTree = ""; }; + 438849EB1D29EC34003B3F23 /* AmplitudeService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmplitudeService.swift; sourceTree = ""; }; + 438849ED1D2A1EBB003B3F23 /* MLabService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MLabService.swift; sourceTree = ""; }; + 438991661E91B563000EEF90 /* ChartPoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartPoint.swift; sourceTree = ""; }; + 4389916A1E91B689000EEF90 /* ChartSettings+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ChartSettings+Loop.swift"; sourceTree = ""; }; + 438A95A71D8B9B24009D12E1 /* CGMBLEKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CGMBLEKit.framework; path = Carthage/Build/iOS/CGMBLEKit.framework; sourceTree = SOURCE_ROOT; }; + 438D42F81D7C88BC003244B0 /* PredictionInputEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PredictionInputEffect.swift; sourceTree = ""; }; + 438D42FA1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PredictionInputEffectTableViewCell.swift; sourceTree = ""; }; + 438DADC71CDE8F8B007697A5 /* LoopStateView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoopStateView.swift; sourceTree = ""; }; + 439897341CD2F7DE00223065 /* NSTimeInterval.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTimeInterval.swift; sourceTree = ""; }; + 439897361CD2F80600223065 /* AnalyticsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AnalyticsManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 439A7941211F631C0041B75F /* RootNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootNavigationController.swift; sourceTree = ""; }; + 439A7943211FE22F0041B75F /* NSUserActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSUserActivity.swift; sourceTree = ""; }; + 439BED291E76093C00B0AED5 /* CGMManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGMManager.swift; sourceTree = ""; }; + 43A51E1E1EB6D62A000736CC /* CarbAbsorptionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarbAbsorptionViewController.swift; sourceTree = ""; }; + 43A51E201EB6DBDD000736CC /* ChartsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartsTableViewController.swift; sourceTree = ""; }; + 43A567681C94880B00334FAC /* LoopDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = LoopDataManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 43A8EC6E210E622600A81379 /* CGMBLEKitUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CGMBLEKitUI.framework; path = Carthage/Build/iOS/CGMBLEKitUI.framework; sourceTree = ""; }; + 43A943721B926B7B0051FA24 /* WatchApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WatchApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A943751B926B7B0051FA24 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + 43A9437E1B926B7B0051FA24 /* WatchApp Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "WatchApp Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A943841B926B7B0051FA24 /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; + 43A943871B926B7B0051FA24 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; + 43A943891B926B7B0051FA24 /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; + 43A9438D1B926B7B0051FA24 /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; + 43A9438F1B926B7B0051FA24 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 43A943911B926B7B0051FA24 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43B260481ED248FB008CAA77 /* CarbEntryTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarbEntryTableViewCell.swift; sourceTree = ""; }; + 43B371851CE583890013C5A6 /* BasalStateView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasalStateView.swift; sourceTree = ""; }; + 43B371871CE597D10013C5A6 /* ShareClient.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ShareClient.framework; path = Carthage/Build/iOS/ShareClient.framework; sourceTree = SOURCE_ROOT; }; + 43BFF0B11E45C18400FF19A9 /* UIColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = ""; }; + 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberFormatter.swift; sourceTree = ""; }; + 43BFF0BB1E45C80600FF19A9 /* UIColor+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Loop.swift"; sourceTree = ""; }; + 43BFF0BE1E45C8EA00FF19A9 /* UIColor+Widget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Widget.swift"; sourceTree = ""; }; + 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+HIG.swift"; sourceTree = ""; }; + 43BFF0C81E465B0A00FF19A9 /* StateColorPalette.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StateColorPalette.swift; sourceTree = ""; }; + 43BFF0CA1E466C0900FF19A9 /* StateColorPalette.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StateColorPalette.swift; sourceTree = ""; }; + 43BFF0CC1E466C8400FF19A9 /* StateColorPalette.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StateColorPalette.swift; sourceTree = ""; }; + 43C094491CACCC73001F6403 /* NotificationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; + 43C246A71D89990F0031F8D1 /* Crypto.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Crypto.framework; path = Carthage/Build/iOS/Crypto.framework; sourceTree = SOURCE_ROOT; }; + 43C2FAE01EB656A500364AFF /* GlucoseEffectVelocity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseEffectVelocity.swift; sourceTree = ""; }; + 43C3B6EB20B650A80026CAFA /* SettingsImageTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsImageTableViewCell.swift; sourceTree = ""; }; + 43C3B6F620BBCAA30026CAFA /* PumpManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PumpManager.swift; sourceTree = ""; }; + 43C513181E864C4E001547C7 /* GlucoseRangeSchedule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseRangeSchedule.swift; sourceTree = ""; }; + 43C98058212A799E003B5D17 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Intents.strings; sourceTree = ""; }; + 43CA93361CB98079000026B5 /* MinimedKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MinimedKit.framework; path = Carthage/Build/iOS/MinimedKit.framework; sourceTree = SOURCE_ROOT; }; + 43CB2B2A1D924D450079823D /* WCSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WCSession.swift; sourceTree = ""; }; + 43CE7CDD1CA8B63E003CC1B0 /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = ""; }; + 43CEE6E51E56AFD400CB9116 /* NightscoutUploader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NightscoutUploader.swift; sourceTree = ""; }; + 43D2E8221F00425400AE5CBF /* BolusViewController+LoopDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BolusViewController+LoopDataManager.swift"; sourceTree = ""; }; + 43D381611EBD9759007F8C8F /* HeaderValuesTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderValuesTableViewCell.swift; sourceTree = ""; }; + 43D533BB1CFD1DD7009E3085 /* WatchApp Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "WatchApp Extension.entitlements"; sourceTree = ""; }; + 43D848AF1E7DCBE100DADCBC /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; + 43DACFFF20A2736F000F8529 /* PersistedPumpEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistedPumpEvent.swift; sourceTree = ""; }; + 43DBF04B1C93B8D700B3C386 /* BolusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = BolusViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 43DBF0521C93EC8200B3C386 /* DeviceDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = DeviceDataManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 43DBF0581C93F73800B3C386 /* CarbEntryTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarbEntryTableViewController.swift; sourceTree = ""; }; + 43DE92581C5479E4001FFDE1 /* CarbEntryUserInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CarbEntryUserInfo.swift; sourceTree = ""; }; + 43DE92601C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AbsorptionTimeType+CarbKit.swift"; sourceTree = ""; }; + 43E0F0A41E46D1670064F7CE /* LevelHUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LevelHUDView.swift; sourceTree = ""; }; + 43E2D8C71D208D5B004DA55F /* KeychainManager+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "KeychainManager+Loop.swift"; sourceTree = ""; }; + 43E2D8C91D20B9E7004DA55F /* KeychainManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainManagerTests.swift; sourceTree = ""; }; + 43E2D8D11D20BF42004DA55F /* DoseMathTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DoseMathTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 43E2D8D31D20BF42004DA55F /* DoseMathTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoseMathTests.swift; sourceTree = ""; }; + 43E2D8D51D20BF42004DA55F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43E2D8E11D20C0DB004DA55F /* read_selected_basal_profile.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = read_selected_basal_profile.json; sourceTree = ""; }; + 43E2D8E21D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_correct_low_at_min.json; sourceTree = ""; }; + 43E2D8E31D20C0DB004DA55F /* recommend_temp_basal_flat_and_high.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_flat_and_high.json; sourceTree = ""; }; + 43E2D8E41D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_high_and_falling.json; sourceTree = ""; }; + 43E2D8E51D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_high_and_rising.json; sourceTree = ""; }; + 43E2D8E61D20C0DB004DA55F /* recommend_temp_basal_in_range_and_rising.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_in_range_and_rising.json; sourceTree = ""; }; + 43E2D8E71D20C0DB004DA55F /* recommend_temp_basal_no_change_glucose.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_no_change_glucose.json; sourceTree = ""; }; + 43E2D8E81D20C0DB004DA55F /* recommend_temp_basal_start_high_end_in_range.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_start_high_end_in_range.json; sourceTree = ""; }; + 43E2D8E91D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_start_high_end_low.json; sourceTree = ""; }; + 43E2D8EA1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_high.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_start_low_end_high.json; sourceTree = ""; }; + 43E2D8EB1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_start_low_end_in_range.json; sourceTree = ""; }; + 43E2D90B1D20C581004DA55F /* LoopTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LoopTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 43E2D90F1D20C581004DA55F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43E3449E1B9D68E900C85C07 /* StatusTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = StatusTableViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Loop.entitlements; sourceTree = ""; }; + 43F41C361D3BF32400C11ED6 /* UIAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIAlertController.swift; sourceTree = ""; }; + 43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiagnosticLogger.swift; sourceTree = ""; }; + 43F5C2C81B929C09003EB13D /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; }; + 43F5C2D41B92A4A6003EB13D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43F5C2D61B92A4DC003EB13D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43F5C2DA1B92A5E1003EB13D /* SettingsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = SettingsTableViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 43F64DD81D9C92C900D24DC6 /* TitleSubtitleTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TitleSubtitleTableViewCell.swift; sourceTree = ""; }; + 43F78D251C8FC000002152D1 /* DoseMath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoseMath.swift; sourceTree = ""; }; + 43F78D4B1C914197002152D1 /* LoopKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LoopKit.framework; path = Carthage/Build/iOS/LoopKit.framework; sourceTree = SOURCE_ROOT; }; + 43FBEDD71D73843700B21F22 /* LevelMaskView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LevelMaskView.swift; sourceTree = ""; }; + 4D3B40021D4A9DFE00BC6334 /* G4ShareSpy.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = G4ShareSpy.framework; path = Carthage/Build/iOS/G4ShareSpy.framework; sourceTree = SOURCE_ROOT; }; + 4F08DE7C1E7BB6E5006741EA /* ChartAxisValueDoubleLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisValueDoubleLog.swift; sourceTree = ""; }; + 4F08DE7D1E7BB6E5006741EA /* ChartAxisValueDoubleUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisValueDoubleUnit.swift; sourceTree = ""; }; + 4F08DE801E7BB6F1006741EA /* CGPoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGPoint.swift; sourceTree = ""; }; + 4F08DE831E7BB70B006741EA /* ChartPointsScatterDownTrianglesLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartPointsScatterDownTrianglesLayer.swift; sourceTree = ""; }; + 4F08DE841E7BB70B006741EA /* ChartPointsTouchHighlightLayerViewCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartPointsTouchHighlightLayerViewCache.swift; sourceTree = ""; }; + 4F08DE8E1E7BB871006741EA /* CollectionType+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CollectionType+Loop.swift"; sourceTree = ""; }; + 4F11D3BF20DCBEEC006E072C /* GlucoseBackfillRequestUserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlucoseBackfillRequestUserInfo.swift; sourceTree = ""; }; + 4F11D3C120DD80B3006E072C /* WatchHistoricalGlucose.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchHistoricalGlucose.swift; sourceTree = ""; }; + 4F2C15801E0495B200E160D4 /* WatchContext+WatchApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "WatchContext+WatchApp.swift"; sourceTree = ""; }; + 4F2C15921E09BF2C00E160D4 /* HUDView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HUDView.swift; sourceTree = ""; }; + 4F2C15941E09BF3C00E160D4 /* HUDView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HUDView.xib; sourceTree = ""; }; + 4F2C15961E09E94E00E160D4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4F526D5E1DF2459000A04910 /* HKUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HKUnit.swift; sourceTree = ""; }; + 4F526D601DF8D9A900A04910 /* NetBasal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetBasal.swift; sourceTree = ""; }; + 4F6663931E905FD2009E74FC /* ChartColorPalette+Loop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ChartColorPalette+Loop.swift"; sourceTree = ""; }; + 4F70C1DC1DE8DCA7006380B7 /* Loop Status Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Loop Status Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F70C1DD1DE8DCA7006380B7 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; + 4F70C1E01DE8DCA7006380B7 /* StatusViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = StatusViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 4F70C1E31DE8DCA7006380B7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + 4F70C1E51DE8DCA7006380B7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4F70C1FD1DE8E662006380B7 /* Loop Status Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Loop Status Extension.entitlements"; sourceTree = ""; }; + 4F70C20F1DE8FAC5006380B7 /* StatusExtensionDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusExtensionDataManager.swift; sourceTree = ""; }; + 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusExtensionContext.swift; sourceTree = ""; }; + 4F73F5FB20E2E7FA00E8D82C /* GlucoseStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlucoseStore.swift; sourceTree = ""; }; + 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoopUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F75288D1DFE1DC600C322D6 /* LoopUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LoopUI.h; sourceTree = ""; }; + 4F75288E1DFE1DC600C322D6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4F75F00120FCFE8C00B5570E /* GlucoseChartScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlucoseChartScene.swift; sourceTree = ""; }; + 4F7E8AC420E2AB9600AEA65E /* Date.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = ""; }; + 4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchPredictedGlucose.swift; sourceTree = ""; }; + 4F82654F20E69F9A0031A8F5 /* HUDInterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HUDInterfaceController.swift; sourceTree = ""; }; + 4FB76FC51E8C57B100B39636 /* StatusChartsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusChartsManager.swift; sourceTree = ""; }; + 4FB76FCD1E8C835D00B39636 /* ChartColorPalette.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartColorPalette.swift; sourceTree = ""; }; + 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSUserDefaults+StatusExtension.swift"; sourceTree = ""; }; + 4FDDD23620DC51DF00D04B16 /* LoopDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopDataManager.swift; sourceTree = ""; }; + 4FF4D0FF1E18374700846527 /* WatchContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchContext.swift; sourceTree = ""; }; + 4FFEDFBE20E5CF22000BFC58 /* ChartHUDController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartHUDController.swift; sourceTree = ""; }; + 7B4282D1217AD17900026DE1 /* FPURatioTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPURatioTableViewController.swift; sourceTree = ""; }; + 7B4282D2217AD17900026DE1 /* FPUDelayTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPUDelayTableViewController.swift; sourceTree = ""; }; + 7D199D92212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D199D93212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Main.strings; sourceTree = ""; }; + 7D199D94212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/MainInterface.strings; sourceTree = ""; }; + 7D199D95212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Interface.strings; sourceTree = ""; }; + 7D199D96212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 7D199D97212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199D98212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199D99212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 7D199D9A212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 7D199D9B212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199D9C212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199D9D212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 7D199D9E212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D199D9F212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199DA0212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199DA1212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D199DA2212A067700241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + 7D23667521250BE30028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 7D23667621250BF70028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23667721250C280028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23667821250C2D0028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 7D23667921250C440028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 7D23667A21250C480028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23667C21250C7E0028B67D /* LocalizedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LocalizedString.swift; path = LoopUI/Common/LocalizedString.swift; sourceTree = SOURCE_ROOT; }; + 7D23667E21250CAC0028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23667F21250CB80028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 7D23668021250CBE0028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23668121250CC50028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D23668221250CF60028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23668321250CFB0028B67D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + 7D23668421250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D23668521250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; }; + 7D23668621250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainInterface.strings; sourceTree = ""; }; + 7D23668721250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Interface.strings; sourceTree = ""; }; + 7D23668821250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + 7D23668921250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23668A21250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23668B21250D180028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + 7D23668C21250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + 7D23668D21250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23668E21250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23668F21250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + 7D23669021250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D23669121250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23669221250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23669321250D190028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + 7D23669421250D220028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D23669521250D220028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; }; + 7D23669621250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainInterface.strings; sourceTree = ""; }; + 7D23669721250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Interface.strings; sourceTree = ""; }; + 7D23669821250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 7D23669921250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23669A21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23669B21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 7D23669C21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 7D23669D21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23669E21250D230028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D23669F21250D240028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366A021250D240028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D2366A121250D240028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366A221250D240028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366A321250D240028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366A421250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; }; + 7D2366A521250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; }; + 7D2366A621250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/MainInterface.strings"; sourceTree = ""; }; + 7D2366A721250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Interface.strings"; sourceTree = ""; }; + 7D2366A821250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 7D2366A921250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366AA21250D2C0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366AB21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 7D2366AC21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 7D2366AD21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366AE21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366AF21250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 7D2366B021250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ckcomplication.strings"; sourceTree = ""; }; + 7D2366B121250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366B221250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366B321250D2D0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 7D2366B421250D350028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Interface.strings; sourceTree = ""; }; + 7D2366B521250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366B621250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D2366B721250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = ""; }; + 7D2366B821250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/MainInterface.strings; sourceTree = ""; }; + 7D2366B921250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366BA21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366BB21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366BC21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366BD21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366BE21250D360028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366BF21250D370028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366C021250D370028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D2366C121250D370028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366C221250D370028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366C321250D370028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366C421250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D2366C521250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Main.strings; sourceTree = ""; }; + 7D2366C621250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/MainInterface.strings; sourceTree = ""; }; + 7D2366C721250D3F0028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Interface.strings; sourceTree = ""; }; + 7D2366C821250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366C921250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366CA21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366CB21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366CC21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366CD21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366CE21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366CF21250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366D021250D400028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D2366D121250D410028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366D221250D410028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366D321250D410028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366D421250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D2366D521250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Main.strings; sourceTree = ""; }; + 7D2366D621250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/MainInterface.strings; sourceTree = ""; }; + 7D2366D721250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Interface.strings; sourceTree = ""; }; + 7D2366D821250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366D921250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366DA21250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366DB21250D4A0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366DC21250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366DD21250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366DE21250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366DF21250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366E021250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D2366E121250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366E221250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366E321250D4B0028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + 7D2366E521250E0A0028B67D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366E721250E7B0028B67D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366E921250E8F0028B67D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366EA21250EA40028B67D /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366EB21250EB80028B67D /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366EC21250ECE0028B67D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 7D2366ED21250F010028B67D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D2366EE21250F170028B67D /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAA91FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7D68AAAA1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; }; + 7D68AAAB1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/MainInterface.strings; sourceTree = ""; }; + 7D68AAAC1FE2DB0A00522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Interface.strings; sourceTree = ""; }; + 7D68AAAD1FE2E8D400522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 7D68AAAE1FE2E8D400522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAAF1FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAB01FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D68AAB11FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAB21FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAB31FE2E8D500522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 7D68AAB41FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAB51FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D68AAB61FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 7D68AAB71FE2E8D600522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 7D68AAB81FE2E8D700522C49 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 7D7076361FE06EDE004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 7D70763B1FE06EDF004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D7076401FE06EDF004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ckcomplication.strings; sourceTree = ""; }; + 7D7076421FE06EE0004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D7076461FE06EE0004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D70764B1FE06EE1004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 7D7076501FE06EE1004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D7076551FE06EE2004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7D70765A1FE06EE2004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 7D70765F1FE06EE3004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 7D7076641FE06EE4004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 7D7076691FE0702F004AC8EA /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + 7DD382761F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; }; + 7DD382771F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; }; + 7DD382781F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/MainInterface.strings; sourceTree = ""; }; + 7DD382791F8DBFC60071272B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Interface.strings; sourceTree = ""; }; + 894F71E11FFEC4D8007D365C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 9E575200217D87E7002D167B /* IntegralRetrospectiveCorrection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegralRetrospectiveCorrection.swift; sourceTree = ""; }; + C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NightscoutUploadKit.framework; path = Carthage/Build/iOS/NightscoutUploadKit.framework; sourceTree = SOURCE_ROOT; }; + C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = far_future_high_bg_forecast.json; sourceTree = ""; }; + C12F21A61DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_very_low_end_in_range.json; sourceTree = ""; }; + C15713811DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MealBolusNightscoutTreatment.swift; sourceTree = ""; }; + C17824991E1999FA00D9D25C /* CaseCountable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaseCountable.swift; sourceTree = ""; }; + C178249F1E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseThresholdTableViewController.swift; sourceTree = ""; }; + C17824A21E19EAB600D9D25C /* recommend_temp_basal_start_very_low_end_high.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_start_very_low_end_high.json; sourceTree = ""; }; + C17824A41E1AD4D100D9D25C /* BolusRecommendation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BolusRecommendation.swift; sourceTree = ""; }; + C18852E12082AB1A00BECC8C /* RileyLinkKitUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RileyLinkKitUI.framework; path = Carthage/Build/iOS/RileyLinkKitUI.framework; sourceTree = ""; }; + C18C8C501D5A351900E043FB /* NightscoutDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NightscoutDataManager.swift; sourceTree = ""; }; + C1C6591B1E1B1FDA0025CC58 /* recommend_temp_basal_dropping_then_rising.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = recommend_temp_basal_dropping_then_rising.json; sourceTree = ""; }; + C9886AE41E5B2FAD00473BB8 /* gallery.ckcomplication */ = {isa = PBXFileReference; lastKnownFileType = folder; path = gallery.ckcomplication; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 43105EF81BADC8F9009CD81E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43776F891B8022E90074EA36 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F7528941DFE1E9500C322D6 /* LoopUI.framework in Frameworks */, + 434FB6461D68F1CD007B9C70 /* Amplitude.framework in Frameworks */, + 43A8EC6F210E622700A81379 /* CGMBLEKitUI.framework in Frameworks */, + 438A95A81D8B9B24009D12E1 /* CGMBLEKit.framework in Frameworks */, + 43C246A81D89990F0031F8D1 /* Crypto.framework in Frameworks */, + 4D3B40041D4A9E1A00BC6334 /* G4ShareSpy.framework in Frameworks */, + 43F5C2C91B929C09003EB13D /* HealthKit.framework in Frameworks */, + 43F78D4F1C914197002152D1 /* LoopKit.framework in Frameworks */, + 437AFEE7203688CF008C4892 /* LoopKitUI.framework in Frameworks */, + 43CA93371CB98079000026B5 /* MinimedKit.framework in Frameworks */, + 43709AEA20DF3F8200F941B3 /* MinimedKitUI.framework in Frameworks */, + C10428971D17BAD400DD539A /* NightscoutUploadKit.framework in Frameworks */, + 437AFEE42035252A008C4892 /* RileyLinkBLEKit.framework in Frameworks */, + 43523EDB1CC35083001850F1 /* RileyLinkKit.framework in Frameworks */, + C18852E22082AB1B00BECC8C /* RileyLinkKitUI.framework in Frameworks */, + 43B371881CE597D10013C5A6 /* ShareClient.framework in Frameworks */, + 4F08DE9B1E7BC4ED006741EA /* SwiftCharts.framework in Frameworks */, + 4379CFF021112CF700AADC79 /* ShareClientUI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43A9437B1B926B7B0051FA24 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4344628220A7A37F00C4BE6F /* CoreBluetooth.framework in Frameworks */, + 4344628020A7A37400C4BE6F /* HealthKit.framework in Frameworks */, + 4344628520A7A3BE00C4BE6F /* LoopKit.framework in Frameworks */, + 4344628620A7A3BE00C4BE6F /* CGMBLEKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D8CE1D20BF42004DA55F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 43E2D9191D222759004DA55F /* LoopKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D9081D20C581004DA55F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F70C1D91DE8DCA7006380B7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F7528951DFE1E9B00C322D6 /* LoopUI.framework in Frameworks */, + 437AFEE520352591008C4892 /* NotificationCenter.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F7528871DFE1DC600C322D6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 437AFEE8203689FE008C4892 /* LoopKit.framework in Frameworks */, + 4FB76FB01E8C3E8000B39636 /* SwiftCharts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4328E0121CFBE1B700E199AA /* Controllers */ = { + isa = PBXGroup; + children = ( + 4328E0151CFBE1DA00E199AA /* ActionHUDController.swift */, + 4328E01D1CFBE25F00E199AA /* AddCarbsInterfaceController.swift */, + 4328E0161CFBE1DA00E199AA /* BolusInterfaceController.swift */, + 4FFEDFBE20E5CF22000BFC58 /* ChartHUDController.swift */, + 4F82654F20E69F9A0031A8F5 /* HUDInterfaceController.swift */, + 43A943891B926B7B0051FA24 /* NotificationController.swift */, + ); + path = Controllers; + sourceTree = ""; + }; + 4328E01F1CFBE2B100E199AA /* Extensions */ = { + isa = PBXGroup; + children = ( + 4344629120A7C19800C4BE6F /* ButtonGroup.swift */, + 4328E0221CFBE2C500E199AA /* CLKComplicationTemplate.swift */, + 4F7E8AC420E2AB9600AEA65E /* Date.swift */, + 4F73F5FB20E2E7FA00E8D82C /* GlucoseStore.swift */, + 4328E0201CFBE2C500E199AA /* IdentifiableClass.swift */, + 43785E952120E4010057DED1 /* INRelevantShortcutStore+Loop.swift */, + 4328E0231CFBE2C500E199AA /* NSUserDefaults+WatchApp.swift */, + 4328E0241CFBE2C500E199AA /* UIColor.swift */, + 4F2C15801E0495B200E160D4 /* WatchContext+WatchApp.swift */, + 43CB2B2A1D924D450079823D /* WCSession.swift */, + 4328E0251CFBE2C500E199AA /* WKAlertAction.swift */, + 4328E02E1CFBF81800E199AA /* WKInterfaceImage.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 43673E2E1F37BDA10058AC7C /* Insulin */ = { + isa = PBXGroup; + children = ( + 435CB6241F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift */, + 435CB6281F37B01300C320C7 /* InsulinModelSettings.swift */, + 435CB6261F37AE5600C320C7 /* WalshInsulinModel.swift */, + ); + path = Insulin; + sourceTree = ""; + }; + 43757D131C06F26C00910CB9 /* Models */ = { + isa = PBXGroup; + children = ( + 43880F961D9D8052009061A8 /* ServiceAuthentication */, + 43DE92601C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift */, + C17824A41E1AD4D100D9D25C /* BolusRecommendation.swift */, + 43C2FAE01EB656A500364AFF /* GlucoseEffectVelocity.swift */, + 4374B5F1209D897600D17AA8 /* Locked.swift */, + 436A0DA41D236A2A00104B24 /* LoopError.swift */, + 430B29942041F5CB00BA9F93 /* LoopSettings+Loop.swift */, + 4F526D601DF8D9A900A04910 /* NetBasal.swift */, + 438D42F81D7C88BC003244B0 /* PredictionInputEffect.swift */, + 43D848AF1E7DCBE100DADCBC /* Result.swift */, + 43441A9B1EDB34810087958C /* StatusExtensionContext+LoopKit.swift */, + 4328E0311CFC068900E199AA /* WatchContext+LoopKit.swift */, + ); + path = Models; + sourceTree = ""; + }; + 43776F831B8022E90074EA36 = { + isa = PBXGroup; + children = ( + 4FF4D0FA1E1834BD00846527 /* Common */, + 43776F8E1B8022E90074EA36 /* Loop */, + 4F70C1DF1DE8DCA7006380B7 /* Loop Status Extension */, + 4F75288C1DFE1DC600C322D6 /* LoopUI */, + 43A943731B926B7B0051FA24 /* WatchApp */, + 43A943821B926B7B0051FA24 /* WatchApp Extension */, + 43F78D2C1C8FC58F002152D1 /* LoopTests */, + 43E2D8D21D20BF42004DA55F /* DoseMathTests */, + 968DCD53F724DE56FFE51920 /* Frameworks */, + 43776F8D1B8022E90074EA36 /* Products */, + 437D9BA11D7B5203007245E8 /* Loop.xcconfig */, + ); + sourceTree = ""; + }; + 43776F8D1B8022E90074EA36 /* Products */ = { + isa = PBXGroup; + children = ( + 43776F8C1B8022E90074EA36 /* Loop.app */, + 43A943721B926B7B0051FA24 /* WatchApp.app */, + 43A9437E1B926B7B0051FA24 /* WatchApp Extension.appex */, + 43E2D8D11D20BF42004DA55F /* DoseMathTests.xctest */, + 43E2D90B1D20C581004DA55F /* LoopTests.xctest */, + 4F70C1DC1DE8DCA7006380B7 /* Loop Status Extension.appex */, + 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */, + ); + name = Products; + sourceTree = ""; + }; + 43776F8E1B8022E90074EA36 /* Loop */ = { + isa = PBXGroup; + children = ( + 7D7076651FE06EE4004AC8EA /* Localizable.strings */, + 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */, + C9886AE41E5B2FAD00473BB8 /* gallery.ckcomplication */, + 43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */, + 43F5C2D41B92A4A6003EB13D /* Info.plist */, + 43776F8F1B8022E90074EA36 /* AppDelegate.swift */, + 43776F981B8022E90074EA36 /* Assets.xcassets */, + 43776F9A1B8022E90074EA36 /* LaunchScreen.storyboard */, + 43776F951B8022E90074EA36 /* Main.storyboard */, + 43E344A01B9E144300C85C07 /* Extensions */, + 43F5C2E41B93C5D4003EB13D /* Managers */, + 43757D131C06F26C00910CB9 /* Models */, + 43F5C2CE1B92A2A0003EB13D /* View Controllers */, + 43F5C2CF1B92A2ED003EB13D /* Views */, + ); + path = Loop; + sourceTree = ""; + }; + 43880F961D9D8052009061A8 /* ServiceAuthentication */ = { + isa = PBXGroup; + children = ( + 438849EB1D29EC34003B3F23 /* AmplitudeService.swift */, + 4341F4EA1EDB92AC001C936B /* LogglyService.swift */, + 438849ED1D2A1EBB003B3F23 /* MLabService.swift */, + 438849E91D297CB6003B3F23 /* NightscoutService.swift */, + ); + path = ServiceAuthentication; + sourceTree = ""; + }; + 43A943731B926B7B0051FA24 /* WatchApp */ = { + isa = PBXGroup; + children = ( + 894F71E11FFEC4D8007D365C /* Assets.xcassets */, + C1C73F0F1DE3D0270022FC89 /* InfoPlist.strings */, + 43F5C2D61B92A4DC003EB13D /* Info.plist */, + 43A943741B926B7B0051FA24 /* Interface.storyboard */, + ); + path = WatchApp; + sourceTree = ""; + }; + 43A943821B926B7B0051FA24 /* WatchApp Extension */ = { + isa = PBXGroup; + children = ( + 7D7076601FE06EE3004AC8EA /* Localizable.strings */, + 7D7076411FE06EDF004AC8EA /* ckcomplication.strings */, + 7D70763C1FE06EDF004AC8EA /* InfoPlist.strings */, + 43D533BB1CFD1DD7009E3085 /* WatchApp Extension.entitlements */, + 43A943911B926B7B0051FA24 /* Info.plist */, + 43A9438D1B926B7B0051FA24 /* ComplicationController.swift */, + 43A943871B926B7B0051FA24 /* ExtensionDelegate.swift */, + 43A9438F1B926B7B0051FA24 /* Assets.xcassets */, + 4328E0121CFBE1B700E199AA /* Controllers */, + 4328E01F1CFBE2B100E199AA /* Extensions */, + 4FE3475F20D5D7FA00A86D03 /* Managers */, + 4F75F0052100146B00B5570E /* Scenes */, + 43A943831B926B7B0051FA24 /* Supporting Files */, + ); + path = "WatchApp Extension"; + sourceTree = ""; + }; + 43A943831B926B7B0051FA24 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 43A943841B926B7B0051FA24 /* PushNotificationPayload.apns */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 43E2D8D21D20BF42004DA55F /* DoseMathTests */ = { + isa = PBXGroup; + children = ( + 7D70766A1FE0702F004AC8EA /* InfoPlist.strings */, + 7D70765B1FE06EE2004AC8EA /* Localizable.strings */, + 43E2D8E01D20C0CB004DA55F /* Fixtures */, + 43E2D8D31D20BF42004DA55F /* DoseMathTests.swift */, + 43E2D8D51D20BF42004DA55F /* Info.plist */, + ); + path = DoseMathTests; + sourceTree = ""; + }; + 43E2D8E01D20C0CB004DA55F /* Fixtures */ = { + isa = PBXGroup; + children = ( + C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */, + 43E2D8E11D20C0DB004DA55F /* read_selected_basal_profile.json */, + 43E2D8E21D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json */, + C1C6591B1E1B1FDA0025CC58 /* recommend_temp_basal_dropping_then_rising.json */, + 43E2D8E31D20C0DB004DA55F /* recommend_temp_basal_flat_and_high.json */, + 43E2D8E41D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json */, + 43E2D8E51D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json */, + 43E2D8E61D20C0DB004DA55F /* recommend_temp_basal_in_range_and_rising.json */, + 43E2D8E71D20C0DB004DA55F /* recommend_temp_basal_no_change_glucose.json */, + 43E2D8E81D20C0DB004DA55F /* recommend_temp_basal_start_high_end_in_range.json */, + 43E2D8E91D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json */, + 43E2D8EA1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_high.json */, + 43E2D8EB1D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json */, + C17824A21E19EAB600D9D25C /* recommend_temp_basal_start_very_low_end_high.json */, + C12F21A61DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json */, + 436D9BF71F6F4EA100CFA75F /* recommended_temp_start_low_end_just_above_range.json */, + ); + path = Fixtures; + sourceTree = ""; + }; + 43E344A01B9E144300C85C07 /* Extensions */ = { + isa = PBXGroup; + children = ( + C17824991E1999FA00D9D25C /* CaseCountable.swift */, + 4F6663931E905FD2009E74FC /* ChartColorPalette+Loop.swift */, + 4389916A1E91B689000EEF90 /* ChartSettings+Loop.swift */, + 4F08DE8E1E7BB871006741EA /* CollectionType+Loop.swift */, + 43CE7CDD1CA8B63E003CC1B0 /* Data.swift */, + C15713811DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift */, + 438172D81F4E9E37003C3328 /* NewPumpEvent.swift */, + 43CEE6E51E56AFD400CB9116 /* NightscoutUploader.swift */, + 43DACFFF20A2736F000F8529 /* PersistedPumpEvent.swift */, + 43BFF0CA1E466C0900FF19A9 /* StateColorPalette.swift */, + 43F41C361D3BF32400C11ED6 /* UIAlertController.swift */, + 43BFF0BB1E45C80600FF19A9 /* UIColor+Loop.swift */, + 437CEEE31CDE5C0A003C8C80 /* UIImage.swift */, + 434FF1ED1CF27EEF000DB779 /* UITableViewCell.swift */, + 430B29922041F5B200BA9F93 /* UserDefaults+Loop.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 43F5C2CE1B92A2A0003EB13D /* View Controllers */ = { + isa = PBXGroup; + children = ( + 7B4282D2217AD17900026DE1 /* FPUDelayTableViewController.swift */, + 7B4282D1217AD17900026DE1 /* FPURatioTableViewController.swift */, + 43DBF04B1C93B8D700B3C386 /* BolusViewController.swift */, + 43D2E8221F00425400AE5CBF /* BolusViewController+LoopDataManager.swift */, + 43A51E1E1EB6D62A000736CC /* CarbAbsorptionViewController.swift */, + 4315D2861CA5CC3B00589052 /* CarbEntryEditTableViewController.swift */, + 43DBF0581C93F73800B3C386 /* CarbEntryTableViewController.swift */, + 43A51E201EB6DBDD000736CC /* ChartsTableViewController.swift */, + 433EA4C31D9F71C800CD78FB /* CommandResponseViewController.swift */, + C178249F1E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift */, + 4302F4E21D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift */, + 435CB6221F37967800C320C7 /* InsulinModelSettingsViewController.swift */, + 437D9BA21D7BC977007245E8 /* PredictionTableViewController.swift */, + 439A7941211F631C0041B75F /* RootNavigationController.swift */, + 43F5C2DA1B92A5E1003EB13D /* SettingsTableViewController.swift */, + 43E3449E1B9D68E900C85C07 /* StatusTableViewController.swift */, + 4302F4E01D4E9C8900F0FCAF /* TextFieldTableViewController.swift */, + ); + path = "View Controllers"; + sourceTree = ""; + }; + 43F5C2CF1B92A2ED003EB13D /* Views */ = { + isa = PBXGroup; + children = ( + 43B260481ED248FB008CAA77 /* CarbEntryTableViewCell.swift */, + 4346D1E61C77F5FE00ABAFE3 /* ChartTableViewCell.swift */, + 431A8C3F1EC6E8AB00823B9C /* CircleMaskView.swift */, + 43D381611EBD9759007F8C8F /* HeaderValuesTableViewCell.swift */, + 430D85881F44037000AF2D4F /* HUDViewTableViewCell.swift */, + 438D42FA1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift */, + 43C3B6EB20B650A80026CAFA /* SettingsImageTableViewCell.swift */, + 4374B5F3209D89A900D17AA8 /* TextFieldTableViewCell.swift */, + 43F64DD81D9C92C900D24DC6 /* TitleSubtitleTableViewCell.swift */, + 4311FB9A1F37FE1B00D4C0A7 /* TitleSubtitleTextFieldTableViewCell.swift */, + ); + path = Views; + sourceTree = ""; + }; + 43F5C2E41B93C5D4003EB13D /* Managers */ = { + isa = PBXGroup; + children = ( + 439897361CD2F80600223065 /* AnalyticsManager.swift */, + 439BED291E76093C00B0AED5 /* CGMManager.swift */, + 43DBF0521C93EC8200B3C386 /* DeviceDataManager.swift */, + 43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */, + 4315D2891CA5F45E00589052 /* DiagnosticLogger+LoopKit.swift */, + 43F78D251C8FC000002152D1 /* DoseMath.swift */, + 43E2D8C71D208D5B004DA55F /* KeychainManager+Loop.swift */, + 43A567681C94880B00334FAC /* LoopDataManager.swift */, + C18C8C501D5A351900E043FB /* NightscoutDataManager.swift */, + 43C094491CACCC73001F6403 /* NotificationManager.swift */, + 43C3B6F620BBCAA30026CAFA /* PumpManager.swift */, + 432E73CA1D24B3D6009AD15D /* RemoteDataManager.swift */, + 430C1ABC1E5568A80067F1AE /* StatusChartsManager+LoopKit.swift */, + 4F70C20F1DE8FAC5006380B7 /* StatusExtensionDataManager.swift */, + 4328E0341CFC0AE100E199AA /* WatchDataManager.swift */, + 9E575200217D87E7002D167B /* IntegralRetrospectiveCorrection.swift */, + ); + path = Managers; + sourceTree = ""; + }; + 43F78D2C1C8FC58F002152D1 /* LoopTests */ = { + isa = PBXGroup; + children = ( + 43E2D90F1D20C581004DA55F /* Info.plist */, + 7D2366E421250E0A0028B67D /* InfoPlist.strings */, + 43E2D8C91D20B9E7004DA55F /* KeychainManagerTests.swift */, + ); + path = LoopTests; + sourceTree = ""; + }; + 4F70C1DF1DE8DCA7006380B7 /* Loop Status Extension */ = { + isa = PBXGroup; + children = ( + 7D7076561FE06EE2004AC8EA /* InfoPlist.strings */, + 7D7076371FE06EDE004AC8EA /* Localizable.strings */, + 4F70C1FD1DE8E662006380B7 /* Loop Status Extension.entitlements */, + 4F70C1E51DE8DCA7006380B7 /* Info.plist */, + 43BFF0CC1E466C8400FF19A9 /* StateColorPalette.swift */, + 4F70C1E01DE8DCA7006380B7 /* StatusViewController.swift */, + 43BFF0BE1E45C8EA00FF19A9 /* UIColor+Widget.swift */, + 4F70C1E21DE8DCA7006380B7 /* MainInterface.storyboard */, + ); + path = "Loop Status Extension"; + sourceTree = ""; + }; + 4F75288C1DFE1DC600C322D6 /* LoopUI */ = { + isa = PBXGroup; + children = ( + 7D23667B21250C5A0028B67D /* Common */, + 7D70764C1FE06EE1004AC8EA /* Localizable.strings */, + 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */, + 4FB76FC41E8C576800B39636 /* Extensions */, + 4FB76FC31E8C575900B39636 /* Managers */, + 4F7528A61DFE20AE00C322D6 /* Models */, + 4F7528931DFE1E1600C322D6 /* Views */, + 4F75288D1DFE1DC600C322D6 /* LoopUI.h */, + 4F75288E1DFE1DC600C322D6 /* Info.plist */, + 4F2C15941E09BF3C00E160D4 /* HUDView.xib */, + 4F2C15961E09E94E00E160D4 /* Assets.xcassets */, + ); + path = LoopUI; + sourceTree = ""; + }; + 4F7528931DFE1E1600C322D6 /* Views */ = { + isa = PBXGroup; + children = ( + 437CEEBF1CD6FCD8003C8C80 /* BasalRateHUDView.swift */, + 43B371851CE583890013C5A6 /* BasalStateView.swift */, + 437CEEBB1CD6DE6A003C8C80 /* BaseHUDView.swift */, + 437CEEC91CD84DB7003C8C80 /* BatteryLevelHUDView.swift */, + 4313EDDF1D8A6BF90060FA79 /* ChartContainerView.swift */, + 4369618F1F19C86400447E89 /* ChartPointsContextFillLayer.swift */, + 4F08DE831E7BB70B006741EA /* ChartPointsScatterDownTrianglesLayer.swift */, + 4F08DE841E7BB70B006741EA /* ChartPointsTouchHighlightLayerViewCache.swift */, + 4337615E1D52F487004A3647 /* GlucoseHUDView.swift */, + 4F2C15921E09BF2C00E160D4 /* HUDView.swift */, + 43E0F0A41E46D1670064F7CE /* LevelHUDView.swift */, + 43FBEDD71D73843700B21F22 /* LevelMaskView.swift */, + 437CEEBD1CD6E0CB003C8C80 /* LoopCompletionHUDView.swift */, + 438DADC71CDE8F8B007697A5 /* LoopStateView.swift */, + 437CEEC71CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 4F7528A61DFE20AE00C322D6 /* Models */ = { + isa = PBXGroup; + children = ( + 4F08DE7C1E7BB6E5006741EA /* ChartAxisValueDoubleLog.swift */, + 4F08DE7D1E7BB6E5006741EA /* ChartAxisValueDoubleUnit.swift */, + 4FB76FCD1E8C835D00B39636 /* ChartColorPalette.swift */, + 4326BA631F3A44D9007CCAD4 /* ChartLineModel.swift */, + 43BFF0C81E465B0A00FF19A9 /* StateColorPalette.swift */, + ); + path = Models; + sourceTree = ""; + }; + 4F75F0052100146B00B5570E /* Scenes */ = { + isa = PBXGroup; + children = ( + 4F75F00120FCFE8C00B5570E /* GlucoseChartScene.swift */, + 4372E495213DCDD30068E043 /* GlucoseChartValueHashable.swift */, + ); + path = Scenes; + sourceTree = ""; + }; + 4FB76FC31E8C575900B39636 /* Managers */ = { + isa = PBXGroup; + children = ( + 4FB76FC51E8C57B100B39636 /* StatusChartsManager.swift */, + ); + path = Managers; + sourceTree = ""; + }; + 4FB76FC41E8C576800B39636 /* Extensions */ = { + isa = PBXGroup; + children = ( + 4F08DE801E7BB6F1006741EA /* CGPoint.swift */, + 438991661E91B563000EEF90 /* ChartPoint.swift */, + 43649A621C7A347F00523D7F /* CollectionType.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 4FE3475F20D5D7FA00A86D03 /* Managers */ = { + isa = PBXGroup; + children = ( + 4FDDD23620DC51DF00D04B16 /* LoopDataManager.swift */, + ); + path = Managers; + sourceTree = ""; + }; + 4FF4D0FA1E1834BD00846527 /* Common */ = { + isa = PBXGroup; + children = ( + 4FF4D0FC1E1834CC00846527 /* Extensions */, + 4FF4D0FB1E1834C400846527 /* Models */, + 43785E9B2120E7060057DED1 /* Intents.intentdefinition */, + ); + path = Common; + sourceTree = ""; + }; + 4FF4D0FB1E1834C400846527 /* Models */ = { + isa = PBXGroup; + children = ( + 43673E2E1F37BDA10058AC7C /* Insulin */, + 435400301C9F744E00D5819C /* BolusSuggestionUserInfo.swift */, + 43DE92581C5479E4001FFDE1 /* CarbEntryUserInfo.swift */, + 4F11D3BF20DCBEEC006E072C /* GlucoseBackfillRequestUserInfo.swift */, + 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */, + 430B298C2041F56500BA9F93 /* LoopSettings.swift */, + 4372E48F213CFCE70068E043 /* LoopSettingsUserInfo.swift */, + 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */, + 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */, + 4FF4D0FF1E18374700846527 /* WatchContext.swift */, + 4F11D3C120DD80B3006E072C /* WatchHistoricalGlucose.swift */, + 4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */, + ); + path = Models; + sourceTree = ""; + }; + 4FF4D0FC1E1834CC00846527 /* Extensions */ = { + isa = PBXGroup; + children = ( + 4372E48A213CB5F00068E043 /* Double.swift */, + 4F526D5E1DF2459000A04910 /* HKUnit.swift */, + 43C513181E864C4E001547C7 /* GlucoseRangeSchedule.swift */, + 434FF1E91CF26C29000DB779 /* IdentifiableClass.swift */, + 43785E922120A01B0057DED1 /* NewCarbEntryIntent+Loop.swift */, + 434F54561D287FDB002A9274 /* NibLoadable.swift */, + 430DA58D1D4AEC230097D1CA /* NSBundle.swift */, + 439897341CD2F7DE00223065 /* NSTimeInterval.swift */, + 439A7943211FE22F0041B75F /* NSUserActivity.swift */, + 430B29892041F54A00BA9F93 /* NSUserDefaults.swift */, + 4FC8C8001DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift */, + 43BFF0B31E45C1BE00FF19A9 /* NumberFormatter.swift */, + 4374B5EE209D84BE00D17AA8 /* OSLog.swift */, + 431E73471FF95A900069B5F7 /* PersistenceController.swift */, + 4372E486213C86240068E043 /* SampleValue.swift */, + 43BFF0B11E45C18400FF19A9 /* UIColor.swift */, + 43BFF0C31E4659E700FF19A9 /* UIColor+HIG.swift */, + 4344628D20A7ADD100C4BE6F /* UserDefaults+CGM.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 7D23667B21250C5A0028B67D /* Common */ = { + isa = PBXGroup; + children = ( + 7D23667C21250C7E0028B67D /* LocalizedString.swift */, + ); + path = Common; + sourceTree = ""; + }; + 968DCD53F724DE56FFE51920 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 434FB6451D68F1CD007B9C70 /* Amplitude.framework */, + 4344628420A7A3BE00C4BE6F /* CGMBLEKit.framework */, + 438A95A71D8B9B24009D12E1 /* CGMBLEKit.framework */, + 43A8EC6E210E622600A81379 /* CGMBLEKitUI.framework */, + 4344628120A7A37E00C4BE6F /* CoreBluetooth.framework */, + 43C246A71D89990F0031F8D1 /* Crypto.framework */, + 4D3B40021D4A9DFE00BC6334 /* G4ShareSpy.framework */, + 4344627F20A7A37400C4BE6F /* HealthKit.framework */, + 43F5C2C81B929C09003EB13D /* HealthKit.framework */, + 4344628320A7A3BE00C4BE6F /* LoopKit.framework */, + 43F78D4B1C914197002152D1 /* LoopKit.framework */, + 437AFEE6203688CF008C4892 /* LoopKitUI.framework */, + 43CA93361CB98079000026B5 /* MinimedKit.framework */, + 43709AE920DF3F8200F941B3 /* MinimedKitUI.framework */, + C10428961D17BAD400DD539A /* NightscoutUploadKit.framework */, + 4F70C1DD1DE8DCA7006380B7 /* NotificationCenter.framework */, + 434AB0B11CBB4C3300422F4A /* RileyLinkBLEKit.framework */, + 43523EDA1CC35083001850F1 /* RileyLinkKit.framework */, + C18852E12082AB1A00BECC8C /* RileyLinkKitUI.framework */, + 43B371871CE597D10013C5A6 /* ShareClient.framework */, + 4379CFEF21112CF700AADC79 /* ShareClientUI.framework */, + 4346D1EF1C781BEA00ABAFE3 /* SwiftCharts.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 4F7528881DFE1DC600C322D6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F2C15851E075B8700E160D4 /* LoopUI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 43776F8B1B8022E90074EA36 /* Loop */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43776FB61B8022E90074EA36 /* Build configuration list for PBXNativeTarget "Loop" */; + buildPhases = ( + 43776F881B8022E90074EA36 /* Sources */, + 43776F891B8022E90074EA36 /* Frameworks */, + 43776F8A1B8022E90074EA36 /* Resources */, + 43A9439C1B926B7B0051FA24 /* Embed Watch Content */, + 43A943AE1B928D400051FA24 /* Embed Frameworks */, + 43EDDBEF1C361BCE007D89B5 /* Copy Frameworks with Carthage */, + 4F70C1EC1DE8DCA8006380B7 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 432CF87D20D8B8990066B889 /* PBXTargetDependency */, + 4F7528971DFE1ED400C322D6 /* PBXTargetDependency */, + 43A943931B926B7B0051FA24 /* PBXTargetDependency */, + 4F70C1E71DE8DCA7006380B7 /* PBXTargetDependency */, + ); + name = Loop; + productName = Loop; + productReference = 43776F8C1B8022E90074EA36 /* Loop.app */; + productType = "com.apple.product-type.application"; + }; + 43A943711B926B7B0051FA24 /* WatchApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43A943991B926B7B0051FA24 /* Build configuration list for PBXNativeTarget "WatchApp" */; + buildPhases = ( + 43A943701B926B7B0051FA24 /* Resources */, + 43A943981B926B7B0051FA24 /* Embed App Extensions */, + 43105EF81BADC8F9009CD81E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 43A943811B926B7B0051FA24 /* PBXTargetDependency */, + ); + name = WatchApp; + productName = WatchApp; + productReference = 43A943721B926B7B0051FA24 /* WatchApp.app */; + productType = "com.apple.product-type.application.watchapp2"; + }; + 43A9437D1B926B7B0051FA24 /* WatchApp Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43A943951B926B7B0051FA24 /* Build configuration list for PBXNativeTarget "WatchApp Extension" */; + buildPhases = ( + 43A9437A1B926B7B0051FA24 /* Sources */, + 43A9437B1B926B7B0051FA24 /* Frameworks */, + 43A9437C1B926B7B0051FA24 /* Resources */, + 43C667D71C5577280050C674 /* Embed Frameworks */, + 43FF3DF620A8EFE800F8E62C /* Copy Frameworks with Carthage */, + ); + buildRules = ( + ); + dependencies = ( + 432CF88120D8BC460066B889 /* PBXTargetDependency */, + ); + name = "WatchApp Extension"; + productName = "WatchApp Extension"; + productReference = 43A9437E1B926B7B0051FA24 /* WatchApp Extension.appex */; + productType = "com.apple.product-type.watchkit2-extension"; + }; + 43E2D8D01D20BF42004DA55F /* DoseMathTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43E2D8D61D20BF42004DA55F /* Build configuration list for PBXNativeTarget "DoseMathTests" */; + buildPhases = ( + 43E2D8CD1D20BF42004DA55F /* Sources */, + 43E2D8CE1D20BF42004DA55F /* Frameworks */, + 43E2D8CF1D20BF42004DA55F /* Resources */, + 43E2D8DD1D20C072004DA55F /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DoseMathTests; + productName = DoseMathTests; + productReference = 43E2D8D11D20BF42004DA55F /* DoseMathTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 43E2D90A1D20C581004DA55F /* LoopTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43E2D9121D20C581004DA55F /* Build configuration list for PBXNativeTarget "LoopTests" */; + buildPhases = ( + 43E2D9071D20C581004DA55F /* Sources */, + 43E2D9081D20C581004DA55F /* Frameworks */, + 43E2D9091D20C581004DA55F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 43E2D9111D20C581004DA55F /* PBXTargetDependency */, + ); + name = LoopTests; + productName = LoopTests; + productReference = 43E2D90B1D20C581004DA55F /* LoopTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4F70C1DB1DE8DCA7006380B7 /* Loop Status Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F70C1EB1DE8DCA8006380B7 /* Build configuration list for PBXNativeTarget "Loop Status Extension" */; + buildPhases = ( + 4F70C1D81DE8DCA7006380B7 /* Sources */, + 4F70C1D91DE8DCA7006380B7 /* Frameworks */, + 4F70C1DA1DE8DCA7006380B7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4F7528991DFE1ED800C322D6 /* PBXTargetDependency */, + ); + name = "Loop Status Extension"; + productName = "Loop Status Extension"; + productReference = 4F70C1DC1DE8DCA7006380B7 /* Loop Status Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 4F75288A1DFE1DC600C322D6 /* LoopUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F7528921DFE1DC600C322D6 /* Build configuration list for PBXNativeTarget "LoopUI" */; + buildPhases = ( + 4F7528861DFE1DC600C322D6 /* Sources */, + 4F7528871DFE1DC600C322D6 /* Frameworks */, + 4F7528881DFE1DC600C322D6 /* Headers */, + 4F7528891DFE1DC600C322D6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 432CF87F20D8BC3B0066B889 /* PBXTargetDependency */, + ); + name = LoopUI; + productName = LoopUI; + productReference = 4F75288B1DFE1DC600C322D6 /* LoopUI.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 43776F841B8022E90074EA36 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "LoopKit Authors"; + TargetAttributes = { + 432CF87720D8B8380066B889 = { + CreatedOnToolsVersion = 9.4; + ProvisioningStyle = Automatic; + }; + 43776F8B1B8022E90074EA36 = { + CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 1000; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + com.apple.BackgroundModes = { + enabled = 1; + }; + com.apple.HealthKit = { + enabled = 1; + }; + com.apple.Keychain = { + enabled = 0; + }; + com.apple.Siri = { + enabled = 1; + }; + }; + }; + 43A943711B926B7B0051FA24 = { + CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 0800; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 0; + }; + com.apple.BackgroundModes.watchos.app = { + enabled = 0; + }; + }; + }; + 43A9437D1B926B7B0051FA24 = { + CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 1000; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 0; + }; + com.apple.HealthKit = { + enabled = 0; + }; + com.apple.HealthKit.watchos = { + enabled = 1; + }; + com.apple.Keychain = { + enabled = 0; + }; + com.apple.Siri = { + enabled = 1; + }; + }; + }; + 43E2D8D01D20BF42004DA55F = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1000; + }; + 43E2D90A1D20C581004DA55F = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1000; + TestTargetID = 43776F8B1B8022E90074EA36; + }; + 4F70C1DB1DE8DCA7006380B7 = { + CreatedOnToolsVersion = 8.1; + LastSwiftMigration = 1000; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; + }; + 4F75288A1DFE1DC600C322D6 = { + CreatedOnToolsVersion = 8.1; + LastSwiftMigration = 1000; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 43776F871B8022E90074EA36 /* Build configuration list for PBXProject "Loop" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + fr, + de, + "zh-Hans", + it, + nl, + nb, + es, + pl, + ); + mainGroup = 43776F831B8022E90074EA36; + productRefGroup = 43776F8D1B8022E90074EA36 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 43776F8B1B8022E90074EA36 /* Loop */, + 4F70C1DB1DE8DCA7006380B7 /* Loop Status Extension */, + 43A943711B926B7B0051FA24 /* WatchApp */, + 43A9437D1B926B7B0051FA24 /* WatchApp Extension */, + 4F75288A1DFE1DC600C322D6 /* LoopUI */, + 43E2D8D01D20BF42004DA55F /* DoseMathTests */, + 43E2D90A1D20C581004DA55F /* LoopTests */, + 432CF87720D8B8380066B889 /* Cartfile */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 43776F8A1B8022E90074EA36 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43FCBBC21E51710B00343C1B /* LaunchScreen.storyboard in Resources */, + 7D70764F1FE06EE1004AC8EA /* InfoPlist.strings in Resources */, + 43776F991B8022E90074EA36 /* Assets.xcassets in Resources */, + 7D7076631FE06EE4004AC8EA /* Localizable.strings in Resources */, + 43776F971B8022E90074EA36 /* Main.storyboard in Resources */, + C9886AE51E5B2FAD00473BB8 /* gallery.ckcomplication in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43A943701B926B7B0051FA24 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C1C73F0D1DE3D0270022FC89 /* InfoPlist.strings in Resources */, + 894F71E21FFEC4D8007D365C /* Assets.xcassets in Resources */, + 43A943761B926B7B0051FA24 /* Interface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43A9437C1B926B7B0051FA24 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7D70765E1FE06EE3004AC8EA /* Localizable.strings in Resources */, + 7D70763A1FE06EDF004AC8EA /* InfoPlist.strings in Resources */, + 7D70763F1FE06EDF004AC8EA /* ckcomplication.strings in Resources */, + 43A943901B926B7B0051FA24 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D8CF1D20BF42004DA55F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7D7076591FE06EE2004AC8EA /* Localizable.strings in Resources */, + 43E2D8F21D20C0DB004DA55F /* recommend_temp_basal_no_change_glucose.json in Resources */, + 43E2D8F61D20C0DB004DA55F /* recommend_temp_basal_start_low_end_in_range.json in Resources */, + C17824A31E19EAB600D9D25C /* recommend_temp_basal_start_very_low_end_high.json in Resources */, + 43E2D8F41D20C0DB004DA55F /* recommend_temp_basal_start_high_end_low.json in Resources */, + 43E2D8EF1D20C0DB004DA55F /* recommend_temp_basal_high_and_falling.json in Resources */, + 436D9BF81F6F4EA100CFA75F /* recommended_temp_start_low_end_just_above_range.json in Resources */, + 7D7076681FE0702F004AC8EA /* InfoPlist.strings in Resources */, + 43E2D8ED1D20C0DB004DA55F /* recommend_temp_basal_correct_low_at_min.json in Resources */, + 43E2D8F01D20C0DB004DA55F /* recommend_temp_basal_high_and_rising.json in Resources */, + C12F21A71DFA79CB00748193 /* recommend_temp_basal_very_low_end_in_range.json in Resources */, + 43E2D8F11D20C0DB004DA55F /* recommend_temp_basal_in_range_and_rising.json in Resources */, + 43E2D8EE1D20C0DB004DA55F /* recommend_temp_basal_flat_and_high.json in Resources */, + C1C6591C1E1B1FDA0025CC58 /* recommend_temp_basal_dropping_then_rising.json in Resources */, + 43E2D8F31D20C0DB004DA55F /* recommend_temp_basal_start_high_end_in_range.json in Resources */, + 43E2D8F51D20C0DB004DA55F /* recommend_temp_basal_start_low_end_high.json in Resources */, + C10B28461EA9BA5E006EA1FC /* far_future_high_bg_forecast.json in Resources */, + 43E2D8EC1D20C0DB004DA55F /* read_selected_basal_profile.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D9091D20C581004DA55F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7D2366E621250E0A0028B67D /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F70C1DA1DE8DCA7006380B7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F70C1E41DE8DCA7006380B7 /* MainInterface.storyboard in Resources */, + 7D7076541FE06EE2004AC8EA /* InfoPlist.strings in Resources */, + 7D7076351FE06EDE004AC8EA /* Localizable.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F7528891DFE1DC600C322D6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F2C15971E09E94E00E160D4 /* Assets.xcassets in Resources */, + 7D70764A1FE06EE1004AC8EA /* Localizable.strings in Resources */, + 7D7076451FE06EE0004AC8EA /* InfoPlist.strings in Resources */, + 4F2C15951E09BF3C00E160D4 /* HUDView.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 432CF87B20D8B8490066B889 /* Build Carthage Dependencies */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Build Carthage Dependencies"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ -f $PROJECT_DIR/.gitmodules ]; then\n echo \"Skipping checkout due to presence of .gitmodules file\"\n if [ $ACTION = \"install\" ]; then\n echo \"You're installing: Make sure to keep all submodules up-to-date and run carthage build after changes.\"\n fi\nelse\n echo \"Bootstrapping carthage dependencies\"\n /usr/local/bin/carthage bootstrap --project-directory \"$SRCROOT\" --cache-builds\nfi"; + }; + 432CF88220D8BCD90066B889 /* Homebrew & Carthage Setup */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Homebrew & Carthage Setup"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if ! [ -x \"$(command -v brew)\" ]; then\n # Install Homebrew\n ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\nfi\n\nif brew ls carthage > /dev/null; then\n brew upgrade carthage || echo \"Continuing…\"\nelse\n brew install carthage\nfi\n"; + }; + 43EDDBEF1C361BCE007D89B5 /* Copy Frameworks with Carthage */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/Carthage/Build/iOS/CGMBLEKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/LoopKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/SwiftCharts.framework", + "$(SRCROOT)/Carthage/Build/iOS/MinimedKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/RileyLinkBLEKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/RileyLinkKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/Amplitude.framework", + "$(SRCROOT)/Carthage/Build/iOS/ShareClient.framework", + "$(SRCROOT)/Carthage/Build/iOS/NightscoutUploadKit.framework", + "$(SRCROOT)/Carthage/Build/iOS/Crypto.framework", + "$(SRCROOT)/Carthage/Build/iOS/G4ShareSpy.framework", + "$(SRCROOT)/Carthage/Build/iOS/RileyLinkKitUI.framework", + "$(SRCROOT)/Carthage/Build/iOS/LoopKitUI.framework", + "$(SRCROOT)/Carthage/Build/iOS/MinimedKitUI.framework", + "$(SRCROOT)/Carthage/Build/iOS/CGMBLEKitUI.framework", + "$(SRCROOT)/Carthage/Build/iOS/ShareClientUI.framework", + ); + name = "Copy Frameworks with Carthage"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "carthage_frameworks_dir=${SRCROOT}/Carthage/Build/iOS\nif [ -f $PROJECT_DIR/.gitmodules && [ $ACTION != \"install\" ]; then\nfor varname in ${!SCRIPT_INPUT_FILE_*}\ndo\nexport ${varname}=${!varname/$carthage_frameworks_dir/$BUILT_PRODUCTS_DIR}\ndone\nfi\n/usr/local/bin/carthage copy-frameworks"; + }; + 43FF3DF620A8EFE800F8E62C /* Copy Frameworks with Carthage */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/Carthage/Build/watchOS/CGMBLEKit.framework", + "$(SRCROOT)/Carthage/Build/watchOS/LoopKit.framework", + "$(SRCROOT)/Carthage/Build/watchOS/ShareClient.framework", + ); + name = "Copy Frameworks with Carthage"; + outputPaths = ( + "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/CGMBLEKit.framework", + "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/LoopKit.framework", + "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ShareClient.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "carthage_frameworks_dir=${SRCROOT}/Carthage/Build/iOS\nif [ -f $PROJECT_DIR/.gitmodules && [ $ACTION != \"install\" ]; then\nfor varname in ${!SCRIPT_INPUT_FILE_*}\ndo\nexport ${varname}=${!varname/$carthage_frameworks_dir/$BUILT_PRODUCTS_DIR}\ndone\nfi\n/usr/local/bin/carthage copy-frameworks"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 43776F881B8022E90074EA36 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C17824A51E1AD4D100D9D25C /* BolusRecommendation.swift in Sources */, + 4F70C2131DE90339006380B7 /* StatusExtensionContext.swift in Sources */, + 434F54571D287FDB002A9274 /* NibLoadable.swift in Sources */, + 43441A9C1EDB34810087958C /* StatusExtensionContext+LoopKit.swift in Sources */, + 4FF4D1001E18374700846527 /* WatchContext.swift in Sources */, + 430B298A2041F54A00BA9F93 /* NSUserDefaults.swift in Sources */, + 4315D28A1CA5F45E00589052 /* DiagnosticLogger+LoopKit.swift in Sources */, + 7B4282D4217AD17900026DE1 /* FPUDelayTableViewController.swift in Sources */, + 4F2C15821E074FC600E160D4 /* NSTimeInterval.swift in Sources */, + 4311FB9B1F37FE1B00D4C0A7 /* TitleSubtitleTextFieldTableViewCell.swift in Sources */, + 430DA58E1D4AEC230097D1CA /* NSBundle.swift in Sources */, + 43C513191E864C4E001547C7 /* GlucoseRangeSchedule.swift in Sources */, + 43A51E1F1EB6D62A000736CC /* CarbAbsorptionViewController.swift in Sources */, + 43776F901B8022E90074EA36 /* AppDelegate.swift in Sources */, + 4372E48B213CB5F00068E043 /* Double.swift in Sources */, + 9E575201217D87E7002D167B /* IntegralRetrospectiveCorrection.swift in Sources */, + 430B29932041F5B300BA9F93 /* UserDefaults+Loop.swift in Sources */, + 4341F4EB1EDB92AC001C936B /* LogglyService.swift in Sources */, + 43CE7CDE1CA8B63E003CC1B0 /* Data.swift in Sources */, + 43BFF0CB1E466C0900FF19A9 /* StateColorPalette.swift in Sources */, + 439A7942211F631C0041B75F /* RootNavigationController.swift in Sources */, + 4F11D3C020DCBEEC006E072C /* GlucoseBackfillRequestUserInfo.swift in Sources */, + 43F5C2DB1B92A5E1003EB13D /* SettingsTableViewController.swift in Sources */, + 434FF1EA1CF26C29000DB779 /* IdentifiableClass.swift in Sources */, + 43A567691C94880B00334FAC /* LoopDataManager.swift in Sources */, + 43D848B01E7DCBE100DADCBC /* Result.swift in Sources */, + 43B260491ED248FB008CAA77 /* CarbEntryTableViewCell.swift in Sources */, + 4302F4E11D4E9C8900F0FCAF /* TextFieldTableViewController.swift in Sources */, + 435CB6271F37AE5600C320C7 /* WalshInsulinModel.swift in Sources */, + 43F64DD91D9C92C900D24DC6 /* TitleSubtitleTableViewCell.swift in Sources */, + C15713821DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift in Sources */, + 435400321C9F745500D5819C /* BolusSuggestionUserInfo.swift in Sources */, + 43E3449F1B9D68E900C85C07 /* StatusTableViewController.swift in Sources */, + 43DBF0531C93EC8200B3C386 /* DeviceDataManager.swift in Sources */, + 43E2D8C81D208D5B004DA55F /* KeychainManager+Loop.swift in Sources */, + 430B298F2041F56500BA9F93 /* GlucoseThreshold.swift in Sources */, + C17824A01E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift in Sources */, + 435CB6251F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift in Sources */, + 4372E487213C86240068E043 /* SampleValue.swift in Sources */, + 4346D1E71C77F5FE00ABAFE3 /* ChartTableViewCell.swift in Sources */, + 437CEEE41CDE5C0A003C8C80 /* UIImage.swift in Sources */, + 43DBF0591C93F73800B3C386 /* CarbEntryTableViewController.swift in Sources */, + 43E93FB71E469A5100EAB8DB /* HKUnit.swift in Sources */, + 43BFF0BC1E45C80600FF19A9 /* UIColor+Loop.swift in Sources */, + 43C0944A1CACCC73001F6403 /* NotificationManager.swift in Sources */, + 4F08DE9D1E81D0E9006741EA /* StatusChartsManager+LoopKit.swift in Sources */, + 434FF1EE1CF27EEF000DB779 /* UITableViewCell.swift in Sources */, + 439BED2A1E76093C00B0AED5 /* CGMManager.swift in Sources */, + C18C8C511D5A351900E043FB /* NightscoutDataManager.swift in Sources */, + 438849EA1D297CB6003B3F23 /* NightscoutService.swift in Sources */, + 438172D91F4E9E37003C3328 /* NewPumpEvent.swift in Sources */, + 4389916B1E91B689000EEF90 /* ChartSettings+Loop.swift in Sources */, + 4315D2871CA5CC3B00589052 /* CarbEntryEditTableViewController.swift in Sources */, + C178249A1E1999FA00D9D25C /* CaseCountable.swift in Sources */, + 43DBF04C1C93B8D700B3C386 /* BolusViewController.swift in Sources */, + 4FB76FBB1E8C42CF00B39636 /* UIColor.swift in Sources */, + 4374B5EF209D84BF00D17AA8 /* OSLog.swift in Sources */, + 4F6663941E905FD2009E74FC /* ChartColorPalette+Loop.swift in Sources */, + 4328E0351CFC0AE100E199AA /* WatchDataManager.swift in Sources */, + 43D381621EBD9759007F8C8F /* HeaderValuesTableViewCell.swift in Sources */, + 43BFF0C51E465A2D00FF19A9 /* UIColor+HIG.swift in Sources */, + 43785E982120E7060057DED1 /* Intents.intentdefinition in Sources */, + 4302F4E31D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift in Sources */, + 4374B5F4209D89A900D17AA8 /* TextFieldTableViewCell.swift in Sources */, + 4FC8C8011DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift in Sources */, + 43DAD00020A2736F000F8529 /* PersistedPumpEvent.swift in Sources */, + 438849EC1D29EC34003B3F23 /* AmplitudeService.swift in Sources */, + 43E93FB61E469A4000EAB8DB /* NumberFormatter.swift in Sources */, + 4F08DE8F1E7BB871006741EA /* CollectionType+Loop.swift in Sources */, + 435400341C9F878D00D5819C /* SetBolusUserInfo.swift in Sources */, + 437D9BA31D7BC977007245E8 /* PredictionTableViewController.swift in Sources */, + 4344628F20A7ADD500C4BE6F /* UserDefaults+CGM.swift in Sources */, + 43F41C371D3BF32400C11ED6 /* UIAlertController.swift in Sources */, + 7B4282D3217AD17900026DE1 /* FPURatioTableViewController.swift in Sources */, + 433EA4C41D9F71C800CD78FB /* CommandResponseViewController.swift in Sources */, + 43D2E8231F00425400AE5CBF /* BolusViewController+LoopDataManager.swift in Sources */, + 430B29952041F5CB00BA9F93 /* LoopSettings+Loop.swift in Sources */, + 43785E932120A01B0057DED1 /* NewCarbEntryIntent+Loop.swift in Sources */, + 43CEE6E61E56AFD400CB9116 /* NightscoutUploader.swift in Sources */, + 439A7944211FE22F0041B75F /* NSUserActivity.swift in Sources */, + 4328E0331CFC091100E199AA /* WatchContext+LoopKit.swift in Sources */, + 4F526D611DF8D9A900A04910 /* NetBasal.swift in Sources */, + 43C3B6EC20B650A80026CAFA /* SettingsImageTableViewCell.swift in Sources */, + 4F7E8ACB20E2ACB500AEA65E /* WatchPredictedGlucose.swift in Sources */, + 436A0DA51D236A2A00104B24 /* LoopError.swift in Sources */, + 4F11D3C220DD80B3006E072C /* WatchHistoricalGlucose.swift in Sources */, + 435CB6231F37967800C320C7 /* InsulinModelSettingsViewController.swift in Sources */, + 431E73481FF95A900069B5F7 /* PersistenceController.swift in Sources */, + 4372E490213CFCE70068E043 /* LoopSettingsUserInfo.swift in Sources */, + 43F78D261C8FC000002152D1 /* DoseMath.swift in Sources */, + 438D42F91D7C88BC003244B0 /* PredictionInputEffect.swift in Sources */, + 4F70C2101DE8FAC5006380B7 /* StatusExtensionDataManager.swift in Sources */, + 43DFB62320D4CAE7008A7BAE /* PumpManager.swift in Sources */, + 435CB6291F37B01300C320C7 /* InsulinModelSettings.swift in Sources */, + 431A8C401EC6E8AB00823B9C /* CircleMaskView.swift in Sources */, + 439897371CD2F80600223065 /* AnalyticsManager.swift in Sources */, + 430D85891F44037000AF2D4F /* HUDViewTableViewCell.swift in Sources */, + 43A51E211EB6DBDD000736CC /* ChartsTableViewController.swift in Sources */, + 438849EE1D2A1EBB003B3F23 /* MLabService.swift in Sources */, + 438D42FB1D7D11A4003244B0 /* PredictionInputEffectTableViewCell.swift in Sources */, + 43F4EF1D1BA2A57600526CE1 /* DiagnosticLogger.swift in Sources */, + 432E73CB1D24B3D6009AD15D /* RemoteDataManager.swift in Sources */, + 43DE92591C5479E4001FFDE1 /* CarbEntryUserInfo.swift in Sources */, + 43DE92611C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift in Sources */, + 430B298E2041F56500BA9F93 /* LoopSettings.swift in Sources */, + 43C2FAE11EB656A500364AFF /* GlucoseEffectVelocity.swift in Sources */, + 4374B5F2209D897600D17AA8 /* Locked.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43A9437A1B926B7B0051FA24 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4372E488213C862B0068E043 /* SampleValue.swift in Sources */, + 4F2C15741E0209F500E160D4 /* NSTimeInterval.swift in Sources */, + 4FF4D1011E18375000846527 /* WatchContext.swift in Sources */, + 435400311C9F744E00D5819C /* BolusSuggestionUserInfo.swift in Sources */, + 4372E49A213F7A830068E043 /* WalshInsulinModel.swift in Sources */, + 43A9438A1B926B7B0051FA24 /* NotificationController.swift in Sources */, + 439A7945211FE23A0041B75F /* NSUserActivity.swift in Sources */, + 43A943881B926B7B0051FA24 /* ExtensionDelegate.swift in Sources */, + 4372E498213F7A550068E043 /* InsulinModelSettings.swift in Sources */, + 4F75F00220FCFE8C00B5570E /* GlucoseChartScene.swift in Sources */, + 4328E02F1CFBF81800E199AA /* WKInterfaceImage.swift in Sources */, + 4F2C15811E0495B200E160D4 /* WatchContext+WatchApp.swift in Sources */, + 4372E496213DCDD30068E043 /* GlucoseChartValueHashable.swift in Sources */, + 4344629820A8B2D700C4BE6F /* OSLog.swift in Sources */, + 4328E02A1CFBE2C500E199AA /* UIColor.swift in Sources */, + 4372E484213A63FB0068E043 /* ChartHUDController.swift in Sources */, + 4FDDD23720DC51DF00D04B16 /* LoopDataManager.swift in Sources */, + 4328E01B1CFBE1DA00E199AA /* BolusInterfaceController.swift in Sources */, + 4F82655020E69F9A0031A8F5 /* HUDInterfaceController.swift in Sources */, + 4372E492213D956C0068E043 /* GlucoseRangeSchedule.swift in Sources */, + 4328E02B1CFBE2C500E199AA /* WKAlertAction.swift in Sources */, + 4F7E8AC720E2AC0300AEA65E /* WatchPredictedGlucose.swift in Sources */, + 4344628E20A7ADD100C4BE6F /* UserDefaults+CGM.swift in Sources */, + 4372E499213F7A6D0068E043 /* ExponentialInsulinModelPreset.swift in Sources */, + 4F7E8AC520E2AB9600AEA65E /* Date.swift in Sources */, + 4F11D3C420DD881A006E072C /* WatchHistoricalGlucose.swift in Sources */, + 4328E0281CFBE2C500E199AA /* CLKComplicationTemplate.swift in Sources */, + 4328E01E1CFBE25F00E199AA /* AddCarbsInterfaceController.swift in Sources */, + 4328E0261CFBE2C500E199AA /* IdentifiableClass.swift in Sources */, + 4F73F5FC20E2E7FA00E8D82C /* GlucoseStore.swift in Sources */, + 432CF87520D8AC950066B889 /* NSUserDefaults+WatchApp.swift in Sources */, + 43027F0F1DFE0EC900C51989 /* HKUnit.swift in Sources */, + 4344629220A7C19800C4BE6F /* ButtonGroup.swift in Sources */, + 4372E48C213CB6750068E043 /* Double.swift in Sources */, + 43785E972120E4500057DED1 /* INRelevantShortcutStore+Loop.swift in Sources */, + 4372E48E213CF8AD0068E043 /* LoopSettings.swift in Sources */, + 4372E49B213F7B340068E043 /* NSBundle.swift in Sources */, + 43CB2B2B1D924D450079823D /* WCSession.swift in Sources */, + 4372E497213F79F90068E043 /* NSUserDefaults.swift in Sources */, + 4372E491213D05F90068E043 /* LoopSettingsUserInfo.swift in Sources */, + 43DE925A1C5479E4001FFDE1 /* CarbEntryUserInfo.swift in Sources */, + 4FF0F75E20E1E5D100FC6291 /* PersistenceController.swift in Sources */, + 43BFF0B51E45C1E700FF19A9 /* NumberFormatter.swift in Sources */, + 43A9438E1B926B7B0051FA24 /* ComplicationController.swift in Sources */, + 4328E01A1CFBE1DA00E199AA /* ActionHUDController.swift in Sources */, + 4F11D3C320DD84DB006E072C /* GlucoseBackfillRequestUserInfo.swift in Sources */, + 4372E48D213CF8A70068E043 /* GlucoseThreshold.swift in Sources */, + 435400351C9F878D00D5819C /* SetBolusUserInfo.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D8CD1D20BF42004DA55F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43C3B6ED20B884500026CAFA /* GlucoseThreshold.swift in Sources */, + 43947D731F529FAA00A07D31 /* GlucoseRangeSchedule.swift in Sources */, + 43E2D8DC1D20C049004DA55F /* DoseMath.swift in Sources */, + 43E2D8DB1D20C03B004DA55F /* NSTimeInterval.swift in Sources */, + 43E2D8D41D20BF42004DA55F /* DoseMathTests.swift in Sources */, + C11C87DE1E21EAAD00BB71D3 /* HKUnit.swift in Sources */, + C13BAD941E8009B000050CB5 /* NumberFormatter.swift in Sources */, + C17824A61E1AF91F00D9D25C /* BolusRecommendation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43E2D9071D20C581004DA55F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43E2D9151D20C5A2004DA55F /* KeychainManagerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F70C1D81DE8DCA7006380B7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4FAC02541E22F6B20087A773 /* NSTimeInterval.swift in Sources */, + 434B2888206B4F0A000EE07B /* InsulinModelSettings.swift in Sources */, + 4FB76FBA1E8C42CE00B39636 /* UIColor.swift in Sources */, + 4F2C15831E0757E600E160D4 /* HKUnit.swift in Sources */, + 430B29902041F57000BA9F93 /* GlucoseThreshold.swift in Sources */, + 434B2887206B4F07000EE07B /* WalshInsulinModel.swift in Sources */, + 43E93FB51E4675E800EAB8DB /* NumberFormatter.swift in Sources */, + 43BFF0CD1E466C8400FF19A9 /* StateColorPalette.swift in Sources */, + 430B29912041F57200BA9F93 /* LoopSettings.swift in Sources */, + 4F526D621DF9D95200A04910 /* NSBundle.swift in Sources */, + 4FC8C8021DEB943800A1452E /* NSUserDefaults+StatusExtension.swift in Sources */, + 434B2889206B4F0C000EE07B /* ExponentialInsulinModelPreset.swift in Sources */, + 434B2886206628B3000EE07B /* PersistenceController.swift in Sources */, + 43BFF0C71E465A4F00FF19A9 /* UIColor+HIG.swift in Sources */, + 43BFF0BF1E45C8EA00FF19A9 /* UIColor+Widget.swift in Sources */, + 4F70C2121DE900EA006380B7 /* StatusExtensionContext.swift in Sources */, + 4F70C1E11DE8DCA7006380B7 /* StatusViewController.swift in Sources */, + 430B298B2041F55700BA9F93 /* NSUserDefaults.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F7528861DFE1DC600C322D6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F20AE621E6B879C00D07A06 /* ReservoirVolumeHUDView.swift in Sources */, + 4FB76FB91E8C42B000B39636 /* CollectionType.swift in Sources */, + 7D23667D21250C7E0028B67D /* LocalizedString.swift in Sources */, + 4FF4D0F91E17268800846527 /* IdentifiableClass.swift in Sources */, + 436961911F19D11E00447E89 /* ChartPointsContextFillLayer.swift in Sources */, + 4FF4D0F81E1725B000846527 /* NibLoadable.swift in Sources */, + 4326BA641F3A44D9007CCAD4 /* ChartLineModel.swift in Sources */, + 4374B5F0209D857E00D17AA8 /* OSLog.swift in Sources */, + 4F7528AA1DFE215100C322D6 /* HKUnit.swift in Sources */, + 4FB76FB61E8C426900B39636 /* ChartPointsTouchHighlightLayerViewCache.swift in Sources */, + 4F2C15931E09BF2C00E160D4 /* HUDView.swift in Sources */, + 43BFF0B71E45C20C00FF19A9 /* NumberFormatter.swift in Sources */, + 4FB76FB71E8C428600B39636 /* UIColor.swift in Sources */, + 4F7528A51DFE208C00C322D6 /* NSTimeInterval.swift in Sources */, + 4FB76FC61E8C57B100B39636 /* StatusChartsManager.swift in Sources */, + 4FB76FB41E8C3F7C00B39636 /* ChartAxisValueDoubleUnit.swift in Sources */, + 4FB76FB31E8C3EE400B39636 /* ChartAxisValueDoubleLog.swift in Sources */, + 43F1C31A1F5DC87700395429 /* ChartPoint.swift in Sources */, + 4F7528A11DFE200B00C322D6 /* BasalStateView.swift in Sources */, + 4F20AE631E6B87B100D07A06 /* ChartContainerView.swift in Sources */, + 4F7528A21DFE200B00C322D6 /* LevelMaskView.swift in Sources */, + 43BFF0C61E465A4400FF19A9 /* UIColor+HIG.swift in Sources */, + 4F7528A01DFE1F9D00C322D6 /* LoopStateView.swift in Sources */, + 4FB76FCE1E8C835D00B39636 /* ChartColorPalette.swift in Sources */, + 4FB76FB51E8C41E200B39636 /* ChartPointsScatterDownTrianglesLayer.swift in Sources */, + 4F75289A1DFE1F6000C322D6 /* BasalRateHUDView.swift in Sources */, + 4F75289B1DFE1F6000C322D6 /* BatteryLevelHUDView.swift in Sources */, + 4F75289C1DFE1F6000C322D6 /* GlucoseHUDView.swift in Sources */, + 4FB76FB81E8C429D00B39636 /* CGPoint.swift in Sources */, + 4F75289D1DFE1F6000C322D6 /* BaseHUDView.swift in Sources */, + 43BFF0C91E465B0A00FF19A9 /* StateColorPalette.swift in Sources */, + 43E0F0A51E46D1670064F7CE /* LevelHUDView.swift in Sources */, + 4F75289E1DFE1F6000C322D6 /* LoopCompletionHUDView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 432CF87D20D8B8990066B889 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 432CF87720D8B8380066B889 /* Cartfile */; + targetProxy = 432CF87C20D8B8990066B889 /* PBXContainerItemProxy */; + }; + 432CF87F20D8BC3B0066B889 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 432CF87720D8B8380066B889 /* Cartfile */; + targetProxy = 432CF87E20D8BC3B0066B889 /* PBXContainerItemProxy */; + }; + 432CF88120D8BC460066B889 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 432CF87720D8B8380066B889 /* Cartfile */; + targetProxy = 432CF88020D8BC460066B889 /* PBXContainerItemProxy */; + }; + 43A943811B926B7B0051FA24 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 43A9437D1B926B7B0051FA24 /* WatchApp Extension */; + targetProxy = 43A943801B926B7B0051FA24 /* PBXContainerItemProxy */; + }; + 43A943931B926B7B0051FA24 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 43A943711B926B7B0051FA24 /* WatchApp */; + targetProxy = 43A943921B926B7B0051FA24 /* PBXContainerItemProxy */; + }; + 43E2D9111D20C581004DA55F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 43776F8B1B8022E90074EA36 /* Loop */; + targetProxy = 43E2D9101D20C581004DA55F /* PBXContainerItemProxy */; + }; + 4F70C1E71DE8DCA7006380B7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4F70C1DB1DE8DCA7006380B7 /* Loop Status Extension */; + targetProxy = 4F70C1E61DE8DCA7006380B7 /* PBXContainerItemProxy */; + }; + 4F7528971DFE1ED400C322D6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4F75288A1DFE1DC600C322D6 /* LoopUI */; + targetProxy = 4F7528961DFE1ED400C322D6 /* PBXContainerItemProxy */; + }; + 4F7528991DFE1ED800C322D6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4F75288A1DFE1DC600C322D6 /* LoopUI */; + targetProxy = 4F7528981DFE1ED800C322D6 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 43776F951B8022E90074EA36 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 43776F961B8022E90074EA36 /* Base */, + 7DD382771F8DBFC60071272B /* es */, + 7D68AAAA1FE2DB0A00522C49 /* ru */, + 7D23668521250D180028B67D /* fr */, + 7D23669521250D220028B67D /* de */, + 7D2366A521250D2C0028B67D /* zh-Hans */, + 7D2366B721250D360028B67D /* it */, + 7D2366C521250D3F0028B67D /* nl */, + 7D2366D521250D4A0028B67D /* nb */, + 7D199D93212A067600241026 /* pl */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 43776F9A1B8022E90074EA36 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 43776F9B1B8022E90074EA36 /* Base */, + 7DD382761F8DBFC60071272B /* es */, + 7D68AAA91FE2DB0A00522C49 /* ru */, + 7D23668421250D180028B67D /* fr */, + 7D23669421250D220028B67D /* de */, + 7D2366A421250D2C0028B67D /* zh-Hans */, + 7D2366B621250D360028B67D /* it */, + 7D2366C421250D3F0028B67D /* nl */, + 7D2366D421250D4A0028B67D /* nb */, + 7D199D92212A067600241026 /* pl */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 43785E9B2120E7060057DED1 /* Intents.intentdefinition */ = { + isa = PBXVariantGroup; + children = ( + 43785E9A2120E7060057DED1 /* Base */, + 43785E9F2122774A0057DED1 /* es */, + 43785EA12122774B0057DED1 /* ru */, + 43785EA32122774B0057DED1 /* it */, + 43C98058212A799E003B5D17 /* en */, + ); + name = Intents.intentdefinition; + sourceTree = ""; + }; + 43A943741B926B7B0051FA24 /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 43A943751B926B7B0051FA24 /* Base */, + 7DD382791F8DBFC60071272B /* es */, + 7D68AAAC1FE2DB0A00522C49 /* ru */, + 7D23668721250D180028B67D /* fr */, + 7D23669721250D230028B67D /* de */, + 7D2366A721250D2C0028B67D /* zh-Hans */, + 7D2366B421250D350028B67D /* it */, + 7D2366C721250D3F0028B67D /* nl */, + 7D2366D721250D4A0028B67D /* nb */, + 7D199D95212A067600241026 /* pl */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; + 4F70C1E21DE8DCA7006380B7 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4F70C1E31DE8DCA7006380B7 /* Base */, + 7DD382781F8DBFC60071272B /* es */, + 7D68AAAB1FE2DB0A00522C49 /* ru */, + 7D23668621250D180028B67D /* fr */, + 7D23669621250D230028B67D /* de */, + 7D2366A621250D2C0028B67D /* zh-Hans */, + 7D2366B821250D360028B67D /* it */, + 7D2366C621250D3F0028B67D /* nl */, + 7D2366D621250D4A0028B67D /* nb */, + 7D199D94212A067600241026 /* pl */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; + 7D2366E421250E0A0028B67D /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D2366E521250E0A0028B67D /* es */, + 7D2366E721250E7B0028B67D /* de */, + 7D2366E921250E8F0028B67D /* fr */, + 7D2366EA21250EA40028B67D /* it */, + 7D2366EB21250EB80028B67D /* nb */, + 7D2366EC21250ECE0028B67D /* zh-Hans */, + 7D2366ED21250F010028B67D /* ru */, + 7D2366EE21250F170028B67D /* nl */, + 7D199DA0212A067700241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 7D7076371FE06EDE004AC8EA /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076361FE06EDE004AC8EA /* es */, + 7D68AAAD1FE2E8D400522C49 /* ru */, + 7D23667821250C2D0028B67D /* Base */, + 7D23668B21250D180028B67D /* fr */, + 7D23669B21250D230028B67D /* de */, + 7D2366AB21250D2D0028B67D /* zh-Hans */, + 7D2366BC21250D360028B67D /* it */, + 7D2366CB21250D400028B67D /* nl */, + 7D2366DB21250D4A0028B67D /* nb */, + 7D199D99212A067600241026 /* pl */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 7D70763C1FE06EDF004AC8EA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D70763B1FE06EDF004AC8EA /* es */, + 7D68AAAF1FE2E8D500522C49 /* ru */, + 7D23668021250CBE0028B67D /* Base */, + 7D23669121250D190028B67D /* fr */, + 7D2366A121250D240028B67D /* de */, + 7D2366B121250D2D0028B67D /* zh-Hans */, + 7D2366C121250D370028B67D /* it */, + 7D2366D121250D410028B67D /* nl */, + 7D2366E121250D4B0028B67D /* nb */, + 7D199D9F212A067700241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 7D7076411FE06EDF004AC8EA /* ckcomplication.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076401FE06EDF004AC8EA /* es */, + 7D68AAB01FE2E8D500522C49 /* ru */, + 7D23668121250CC50028B67D /* Base */, + 7D23669021250D190028B67D /* fr */, + 7D2366A021250D240028B67D /* de */, + 7D2366B021250D2D0028B67D /* zh-Hans */, + 7D2366C021250D370028B67D /* it */, + 7D2366D021250D400028B67D /* nl */, + 7D2366E021250D4B0028B67D /* nb */, + 7D199D9E212A067700241026 /* pl */, + ); + name = ckcomplication.strings; + sourceTree = ""; + }; + 7D7076471FE06EE0004AC8EA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076461FE06EE0004AC8EA /* es */, + 7D68AAB21FE2E8D500522C49 /* ru */, + 7D23667A21250C480028B67D /* Base */, + 7D23668D21250D190028B67D /* fr */, + 7D23669D21250D230028B67D /* de */, + 7D2366AD21250D2D0028B67D /* zh-Hans */, + 7D2366BE21250D360028B67D /* it */, + 7D2366CD21250D400028B67D /* nl */, + 7D2366DD21250D4B0028B67D /* nb */, + 7D199D9B212A067600241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 7D70764C1FE06EE1004AC8EA /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D70764B1FE06EE1004AC8EA /* es */, + 7D68AAB31FE2E8D500522C49 /* ru */, + 7D23667921250C440028B67D /* Base */, + 7D23668C21250D190028B67D /* fr */, + 7D23669C21250D230028B67D /* de */, + 7D2366AC21250D2D0028B67D /* zh-Hans */, + 7D2366BD21250D360028B67D /* it */, + 7D2366CC21250D400028B67D /* nl */, + 7D2366DC21250D4B0028B67D /* nb */, + 7D199D9A212A067600241026 /* pl */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 7D7076511FE06EE1004AC8EA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076501FE06EE1004AC8EA /* es */, + 7D68AAB41FE2E8D600522C49 /* ru */, + 7D23667621250BF70028B67D /* Base */, + 7D23668921250D180028B67D /* fr */, + 7D23669921250D230028B67D /* de */, + 7D2366A921250D2C0028B67D /* zh-Hans */, + 7D2366BA21250D360028B67D /* it */, + 7D2366C921250D400028B67D /* nl */, + 7D2366D921250D4A0028B67D /* nb */, + 7D199D97212A067600241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 7D7076561FE06EE2004AC8EA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076551FE06EE2004AC8EA /* es */, + 7D68AAB51FE2E8D600522C49 /* ru */, + 7D23667721250C280028B67D /* Base */, + 7D23668A21250D180028B67D /* fr */, + 7D23669A21250D230028B67D /* de */, + 7D2366AA21250D2C0028B67D /* zh-Hans */, + 7D2366BB21250D360028B67D /* it */, + 7D2366CA21250D400028B67D /* nl */, + 7D2366DA21250D4A0028B67D /* nb */, + 7D199D98212A067600241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 7D70765B1FE06EE2004AC8EA /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D70765A1FE06EE2004AC8EA /* es */, + 7D68AAB61FE2E8D600522C49 /* ru */, + 7D23668321250CFB0028B67D /* Base */, + 7D23669321250D190028B67D /* fr */, + 7D2366A321250D240028B67D /* de */, + 7D2366B321250D2D0028B67D /* zh-Hans */, + 7D2366C321250D370028B67D /* it */, + 7D2366D321250D410028B67D /* nl */, + 7D2366E321250D4B0028B67D /* nb */, + 7D199DA2212A067700241026 /* pl */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 7D7076601FE06EE3004AC8EA /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D70765F1FE06EE3004AC8EA /* es */, + 7D68AAB71FE2E8D600522C49 /* ru */, + 7D23667F21250CB80028B67D /* Base */, + 7D23668F21250D190028B67D /* fr */, + 7D23669F21250D240028B67D /* de */, + 7D2366AF21250D2D0028B67D /* zh-Hans */, + 7D2366BF21250D370028B67D /* it */, + 7D2366CF21250D400028B67D /* nl */, + 7D2366DF21250D4B0028B67D /* nb */, + 7D199D9D212A067700241026 /* pl */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 7D7076651FE06EE4004AC8EA /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076641FE06EE4004AC8EA /* es */, + 7D68AAB81FE2E8D700522C49 /* ru */, + 7D23667521250BE30028B67D /* Base */, + 7D23668821250D180028B67D /* fr */, + 7D23669821250D230028B67D /* de */, + 7D2366A821250D2C0028B67D /* zh-Hans */, + 7D2366B921250D360028B67D /* it */, + 7D2366C821250D400028B67D /* nl */, + 7D2366D821250D4A0028B67D /* nb */, + 7D199D96212A067600241026 /* pl */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 7D70766A1FE0702F004AC8EA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076691FE0702F004AC8EA /* es */, + 7D68AAAE1FE2E8D400522C49 /* ru */, + 7D23668221250CF60028B67D /* Base */, + 7D23669221250D190028B67D /* fr */, + 7D2366A221250D240028B67D /* de */, + 7D2366B221250D2D0028B67D /* zh-Hans */, + 7D2366C221250D370028B67D /* it */, + 7D2366D221250D410028B67D /* nl */, + 7D2366E221250D4B0028B67D /* nb */, + 7D199DA1212A067700241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + C1C73F0F1DE3D0270022FC89 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 7D7076421FE06EE0004AC8EA /* es */, + 7D68AAB11FE2E8D500522C49 /* ru */, + 7D23667E21250CAC0028B67D /* Base */, + 7D23668E21250D190028B67D /* fr */, + 7D23669E21250D230028B67D /* de */, + 7D2366AE21250D2D0028B67D /* zh-Hans */, + 7D2366B521250D360028B67D /* it */, + 7D2366CE21250D400028B67D /* nl */, + 7D2366DE21250D4B0028B67D /* nb */, + 7D199D9C212A067700241026 /* pl */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 432CF87920D8B8380066B889 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + WATCHOS_DEPLOYMENT_TARGET = 5.0; + }; + name = Debug; + }; + 432CF87A20D8B8380066B889 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + WATCHOS_DEPLOYMENT_TARGET = 5.0; + }; + name = Release; + }; + 43776FB41B8022E90074EA36 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 437D9BA11D7B5203007245E8 /* Loop.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APP_GROUP_IDENTIFIER = "group.$(MAIN_APP_BUNDLE_IDENTIFIER)Group"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer: loudnate@gmail.com (XZN842LDLT)"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 54; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.1; + LOCALIZED_STRING_MACRO_NAMES = ( + NSLocalizedString, + CFLocalizedString, + LocalizedString, + ); + MAIN_APP_BUNDLE_IDENTIFIER = "$(inherited).Loop"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + WARNING_CFLAGS = "-Wall"; + WATCHOS_DEPLOYMENT_TARGET = 4.1; + }; + name = Debug; + }; + 43776FB51B8022E90074EA36 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 437D9BA11D7B5203007245E8 /* Loop.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APP_GROUP_IDENTIFIER = "group.$(MAIN_APP_BUNDLE_IDENTIFIER)Group"; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer: loudnate@gmail.com (XZN842LDLT)"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 54; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.1; + LOCALIZED_STRING_MACRO_NAMES = ( + NSLocalizedString, + CFLocalizedString, + LocalizedString, + ); + MAIN_APP_BUNDLE_IDENTIFIER = "$(inherited).Loop"; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = "-Wall"; + WATCHOS_DEPLOYMENT_TARGET = 4.1; + }; + name = Release; + }; + 43776FB71B8022E90074EA36 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Loop/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + "OTHER_SWIFT_FLAGS[sdk=iphonesimulator*]" = "-D IOS_SIMULATOR"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + }; + name = Debug; + }; + 43776FB81B8022E90074EA36 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Loop/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + }; + name = Release; + }; + 43A943961B926B7B0051FA24 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CODE_SIGN_ENTITLEMENTS = "WatchApp Extension/WatchApp Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/watchOS"; + INFOPLIST_FILE = "WatchApp Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop.LoopWatch.watchkitextension; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 5.0; + }; + name = Debug; + }; + 43A943971B926B7B0051FA24 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CODE_SIGN_ENTITLEMENTS = "WatchApp Extension/WatchApp Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/watchOS"; + INFOPLIST_FILE = "WatchApp Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop.LoopWatch.watchkitextension; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 5.0; + }; + name = Release; + }; + 43A9439A1B926B7B0051FA24 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ""; + IBSC_MODULE = WatchApp_Extension; + INFOPLIST_FILE = WatchApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop.LoopWatch; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 5.0; + }; + name = Debug; + }; + 43A9439B1B926B7B0051FA24 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ""; + IBSC_MODULE = WatchApp_Extension; + INFOPLIST_FILE = WatchApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop.LoopWatch; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 5.0; + }; + name = Release; + }; + 43E2D8D71D20BF42004DA55F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = DoseMathTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.DoseMathTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 43E2D8D81D20BF42004DA55F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = DoseMathTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.DoseMathTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 43E2D9131D20C581004DA55F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = LoopTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.LoopTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Loop.app/Loop"; + }; + name = Debug; + }; + 43E2D9141D20C581004DA55F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = LoopTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.LoopTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Loop.app/Loop"; + }; + name = Release; + }; + 4F70C1E91DE8DCA8006380B7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "Loop Status Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop.statuswidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + }; + name = Debug; + }; + 4F70C1EA1DE8DCA8006380B7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "Loop Status Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.5RLXQ74459.loopkit.Loop.statuswidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 4F7528901DFE1DC600C322D6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CURRENT_PROJECT_VERSION = 54; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 54; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = LoopUI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.5RLXQ74459.loopkit.Loop-exp.LoopUI"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4F7528911DFE1DC600C322D6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CURRENT_PROJECT_VERSION = 54; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 54; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = LoopUI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.5RLXQ74459.loopkit.Loop-exp.LoopUI"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 432CF87820D8B8380066B889 /* Build configuration list for PBXAggregateTarget "Cartfile" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 432CF87920D8B8380066B889 /* Debug */, + 432CF87A20D8B8380066B889 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43776F871B8022E90074EA36 /* Build configuration list for PBXProject "Loop" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43776FB41B8022E90074EA36 /* Debug */, + 43776FB51B8022E90074EA36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43776FB61B8022E90074EA36 /* Build configuration list for PBXNativeTarget "Loop" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43776FB71B8022E90074EA36 /* Debug */, + 43776FB81B8022E90074EA36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43A943951B926B7B0051FA24 /* Build configuration list for PBXNativeTarget "WatchApp Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43A943961B926B7B0051FA24 /* Debug */, + 43A943971B926B7B0051FA24 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43A943991B926B7B0051FA24 /* Build configuration list for PBXNativeTarget "WatchApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43A9439A1B926B7B0051FA24 /* Debug */, + 43A9439B1B926B7B0051FA24 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43E2D8D61D20BF42004DA55F /* Build configuration list for PBXNativeTarget "DoseMathTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43E2D8D71D20BF42004DA55F /* Debug */, + 43E2D8D81D20BF42004DA55F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43E2D9121D20C581004DA55F /* Build configuration list for PBXNativeTarget "LoopTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43E2D9131D20C581004DA55F /* Debug */, + 43E2D9141D20C581004DA55F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F70C1EB1DE8DCA8006380B7 /* Build configuration list for PBXNativeTarget "Loop Status Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F70C1E91DE8DCA8006380B7 /* Debug */, + 4F70C1EA1DE8DCA8006380B7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F7528921DFE1DC600C322D6 /* Build configuration list for PBXNativeTarget "LoopUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F7528901DFE1DC600C322D6 /* Debug */, + 4F7528911DFE1DC600C322D6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 43776F841B8022E90074EA36 /* Project object */; +} diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj index ca508159ab..f40f769338 100644 --- a/Loop.xcodeproj/project.pbxproj +++ b/Loop.xcodeproj/project.pbxproj @@ -276,6 +276,11 @@ 4FF4D0F91E17268800846527 /* IdentifiableClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434FF1E91CF26C29000DB779 /* IdentifiableClass.swift */; }; 4FF4D1001E18374700846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; }; 4FF4D1011E18375000846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; }; + 7B97980721828DA8007593D9 /* FPUDelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980521828DA8007593D9 /* FPUDelay.swift */; }; + 7B97980821828DA8007593D9 /* FPURatio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980621828DA8007593D9 /* FPURatio.swift */; }; + 7B97980B21828E5B007593D9 /* FPUDelayTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980921828E5B007593D9 /* FPUDelayTableViewController.swift */; }; + 7B97980C21828E5B007593D9 /* FPURatioTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980A21828E5B007593D9 /* FPURatioTableViewController.swift */; }; + 7B97980E2182A71F007593D9 /* IntegralRetrospectiveCorrection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980D2182A71F007593D9 /* IntegralRetrospectiveCorrection.swift */; }; 7D23667D21250C7E0028B67D /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D23667C21250C7E0028B67D /* LocalizedString.swift */; }; 7D2366E621250E0A0028B67D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D2366E421250E0A0028B67D /* InfoPlist.strings */; }; 7D7076351FE06EDE004AC8EA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D7076371FE06EDE004AC8EA /* Localizable.strings */; }; @@ -656,6 +661,11 @@ 4FDDD23620DC51DF00D04B16 /* LoopDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopDataManager.swift; sourceTree = ""; }; 4FF4D0FF1E18374700846527 /* WatchContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchContext.swift; sourceTree = ""; }; 4FFEDFBE20E5CF22000BFC58 /* ChartHUDController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartHUDController.swift; sourceTree = ""; }; + 7B97980521828DA8007593D9 /* FPUDelay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPUDelay.swift; sourceTree = ""; }; + 7B97980621828DA8007593D9 /* FPURatio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPURatio.swift; sourceTree = ""; }; + 7B97980921828E5B007593D9 /* FPUDelayTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPUDelayTableViewController.swift; sourceTree = ""; }; + 7B97980A21828E5B007593D9 /* FPURatioTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPURatioTableViewController.swift; sourceTree = ""; }; + 7B97980D2182A71F007593D9 /* IntegralRetrospectiveCorrection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntegralRetrospectiveCorrection.swift; sourceTree = ""; }; 7D199D92212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/LaunchScreen.strings; sourceTree = ""; }; 7D199D93212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Main.strings; sourceTree = ""; }; 7D199D94212A067600241026 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/MainInterface.strings; sourceTree = ""; }; @@ -1145,6 +1155,8 @@ 43DBF0581C93F73800B3C386 /* CarbEntryTableViewController.swift */, 43A51E201EB6DBDD000736CC /* ChartsTableViewController.swift */, 433EA4C31D9F71C800CD78FB /* CommandResponseViewController.swift */, + 7B97980921828E5B007593D9 /* FPUDelayTableViewController.swift */, + 7B97980A21828E5B007593D9 /* FPURatioTableViewController.swift */, C178249F1E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift */, 4302F4E21D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift */, 435CB6221F37967800C320C7 /* InsulinModelSettingsViewController.swift */, @@ -1177,6 +1189,7 @@ 43F5C2E41B93C5D4003EB13D /* Managers */ = { isa = PBXGroup; children = ( + 7B97980D2182A71F007593D9 /* IntegralRetrospectiveCorrection.swift */, 439897361CD2F80600223065 /* AnalyticsManager.swift */, 439BED291E76093C00B0AED5 /* CGMManager.swift */, 43DBF0521C93EC8200B3C386 /* DeviceDataManager.swift */, @@ -1328,6 +1341,8 @@ 430B298D2041F56500BA9F93 /* GlucoseThreshold.swift */, 430B298C2041F56500BA9F93 /* LoopSettings.swift */, 4372E48F213CFCE70068E043 /* LoopSettingsUserInfo.swift */, + 7B97980521828DA8007593D9 /* FPUDelay.swift */, + 7B97980621828DA8007593D9 /* FPURatio.swift */, 435400331C9F878D00D5819C /* SetBolusUserInfo.swift */, 4F70C2111DE900EA006380B7 /* StatusExtensionContext.swift */, 4FF4D0FF1E18374700846527 /* WatchContext.swift */, @@ -1565,7 +1580,7 @@ }; 43776F8B1B8022E90074EA36 = { CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0800; + LastSwiftMigration = 1000; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -1598,7 +1613,7 @@ }; 43A9437D1B926B7B0051FA24 = { CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0800; + LastSwiftMigration = 1000; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 0; @@ -1619,15 +1634,16 @@ }; 43E2D8D01D20BF42004DA55F = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1000; }; 43E2D90A1D20C581004DA55F = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1000; TestTargetID = 43776F8B1B8022E90074EA36; }; 4F70C1DB1DE8DCA7006380B7 = { CreatedOnToolsVersion = 8.1; + LastSwiftMigration = 1000; ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { @@ -1637,6 +1653,7 @@ }; 4F75288A1DFE1DC600C322D6 = { CreatedOnToolsVersion = 8.1; + LastSwiftMigration = 1000; ProvisioningStyle = Automatic; }; }; @@ -1877,6 +1894,7 @@ 43B260491ED248FB008CAA77 /* CarbEntryTableViewCell.swift in Sources */, 4302F4E11D4E9C8900F0FCAF /* TextFieldTableViewController.swift in Sources */, 435CB6271F37AE5600C320C7 /* WalshInsulinModel.swift in Sources */, + 7B97980B21828E5B007593D9 /* FPUDelayTableViewController.swift in Sources */, 43F64DD91D9C92C900D24DC6 /* TitleSubtitleTableViewCell.swift in Sources */, C15713821DAC6983005BC4D2 /* MealBolusNightscoutTreatment.swift in Sources */, 435400321C9F745500D5819C /* BolusSuggestionUserInfo.swift in Sources */, @@ -1884,6 +1902,7 @@ 43DBF0531C93EC8200B3C386 /* DeviceDataManager.swift in Sources */, 43E2D8C81D208D5B004DA55F /* KeychainManager+Loop.swift in Sources */, 430B298F2041F56500BA9F93 /* GlucoseThreshold.swift in Sources */, + 7B97980E2182A71F007593D9 /* IntegralRetrospectiveCorrection.swift in Sources */, C17824A01E19CF9800D9D25C /* GlucoseThresholdTableViewController.swift in Sources */, 435CB6251F37ABFC00C320C7 /* ExponentialInsulinModelPreset.swift in Sources */, 4372E487213C86240068E043 /* SampleValue.swift in Sources */, @@ -1899,6 +1918,7 @@ C18C8C511D5A351900E043FB /* NightscoutDataManager.swift in Sources */, 438849EA1D297CB6003B3F23 /* NightscoutService.swift in Sources */, 438172D91F4E9E37003C3328 /* NewPumpEvent.swift in Sources */, + 7B97980721828DA8007593D9 /* FPUDelay.swift in Sources */, 4389916B1E91B689000EEF90 /* ChartSettings+Loop.swift in Sources */, 4315D2871CA5CC3B00589052 /* CarbEntryEditTableViewController.swift in Sources */, C178249A1E1999FA00D9D25C /* CaseCountable.swift in Sources */, @@ -1911,6 +1931,7 @@ 43BFF0C51E465A2D00FF19A9 /* UIColor+HIG.swift in Sources */, 43785E982120E7060057DED1 /* Intents.intentdefinition in Sources */, 4302F4E31D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift in Sources */, + 7B97980C21828E5B007593D9 /* FPURatioTableViewController.swift in Sources */, 4374B5F4209D89A900D17AA8 /* TextFieldTableViewCell.swift in Sources */, 4FC8C8011DEB93E400A1452E /* NSUserDefaults+StatusExtension.swift in Sources */, 43DAD00020A2736F000F8529 /* PersistedPumpEvent.swift in Sources */, @@ -1952,6 +1973,7 @@ 43DE92591C5479E4001FFDE1 /* CarbEntryUserInfo.swift in Sources */, 43DE92611C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift in Sources */, 430B298E2041F56500BA9F93 /* LoopSettings.swift in Sources */, + 7B97980821828DA8007593D9 /* FPURatio.swift in Sources */, 43C2FAE11EB656A500364AFF /* GlucoseEffectVelocity.swift in Sources */, 4374B5F2209D897600D17AA8 /* Locked.swift in Sources */, ); @@ -2615,7 +2637,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Loop/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; "OTHER_SWIFT_FLAGS[sdk=iphonesimulator*]" = "-D IOS_SIMULATOR"; @@ -2632,7 +2654,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Loop/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER)"; @@ -2648,7 +2670,7 @@ CODE_SIGN_ENTITLEMENTS = "WatchApp Extension/WatchApp Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/watchOS"; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -2668,7 +2690,7 @@ CODE_SIGN_ENTITLEMENTS = "WatchApp Extension/WatchApp Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/watchOS"; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -2688,7 +2710,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; @@ -2709,7 +2731,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; @@ -2788,7 +2810,7 @@ CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Loop Status Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).statuswidget"; @@ -2807,7 +2829,7 @@ CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = UY678SP37Q; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = "Loop Status Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).statuswidget"; @@ -2823,7 +2845,7 @@ CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 54; DEFINES_MODULE = YES; diff --git a/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme b/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme index 41e44bba86..efa6592705 100644 --- a/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme +++ b/Loop.xcodeproj/xcshareddata/xcschemes/Complication - WatchApp.xcscheme @@ -1,6 +1,6 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.4 dev + 1.9.3-FPU-IRC-1.4 CFBundleSignature ???? CFBundleURLTypes diff --git a/Loop/Managers/AnalyticsManager.swift b/Loop/Managers/AnalyticsManager.swift index 431ed82921..782569b583 100644 --- a/Loop/Managers/AnalyticsManager.swift +++ b/Loop/Managers/AnalyticsManager.swift @@ -5,6 +5,7 @@ // Created by Nathan Racklyeft on 4/28/16. // Copyright © 2016 Nathan Racklyeft. All rights reserved. // +// Fat-Protein Unit code by Robert Silvers, 10/2018. import Foundation import Amplitude @@ -110,6 +111,14 @@ final class AnalyticsManager: IdentifiableClass { if newValue.suspendThreshold != oldValue.suspendThreshold { logEvent("Minimum BG Guard change") } + + if newValue.fpuRatio != oldValue.fpuRatio { + logEvent("FPU Ratio change") + } + + if newValue.fpuDelay != oldValue.fpuDelay { + logEvent("FPU Delay change") + } if newValue.dosingEnabled != oldValue.dosingEnabled { logEvent("Closed loop enabled change") @@ -118,6 +127,10 @@ final class AnalyticsManager: IdentifiableClass { if newValue.retrospectiveCorrectionEnabled != oldValue.retrospectiveCorrectionEnabled { logEvent("Retrospective correction enabled change") } + + if newValue.integralRetrospectiveCorrectionEnabled != oldValue.integralRetrospectiveCorrectionEnabled { + logEvent("Integral retrospective correction enabled change") + } if newValue.glucoseTargetRangeSchedule != oldValue.glucoseTargetRangeSchedule { if newValue.glucoseTargetRangeSchedule?.timeZone != oldValue.glucoseTargetRangeSchedule?.timeZone { diff --git a/Loop/Managers/CGMManager.swift b/Loop/Managers/CGMManager.swift index 50bfb7bcae..b3f7d15279 100644 --- a/Loop/Managers/CGMManager.swift +++ b/Loop/Managers/CGMManager.swift @@ -9,6 +9,7 @@ import LoopKit import CGMBLEKit import G4ShareSpy import ShareClient +//import SpikeClient let allCGMManagers: [CGMManager.Type] = [ @@ -16,6 +17,7 @@ let allCGMManagers: [CGMManager.Type] = [ G5CGMManager.self, G4CGMManager.self, ShareClientManager.self, + //SpikeClientManager.self, ] diff --git a/Loop/Managers/IntegralRetrospectiveCorrection.swift b/Loop/Managers/IntegralRetrospectiveCorrection.swift new file mode 100644 index 0000000000..79914828b0 --- /dev/null +++ b/Loop/Managers/IntegralRetrospectiveCorrection.swift @@ -0,0 +1,161 @@ +// +// IntegralRetrospectiveCorrection.swift +// Loop +// +// Created by Dragan Maksimovic on 10/21/18. +// Copyright © 2018 LoopKit Authors. All rights reserved. +// + +import Foundation +import HealthKit +import LoopKit + +/** + Integral Retrospective Correction (IRC) calculates a correction effect in glucose prediction based on a timeline of past discrepancies between observed glucose movement and movement expected based on insulin and carb models. Integral retrospective correction acts as a proportional-integral-differential (PID) controller aimed at reducing modeling errors in glucose prediction. + + In the above summary, "discrepancy" is a difference between the actual glucose and the model predicted glucose over retrospective correction grouping interval (set to 30 min in LoopSettings), whereas "past discrepancies" refers to a timeline of discrepancies computed over retrospective correction integration interval (set to 180 min in Loop Settings). + + */ +class IntegralRetrospectiveCorrection { + + /** + Integral retrospective correction parameters: + - currentDiscrepancyGain: Standard retrospective correction gain + - persistentDiscrepancyGain: Gain for persistent long-term modeling errors, must be greater than or equal to currentDiscrepancyGain + - correctionTimeConstant: How fast integral effect accumulates in response to persistent errors + - delta: Glucose sampling time interval (5 min) + - differentialGain: Differential effect gain + - maximumCorrectionEffectDuration: Maximum duration of the correction effect in glucose prediction + */ + static let currentDiscrepancyGain: Double = 1.0 + static let persistentDiscrepancyGain: Double = 5.0 + static let correctionTimeConstant: TimeInterval = TimeInterval(minutes: 120.0) + static let differentialGain: Double = 2.0 + static let delta: TimeInterval = TimeInterval(minutes: 5.0) + static let maximumCorrectionEffectDuration: TimeInterval = TimeInterval(minutes: 240.0) + + /// Initialize computed integral retrospective correction parameters + static let integralForget: Double = exp( -delta.minutes / correctionTimeConstant.minutes ) + static let integralGain: Double = ((1 - integralForget) / integralForget) * + (persistentDiscrepancyGain - currentDiscrepancyGain) + static let proportionalGain: Double = currentDiscrepancyGain - integralGain + + /// All math is performed with glucose expressed in mg/dL + private let unit = HKUnit.milligramsPerDeciliter + + /// Effect duration for standard retrospective correction + private let effectDuration: TimeInterval + + /// Settings relevant for calculation of effect limits + private let settings: LoopSettings + private let correctionRange: GlucoseRangeSchedule + private let insulinSensitivity: InsulinSensitivitySchedule + private let basalRates: BasalRateSchedule + + /** + Initialize integral retrospective correction settings based on current values of user settings + + - Parameters: + - effectDuration: Effect duration for standard retrospective correction + - settings: User Loop settings + - correctionRange: User correction range settings + - insulinSensitivity: User insulin sensitivity schedule + - basalRates: User basal rate schedule + + - Returns: Integral Retrospective Correction customized with controller parameters and user settings + */ + init(_ effectDuration: TimeInterval, _ settings: LoopSettings, _ correctionRange: GlucoseRangeSchedule, _ insulinSensitivity: InsulinSensitivitySchedule, _ basalRates: BasalRateSchedule) { + + self.effectDuration = effectDuration + self.settings = settings + self.correctionRange = correctionRange + self.insulinSensitivity = insulinSensitivity + self.basalRates = basalRates + } + + /** + Calculate correction effect and correction effect duration based on timeline of past discrepancies + + - Parameters: + - currentDate: Date when timeline of past discrepancies is computed + - currentDiscrepancy: Most recent discrepancy + - latestGlucose: Most recent glucose + - pastDiscrepancies: Timeline of past discepancies + + - Returns: + - totalRetrospectiveCorrection: Overall glucose effect + - integralCorrectionEffectDuration: Effect duration + + */ + func updateIntegralRetrospectiveCorrection(_ currentDate: Date, + _ currentDiscrepancy: GlucoseChange, _ latestGlucose: GlucoseValue, + _ pastDiscrepancies: [GlucoseChange]) -> (HKQuantity, TimeInterval) { + + /// To reduce response delay, integral retrospective correction is computed over an array of recent contiguous discrepancy values having the same sign as the most recent discrepancy value + var recentDiscrepancyValues: [Double] = [] + var nextDiscrepancy = currentDiscrepancy + let currentDiscrepancySign = currentDiscrepancy.quantity.doubleValue(for: unit).sign + for pastDiscrepancy in pastDiscrepancies.reversed() { + let pastDiscrepancyValue = pastDiscrepancy.quantity.doubleValue(for: unit) + if (pastDiscrepancyValue.sign == currentDiscrepancySign && + nextDiscrepancy.endDate.timeIntervalSince(pastDiscrepancy.endDate) + <= settings.recencyInterval && + abs(pastDiscrepancyValue) >= 0.1) + { + recentDiscrepancyValues.append(pastDiscrepancyValue) + nextDiscrepancy = pastDiscrepancy + } else { + break + } + } + recentDiscrepancyValues = recentDiscrepancyValues.reversed() + + /// User settings relevant for calculations of effect limits + let currentSensitivity = insulinSensitivity.quantity(at: currentDate).doubleValue(for: unit) + let currentBasalRate = basalRates.value(at: currentDate) + let correctionRangeMin = correctionRange.minQuantity(at: currentDate).doubleValue(for: unit) + let correctionRangeMax = correctionRange.maxQuantity(at: currentDate).doubleValue(for: unit) + + let latestGlucoseValue = latestGlucose.quantity.doubleValue(for: unit) // most recent glucose + + /// Safety limit for (+) integral effect. The limit is set to a larger value if the current blood glucose is further away from the correction range because we have more time available for corrections + let glucoseError = latestGlucoseValue - correctionRangeMax + let zeroTempEffect = abs(currentSensitivity * currentBasalRate) + let integralEffectPositiveLimit = min(max(glucoseError, 0.5 * zeroTempEffect), 4.0 * zeroTempEffect) + + /// Limit for (-) integral effect: glucose prediction reduced by no more than 10 mg/dL below the correction range minimum + let integralEffectNegativeLimit = -max(10.0, latestGlucoseValue - correctionRangeMin) + + /// Integral correction math + var integralCorrection = 0.0 + var integralCorrectionEffectMinutes = effectDuration.minutes - 2.0 * IntegralRetrospectiveCorrection.delta.minutes + for discrepancy in recentDiscrepancyValues { + integralCorrection = + IntegralRetrospectiveCorrection.integralForget * integralCorrection + + IntegralRetrospectiveCorrection.integralGain * discrepancy + integralCorrectionEffectMinutes += 2.0 * IntegralRetrospectiveCorrection.delta.minutes + } + /// Limits applied to integral correction effect and effect duration + integralCorrection = min(max(integralCorrection, integralEffectNegativeLimit), integralEffectPositiveLimit) + integralCorrectionEffectMinutes = min(integralCorrectionEffectMinutes, IntegralRetrospectiveCorrection.maximumCorrectionEffectDuration.minutes) + + /// Differential correction math + let currentDiscrepancyValue = currentDiscrepancy.quantity.doubleValue(for: unit) + var differentialDiscrepancy: Double = 0.0 + if recentDiscrepancyValues.count > 1 { + let previousDiscrepancyValue = recentDiscrepancyValues[recentDiscrepancyValues.count - 2] + differentialDiscrepancy = currentDiscrepancyValue - previousDiscrepancyValue + } + + /// Overall glucose effect calculated as a sum of propotional, integral and differential correction effects + let proportionalCorrection = IntegralRetrospectiveCorrection.proportionalGain * currentDiscrepancyValue + let differentialCorrection = IntegralRetrospectiveCorrection.differentialGain * differentialDiscrepancy + let totalCorrection = proportionalCorrection + integralCorrection + differentialCorrection + let totalRetrospectiveCorrection = HKQuantity(unit: unit, doubleValue: totalCorrection) + let integralCorrectionEffectDuration = TimeInterval(minutes: integralCorrectionEffectMinutes) + + /// Return overall retrospective correction effect and effect duration + return((totalRetrospectiveCorrection, integralCorrectionEffectDuration)) + } + +} diff --git a/Loop/Managers/LoopDataManager.swift b/Loop/Managers/LoopDataManager.swift index 32a455df17..029d0606ca 100644 --- a/Loop/Managers/LoopDataManager.swift +++ b/Loop/Managers/LoopDataManager.swift @@ -40,6 +40,9 @@ final class LoopDataManager { NotificationCenter.default.removeObserver(observer) } } + + // Make overall retrospective effect available for display to the user + var totalRetrospectiveCorrection: HKQuantity? init( lastLoopCompleted: Date?, @@ -69,7 +72,9 @@ final class LoopDataManager { carbRatioSchedule: carbRatioSchedule, insulinSensitivitySchedule: insulinSensitivitySchedule ) - + + totalRetrospectiveCorrection = nil + doseStore = DoseStore( healthStore: healthStore, cacheStore: cacheStore, @@ -787,8 +792,8 @@ extension LoopDataManager { return prediction } - - /// Generates an effect based on how large the discrepancy is between the current glucose and its predicted value. + + /// Generates an effect based on how large the discrepancy is between the current glucose and its predicted value. If integral retrospective correction is enabled, the retrospective correction effect is based on a timeline of past discrepancies. /// /// - Parameter effectDuration: The length of time to extend the effect /// - Throws: LoopError.missingDataError @@ -798,29 +803,66 @@ extension LoopDataManager { guard let carbEffects = self.carbEffect else { retrospectiveGlucoseDiscrepancies = nil retrospectiveGlucoseEffect = [] + totalRetrospectiveCorrection = nil throw LoopError.missingDataError(.carbEffect) } + // Timeline of glucose discrepancies retrospectiveGlucoseDiscrepancies = insulinCounteractionEffects.subtracting(carbEffects, withUniformInterval: carbStore.delta) // Our last change should be recent, otherwise clear the effects - guard let discrepancy = retrospectiveGlucoseDiscrepanciesSummed?.last, - Date().timeIntervalSince(discrepancy.endDate) <= settings.recencyInterval + let currentDate = Date() + guard let currentDiscrepancy = retrospectiveGlucoseDiscrepanciesSummed?.last, + currentDate.timeIntervalSince(currentDiscrepancy.endDate) <= settings.recencyInterval else { retrospectiveGlucoseEffect = [] + totalRetrospectiveCorrection = nil return } - guard let glucose = self.glucoseStore.latestGlucose else { + // Most recent glucose + guard let latestGlucose = self.glucoseStore.latestGlucose else { retrospectiveGlucoseEffect = [] + totalRetrospectiveCorrection = nil throw LoopError.missingDataError(.glucose) } - let unit = HKUnit.milligramsPerDeciliter - let discrepancyTime = max(discrepancy.endDate.timeIntervalSince(discrepancy.startDate), settings.retrospectiveCorrectionGroupingInterval) - let velocity = HKQuantity(unit: unit.unitDivided(by: .second()), doubleValue: discrepancy.quantity.doubleValue(for: unit) / discrepancyTime) + let unit = HKUnit.milligramsPerDeciliter // do all math in mg/dL + + // Standard retrospective correction + let currentDiscrepancyValue = currentDiscrepancy.quantity.doubleValue(for: unit) + var correctionEffectDuration = effectDuration + var scaledCorrection = currentDiscrepancyValue + self.totalRetrospectiveCorrection = HKQuantity(unit: unit, doubleValue: currentDiscrepancyValue) + + // If enabled, calculate integral retrospective correction + if settings.integralRetrospectiveCorrectionEnabled { + + /// Calculate integral retrospective correction if user settings and past discrepancies over integration interval are available + if let correctionRange = settings.glucoseTargetRangeSchedule, + let insulinSensitivity = insulinSensitivitySchedule, + let basalRates = basalRateSchedule, + let pastDiscrepancies = retrospectiveGlucoseDiscrepanciesSummed?.filterDateRange(currentDate.addingTimeInterval(-settings.retrospectiveCorrectionIntegrationInterval), currentDate) { + + let integralRC = IntegralRetrospectiveCorrection(effectDuration, settings, correctionRange, insulinSensitivity, basalRates) + + // Calculate overall retrospective correction effect and effect duration + let (totalRC, integralCorrectionDuration) = integralRC.updateIntegralRetrospectiveCorrection(currentDate, currentDiscrepancy, latestGlucose, pastDiscrepancies) + + self.totalRetrospectiveCorrection = totalRC + correctionEffectDuration = integralCorrectionDuration + + // correction value scaled to account for extended effect duration + scaledCorrection = totalRC.doubleValue(for: unit) * effectDuration.minutes / integralCorrectionDuration.minutes + } + + } + + let retrospectionTimeInterval = currentDiscrepancy.endDate.timeIntervalSince(currentDiscrepancy.startDate) + let discrepancyTime = max(retrospectionTimeInterval, settings.retrospectiveCorrectionGroupingInterval) + let velocity = HKQuantity(unit: unit.unitDivided(by: .second()), doubleValue: scaledCorrection / discrepancyTime) - retrospectiveGlucoseEffect = glucose.decayEffect(atRate: velocity, for: effectDuration) + retrospectiveGlucoseEffect = latestGlucose.decayEffect(atRate: velocity, for: correctionEffectDuration) } /// Runs the glucose prediction on the latest effect data. diff --git a/Loop/Models/ServiceAuthentication/ShareService.swift b/Loop/Models/ServiceAuthentication/ShareService.swift new file mode 100644 index 0000000000..82527c9b31 --- /dev/null +++ b/Loop/Models/ServiceAuthentication/ShareService.swift @@ -0,0 +1,153 @@ +// +// ShareService.swift +// Loop +// +// Created by Nate Racklyeft on 7/2/16. +// Copyright © 2016 Nathan Racklyeft. All rights reserved. +// + +import Foundation +import ShareClient + + +// Encapsulates the Dexcom Share client service and its authentication +class ShareService: ServiceAuthentication { + var credentials: [ServiceCredential] + + let title: String = NSLocalizedString("Dexcom Share", comment: "The title of the Dexcom Share service") + + init(username: String?, password: String?, url: URL?) { + credentials = [ + ServiceCredential( + title: NSLocalizedString("Username", comment: "The title of the Dexcom share username credential"), + isSecret: false, + keyboardType: .asciiCapable, + value: username + ), + ServiceCredential( + title: NSLocalizedString("Password", comment: "The title of the Dexcom share password credential"), + isSecret: true, + keyboardType: .asciiCapable, + value: password + ), + ServiceCredential( + title: NSLocalizedString("Server", comment: "The title of the Dexcom share server URL credential"), + isSecret: false, + value: url?.absoluteString, + options: [ + (title: NSLocalizedString("US", comment: "U.S. share server option title"), + value: KnownShareServers.US.rawValue), + (title: NSLocalizedString("Outside US", comment: "Outside US share server option title"), + value: KnownShareServers.NON_US.rawValue) + + ] + ) + ] + + /* + To enable Loop to use a custom share server, change the value of customServer + and remove the comment markers on line 55 and 62. + + You can find installation instructions for one such custom share server at + https://github.com/dabear/NightscoutShareServer + */ + + + let customServer = "https://127.0.0.1:1979" + let customServerTitle = "Spike" + + credentials[2].options?.append( + (title: NSLocalizedString(customServerTitle, comment: "Custom share server option title"), + value: customServer)) + + + if let username = username, let password = password, let url = url { + isAuthorized = true + client = ShareClient(username: username, password: password, shareServer: url.absoluteString) + } + } + + // The share client, if credentials are present + private(set) var client: ShareClient? + + var username: String? { + return credentials[0].value + } + + var password: String? { + return credentials[1].value + } + + var url: URL? { + guard let urlString = credentials[2].value else { + return nil + } + + return URL(string: urlString) + } + + var isAuthorized: Bool = false + + func verify(_ completion: @escaping (_ success: Bool, _ error: Error?) -> Void) { + guard let username = username, let password = password, let url = url else { + completion(false, nil) + return + } + + let client = ShareClient(username: username, password: password, shareServer: url.absoluteString) + client.fetchLast(1) { (error, _) in + completion(true, error) + + } + self.client = client + } + + func reset() { + credentials[0].reset() + credentials[1].reset() + credentials[2].reset() + isAuthorized = false + client = nil + } +} + + +private let DexcomShareURL = URL(string: KnownShareServers.US.rawValue)! +private let DexcomShareServiceLabel = "DexcomShare1" + + +extension KeychainManager { + func setDexcomShareUsername(_ username: String?, password: String?, url: URL?) throws { + let credentials: InternetCredentials? + + if let username = username, let password = password, let url = url { + credentials = InternetCredentials(username: username, password: password, url: url) + } else { + credentials = nil + } + + // Replace the legacy URL-keyed credentials + try replaceInternetCredentials(nil, forURL: DexcomShareURL) + + try replaceInternetCredentials(credentials, forLabel: DexcomShareServiceLabel) + } + + func getDexcomShareCredentials() -> (username: String, password: String, url: URL)? { + do { // Silence all errors and return nil + do { + let credentials = try getInternetCredentials(label: DexcomShareServiceLabel) + + return (username: credentials.username, password: credentials.password, url: credentials.url) + } catch KeychainManagerError.copy { + // Fetch and replace the legacy URL-keyed credentials + let credentials = try getInternetCredentials(url: DexcomShareURL) + + try setDexcomShareUsername(credentials.username, password: credentials.password, url: credentials.url) + + return (username: credentials.username, password: credentials.password, url: credentials.url) + } + } catch { + return nil + } + } +} diff --git a/Loop/View Controllers/CarbAbsorptionViewController.swift b/Loop/View Controllers/CarbAbsorptionViewController.swift index b6398ab177..b8bca96beb 100644 --- a/Loop/View Controllers/CarbAbsorptionViewController.swift +++ b/Loop/View Controllers/CarbAbsorptionViewController.swift @@ -4,6 +4,7 @@ // // Copyright © 2017 LoopKit Authors. All rights reserved. // +// Fat-Protein Unit code by Robert Silvers, 10/2018. import UIKit import HealthKit @@ -18,7 +19,6 @@ private extension RefreshContext { static let all: Set = [.glucose, .carbs, .targets, .status] } - final class CarbAbsorptionViewController: ChartsTableViewController, IdentifiableClass { override func viewDidLoad() { @@ -82,6 +82,8 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl private var refreshContext = RefreshContext.all private var reloading = false + + var dataManager: DeviceDataManager! // RSS private var carbStatuses: [CarbStatus] = [] @@ -510,6 +512,8 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl /// Unwind segue action from the CarbEntryEditViewController /// /// - parameter segue: The unwind segue + /// RSS - This triggers when you edit an existing carb value and hit save. + @IBAction func unwindFromEditing(_ segue: UIStoryboardSegue) { guard let editVC = segue.source as? CarbEntryEditViewController, let updatedEntry = editVC.updatedCarbEntry @@ -524,14 +528,43 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl os_log(.error, "Failed to donate intent: %{public}@", String(describing: error)) } } + deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedEntry, replacing: editVC.originalCarbEntry) { (result) in + DispatchQueue.main.async { + switch result { + case .success(let recommendation): + if self.active && self.visible, let bolus = recommendation?.amount, bolus > 0 { + self.performSegue(withIdentifier: BolusViewController.className, sender: recommendation) + } + case .failure(let error): + // Ignore bolus wizard errors + if error is CarbStore.CarbStoreError { + self.presentAlertController(with: error) + } + } + } + } + } + + // Now run a second time for the fat and protein... + guard let editFPUVC = segue.source as? CarbEntryEditViewController + else { + return + } + + editFPUVC.FPCaloriesRatio = deviceManager.loopManager.settings.fpuRatio ?? 150.0 // Safer default. + editFPUVC.onsetDelay = deviceManager.loopManager.settings.fpuDelay ?? 60.0 + + guard let updatedFPUEntry = editFPUVC.updatedFPCarbEntry + else { + return } - deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedEntry, replacing: editVC.originalCarbEntry) { (result) in + + deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedFPUEntry, replacing: editFPUVC.originalCarbEntry) { (result) in DispatchQueue.main.async { switch result { - case .success(let recommendation): - if self.active && self.visible, let bolus = recommendation?.amount, bolus > 0 { - self.performSegue(withIdentifier: BolusViewController.className, sender: recommendation) - } + case .success: + // Never give bolus for fat and protein. + print("Not recommending bolus for fat or protein.") case .failure(let error): // Ignore bolus wizard errors if error is CarbStore.CarbStoreError { @@ -540,6 +573,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl } } } + } @IBAction func unwindFromBolusViewController(_ segue: UIStoryboardSegue) { diff --git a/Loop/View Controllers/FPUDelayTableViewController.swift b/Loop/View Controllers/FPUDelayTableViewController.swift new file mode 100644 index 0000000000..0835923646 --- /dev/null +++ b/Loop/View Controllers/FPUDelayTableViewController.swift @@ -0,0 +1,36 @@ +// +// FPUDelayTableViewController.swift +// Loop +// +// Created by Robert Silvers on 10/17/18. +// Copyright © 2018 LoopKit Authors. All rights reserved. +// + +import Foundation + +import UIKit +import LoopKitUI +import HealthKit + + +final class FPUDelayTableViewController: TextFieldTableViewController { + + init(fpuDelayVal: Double?) { + + super.init(style: .grouped) + + placeholder = NSLocalizedString("Enter Fat-Protein Delay in minutes", comment: "The placeholder text instructing users to enter an FPU Delay") + keyboardType = .decimalPad + contextHelp = NSLocalizedString("When fat and/or protein is entered as part of a meal, equivilant carbohydrates will be stored starting at the current time if this delay is set to 0, or starting after the delay specified. Values from 0 to 120 minutes are typical.", comment: "Explanation of delay") + + if let fpuDelayVal = fpuDelayVal { + value = String(Int(fpuDelayVal)) // Don't show decimal. + } + + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/Loop/View Controllers/FPURatioTableViewController.swift b/Loop/View Controllers/FPURatioTableViewController.swift new file mode 100644 index 0000000000..d26a2683ac --- /dev/null +++ b/Loop/View Controllers/FPURatioTableViewController.swift @@ -0,0 +1,37 @@ +// +// FPURatioTableViewController.swift +// Loop +// +// Created by Robert Silvers on 10/17/18. +// Copyright © 2018 LoopKit Authors. All rights reserved. +// +// Fat-Protein Unit code by Robert Silvers, 10/2018. + +import Foundation + +import UIKit +import LoopKitUI +import HealthKit + + +final class FPURatioTableViewController: TextFieldTableViewController { + + init(fpuRatioVal: Double?) { + + super.init(style: .grouped) + + placeholder = NSLocalizedString("Enter Fat-Protein Ratio", comment: "The placeholder text instructing users to enter an FPU Ratio") + keyboardType = .decimalPad + contextHelp = NSLocalizedString("Fat-Protein Units are normally based on Fat + Protein calories / 100. The nominal value is 100, and Loop will provide fewer equivilant carbohydrates and insulin for fat and protein if this value is larger, or more if this value is smaller.", comment: "Explanation of FPU Ratio") + + if let fpuRatioVal = fpuRatioVal { + value = String(Int(fpuRatioVal)) // Don't show decimal. + } + + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/Loop/View Controllers/PredictionTableViewController.swift b/Loop/View Controllers/PredictionTableViewController.swift index 14e8375b56..4aefbe6943 100644 --- a/Loop/View Controllers/PredictionTableViewController.swift +++ b/Loop/View Controllers/PredictionTableViewController.swift @@ -174,6 +174,13 @@ class PredictionTableViewController: ChartsTableViewController, IdentifiableClas static let count = 3 } + + fileprivate enum SettingsRow: Int, CaseCountable { + case retrospectiveCorrection + case integralRetrospectiveCorrection + + static let count = 2 + } private var eventualGlucoseDescription: String? @@ -192,7 +199,7 @@ class PredictionTableViewController: ChartsTableViewController, IdentifiableClas case .inputs: return availableInputs.count case .settings: - return 1 + return SettingsRow.count } } @@ -218,13 +225,23 @@ class PredictionTableViewController: ChartsTableViewController, IdentifiableClas return cell case .settings: let cell = tableView.dequeueReusableCell(withIdentifier: SwitchTableViewCell.className, for: indexPath) as! SwitchTableViewCell - - cell.titleLabel?.text = NSLocalizedString("Enable Retrospective Correction", comment: "Title of the switch which toggles retrospective correction effects") - cell.subtitleLabel?.text = NSLocalizedString("This will more aggresively increase or decrease basal delivery when glucose movement doesn't match the carbohydrate and insulin-based model.", comment: "The description of the switch which toggles retrospective correction effects") - cell.`switch`?.isOn = deviceManager.loopManager.settings.retrospectiveCorrectionEnabled - cell.`switch`?.addTarget(self, action: #selector(retrospectiveCorrectionSwitchChanged(_:)), for: .valueChanged) - - cell.contentView.layoutMargins.left = tableView.separatorInset.left + + switch SettingsRow(rawValue: indexPath.row)! { + case .retrospectiveCorrection: + cell.titleLabel?.text = NSLocalizedString("Retrospective Correction", comment: "Title of the switch which toggles retrospective correction effects") + cell.subtitleLabel?.text = NSLocalizedString("More agressively increase or decrease basal delivery when glucose movement over past 30 min doesn't match the carbohydrate and insulin-based model.", comment: "The description of the switch which toggles retrospective correction effects") + cell.`switch`?.isOn = deviceManager.loopManager.settings.retrospectiveCorrectionEnabled + cell.`switch`?.addTarget(self, action: #selector(retrospectiveCorrectionSwitchChanged(_:)), for: .valueChanged) + cell.contentView.layoutMargins.left = tableView.separatorInset.left + + case .integralRetrospectiveCorrection: + cell.titleLabel?.text = NSLocalizedString("Integral Retrospective Correction", comment: "Title of the switch which toggles integral retrospective correction effects") + cell.subtitleLabel?.text = NSLocalizedString("Respond more aggressively to persistent discrepancies in glucose movement.", comment: "The description of the switch which toggles integral retrospective correction effects") + cell.`switch`?.isOn = deviceManager.loopManager.settings.integralRetrospectiveCorrectionEnabled + cell.`switch`?.addTarget(self, action: #selector(integralRetrospectiveCorrectionSwitchChanged(_:)), for: .valueChanged) + + cell.contentView.layoutMargins.left = tableView.separatorInset.left + } return cell } @@ -270,8 +287,25 @@ class PredictionTableViewController: ChartsTableViewController, IdentifiableClas format: NSLocalizedString("prediction-description-retrospective-correction", comment: "Format string describing retrospective glucose prediction comparison. (1: Predicted glucose)(2: Actual glucose)(3: difference)"), values[0], values[1], values[2] ) - - subtitleText = String(format: "%@\n%@", subtitleText, retro) + if !deviceManager.loopManager.settings.integralRetrospectiveCorrectionEnabled { + // Standard retrospective correction + subtitleText = String(format: "%@\n%@", subtitleText, retro) + } else { + // Integral retrospective correction + var integralEffectDisplay = "?" + var totalEffectDisplay = "?" + if let totalEffect = self.deviceManager.loopManager.totalRetrospectiveCorrection { + let integralEffectValue = totalEffect.doubleValue(for: charts.glucoseUnit) - lastDiscrepancy.quantity.doubleValue(for: charts.glucoseUnit) + let integralEffect = HKQuantity(unit: charts.glucoseUnit, doubleValue: integralEffectValue) + integralEffectDisplay = formatter.string(from: integralEffect, for: charts.glucoseUnit) ?? "?" + totalEffectDisplay = formatter.string(from: totalEffect, for: charts.glucoseUnit) ?? "?" + } + let integralRetro = String( + format: NSLocalizedString("prediction-description-integral-retrospective-correction", comment: "Format string describing integral retrospective correction. (1: Integral glucose effect)(2: Total glucose effect)"), + integralEffectDisplay, totalEffectDisplay + ) + subtitleText = String(format: "%@\n%@", retro, integralRetro) + } } cell.subtitleLabel?.text = subtitleText @@ -320,10 +354,23 @@ class PredictionTableViewController: ChartsTableViewController, IdentifiableClas @objc private func retrospectiveCorrectionSwitchChanged(_ sender: UISwitch) { deviceManager.loopManager.settings.retrospectiveCorrectionEnabled = sender.isOn + // if retrospective correction is disabled, integral retrospective correction must also be disabled + if !sender.isOn { + deviceManager.loopManager.settings.integralRetrospectiveCorrectionEnabled = sender.isOn + } + if let row = availableInputs.index(where: { $0 == .retrospection }), let cell = tableView.cellForRow(at: IndexPath(row: row, section: Section.inputs.rawValue)) as? PredictionInputEffectTableViewCell { cell.enabled = self.deviceManager.loopManager.settings.retrospectiveCorrectionEnabled } } + + @objc private func integralRetrospectiveCorrectionSwitchChanged(_ sender: UISwitch) { + deviceManager.loopManager.settings.integralRetrospectiveCorrectionEnabled = sender.isOn + // if integral retrospective correction is enabled, retrospective correction must also be enabled + if sender.isOn { + deviceManager.loopManager.settings.retrospectiveCorrectionEnabled = sender.isOn + } + } } diff --git a/Loop/View Controllers/SettingsTableViewController.swift b/Loop/View Controllers/SettingsTableViewController.swift index 48b76fca8d..d5ebde1aa5 100644 --- a/Loop/View Controllers/SettingsTableViewController.swift +++ b/Loop/View Controllers/SettingsTableViewController.swift @@ -75,6 +75,8 @@ final class SettingsTableViewController: UITableViewController { case insulinModel case carbRatio case insulinSensitivity + case fpRatio + case fpDelay } fileprivate enum ServiceRow: Int, CaseCountable { @@ -129,6 +131,14 @@ final class SettingsTableViewController: UITableViewController { return ServiceRow.count } } + + private var integerFormatter: NumberFormatter { + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .none + numberFormatter.maximumFractionDigits = 0 + + return numberFormatter + } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { switch Section(rawValue: indexPath.section)! { @@ -237,6 +247,24 @@ final class SettingsTableViewController: UITableViewController { } else { configCell.detailTextLabel?.text = SettingsTableViewCell.TapToSetString } + case .fpRatio: + configCell.textLabel?.text = NSLocalizedString("Fat-Protein Ratio", comment: "The title text in settings") + + if let fpuRatio = dataManager.loopManager.settings.fpuRatio { + let value = valueNumberFormatter.string(from: fpuRatio) ?? SettingsTableViewCell.TapToSetString + configCell.detailTextLabel?.text = value + } else { + configCell.detailTextLabel?.text = SettingsTableViewCell.TapToSetString + } + case .fpDelay: // This displays the value on the otions screen but not in the cell itself. + configCell.textLabel?.text = NSLocalizedString("Fat-Protein Delay", comment: "The title text in settings") + + if let fpuDelay = dataManager.loopManager.settings.fpuDelay { + let value = valueNumberFormatter.string(from: fpuDelay) ?? SettingsTableViewCell.TapToSetString + configCell.detailTextLabel?.text = value + } else { + configCell.detailTextLabel?.text = SettingsTableViewCell.TapToSetString + } case .insulinModel: configCell.textLabel?.text = NSLocalizedString("Insulin Model", comment: "The title text for the insulin model setting row") @@ -470,6 +498,34 @@ final class SettingsTableViewController: UITableViewController { vc.title = sender?.textLabel?.text self.show(vc, sender: sender) } + case .fpRatio: // This is where they get set when you click on the option.. + if let theFPURatio = dataManager.loopManager.settings.fpuRatio { + let vc = FPURatioTableViewController(fpuRatioVal: theFPURatio) + vc.delegate = self + vc.indexPath = indexPath + vc.title = sender?.textLabel?.text + self.show(vc, sender: sender) + } else { + let vc = FPURatioTableViewController(fpuRatioVal: nil) + vc.delegate = self + vc.indexPath = indexPath + vc.title = sender?.textLabel?.text + self.show(vc, sender: sender) + } + case .fpDelay: // This is where they get set when you click on the option.. + if let theFPUDelay = dataManager.loopManager.settings.fpuDelay { + let vc = FPUDelayTableViewController(fpuDelayVal: theFPUDelay) + vc.delegate = self + vc.indexPath = indexPath + vc.title = sender?.textLabel?.text + self.show(vc, sender: sender) + } else { + let vc = FPUDelayTableViewController(fpuDelayVal: nil) + vc.delegate = self + vc.indexPath = indexPath + vc.title = sender?.textLabel?.text + self.show(vc, sender: sender) + } case .insulinModel: performSegue(withIdentifier: InsulinModelSettingsViewController.className, sender: sender) case .deliveryLimits: @@ -706,6 +762,18 @@ extension SettingsTableViewController: LoopKitUI.TextFieldTableViewControllerDel } else { dataManager.loopManager.settings.suspendThreshold = nil } + case .fpRatio: + if let value = controller.value, let fpuRatio = valueNumberFormatter.number(from: value)?.doubleValue { + dataManager.loopManager.settings.fpuRatio = fpuRatio + } else { + dataManager.loopManager.settings.fpuRatio = nil + } + case .fpDelay: + if let value = controller.value, let fpuDelay = valueNumberFormatter.number(from: value)?.doubleValue { + dataManager.loopManager.settings.fpuDelay = fpuDelay + } else { + dataManager.loopManager.settings.fpuDelay = nil + } default: assertionFailure() } diff --git a/Loop/View Controllers/StatusTableViewController.swift b/Loop/View Controllers/StatusTableViewController.swift index 27882a8e50..f1bb3e4f5b 100644 --- a/Loop/View Controllers/StatusTableViewController.swift +++ b/Loop/View Controllers/StatusTableViewController.swift @@ -5,6 +5,7 @@ // Created by Nathan Racklyeft on 9/6/15. // Copyright © 2015 Nathan Racklyeft. All rights reserved. // +// Fat-Protein Unit code by Robert Silvers, 10/2018. import UIKit import HealthKit @@ -166,6 +167,8 @@ final class StatusTableViewController: ChartsTableViewController { refreshContext.update(with: .status) } } + + //var dataManager: DeviceDataManager! // RSS // Toggles the display mode based on the screen aspect ratio. Should not be updated outside of reloadData(). private var landscapeMode = false @@ -894,12 +897,12 @@ final class StatusTableViewController: ChartsTableViewController { /// Unwind segue action from the CarbEntryEditViewController /// /// - parameter segue: The unwind segue + /// RSS - This triggers when you enter carb and hit save. + @IBAction func unwindFromEditing(_ segue: UIStoryboardSegue) { guard let carbVC = segue.source as? CarbEntryEditViewController, let updatedEntry = carbVC.updatedCarbEntry else { return } - - // RSS - Do we need to do an addCarbEntry here for the Protain and Fat portion? if #available(iOS 12.0, *) { let interaction = INInteraction(intent: NewCarbEntryIntent(), response: nil) @@ -927,6 +930,32 @@ final class StatusTableViewController: ChartsTableViewController { } } } + + carbVC.FPCaloriesRatio = deviceManager.loopManager.settings.fpuRatio ?? 100.0 + carbVC.onsetDelay = deviceManager.loopManager.settings.fpuDelay ?? 60.0 + + // RSS - Repeat for the fat and protein portion... + guard let updatedFPEntry = carbVC.updatedFPCarbEntry else { + return + } + + deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedFPEntry) { (result) -> Void in + DispatchQueue.main.async { + switch result { + case .success: + // Never give bolus for fat and protein. + print("Not recommending bolus for fat or protein.") + case .failure(let error): + // Ignore bolus wizard errors + if error is CarbStore.CarbStoreError { + self.presentAlertController(with: error) + } else { + self.deviceManager.logger.addError(error, fromSource: "Bolus") + } + } + } + } + } @IBAction func unwindFromBolusViewController(_ segue: UIStoryboardSegue) { diff --git a/WatchApp/Info.plist b/WatchApp/Info.plist index b9cfe59fb9..701ca1fdcf 100644 --- a/WatchApp/Info.plist +++ b/WatchApp/Info.plist @@ -22,6 +22,10 @@ ???? CFBundleVersion $(CURRENT_PROJECT_VERSION) + NSUserActivityTypes + + com.loopkit.Loop.AddCarbEntryOnWatch + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait @@ -31,9 +35,5 @@ $(MAIN_APP_BUNDLE_IDENTIFIER) WKWatchKitApp - NSUserActivityTypes - - com.loopkit.Loop.AddCarbEntryOnWatch - From 17b68227af180311bed7b855f2249381437f19cb Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Mon, 29 Oct 2018 17:01:24 -0400 Subject: [PATCH 4/9] Added Spike support. --- .gitmodules | 3 + Cartfile | 1 + Cartfile.resolved | 3 +- Carthage/Checkouts/LoopKit | 2 +- Carthage/Checkouts/spike-client-swift-master | 1 + Loop Status Extension/Info.plist | 4 + Loop.xcodeproj/project.pbxproj | 38 +++-- Loop/Info.plist | 2 +- Loop/Managers/CGMManager.swift | 4 +- .../ServiceAuthentication/ShareService.swift | 153 ------------------ .../CarbAbsorptionViewController.swift | 2 + .../StatusTableViewController.swift | 5 +- 12 files changed, 44 insertions(+), 174 deletions(-) create mode 160000 Carthage/Checkouts/spike-client-swift-master delete mode 100644 Loop/Models/ServiceAuthentication/ShareService.swift diff --git a/.gitmodules b/.gitmodules index d9d5d5f305..daa7348c74 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "Carthage/Checkouts/LoopKit"] path = Carthage/Checkouts/LoopKit url = https://github.com/rsilvers129/LoopKit.git +[submodule "Carthage/Checkouts/spike-client-swift-master"] + path = Carthage/Checkouts/spike-client-swift-master + url = https://github.com/rsilvers129/spike-client-swift-master.git diff --git a/Cartfile b/Cartfile index 49b56384cd..0d753ad4ff 100644 --- a/Cartfile +++ b/Cartfile @@ -5,3 +5,4 @@ github "rsilvers129/dexcom-share-client-swift" "carthage-recursive" github "rsilvers129/G4ShareSpy" "fix-cartfile" github "rsilvers129/rileylink_ios" "FPU-dev" github "LoopKit/Amplitude-iOS" "decreepify" +github "rsilvers129/spike-client-swift-master" "FPU-dev" diff --git a/Cartfile.resolved b/Cartfile.resolved index 17fce65aeb..900d1222e9 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -2,6 +2,7 @@ github "LoopKit/Amplitude-iOS" "2137d5fd44bf630ed33e1e72d7af6d8f8612f270" github "i-schuetz/SwiftCharts" "0.6.2" github "rsilvers129/CGMBLEKit" "8eb7b463490b76e93143dafec2b24951e4305a41" github "rsilvers129/G4ShareSpy" "0448cfc3de9637c3b89698c3e5645d472aefb1e8" -github "rsilvers129/LoopKit" "4a7c8118cc53926cc018a127fd177d944c0cba65" +github "rsilvers129/LoopKit" "d1e6d848289a6116f7ec0d3d65b92cb784d273a7" github "rsilvers129/dexcom-share-client-swift" "10d5739613f8b70946210f763a260e80a17cb1a8" github "rsilvers129/rileylink_ios" "5c47e983f46ea39ffbec52898963f609523b5fb4" +github "rsilvers129/spike-client-swift-master" "45bda83426eb52a5ca9ff746e95988ec04006f85" diff --git a/Carthage/Checkouts/LoopKit b/Carthage/Checkouts/LoopKit index 74d539c573..d1e6d84828 160000 --- a/Carthage/Checkouts/LoopKit +++ b/Carthage/Checkouts/LoopKit @@ -1 +1 @@ -Subproject commit 74d539c573fa1f60108c0188ef608e60b7366ab5 +Subproject commit d1e6d848289a6116f7ec0d3d65b92cb784d273a7 diff --git a/Carthage/Checkouts/spike-client-swift-master b/Carthage/Checkouts/spike-client-swift-master new file mode 160000 index 0000000000..45bda83426 --- /dev/null +++ b/Carthage/Checkouts/spike-client-swift-master @@ -0,0 +1 @@ +Subproject commit 45bda83426eb52a5ca9ff746e95988ec04006f85 diff --git a/Loop Status Extension/Info.plist b/Loop Status Extension/Info.plist index cf22a23017..dce8ba8326 100644 --- a/Loop Status Extension/Info.plist +++ b/Loop Status Extension/Info.plist @@ -19,7 +19,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString +<<<<<<< HEAD 1.9.4 dev +======= + 1.9.3-FPU-IRC-1.6 +>>>>>>> 997a389a... Bump CFBundleVersion $(CURRENT_PROJECT_VERSION) MainAppBundleIdentifier diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj index f40f769338..0482bd1972 100644 --- a/Loop.xcodeproj/project.pbxproj +++ b/Loop.xcodeproj/project.pbxproj @@ -276,6 +276,8 @@ 4FF4D0F91E17268800846527 /* IdentifiableClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434FF1E91CF26C29000DB779 /* IdentifiableClass.swift */; }; 4FF4D1001E18374700846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; }; 4FF4D1011E18375000846527 /* WatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4D0FF1E18374700846527 /* WatchContext.swift */; }; + 7B0916AD2187AB8600CFF416 /* SpikeClientUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B0916A92187AB8600CFF416 /* SpikeClientUI.framework */; }; + 7B0916AE2187AB8600CFF416 /* SpikeClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B0916AA2187AB8600CFF416 /* SpikeClient.framework */; }; 7B97980721828DA8007593D9 /* FPUDelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980521828DA8007593D9 /* FPUDelay.swift */; }; 7B97980821828DA8007593D9 /* FPURatio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980621828DA8007593D9 /* FPURatio.swift */; }; 7B97980B21828E5B007593D9 /* FPUDelayTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B97980921828E5B007593D9 /* FPUDelayTableViewController.swift */; }; @@ -661,6 +663,8 @@ 4FDDD23620DC51DF00D04B16 /* LoopDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopDataManager.swift; sourceTree = ""; }; 4FF4D0FF1E18374700846527 /* WatchContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchContext.swift; sourceTree = ""; }; 4FFEDFBE20E5CF22000BFC58 /* ChartHUDController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartHUDController.swift; sourceTree = ""; }; + 7B0916A92187AB8600CFF416 /* SpikeClientUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpikeClientUI.framework; path = Carthage/Build/iOS/SpikeClientUI.framework; sourceTree = ""; }; + 7B0916AA2187AB8600CFF416 /* SpikeClient.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpikeClient.framework; path = Carthage/Build/iOS/SpikeClient.framework; sourceTree = ""; }; 7B97980521828DA8007593D9 /* FPUDelay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPUDelay.swift; sourceTree = ""; }; 7B97980621828DA8007593D9 /* FPURatio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPURatio.swift; sourceTree = ""; }; 7B97980921828E5B007593D9 /* FPUDelayTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FPUDelayTableViewController.swift; sourceTree = ""; }; @@ -873,6 +877,8 @@ 437AFEE42035252A008C4892 /* RileyLinkBLEKit.framework in Frameworks */, 43523EDB1CC35083001850F1 /* RileyLinkKit.framework in Frameworks */, C18852E22082AB1B00BECC8C /* RileyLinkKitUI.framework in Frameworks */, + 7B0916AD2187AB8600CFF416 /* SpikeClientUI.framework in Frameworks */, + 7B0916AE2187AB8600CFF416 /* SpikeClient.framework in Frameworks */, 43B371881CE597D10013C5A6 /* ShareClient.framework in Frameworks */, 4F08DE9B1E7BC4ED006741EA /* SwiftCharts.framework in Frameworks */, 4379CFF021112CF700AADC79 /* ShareClientUI.framework in Frameworks */, @@ -1388,6 +1394,8 @@ 968DCD53F724DE56FFE51920 /* Frameworks */ = { isa = PBXGroup; children = ( + 7B0916AA2187AB8600CFF416 /* SpikeClient.framework */, + 7B0916A92187AB8600CFF416 /* SpikeClientUI.framework */, 434FB6451D68F1CD007B9C70 /* Amplitude.framework */, 4344628420A7A3BE00C4BE6F /* CGMBLEKit.framework */, 438A95A71D8B9B24009D12E1 /* CGMBLEKit.framework */, @@ -1832,6 +1840,8 @@ "$(SRCROOT)/Carthage/Build/iOS/MinimedKitUI.framework", "$(SRCROOT)/Carthage/Build/iOS/CGMBLEKitUI.framework", "$(SRCROOT)/Carthage/Build/iOS/ShareClientUI.framework", + "$(SRCROOT)/Carthage/Build/iOS/SpikeClient.framework", + "$(SRCROOT)/Carthage/Build/iOS/SpikeClientUI.framework", ); name = "Copy Frameworks with Carthage"; outputPaths = ( @@ -2637,7 +2647,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = Loop/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; "OTHER_SWIFT_FLAGS[sdk=iphonesimulator*]" = "-D IOS_SIMULATOR"; @@ -2654,7 +2664,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Loop/Loop.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = Loop/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER)"; @@ -2670,7 +2680,7 @@ CODE_SIGN_ENTITLEMENTS = "WatchApp Extension/WatchApp Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/watchOS"; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -2690,7 +2700,7 @@ CODE_SIGN_ENTITLEMENTS = "WatchApp Extension/WatchApp Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/watchOS"; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -2710,7 +2720,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; FRAMEWORK_SEARCH_PATHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; @@ -2731,7 +2741,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; FRAMEWORK_SEARCH_PATHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; @@ -2750,7 +2760,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = DoseMathTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.DoseMathTests; @@ -2763,7 +2773,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = DoseMathTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.DoseMathTests; @@ -2777,7 +2787,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = LoopTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.LoopTests; @@ -2792,7 +2802,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = LoopTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.loudnate.LoopTests; @@ -2810,7 +2820,7 @@ CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = "Loop Status Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).statuswidget"; @@ -2829,7 +2839,7 @@ CODE_SIGN_ENTITLEMENTS = "Loop Status Extension/Loop Status Extension.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; INFOPLIST_FILE = "Loop Status Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(MAIN_APP_BUNDLE_IDENTIFIER).statuswidget"; @@ -2849,7 +2859,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 54; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 54; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2876,7 +2886,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 54; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 5RLXQ74459; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 54; DYLIB_INSTALL_NAME_BASE = "@rpath"; diff --git a/Loop/Info.plist b/Loop/Info.plist index cb4d5062d5..80aaae9eb5 100644 --- a/Loop/Info.plist +++ b/Loop/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.3-FPU-IRC-1.4 + 1.9.3-FPU-IRC-1.6 CFBundleSignature ???? CFBundleURLTypes diff --git a/Loop/Managers/CGMManager.swift b/Loop/Managers/CGMManager.swift index b3f7d15279..69c26daaab 100644 --- a/Loop/Managers/CGMManager.swift +++ b/Loop/Managers/CGMManager.swift @@ -9,7 +9,7 @@ import LoopKit import CGMBLEKit import G4ShareSpy import ShareClient -//import SpikeClient +import SpikeClient // Add in dabear Spike support. let allCGMManagers: [CGMManager.Type] = [ @@ -17,7 +17,7 @@ let allCGMManagers: [CGMManager.Type] = [ G5CGMManager.self, G4CGMManager.self, ShareClientManager.self, - //SpikeClientManager.self, + SpikeClientManager.self, ] diff --git a/Loop/Models/ServiceAuthentication/ShareService.swift b/Loop/Models/ServiceAuthentication/ShareService.swift deleted file mode 100644 index 82527c9b31..0000000000 --- a/Loop/Models/ServiceAuthentication/ShareService.swift +++ /dev/null @@ -1,153 +0,0 @@ -// -// ShareService.swift -// Loop -// -// Created by Nate Racklyeft on 7/2/16. -// Copyright © 2016 Nathan Racklyeft. All rights reserved. -// - -import Foundation -import ShareClient - - -// Encapsulates the Dexcom Share client service and its authentication -class ShareService: ServiceAuthentication { - var credentials: [ServiceCredential] - - let title: String = NSLocalizedString("Dexcom Share", comment: "The title of the Dexcom Share service") - - init(username: String?, password: String?, url: URL?) { - credentials = [ - ServiceCredential( - title: NSLocalizedString("Username", comment: "The title of the Dexcom share username credential"), - isSecret: false, - keyboardType: .asciiCapable, - value: username - ), - ServiceCredential( - title: NSLocalizedString("Password", comment: "The title of the Dexcom share password credential"), - isSecret: true, - keyboardType: .asciiCapable, - value: password - ), - ServiceCredential( - title: NSLocalizedString("Server", comment: "The title of the Dexcom share server URL credential"), - isSecret: false, - value: url?.absoluteString, - options: [ - (title: NSLocalizedString("US", comment: "U.S. share server option title"), - value: KnownShareServers.US.rawValue), - (title: NSLocalizedString("Outside US", comment: "Outside US share server option title"), - value: KnownShareServers.NON_US.rawValue) - - ] - ) - ] - - /* - To enable Loop to use a custom share server, change the value of customServer - and remove the comment markers on line 55 and 62. - - You can find installation instructions for one such custom share server at - https://github.com/dabear/NightscoutShareServer - */ - - - let customServer = "https://127.0.0.1:1979" - let customServerTitle = "Spike" - - credentials[2].options?.append( - (title: NSLocalizedString(customServerTitle, comment: "Custom share server option title"), - value: customServer)) - - - if let username = username, let password = password, let url = url { - isAuthorized = true - client = ShareClient(username: username, password: password, shareServer: url.absoluteString) - } - } - - // The share client, if credentials are present - private(set) var client: ShareClient? - - var username: String? { - return credentials[0].value - } - - var password: String? { - return credentials[1].value - } - - var url: URL? { - guard let urlString = credentials[2].value else { - return nil - } - - return URL(string: urlString) - } - - var isAuthorized: Bool = false - - func verify(_ completion: @escaping (_ success: Bool, _ error: Error?) -> Void) { - guard let username = username, let password = password, let url = url else { - completion(false, nil) - return - } - - let client = ShareClient(username: username, password: password, shareServer: url.absoluteString) - client.fetchLast(1) { (error, _) in - completion(true, error) - - } - self.client = client - } - - func reset() { - credentials[0].reset() - credentials[1].reset() - credentials[2].reset() - isAuthorized = false - client = nil - } -} - - -private let DexcomShareURL = URL(string: KnownShareServers.US.rawValue)! -private let DexcomShareServiceLabel = "DexcomShare1" - - -extension KeychainManager { - func setDexcomShareUsername(_ username: String?, password: String?, url: URL?) throws { - let credentials: InternetCredentials? - - if let username = username, let password = password, let url = url { - credentials = InternetCredentials(username: username, password: password, url: url) - } else { - credentials = nil - } - - // Replace the legacy URL-keyed credentials - try replaceInternetCredentials(nil, forURL: DexcomShareURL) - - try replaceInternetCredentials(credentials, forLabel: DexcomShareServiceLabel) - } - - func getDexcomShareCredentials() -> (username: String, password: String, url: URL)? { - do { // Silence all errors and return nil - do { - let credentials = try getInternetCredentials(label: DexcomShareServiceLabel) - - return (username: credentials.username, password: credentials.password, url: credentials.url) - } catch KeychainManagerError.copy { - // Fetch and replace the legacy URL-keyed credentials - let credentials = try getInternetCredentials(url: DexcomShareURL) - - try setDexcomShareUsername(credentials.username, password: credentials.password, url: credentials.url) - - return (username: credentials.username, password: credentials.password, url: credentials.url) - } - } catch { - return nil - } - } -} diff --git a/Loop/View Controllers/CarbAbsorptionViewController.swift b/Loop/View Controllers/CarbAbsorptionViewController.swift index b8bca96beb..0100bc01bb 100644 --- a/Loop/View Controllers/CarbAbsorptionViewController.swift +++ b/Loop/View Controllers/CarbAbsorptionViewController.swift @@ -512,6 +512,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl /// Unwind segue action from the CarbEntryEditViewController /// /// - parameter segue: The unwind segue + /// /// RSS - This triggers when you edit an existing carb value and hit save. @IBAction func unwindFromEditing(_ segue: UIStoryboardSegue) { @@ -528,6 +529,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl os_log(.error, "Failed to donate intent: %{public}@", String(describing: error)) } } + deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedEntry, replacing: editVC.originalCarbEntry) { (result) in DispatchQueue.main.async { switch result { diff --git a/Loop/View Controllers/StatusTableViewController.swift b/Loop/View Controllers/StatusTableViewController.swift index f1bb3e4f5b..0975047567 100644 --- a/Loop/View Controllers/StatusTableViewController.swift +++ b/Loop/View Controllers/StatusTableViewController.swift @@ -912,6 +912,8 @@ final class StatusTableViewController: ChartsTableViewController { } } } + + // RSS - This is were carb is entered for a new entry. deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedEntry) { (result) -> Void in DispatchQueue.main.async { switch result { @@ -931,7 +933,7 @@ final class StatusTableViewController: ChartsTableViewController { } } - carbVC.FPCaloriesRatio = deviceManager.loopManager.settings.fpuRatio ?? 100.0 + carbVC.FPCaloriesRatio = deviceManager.loopManager.settings.fpuRatio ?? 150.0 carbVC.onsetDelay = deviceManager.loopManager.settings.fpuDelay ?? 60.0 // RSS - Repeat for the fat and protein portion... @@ -955,7 +957,6 @@ final class StatusTableViewController: ChartsTableViewController { } } } - } @IBAction func unwindFromBolusViewController(_ segue: UIStoryboardSegue) { From 6a9233d59c8fe40fca60348482fb7348b34e4bf9 Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Sat, 3 Nov 2018 23:10:36 -0400 Subject: [PATCH 5/9] Updated to version 1.9.4 --- Loop/Info.plist | 2 +- LoopUI/Info.plist | 2 +- WatchApp Extension/Info.plist | 2 +- WatchApp/Info.plist | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Loop/Info.plist b/Loop/Info.plist index 80aaae9eb5..b47e8fafdb 100644 --- a/Loop/Info.plist +++ b/Loop/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.3-FPU-IRC-1.6 + 1.9.4-FPU-IRC-1.6 CFBundleSignature ???? CFBundleURLTypes diff --git a/LoopUI/Info.plist b/LoopUI/Info.plist index f1c2e1159e..58f96d5060 100644 --- a/LoopUI/Info.plist +++ b/LoopUI/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.9.4 dev + 1.9.4-FPU-IRC-1.6 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/WatchApp Extension/Info.plist b/WatchApp Extension/Info.plist index ece73b3ce7..25f615cd5b 100644 --- a/WatchApp Extension/Info.plist +++ b/WatchApp Extension/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.9.4 dev + 1.9.4-FPU-IRC-1.6 CFBundleSignature ???? CFBundleVersion diff --git a/WatchApp/Info.plist b/WatchApp/Info.plist index 701ca1fdcf..649c4b8ae2 100644 --- a/WatchApp/Info.plist +++ b/WatchApp/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.4 dev + 1.9.4-FPU-IRC-1.6 CFBundleSignature ???? CFBundleVersion From 5cde7cd572b73312da5d84329191128bdd28f79c Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Sat, 3 Nov 2018 23:14:04 -0400 Subject: [PATCH 6/9] Updated to version 1.6. --- Loop Status Extension/Info.plist | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Loop Status Extension/Info.plist b/Loop Status Extension/Info.plist index dce8ba8326..41f565df47 100644 --- a/Loop Status Extension/Info.plist +++ b/Loop Status Extension/Info.plist @@ -19,11 +19,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString -<<<<<<< HEAD - 1.9.4 dev -======= - 1.9.3-FPU-IRC-1.6 ->>>>>>> 997a389a... Bump + 1.9.4-FPU-IRC-1.6 CFBundleVersion $(CURRENT_PROJECT_VERSION) MainAppBundleIdentifier From 5b4d89a80f52b6f4b2a989181403c22d346904e9 Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Sat, 17 Nov 2018 13:51:51 -0500 Subject: [PATCH 7/9] Fix some code that 1.9.4 refactor introduced that prevented existing carb from being edited. Bumped version to 1.7. --- Cartfile.resolved | 2 +- Loop Status Extension/Info.plist | 2 +- Loop/Info.plist | 2 +- .../CarbAbsorptionViewController.swift | 11 +---------- LoopUI/Info.plist | 2 +- WatchApp Extension/Info.plist | 2 +- WatchApp/Info.plist | 2 +- 7 files changed, 7 insertions(+), 16 deletions(-) diff --git a/Cartfile.resolved b/Cartfile.resolved index 900d1222e9..1b3b7aac1f 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -2,7 +2,7 @@ github "LoopKit/Amplitude-iOS" "2137d5fd44bf630ed33e1e72d7af6d8f8612f270" github "i-schuetz/SwiftCharts" "0.6.2" github "rsilvers129/CGMBLEKit" "8eb7b463490b76e93143dafec2b24951e4305a41" github "rsilvers129/G4ShareSpy" "0448cfc3de9637c3b89698c3e5645d472aefb1e8" -github "rsilvers129/LoopKit" "d1e6d848289a6116f7ec0d3d65b92cb784d273a7" +github "rsilvers129/LoopKit" "2e143a2f2bba1b5aae3a542504aa78ccc032150c" github "rsilvers129/dexcom-share-client-swift" "10d5739613f8b70946210f763a260e80a17cb1a8" github "rsilvers129/rileylink_ios" "5c47e983f46ea39ffbec52898963f609523b5fb4" github "rsilvers129/spike-client-swift-master" "45bda83426eb52a5ca9ff746e95988ec04006f85" diff --git a/Loop Status Extension/Info.plist b/Loop Status Extension/Info.plist index 41f565df47..ee788616aa 100644 --- a/Loop Status Extension/Info.plist +++ b/Loop Status Extension/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.9.4-FPU-IRC-1.6 + 1.9.4-FPU-IRC-1.7 CFBundleVersion $(CURRENT_PROJECT_VERSION) MainAppBundleIdentifier diff --git a/Loop/Info.plist b/Loop/Info.plist index b47e8fafdb..e141aa6871 100644 --- a/Loop/Info.plist +++ b/Loop/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.4-FPU-IRC-1.6 + 1.9.4-FPU-IRC-1.7 CFBundleSignature ???? CFBundleURLTypes diff --git a/Loop/View Controllers/CarbAbsorptionViewController.swift b/Loop/View Controllers/CarbAbsorptionViewController.swift index 0100bc01bb..432e23c936 100644 --- a/Loop/View Controllers/CarbAbsorptionViewController.swift +++ b/Loop/View Controllers/CarbAbsorptionViewController.swift @@ -522,15 +522,7 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl return } - if #available(iOS 12.0, *), editVC.originalCarbEntry == nil { - let interaction = INInteraction(intent: NewCarbEntryIntent(), response: nil) - interaction.donate { (error) in - if let error = error { - os_log(.error, "Failed to donate intent: %{public}@", String(describing: error)) - } - } - - deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedEntry, replacing: editVC.originalCarbEntry) { (result) in + deviceManager.loopManager.addCarbEntryAndRecommendBolus(updatedEntry, replacing: editVC.originalCarbEntry) { (result) in DispatchQueue.main.async { switch result { case .success(let recommendation): @@ -543,7 +535,6 @@ final class CarbAbsorptionViewController: ChartsTableViewController, Identifiabl self.presentAlertController(with: error) } } - } } } diff --git a/LoopUI/Info.plist b/LoopUI/Info.plist index 58f96d5060..202c863c76 100644 --- a/LoopUI/Info.plist +++ b/LoopUI/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.9.4-FPU-IRC-1.6 + 1.9.4-FPU-IRC-1.7 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/WatchApp Extension/Info.plist b/WatchApp Extension/Info.plist index 25f615cd5b..796a78cd0f 100644 --- a/WatchApp Extension/Info.plist +++ b/WatchApp Extension/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.9.4-FPU-IRC-1.6 + 1.9.4-FPU-IRC-1.7 CFBundleSignature ???? CFBundleVersion diff --git a/WatchApp/Info.plist b/WatchApp/Info.plist index 649c4b8ae2..3cd9cd9fc5 100644 --- a/WatchApp/Info.plist +++ b/WatchApp/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.9.4-FPU-IRC-1.6 + 1.9.4-FPU-IRC-1.7 CFBundleSignature ???? CFBundleVersion From 08959e8ebc3f8b45ed2a3e18841b1a6ba0ebeed9 Mon Sep 17 00:00:00 2001 From: Robert Silvers Date: Sat, 17 Nov 2018 14:00:40 -0500 Subject: [PATCH 8/9] Push LoopKit --- Carthage/Checkouts/LoopKit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Carthage/Checkouts/LoopKit b/Carthage/Checkouts/LoopKit index d1e6d84828..2e143a2f2b 160000 --- a/Carthage/Checkouts/LoopKit +++ b/Carthage/Checkouts/LoopKit @@ -1 +1 @@ -Subproject commit d1e6d848289a6116f7ec0d3d65b92cb784d273a7 +Subproject commit 2e143a2f2bba1b5aae3a542504aa78ccc032150c From f4a69fc98fe27e4335de18bf15847a456540cedf Mon Sep 17 00:00:00 2001 From: katie disimone Date: Thu, 18 Apr 2019 21:11:13 -0700 Subject: [PATCH 9/9] update for xcode 10.2 build --- Cartfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cartfile b/Cartfile index 0d753ad4ff..aa67cdcd7d 100644 --- a/Cartfile +++ b/Cartfile @@ -1,6 +1,6 @@ github "rsilvers129/LoopKit" "FPU-dev" github "rsilvers129/CGMBLEKit" "dev" -github "i-schuetz/SwiftCharts" == 0.6.2 +github "ps2/SwiftCharts" "hotfix-xcode10.2" github "rsilvers129/dexcom-share-client-swift" "carthage-recursive" github "rsilvers129/G4ShareSpy" "fix-cartfile" github "rsilvers129/rileylink_ios" "FPU-dev"