├── .github
└── workflows
│ ├── add_identifiers.yml
│ ├── build_LoopFollow.yml
│ ├── create_certs.yml
│ └── validate_secrets.yml
├── .gitignore
├── BuildDetails.plist
├── Config.xcconfig
├── Gemfile
├── Gemfile.lock
├── LICENSE
├── LoopFollow.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── xcuserdata
│ └── jon.xcuserdatad
│ ├── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ └── xcschememanagement.plist
├── LoopFollow.xcworkspace
├── contents.xcworkspacedata
├── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ ├── swiftpm
│ │ └── Package.resolved
│ └── xcschemes
│ │ └── LoopFollow.xcscheme
└── xcuserdata
│ └── jon.xcuserdatad
│ ├── UserInterfaceState.xcuserstate
│ └── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
├── LoopFollow
├── Application
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ └── SceneDelegate.swift
├── BackgroundRefresh
│ ├── BT
│ │ ├── BLEDevice.swift
│ │ ├── BLEDeviceSelectionView.swift
│ │ ├── BLEManager.swift
│ │ ├── BluetoothDevice.swift
│ │ ├── BluetoothDeviceDelegate.swift
│ │ ├── Devices
│ │ │ ├── DexcomHeartbeatBluetoothDevice.swift
│ │ │ ├── OmnipodDashHeartbeatBluetoothTransmitter.swift
│ │ │ └── RileyLinkHeartbeatBluetoothDevice.swift
│ │ └── DexcomG7HeartBeat.swift
│ ├── BackgroundRefreshSettingsView.swift
│ ├── BackgroundRefreshSettingsViewModel.swift
│ └── BackgroundRefreshType.swift
├── Contact
│ ├── ContactColorOption.swift
│ ├── ContactImageUpdater.swift
│ ├── ContactIncludeOption.swift
│ ├── ContactType.swift
│ └── Settings
│ │ ├── ContactSettingsView.swift
│ │ └── ContactSettingsViewModel.swift
├── Controllers
│ ├── AlarmSound.swift
│ ├── Alarms.swift
│ ├── AppStateController.swift
│ ├── BackgroundAlertManager.swift
│ ├── Graphs.swift
│ ├── NightScout.swift
│ ├── Nightscout
│ │ ├── BGData.swift
│ │ ├── CAge.swift
│ │ ├── DeviceStatus.swift
│ │ ├── DeviceStatusLoop.swift
│ │ ├── DeviceStatusOpenAPS.swift
│ │ ├── IAge.swift
│ │ ├── NSProfile.swift
│ │ ├── Profile.swift
│ │ ├── ProfileManager.swift
│ │ ├── SAge.swift
│ │ ├── Treatments.swift
│ │ └── Treatments
│ │ │ ├── BGCheck.swift
│ │ │ ├── Basals.swift
│ │ │ ├── Bolus.swift
│ │ │ ├── Carbs.swift
│ │ │ ├── InsulinCartridgeChange.swift
│ │ │ ├── Notes.swift
│ │ │ ├── Overrides.swift
│ │ │ ├── ResumePump.swift
│ │ │ ├── SMB.swift
│ │ │ ├── SensorStart.swift
│ │ │ ├── SiteChange.swift
│ │ │ ├── SuspendPump.swift
│ │ │ └── TemporaryTarget.swift
│ ├── Stats.swift
│ ├── StatsView.swift
│ ├── Timers.swift
│ └── ViewControllerManager.swift
├── Dexcom
│ ├── DexcomSettingsView.swift
│ └── DexcomSettingsViewModel.swift
├── Extensions
│ ├── EKEventStore+Extensions.swift
│ ├── HKQuantity+AnyConvertible.swift
│ ├── HKUnit+Extensions.swift
│ ├── ShareClientExtension.swift
│ └── UIViewExtension.swift
├── Helpers
│ ├── AnyConvertible.swift
│ ├── AppConstants.swift
│ ├── AppVersionManager.swift
│ ├── BackgroundTaskAudio.swift
│ ├── BuildDetails.swift
│ ├── Chart.swift
│ ├── CycleHelper.swift
│ ├── DataStructs.swift
│ ├── DateTime.swift
│ ├── DictionaryKeyPath.swift
│ ├── GitHubService.swift
│ ├── Globals.swift
│ ├── GlucoseConversion.swift
│ ├── Localizer.swift
│ ├── Mobileprovision.swift
│ ├── NightscoutUtils.swift
│ ├── ObservationToken.swift
│ ├── TextFieldWithToolBar.swift
│ ├── Views
│ │ ├── ErrorMessageView.swift
│ │ ├── HKQuantityInputView.swift
│ │ └── LoadingButtonView.swift
│ └── carbBolusArrays.swift
├── Info.plist
├── InfoDisplaySettings
│ ├── InfoDisplaySettingsView.swift
│ └── InfoDisplaySettingsViewModel.swift
├── InfoTable
│ ├── InfoData.swift
│ ├── InfoDataSeparator.swift
│ ├── InfoManager.swift
│ └── InfoType.swift
├── Log
│ ├── LogEntry.swift
│ ├── LogManager.swift
│ ├── LogView.swift
│ ├── LogViewModel.swift
│ └── SearchBar.swift
├── Loop Follow.entitlements
├── LoopFollow.xcdatamodeld
│ ├── .xccurrentversion
│ └── LoopFollow.xcdatamodel
│ │ └── contents
├── Metric
│ ├── CarbMetric.swift
│ ├── InsulinMetric.swift
│ └── Metric.swift
├── Nightscout
│ ├── NightscoutSettingsView.swift
│ └── NightscoutSettingsViewModel.swift
├── Remote
│ ├── Loop
│ │ ├── LoopNightscoutRemoteView.swift
│ │ ├── LoopOverrideView.swift
│ │ └── LoopOverrideViewModel.swift
│ ├── Nightscout
│ │ └── TrioNightscoutRemoteView.swift
│ ├── NoRemoteView.swift
│ ├── RemoteType.swift
│ ├── RemoteViewController.swift
│ ├── Settings
│ │ ├── RemoteSettingsView.swift
│ │ └── RemoteSettingsViewModel.swift
│ ├── TRC
│ │ ├── BolusView.swift
│ │ ├── MealView.swift
│ │ ├── OverrideView.swift
│ │ ├── PushMessage.swift
│ │ ├── PushNotificationManager.swift
│ │ ├── TRCCommandType.swift
│ │ ├── TempTargetView.swift
│ │ ├── TreatmentResponse.swift
│ │ ├── TrioNightscoutRemoteController.swift
│ │ ├── TrioRemoteControlView.swift
│ │ └── TrioRemoteControlViewModel.swift
│ └── TempTargetPreset
│ │ ├── TempTargetPreset.swift
│ │ └── TempTargetPresetManager.swift
├── Resources
│ ├── Alarm Sounds
│ │ ├── 1-millisecond-of-silence.mp3
│ │ ├── 20ms-of-silence.caf
│ │ ├── 500ms-of-silence.mp3
│ │ ├── Alarm_Buzzer.caf
│ │ ├── Alarm_Clock.caf
│ │ ├── Alert_Tone_Busy.caf
│ │ ├── Alert_Tone_Ringtone_1.caf
│ │ ├── Alert_Tone_Ringtone_2.caf
│ │ ├── Alien_Siren.caf
│ │ ├── Ambulance.caf
│ │ ├── Analog_Watch_Alarm.caf
│ │ ├── Big_Clock_Ticking.caf
│ │ ├── Burglar_Alarm_Siren_1.caf
│ │ ├── Burglar_Alarm_Siren_2.caf
│ │ ├── CSFX-2_Alarm.caf
│ │ ├── Cartoon_Ascend_Climb_Sneaky.caf
│ │ ├── Cartoon_Ascend_Then_Descend.caf
│ │ ├── Cartoon_Bounce_To_Ceiling.caf
│ │ ├── Cartoon_Dreamy_Glissando_Harp.caf
│ │ ├── Cartoon_Fail_Strings_Trumpet.caf
│ │ ├── Cartoon_Machine_Clumsy_Loop.caf
│ │ ├── Cartoon_Siren.caf
│ │ ├── Cartoon_Tip_Toe_Sneaky_Walk.caf
│ │ ├── Cartoon_Uh_Oh.caf
│ │ ├── Cartoon_Villain_Horns.caf
│ │ ├── Cell_Phone_Ring_Tone.caf
│ │ ├── Chimes_Glassy.caf
│ │ ├── Computer_Magic.caf
│ │ ├── Cuckoo_Clock.caf
│ │ ├── Dhol_Shuffleloop.caf
│ │ ├── Discreet.caf
│ │ ├── Early_Sunrise.caf
│ │ ├── Emergency_Alarm.caf
│ │ ├── Emergency_Alarm_Carbon_Monoxide.caf
│ │ ├── Emergency_Alarm_Siren.caf
│ │ ├── Ending_Reached.caf
│ │ ├── Fly.caf
│ │ ├── Ghost_Hover.caf
│ │ ├── Good_Morning.caf
│ │ ├── Hell_Yeah_Somewhat_Calmer.caf
│ │ ├── In_A_Hurry.caf
│ │ ├── Indeed.caf
│ │ ├── Insistently.caf
│ │ ├── Jingle_All_The_Way.caf
│ │ ├── Laser_Shoot.caf
│ │ ├── Machine_Charge.caf
│ │ ├── Magical_Twinkle.caf
│ │ ├── Marching_Heavy_Footed_Fat_Elephants.caf
│ │ ├── Marimba_Descend.caf
│ │ ├── Marimba_Flutter_or_Shake.caf
│ │ ├── Martian_Gun.caf
│ │ ├── Martian_Scanner.caf
│ │ ├── Metallic.caf
│ │ ├── Nightguard.caf
│ │ ├── Not_Kiddin.caf
│ │ ├── Open_Your_Eyes_And_See.caf
│ │ ├── Orchestral_Horns.caf
│ │ ├── Oringz.caf
│ │ ├── Pager_Beeps.caf
│ │ ├── Remembers_Me_Of_Asia.caf
│ │ ├── Rise_And_Shine.caf
│ │ ├── Rush.caf
│ │ ├── Sci-Fi_Air_Raid_Alarm.caf
│ │ ├── Sci-Fi_Alarm.caf
│ │ ├── Sci-Fi_Alarm_Loop_1.caf
│ │ ├── Sci-Fi_Alarm_Loop_2.caf
│ │ ├── Sci-Fi_Alarm_Loop_3.caf
│ │ ├── Sci-Fi_Alarm_Loop_4.caf
│ │ ├── Sci-Fi_Computer_Console_Alarm.caf
│ │ ├── Sci-Fi_Console_Alarm.caf
│ │ ├── Sci-Fi_Eerie_Alarm.caf
│ │ ├── Sci-Fi_Engine_Shut_Down.caf
│ │ ├── Sci-Fi_Incoming_Message_Alert.caf
│ │ ├── Sci-Fi_Spaceship_Message.caf
│ │ ├── Sci-Fi_Spaceship_Warm_Up.caf
│ │ ├── Sci-Fi_Warning.caf
│ │ ├── Signature_Corporate.caf
│ │ ├── Siri_Alert_Calibration_Needed.caf
│ │ ├── Siri_Alert_Device_Muted.caf
│ │ ├── Siri_Alert_Glucose_Dropping_Fast.caf
│ │ ├── Siri_Alert_Glucose_Rising_Fast.caf
│ │ ├── Siri_Alert_High_Glucose.caf
│ │ ├── Siri_Alert_Low_Glucose.caf
│ │ ├── Siri_Alert_Missed_Readings.caf
│ │ ├── Siri_Alert_Transmitter_Battery_Low.caf
│ │ ├── Siri_Alert_Urgent_High_Glucose.caf
│ │ ├── Siri_Alert_Urgent_Low_Glucose.caf
│ │ ├── Siri_Calibration_Needed.caf
│ │ ├── Siri_Device_Muted.caf
│ │ ├── Siri_Glucose_Dropping_Fast.caf
│ │ ├── Siri_Glucose_Rising_Fast.caf
│ │ ├── Siri_High_Glucose.caf
│ │ ├── Siri_Low_Glucose.caf
│ │ ├── Siri_Missed_Readings.caf
│ │ ├── Siri_Transmitter_Battery_Low.caf
│ │ ├── Siri_Urgent_High_Glucose.caf
│ │ ├── Siri_Urgent_Low_Glucose.caf
│ │ ├── Soft_Marimba_Pad_Positive.caf
│ │ ├── Soft_Warm_Airy_Optimistic.caf
│ │ ├── Soft_Warm_Airy_Reassuring.caf
│ │ ├── Store_Door_Chime.caf
│ │ ├── Sunny.caf
│ │ ├── Thunder_Sound_FX.caf
│ │ ├── Time_Has_Come.caf
│ │ ├── Tornado_Siren.caf
│ │ ├── Two_Turtle_Doves.caf
│ │ ├── Unpaved.caf
│ │ ├── Wake_Up_Will_You.caf
│ │ ├── Win_Gain.caf
│ │ ├── Wrong_Answer.caf
│ │ ├── alarm-notification.m4a
│ │ ├── alarm.mp3
│ │ └── silence-1sec.mp3
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── 1024.png
│ │ │ ├── 120-1.png
│ │ │ ├── 120.png
│ │ │ ├── 152.png
│ │ │ ├── 167.png
│ │ │ ├── 180.png
│ │ │ ├── 20.png
│ │ │ ├── 29.png
│ │ │ ├── 40-1.png
│ │ │ ├── 40-2.png
│ │ │ ├── 40.png
│ │ │ ├── 58-1.png
│ │ │ ├── 58.png
│ │ │ ├── 60.png
│ │ │ ├── 76.png
│ │ │ ├── 80-1.png
│ │ │ ├── 80.png
│ │ │ ├── 87.png
│ │ │ └── Contents.json
│ │ ├── Colors
│ │ │ ├── Basal.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── DarkerBlue.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Insulin.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Lemon.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── LoopGray.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── LoopGreen.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── LoopPink.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── LoopRed.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── LoopYellow.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── ManualTempBasal.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── NonPumpInsulin.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── SMB.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── TempBasal.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── UAM.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── ZT.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── darkGray.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── minus.colorset
│ │ │ │ └── Contents.json
│ │ │ └── warning.colorset
│ │ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── first.imageset
│ │ │ ├── Contents.json
│ │ │ └── first.pdf
│ │ └── second.imageset
│ │ │ ├── Contents.json
│ │ │ └── second.pdf
│ ├── blank.wav
│ ├── dragbar.png
│ └── silence.mp3
├── Settings
│ ├── AdvancedSettingsView.swift
│ └── AdvancedSettingsViewModel.swift
├── Storage
│ ├── Observable.swift
│ ├── ObservableUserDefaults.swift
│ ├── ObservableUserDefaultsValue.swift
│ ├── ObservableValue.swift
│ ├── SecureStorageValue.swift
│ ├── Storage.swift
│ ├── StorageValue.swift
│ ├── UserData.xcdatamodeld
│ │ └── UserData.xcdatamodel
│ │ │ └── contents
│ ├── UserDefaults.swift
│ ├── UserDefaultsValue.swift
│ └── UserDefaultsValueGroups.swift
├── Task
│ ├── AlarmTask.swift
│ ├── BGTask.swift
│ ├── CalendarTask.swift
│ ├── DeviceStatusTask.swift
│ ├── MinAgoTask.swift
│ ├── ProfileTask.swift
│ ├── Task.swift
│ ├── TaskScheduler.swift
│ └── TreatmentsTask.swift
└── ViewControllers
│ ├── AlarmViewController.swift
│ ├── AppStateViewController.swift
│ ├── DebugViewController.swift
│ ├── GeneralSettingsViewController.swift
│ ├── GraphSettingsViewController.swift
│ ├── MainViewController.swift
│ ├── NightScoutViewController.swift
│ ├── SettingsViewController.swift
│ ├── SnoozeViewController.swift
│ └── WatchSettingsViewController.swift
├── LoopFollowDisplayNameConfig.xcconfig
├── Podfile
├── Podfile.lock
├── Pods
├── Charts
│ ├── LICENSE
│ ├── README.md
│ └── Source
│ │ └── Charts
│ │ ├── Animation
│ │ ├── Animator.swift
│ │ └── ChartAnimationEasing.swift
│ │ ├── Charts
│ │ ├── BarChartView.swift
│ │ ├── BarLineChartViewBase.swift
│ │ ├── BubbleChartView.swift
│ │ ├── CandleStickChartView.swift
│ │ ├── ChartViewBase.swift
│ │ ├── CombinedChartView.swift
│ │ ├── HorizontalBarChartView.swift
│ │ ├── LineChartView.swift
│ │ ├── PieChartView.swift
│ │ ├── PieRadarChartViewBase.swift
│ │ ├── RadarChartView.swift
│ │ └── ScatterChartView.swift
│ │ ├── Components
│ │ ├── AxisBase.swift
│ │ ├── ChartLimitLine.swift
│ │ ├── ComponentBase.swift
│ │ ├── Description.swift
│ │ ├── Legend.swift
│ │ ├── LegendEntry.swift
│ │ ├── Marker.swift
│ │ ├── MarkerImage.swift
│ │ ├── MarkerView.swift
│ │ ├── XAxis.swift
│ │ └── YAxis.swift
│ │ ├── Data
│ │ ├── Implementations
│ │ │ ├── ChartBaseDataSet.swift
│ │ │ └── Standard
│ │ │ │ ├── BarChartData.swift
│ │ │ │ ├── BarChartDataEntry.swift
│ │ │ │ ├── BarChartDataSet.swift
│ │ │ │ ├── BarLineScatterCandleBubbleChartData.swift
│ │ │ │ ├── BarLineScatterCandleBubbleChartDataSet.swift
│ │ │ │ ├── BubbleChartData.swift
│ │ │ │ ├── BubbleChartDataEntry.swift
│ │ │ │ ├── BubbleChartDataSet.swift
│ │ │ │ ├── CandleChartData.swift
│ │ │ │ ├── CandleChartDataEntry.swift
│ │ │ │ ├── CandleChartDataSet.swift
│ │ │ │ ├── ChartData.swift
│ │ │ │ ├── ChartDataEntry.swift
│ │ │ │ ├── ChartDataEntryBase.swift
│ │ │ │ ├── ChartDataSet.swift
│ │ │ │ ├── CombinedChartData.swift
│ │ │ │ ├── LineChartData.swift
│ │ │ │ ├── LineChartDataSet.swift
│ │ │ │ ├── LineRadarChartDataSet.swift
│ │ │ │ ├── LineScatterCandleRadarChartDataSet.swift
│ │ │ │ ├── PieChartData.swift
│ │ │ │ ├── PieChartDataEntry.swift
│ │ │ │ ├── PieChartDataSet.swift
│ │ │ │ ├── RadarChartData.swift
│ │ │ │ ├── RadarChartDataEntry.swift
│ │ │ │ ├── RadarChartDataSet.swift
│ │ │ │ ├── ScatterChartData.swift
│ │ │ │ └── ScatterChartDataSet.swift
│ │ └── Interfaces
│ │ │ ├── BarChartDataSetProtocol.swift
│ │ │ ├── BarLineScatterCandleBubbleChartDataSetProtocol.swift
│ │ │ ├── BubbleChartDataSetProtocol.swift
│ │ │ ├── CandleChartDataSetProtocol.swift
│ │ │ ├── ChartDataSetProtocol.swift
│ │ │ ├── LineChartDataSetProtocol.swift
│ │ │ ├── LineRadarChartDataSetProtocol.swift
│ │ │ ├── LineScatterCandleRadarChartDataSetProtocol.swift
│ │ │ ├── PieChartDataSetProtocol.swift
│ │ │ ├── RadarChartDataSetProtocol.swift
│ │ │ └── ScatterChartDataSetProtocol.swift
│ │ ├── Filters
│ │ ├── DataApproximator+N.swift
│ │ └── DataApproximator.swift
│ │ ├── Formatters
│ │ ├── AxisValueFormatter.swift
│ │ ├── DefaultAxisValueFormatter.swift
│ │ ├── DefaultFillFormatter.swift
│ │ ├── DefaultValueFormatter.swift
│ │ ├── FillFormatter.swift
│ │ ├── IndexAxisValueFormatter.swift
│ │ └── ValueFormatter.swift
│ │ ├── Highlight
│ │ ├── BarHighlighter.swift
│ │ ├── ChartHighlighter.swift
│ │ ├── CombinedHighlighter.swift
│ │ ├── Highlight.swift
│ │ ├── Highlighter.swift
│ │ ├── HorizontalBarHighlighter.swift
│ │ ├── PieHighlighter.swift
│ │ ├── PieRadarHighlighter.swift
│ │ ├── RadarHighlighter.swift
│ │ └── Range.swift
│ │ ├── Interfaces
│ │ ├── BarChartDataProvider.swift
│ │ ├── BarLineScatterCandleBubbleChartDataProvider.swift
│ │ ├── BubbleChartDataProvider.swift
│ │ ├── CandleChartDataProvider.swift
│ │ ├── ChartDataProvider.swift
│ │ ├── CombinedChartDataProvider.swift
│ │ ├── LineChartDataProvider.swift
│ │ └── ScatterChartDataProvider.swift
│ │ ├── Jobs
│ │ ├── AnimatedMoveViewJob.swift
│ │ ├── AnimatedViewPortJob.swift
│ │ ├── AnimatedZoomViewJob.swift
│ │ ├── MoveViewJob.swift
│ │ ├── ViewPortJob.swift
│ │ └── ZoomViewJob.swift
│ │ ├── Renderers
│ │ ├── AxisRenderer.swift
│ │ ├── BarChartRenderer.swift
│ │ ├── BarLineScatterCandleBubbleRenderer.swift
│ │ ├── BubbleChartRenderer.swift
│ │ ├── CandleStickChartRenderer.swift
│ │ ├── CombinedChartRenderer.swift
│ │ ├── DataRenderer.swift
│ │ ├── HorizontalBarChartRenderer.swift
│ │ ├── LegendRenderer.swift
│ │ ├── LineChartRenderer.swift
│ │ ├── LineRadarRenderer.swift
│ │ ├── LineScatterCandleRadarRenderer.swift
│ │ ├── PieChartRenderer.swift
│ │ ├── RadarChartRenderer.swift
│ │ ├── Renderer.swift
│ │ ├── Scatter
│ │ │ ├── ChevronDownShapeRenderer.swift
│ │ │ ├── ChevronUpShapeRenderer.swift
│ │ │ ├── CircleShapeRenderer.swift
│ │ │ ├── CrossShapeRenderer.swift
│ │ │ ├── ShapeRenderer.swift
│ │ │ ├── SquareShapeRenderer.swift
│ │ │ ├── TriangleShapeRenderer.swift
│ │ │ └── XShapeRenderer.swift
│ │ ├── ScatterChartRenderer.swift
│ │ ├── XAxisRenderer.swift
│ │ ├── XAxisRendererHorizontalBarChart.swift
│ │ ├── XAxisRendererRadarChart.swift
│ │ ├── YAxisRenderer.swift
│ │ ├── YAxisRendererHorizontalBarChart.swift
│ │ └── YAxisRendererRadarChart.swift
│ │ └── Utils
│ │ ├── ChartColorTemplates.swift
│ │ ├── ChartUtils.swift
│ │ ├── Fill.swift
│ │ ├── Platform+Accessibility.swift
│ │ ├── Platform+Color.swift
│ │ ├── Platform+Gestures.swift
│ │ ├── Platform+Graphics.swift
│ │ ├── Platform+Touch Handling.swift
│ │ ├── Platform.swift
│ │ ├── Sequence+KeyPath.swift
│ │ ├── Transformer.swift
│ │ ├── TransformerHorizontalBarChart.swift
│ │ └── ViewPortHandler.swift
├── Eureka
│ ├── LICENSE
│ ├── README.md
│ └── Source
│ │ ├── Core
│ │ ├── BaseRow.swift
│ │ ├── Cell.swift
│ │ ├── CellType.swift
│ │ ├── Core.swift
│ │ ├── Form.swift
│ │ ├── HeaderFooterView.swift
│ │ ├── Helpers.swift
│ │ ├── InlineRowType.swift
│ │ ├── NavigationAccessoryView.swift
│ │ ├── Operators.swift
│ │ ├── PresenterRowType.swift
│ │ ├── Row.swift
│ │ ├── RowControllerType.swift
│ │ ├── RowProtocols.swift
│ │ ├── RowType.swift
│ │ ├── Section.swift
│ │ ├── SelectableRowType.swift
│ │ ├── SelectableSection.swift
│ │ ├── SwipeActions.swift
│ │ └── Validation.swift
│ │ ├── Rows
│ │ ├── ActionSheetRow.swift
│ │ ├── AlertRow.swift
│ │ ├── ButtonRow.swift
│ │ ├── ButtonRowWithPresent.swift
│ │ ├── CheckRow.swift
│ │ ├── Common
│ │ │ ├── AlertOptionsRow.swift
│ │ │ ├── DateFieldRow.swift
│ │ │ ├── DateInlineFieldRow.swift
│ │ │ ├── DecimalFormatter.swift
│ │ │ ├── FieldRow.swift
│ │ │ ├── GenericMultipleSelectorRow.swift
│ │ │ ├── OptionsRow.swift
│ │ │ ├── Protocols.swift
│ │ │ └── SelectorRow.swift
│ │ ├── Controllers
│ │ │ ├── MultipleSelectorViewController.swift
│ │ │ ├── SelectorAlertController.swift
│ │ │ └── SelectorViewController.swift
│ │ ├── DateInlineRow.swift
│ │ ├── DatePickerRow.swift
│ │ ├── DateRow.swift
│ │ ├── DoublePickerInputRow.swift
│ │ ├── DoublePickerRow.swift
│ │ ├── FieldsRow.swift
│ │ ├── LabelRow.swift
│ │ ├── MultipleSelectorRow.swift
│ │ ├── PickerInlineRow.swift
│ │ ├── PickerInputRow.swift
│ │ ├── PickerRow.swift
│ │ ├── PopoverSelectorRow.swift
│ │ ├── PushRow.swift
│ │ ├── SegmentedRow.swift
│ │ ├── SelectableRows
│ │ │ └── ListCheckRow.swift
│ │ ├── SliderRow.swift
│ │ ├── StepperRow.swift
│ │ ├── SwitchRow.swift
│ │ ├── TextAreaRow.swift
│ │ ├── TriplePickerInputRow.swift
│ │ └── TriplePickerRow.swift
│ │ └── Validations
│ │ ├── RuleClosure.swift
│ │ ├── RuleEmail.swift
│ │ ├── RuleEqualsToRow.swift
│ │ ├── RuleLength.swift
│ │ ├── RuleRange.swift
│ │ ├── RuleRegExp.swift
│ │ ├── RuleRequired.swift
│ │ └── RuleURL.swift
├── Local Podspecs
│ ├── Eureka.podspec.json
│ └── ShareClient.podspec.json
├── Manifest.lock
├── Pods.xcodeproj
│ ├── project.pbxproj
│ └── xcuserdata
│ │ └── jon.xcuserdatad
│ │ └── xcschemes
│ │ ├── Charts.xcscheme
│ │ ├── Eureka.xcscheme
│ │ ├── Pods-LoopFollow.xcscheme
│ │ ├── ShareClient.xcscheme
│ │ ├── SwiftAlgorithms.xcscheme
│ │ └── xcschememanagement.plist
├── ShareClient
│ ├── LICENSE
│ └── ShareClient
│ │ ├── ShareClient.h
│ │ └── ShareClient.swift
├── SwiftAlgorithms
│ ├── LICENSE.txt
│ ├── README.md
│ └── Sources
│ │ └── Algorithms
│ │ ├── AdjacentPairs.swift
│ │ ├── Chain.swift
│ │ ├── Chunked.swift
│ │ ├── Combinations.swift
│ │ ├── Compacted.swift
│ │ ├── Cycle.swift
│ │ ├── EitherSequence.swift
│ │ ├── FirstNonNil.swift
│ │ ├── FlattenCollection.swift
│ │ ├── Indexed.swift
│ │ ├── Intersperse.swift
│ │ ├── Joined.swift
│ │ ├── MinMax.swift
│ │ ├── Partition.swift
│ │ ├── Permutations.swift
│ │ ├── Product.swift
│ │ ├── Reductions.swift
│ │ ├── Rotate.swift
│ │ ├── Split.swift
│ │ ├── Stride.swift
│ │ ├── Suffix.swift
│ │ ├── Trim.swift
│ │ ├── Unique.swift
│ │ └── Windows.swift
└── Target Support Files
│ ├── Charts
│ ├── Charts-Info.plist
│ ├── Charts-dummy.m
│ ├── Charts-prefix.pch
│ ├── Charts-umbrella.h
│ ├── Charts.debug.xcconfig
│ ├── Charts.modulemap
│ └── Charts.release.xcconfig
│ ├── Eureka
│ ├── Eureka-Info.plist
│ ├── Eureka-dummy.m
│ ├── Eureka-prefix.pch
│ ├── Eureka-umbrella.h
│ ├── Eureka.debug.xcconfig
│ ├── Eureka.modulemap
│ └── Eureka.release.xcconfig
│ ├── Pods-LoopFollow
│ ├── Pods-LoopFollow-Info.plist
│ ├── Pods-LoopFollow-acknowledgements.markdown
│ ├── Pods-LoopFollow-acknowledgements.plist
│ ├── Pods-LoopFollow-dummy.m
│ ├── Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist
│ ├── Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist
│ ├── Pods-LoopFollow-frameworks-Release-input-files.xcfilelist
│ ├── Pods-LoopFollow-frameworks-Release-output-files.xcfilelist
│ ├── Pods-LoopFollow-frameworks.sh
│ ├── Pods-LoopFollow-umbrella.h
│ ├── Pods-LoopFollow.debug.xcconfig
│ ├── Pods-LoopFollow.modulemap
│ └── Pods-LoopFollow.release.xcconfig
│ ├── ShareClient
│ ├── ShareClient-Info.plist
│ ├── ShareClient-dummy.m
│ ├── ShareClient-prefix.pch
│ ├── ShareClient-umbrella.h
│ ├── ShareClient.debug.xcconfig
│ ├── ShareClient.modulemap
│ └── ShareClient.release.xcconfig
│ └── SwiftAlgorithms
│ ├── SwiftAlgorithms-Info.plist
│ ├── SwiftAlgorithms-dummy.m
│ ├── SwiftAlgorithms-prefix.pch
│ ├── SwiftAlgorithms-umbrella.h
│ ├── SwiftAlgorithms.debug.xcconfig
│ ├── SwiftAlgorithms.modulemap
│ └── SwiftAlgorithms.release.xcconfig
├── README.md
├── Scripts
└── capture-build-details.sh
├── blacklisted-versions.json
└── fastlane
├── Fastfile
├── Matchfile
└── testflight.md
/BuildDetails.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Config.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "LoopFollowConfigOverride.xcconfig"
2 | #include? "../../LoopFollowConfigOverride.xcconfig"
3 | #include? "LoopFollowDisplayNameConfig.xcconfig"
4 | #include? "../../LoopFollowDisplayNameConfig.xcconfig"
5 |
6 | unique_id = ${DEVELOPMENT_TEAM}
7 |
8 | //Version (DEFAULT)
9 | LOOP_FOLLOW_MARKETING_VERSION = 2.6.0
10 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 |
3 | gem "fastlane"
4 | gem "rexml", "3.3.2"
--------------------------------------------------------------------------------
/LoopFollow.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/LoopFollow.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LoopFollow.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Oxygen",
6 | "repositoryURL": "https://github.com/mpangburn/Oxygen.git",
7 | "state": {
8 | "branch": "master",
9 | "revision": "b3c7a6ead1400e4799b16755d23c9905040d4acc",
10 | "version": null
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/LoopFollow.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | LoopFollow.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 5
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/LoopFollow.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/LoopFollow.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LoopFollow.xcworkspace/xcuserdata/jon.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow.xcworkspace/xcuserdata/jon.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/LoopFollow/BackgroundRefresh/BT/BLEDevice.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BLEDevice.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-02.
6 | //
7 |
8 | import Foundation
9 |
10 | struct BLEDevice: Identifiable, Codable, Equatable {
11 | let id: UUID
12 |
13 | var name: String?
14 | var rssi: Int
15 | var isConnected: Bool
16 | var advertisedServices: [String]?
17 | var lastSeen: Date
18 | var lastConnected: Date?
19 |
20 | init(id: UUID,
21 | name: String? = nil,
22 | rssi: Int,
23 | isConnected: Bool = false,
24 | advertisedServices: [String]? = nil,
25 | lastSeen: Date = Date(),
26 | lastConnected: Date? = nil) {
27 | self.id = id
28 | self.name = name
29 | self.rssi = rssi
30 | self.isConnected = isConnected
31 | self.advertisedServices = advertisedServices
32 | self.lastSeen = lastSeen
33 | self.lastConnected = lastConnected
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/LoopFollow/BackgroundRefresh/BT/BluetoothDeviceDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BluetoothDeviceDelegate.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-04.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import CoreBluetooth
11 |
12 | protocol BluetoothDeviceDelegate: AnyObject {
13 | func didConnectTo(bluetoothDevice: BluetoothDevice)
14 |
15 | func didDisconnectFrom(bluetoothDevice: BluetoothDevice)
16 |
17 | func heartBeat()
18 | }
19 |
--------------------------------------------------------------------------------
/LoopFollow/BackgroundRefresh/BT/Devices/DexcomHeartbeatBluetoothDevice.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DexcomHeartbeatBluetoothDevice.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-04.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import os
11 | import CoreBluetooth
12 | import AVFoundation
13 |
14 | class DexcomHeartbeatBluetoothDevice: BluetoothDevice {
15 | private let CBUUID_Service_G7 = "F8083532-849E-531C-C594-30F1F86A4EA5"
16 | private let CBUUID_Advertisement_G7 = "FEBC"
17 | private let CBUUID_ReceiveCharacteristic_G7 = "F8083535-849E-531C-C594-30F1F86A4EA5"
18 |
19 | init(address:String, name:String?, bluetoothDeviceDelegate: BluetoothDeviceDelegate) {
20 | super.init(
21 | address: address,
22 | name: name,
23 | CBUUID_Advertisement: CBUUID_Advertisement_G7,
24 | servicesCBUUIDs: [CBUUID(string: CBUUID_Service_G7)],
25 | CBUUID_ReceiveCharacteristic: CBUUID_ReceiveCharacteristic_G7,
26 | bluetoothDeviceDelegate: bluetoothDeviceDelegate
27 | )
28 | }
29 |
30 | override func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
31 | super.centralManager(central, didDisconnectPeripheral: peripheral, error: error)
32 | self.bluetoothDeviceDelegate?.heartBeat()
33 | }
34 |
35 | override func expectedHeartbeatInterval() -> TimeInterval? {
36 | return 5 * 60 // 5 minutes in seconds
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/BackgroundRefresh/BT/DexcomG7HeartBeat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DexcomG7HeartBeat.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-04.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | // Denna behövs
10 |
11 | import Foundation
12 |
13 | /// A simple class to represent the Dexcom G7 Heartbeat.
14 | /// It wraps around a `BLEPeripheral` to store relevant information.
15 | public class DexcomG7HeartBeat {
16 |
17 | // MARK: - Properties
18 |
19 | /// The BLEPeripheral instance associated with this heartbeat.
20 | public let blePeripheral: BLEPeripheral
21 |
22 | // MARK: - Initialization
23 |
24 | /// Initializes a new DexcomG7HeartBeat instance.
25 | /// - Parameters:
26 | /// - address: The unique address of the BLE device.
27 | /// - name: The name of the BLE device.
28 | /// - alias: An optional alias for the device.
29 | public init(address: String, name: String, alias: String? = nil) {
30 | self.blePeripheral = BLEPeripheral(
31 | address: address,
32 | name: name,
33 | alias: alias,
34 | peripheralType: .DexcomG7HeartBeatType
35 | )
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/LoopFollow/BackgroundRefresh/BackgroundRefreshSettingsViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BackgroundRefreshSettingsViewModel.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-02.
6 | //
7 |
8 | import Foundation
9 | import Combine
10 |
11 | class BackgroundRefreshSettingsViewModel: ObservableObject {
12 | @Published var backgroundRefreshType: BackgroundRefreshType
13 |
14 | private var storage = Storage.shared
15 | private var cancellables = Set()
16 |
17 | private var isInitialSetup = true // Tracks whether the value is being set initially
18 |
19 | init() {
20 | self.backgroundRefreshType = storage.backgroundRefreshType.value
21 | setupBindings()
22 | }
23 |
24 | private func setupBindings() {
25 | $backgroundRefreshType
26 | .dropFirst() // Ignore the initial emission during setup
27 | .sink { [weak self] newValue in
28 | guard let self = self else { return }
29 | self.handleBackgroundRefreshTypeChange(newValue)
30 |
31 | // Persist the change
32 | self.storage.backgroundRefreshType.value = newValue
33 | }
34 | .store(in: &cancellables)
35 | }
36 |
37 | private func handleBackgroundRefreshTypeChange(_ newValue: BackgroundRefreshType) {
38 | LogManager.shared.log(category: .general, message: "Background refresh type changed to: \(newValue.rawValue)")
39 |
40 | BLEManager.shared.disconnect()
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/LoopFollow/Contact/ContactColorOption.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContactColorOption.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-02-22.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | enum ContactColorOption: String, CaseIterable {
12 | case red, blue, cyan, green, yellow, orange, purple, white, black
13 |
14 | var uiColor: UIColor {
15 | switch self {
16 | case .red: return .red
17 | case .blue: return .blue
18 | case .cyan: return .cyan
19 | case .green: return .green
20 | case .yellow: return .yellow
21 | case .orange: return .orange
22 | case .purple: return .purple
23 | case .white: return .white
24 | case .black: return .black
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/LoopFollow/Contact/ContactIncludeOption.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContactIncludeOption.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-02-22.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | enum ContactIncludeOption: String, Codable, Equatable, CaseIterable {
10 | case off = "Off"
11 | case include = "Include"
12 | case separate = "Separate"
13 | }
14 |
--------------------------------------------------------------------------------
/LoopFollow/Contact/ContactType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContactSuffix.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-02-23.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | enum ContactType: String, CaseIterable {
10 | case BG = "BG"
11 | case Trend = "Trend"
12 | case Delta = "Delta"
13 | }
14 |
--------------------------------------------------------------------------------
/LoopFollow/Controllers/Nightscout/Treatments/BGCheck.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CarbsToday.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2023-10-04.
6 | // Copyright © 2023 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import UIKit
11 |
12 | extension MainViewController {
13 | // NS BG Check Response Processor
14 | func processNSBGCheck(entries: [[String:AnyObject]]) {
15 | bgCheckData.removeAll()
16 |
17 | entries.reversed().forEach { currentEntry in
18 | guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return }
19 |
20 | guard let parsedDate = NightscoutUtils.parseDate(dateStr),
21 | let glucose = currentEntry["glucose"] as? Double else {
22 | return
23 | }
24 |
25 | let units = currentEntry["units"] as? String ?? "mg/dl"
26 | let convertedGlucose: Double = units == "mmol" ? glucose * GlucoseConversion.mmolToMgDl : glucose
27 |
28 | let dateTimeStamp = parsedDate.timeIntervalSince1970
29 | if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) {
30 | let dot = ShareGlucoseData(sgv: Int(convertedGlucose.rounded()), date: Double(dateTimeStamp), direction: "")
31 | bgCheckData.append(dot)
32 | }
33 | }
34 |
35 | if UserDefaultsRepository.graphOtherTreatments.value {
36 | updateBGCheckGraph()
37 | }
38 | }
39 | }
40 |
41 |
--------------------------------------------------------------------------------
/LoopFollow/Controllers/Nightscout/Treatments/InsulinCartridgeChange.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InsulinCartridgeChange.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-08-05.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | extension MainViewController {
11 | func processIage(entries: [iageData]) {
12 | if !entries.isEmpty {
13 | updateIage(data: entries)
14 | } else if let iage = currentIage {
15 | updateIage(data: [iage])
16 | } else if UserDefaultsRepository.infoVisible.value[InfoType.iage.rawValue] {
17 | webLoadNSIage()
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/LoopFollow/Controllers/Nightscout/Treatments/ResumePump.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ResumePump.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2023-10-05.
6 | // Copyright © 2023 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | extension MainViewController {
11 | // NS Resume Pump Response Processor
12 | func processResumePump(entries: [[String:AnyObject]]) {
13 | resumeGraphData.removeAll()
14 |
15 | var lastFoundIndex = 0
16 |
17 | entries.reversed().forEach { currentEntry in
18 | guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return }
19 |
20 | guard let parsedDate = NightscoutUtils.parseDate(dateStr) else {
21 | return
22 | }
23 |
24 | let dateTimeStamp = parsedDate.timeIntervalSince1970
25 | let sgv = findNearestBGbyTime(needle: dateTimeStamp, haystack: bgData, startingIndex: lastFoundIndex)
26 | lastFoundIndex = sgv.foundIndex
27 |
28 | if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) {
29 | let dot = DataStructs.timestampOnlyStruct(date: Double(dateTimeStamp), sgv: Int(sgv.sgv))
30 | resumeGraphData.append(dot)
31 | }
32 | }
33 |
34 | if UserDefaultsRepository.graphOtherTreatments.value {
35 | updateResumeGraph()
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Controllers/Nightscout/Treatments/SiteChange.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SiteChange.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2023-10-06.
6 | // Copyright © 2023 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | extension MainViewController {
11 | func processCage(entries: [cageData]) {
12 | if !entries.isEmpty {
13 | updateCage(data: entries)
14 | } else if let cage = currentCage {
15 | updateCage(data: [cage])
16 | } else {
17 | webLoadNSCage()
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/LoopFollow/Controllers/Nightscout/Treatments/SuspendPump.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SuspendPump.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2023-10-05.
6 | // Copyright © 2023 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | extension MainViewController {
11 | // NS Suspend Pump Response Processor
12 | func processSuspendPump(entries: [[String:AnyObject]]) {
13 | suspendGraphData.removeAll()
14 |
15 | var lastFoundIndex = 0
16 |
17 | entries.reversed().forEach { currentEntry in
18 | guard let dateStr = currentEntry["timestamp"] as? String ?? currentEntry["created_at"] as? String else { return }
19 |
20 | guard let parsedDate = NightscoutUtils.parseDate(dateStr) else {
21 | return
22 | }
23 |
24 | let dateTimeStamp = parsedDate.timeIntervalSince1970
25 | let sgv = findNearestBGbyTime(needle: dateTimeStamp, haystack: bgData, startingIndex: lastFoundIndex)
26 | lastFoundIndex = sgv.foundIndex
27 |
28 | if dateTimeStamp < (dateTimeUtils.getNowTimeIntervalUTC() + (60 * 60)) {
29 | let dot = DataStructs.timestampOnlyStruct(date: Double(dateTimeStamp), sgv: Int(sgv.sgv))
30 | suspendGraphData.append(dot)
31 | }
32 | }
33 |
34 | if UserDefaultsRepository.graphOtherTreatments.value {
35 | updateSuspendGraph()
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Controllers/ViewControllerManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewControllerManager.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-27.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import UIKit
11 |
12 | class ViewControllerManager {
13 |
14 | static let shared = ViewControllerManager()
15 |
16 | var alarmViewController: AlarmViewController?
17 |
18 | private init() {
19 | instantiateAlarmViewController()
20 | }
21 |
22 | private func instantiateAlarmViewController() {
23 | let storyboard = UIStoryboard(name: "Main", bundle: nil)
24 | self.alarmViewController = storyboard.instantiateViewController(withIdentifier: "AlarmViewController") as? AlarmViewController
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/LoopFollow/Dexcom/DexcomSettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DexcomSettingsView.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-18.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct DexcomSettingsView: View {
12 | @ObservedObject var viewModel: DexcomSettingsViewModel
13 | @Environment(\.presentationMode) var presentationMode
14 |
15 | var body: some View {
16 | NavigationView {
17 | Form {
18 | Section(header: Text("Dexcom Settings")) {
19 | TextField("User Name", text: $viewModel.userName)
20 | .autocapitalization(.none)
21 | .disableAutocorrection(true)
22 |
23 | TextField("Password", text: $viewModel.password)
24 | .autocapitalization(.none)
25 | .disableAutocorrection(true)
26 |
27 | Picker("Server", selection: $viewModel.server) {
28 | Text("US").tag("US")
29 | Text("NON-US").tag("NON-US")
30 | }
31 | .pickerStyle(SegmentedPickerStyle())
32 | }
33 | }
34 | .navigationBarTitle("Dexcom Settings", displayMode: .inline)
35 | .toolbar {
36 | ToolbarItem(placement: .navigationBarTrailing) {
37 | Button("Done") {
38 | presentationMode.wrappedValue.dismiss()
39 | }
40 | }
41 | }
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/LoopFollow/Dexcom/DexcomSettingsViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DexcomSettingsViewModel.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-18.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 |
12 | class DexcomSettingsViewModel: ObservableObject {
13 | @Published var userName: String = UserDefaultsRepository.shareUserName.value {
14 | willSet {
15 | if newValue != userName {
16 | UserDefaultsRepository.shareUserName.value = newValue
17 | }
18 | }
19 | }
20 | @Published var password: String = UserDefaultsRepository.sharePassword.value {
21 | willSet {
22 | if newValue != password {
23 | UserDefaultsRepository.sharePassword.value = newValue
24 | }
25 | }
26 | }
27 | @Published var server: String = UserDefaultsRepository.shareServer.value {
28 | willSet {
29 | if newValue != server {
30 | UserDefaultsRepository.shareServer.value = newValue
31 | }
32 | }
33 | }
34 |
35 | init() {
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/LoopFollow/Extensions/EKEventStore+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EKEventStore+Extensions.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2023-07-27.
6 | // Copyright © 2023 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import EventKit
11 |
12 | #if swift(>=5.9)
13 | extension EKEventStore {
14 | func requestCalendarAccess(completion: @escaping (Bool, Error?) -> Void) {
15 | if #available(iOS 17, *) {
16 | requestFullAccessToEvents { (granted, error) in
17 | completion(granted, error)
18 | }
19 | } else {
20 | requestAccess(to: .event) { (granted, error) in
21 | completion(granted, error)
22 | }
23 | }
24 | }
25 | }
26 | #else
27 | extension EKEventStore {
28 | func requestCalendarAccess(completion: @escaping (Bool, Error?) -> Void) {
29 | requestAccess(to: .event) { (granted, error) in
30 | completion(granted, error)
31 | }
32 | }
33 | }
34 | #endif
35 |
--------------------------------------------------------------------------------
/LoopFollow/Extensions/HKQuantity+AnyConvertible.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HKQuantity+AnyConvertible.swift
3 | // nightguard
4 | //
5 | // Created by Jonas Björkert on 2024-07-24.
6 | //
7 |
8 | import HealthKit
9 |
10 | class HKQuantityWrapper: AnyConvertible {
11 | let quantity: HKQuantity
12 |
13 | init(quantity: HKQuantity) {
14 | self.quantity = quantity
15 | }
16 |
17 | func toAny() -> Any {
18 | return ["unit": UserDefaultsRepository.getPreferredUnit().unitString,
19 | "value": quantity.doubleValue(for: UserDefaultsRepository.getPreferredUnit())]
20 | }
21 |
22 | static func fromAny(_ anyValue: Any) -> HKQuantityWrapper? {
23 | // Convert dictionary back to HKQuantity
24 | guard let dict = anyValue as? [String: Any],
25 | let unitString = dict["unit"] as? String,
26 | let value = dict["value"] as? Double else {
27 | return nil
28 | }
29 |
30 | let unit = HKUnit(from: unitString)
31 | let quantity = HKQuantity(unit: unit, doubleValue: value)
32 | return HKQuantityWrapper(quantity: quantity)
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/LoopFollow/Extensions/UIViewExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewExtension.swift
3 | // LoopFollow
4 | //
5 | // Created by Jose Paredes on 7/16/20.
6 | // Copyright © 2020 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import UIKit
11 |
12 | extension UIView {
13 | enum ViewSide {
14 | case Left, Right, Top, Bottom
15 | }
16 |
17 | func addBorder(toSide side: ViewSide, withColor color: CGColor, andThickness thickness: CGFloat) {
18 | let border = CALayer()
19 | border.backgroundColor = color
20 |
21 | switch side {
22 | case .Left: border.frame = CGRect(x:0, y: 0, width: thickness, height: frame.height); break
23 | case .Right: border.frame = CGRect(x: frame.width-thickness, y: 0, width: thickness, height: frame.height); break
24 | case .Top: border.frame = CGRect(x: 0, y: 0, width: frame.width, height: thickness); break
25 | case .Bottom: border.frame = CGRect(x: 0, y: frame.height-thickness, width: frame.width, height: thickness); break
26 | }
27 | layer.addSublayer(border)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/AppConstants.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppConstants.swift
3 | // scoutwatch
4 | //
5 | // Created by Dirk Hermanns on 26.12.15.
6 | // Copyright © 2015 private. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | // Class that contains general constants used in different classes
12 | class AppConstants {
13 | internal static let APP_GROUP_ID = "group.com.$(unique_id).LoopFollow"
14 | }
15 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/GitHubService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GitHubService.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-05-11.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class GitHubService {
12 | enum GitHubDataType {
13 | case versionConfig
14 | case blacklistedVersions
15 |
16 | var url: String {
17 | switch self {
18 | case .versionConfig:
19 | return "https://raw.githubusercontent.com/loopandlearn/LoopFollow/main/Config.xcconfig"
20 | case .blacklistedVersions:
21 | return "https://raw.githubusercontent.com/loopandlearn/LoopFollow/main/blacklisted-versions.json"
22 | }
23 | }
24 | }
25 |
26 | func fetchData(for dataType: GitHubDataType, completion: @escaping (Data?) -> Void) {
27 | let urlString = dataType.url
28 | guard let url = URL(string: urlString) else {
29 | completion(nil)
30 | return
31 | }
32 |
33 | URLSession.shared.dataTask(with: url) { data, response, error in
34 | guard let data = data, error == nil else {
35 | completion(nil)
36 | return
37 | }
38 | if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
39 | completion(data)
40 | } else {
41 | completion(nil)
42 | }
43 | }.resume()
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/Globals.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Globals.swift
3 | // LoopFollow
4 | //
5 | // Created by Jon Fawcett on 7/23/20.
6 | // Copyright © 2020 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | struct globalVariables {
13 | static var debugLog = ""
14 |
15 | // Graph Settings
16 | static let dotBG: Float = 3
17 | static let dotCarb: Float = 5
18 | static let dotBolus: Float = 5
19 | static let dotOther: Float = 5
20 | }
21 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/GlucoseConversion.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GlucoseConversion.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-04-28.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct GlucoseConversion {
12 | static let mgDlToMmolL: Double = 0.0555
13 | static let mmolToMgDl: Double = 18.01559
14 | }
15 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/ObservationToken.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservationToken.swift
3 | // nightguard
4 | //
5 | // Created by Florian Preknya on 1/30/19.
6 | // Copyright © 2019 private. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /// The token received by an observe when subscribes to its subject. The observer can cancel observation, so the subject will remove it from its observers list.
12 | class ObservationToken {
13 |
14 | private let cancellationClosure: () -> Void
15 |
16 | init(cancellationClosure: @escaping () -> Void) {
17 | self.cancellationClosure = cancellationClosure
18 | }
19 |
20 | func cancel() {
21 | cancellationClosure()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/Views/ErrorMessageView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ErrorMessageView.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-31.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import SwiftUI
11 |
12 | struct ErrorMessageView: View {
13 | var message: String
14 | var buttonTitle: String?
15 | var buttonAction: (() -> Void)?
16 |
17 | var body: some View {
18 | VStack(spacing: 20) {
19 | Text(message)
20 | .foregroundColor(.red)
21 | .multilineTextAlignment(.center)
22 | .padding()
23 | .background(
24 | RoundedRectangle(cornerRadius: 10)
25 | .fill(Color.white)
26 | .shadow(color: .gray, radius: 5, x: 0, y: 2)
27 | )
28 | .padding()
29 |
30 | if let buttonTitle = buttonTitle, let buttonAction = buttonAction {
31 | Button(action: buttonAction) {
32 | Text(buttonTitle)
33 | .frame(maxWidth: .infinity)
34 | .padding()
35 | .background(Color.blue)
36 | .foregroundColor(.white)
37 | .cornerRadius(8)
38 | }
39 | }
40 | }
41 | .padding()
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/Views/HKQuantityInputView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HKQuantityInputView.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-09-17.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import SwiftUI
11 | import HealthKit
12 |
13 | struct HKQuantityInputView: View {
14 | var label: String
15 | @Binding var quantity: HKQuantity
16 | var unit: HKUnit
17 | var maxLength: Int
18 | var minValue: HKQuantity
19 | var maxValue: HKQuantity
20 | @FocusState.Binding var isFocused: Bool
21 |
22 | var onValidationError: (String) -> Void
23 |
24 | var body: some View {
25 | HStack {
26 | Text(label)
27 | Spacer()
28 | TextFieldWithToolBar(
29 | quantity: $quantity,
30 | maxLength: maxLength,
31 | unit: unit,
32 | minValue: minValue,
33 | maxValue: maxValue,
34 | onValidationError: onValidationError
35 | )
36 | .focused($isFocused)
37 | Text(unit.localizedShortUnitString)
38 | .foregroundColor(.secondary)
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/LoopFollow/Helpers/Views/LoadingButtonView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingButtonView.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-09-17.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct LoadingButtonView: View {
12 | var buttonText: String
13 | var progressText: String
14 | var isLoading: Bool
15 | var action: () -> Void
16 | var isDisabled: Bool = false
17 |
18 | var body: some View {
19 | Section {
20 | VStack {
21 | if isLoading {
22 | HStack {
23 | ProgressView()
24 | .padding(.trailing, 10)
25 | Text(progressText)
26 | }
27 | .padding()
28 | } else {
29 | Button(action: {
30 | action()
31 | }) {
32 | Text(buttonText)
33 | .frame(maxWidth: .infinity)
34 | }
35 | .buttonStyle(.borderedProminent)
36 | .controlSize(.large)
37 | .disabled(isDisabled)
38 | }
39 | }
40 | .frame(maxWidth: .infinity, alignment: .center)
41 | .listRowInsets(EdgeInsets())
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/LoopFollow/InfoDisplaySettings/InfoDisplaySettingsViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InfoDisplaySettingsViewModel.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-08-05.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import SwiftUI
11 |
12 | class InfoDisplaySettingsViewModel: ObservableObject {
13 | @Published var infoSort: [Int]
14 | @Published var infoVisible: [Bool]
15 |
16 | init() {
17 | self.infoSort = UserDefaultsRepository.infoSort.value
18 | self.infoVisible = UserDefaultsRepository.infoVisible.value
19 | }
20 |
21 | func toggleVisibility(for sortedIndex: Int) {
22 | infoVisible[sortedIndex].toggle()
23 | UserDefaultsRepository.infoVisible.value = infoVisible
24 | }
25 |
26 | func move(from source: IndexSet, to destination: Int) {
27 | infoSort.move(fromOffsets: source, toOffset: destination)
28 | UserDefaultsRepository.infoSort.value = infoSort
29 | }
30 |
31 | func getName(for index: Int) -> String {
32 | guard let infoType = InfoType(rawValue: index) else {
33 | return "Unknown"
34 | }
35 | return infoType.name
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/LoopFollow/InfoTable/InfoData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InfoData.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-11.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class InfoData {
12 | var name: String
13 | var value: String
14 |
15 | init(name: String, value: String = "") {
16 | self.name = name
17 | self.value = value
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/LoopFollow/InfoTable/InfoDataSeparator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InfoDataSeparator.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-16.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | enum InfoDataSeparator: String {
12 | case arrow = "→"
13 | case slash = "/"
14 | case dash = "-"
15 | }
16 |
--------------------------------------------------------------------------------
/LoopFollow/Log/LogEntry.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LogEntry.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-13.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct LogEntry: Identifiable {
12 | let id: UUID
13 | let text: String
14 | }
15 |
--------------------------------------------------------------------------------
/LoopFollow/Log/SearchBar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SearchBar.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-13.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import UIKit
11 |
12 | struct SearchBar: UIViewRepresentable {
13 | @Binding var text: String
14 |
15 | class Coordinator: NSObject, UISearchBarDelegate {
16 | @Binding var text: String
17 |
18 | init(text: Binding) {
19 | _text = text
20 | }
21 |
22 | func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
23 | text = searchText
24 | }
25 |
26 | func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
27 | searchBar.resignFirstResponder()
28 | }
29 | }
30 |
31 | func makeCoordinator() -> Coordinator {
32 | return Coordinator(text: $text)
33 | }
34 |
35 | func makeUIView(context: UIViewRepresentableContext) -> UISearchBar {
36 | let searchBar = UISearchBar(frame: .zero)
37 | searchBar.placeholder = "Search Log"
38 | searchBar.delegate = context.coordinator
39 | searchBar.autocapitalizationType = .none
40 | searchBar.searchBarStyle = .minimal
41 | return searchBar
42 | }
43 |
44 | func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext) {
45 | uiView.text = text
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/LoopFollow/Loop Follow.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.device.bluetooth
8 |
9 | com.apple.security.network.client
10 |
11 | com.apple.security.personal-information.calendars
12 |
13 | com.apple.security.personal-information.photos-library
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/LoopFollow/LoopFollow.xcdatamodeld/.xccurrentversion:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | _XCCurrentVersionName
6 | LoopFollow.xcdatamodel
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LoopFollow/LoopFollow.xcdatamodeld/LoopFollow.xcdatamodel/contents:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/LoopFollow/Metric/CarbMetric.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CarbMetric.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-17.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class CarbMetric: Metric {
12 | init?(from dictionary: [String: AnyObject], key: String) {
13 | guard let value = dictionary[key] as? Double else {
14 | return nil
15 | }
16 | super.init(value: value, maxFractionDigits: 0, minFractionDigits: 0)
17 | }
18 |
19 | init?(from object: AnyObject?, key: String) {
20 | guard let dictionary = object as? [String: AnyObject], let value = dictionary[key] as? Double else {
21 | return nil
22 | }
23 | super.init(value: value, maxFractionDigits: 0, minFractionDigits: 0)
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/LoopFollow/Metric/InsulinMetric.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InsulinMetric.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-17.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class InsulinMetric: Metric {
12 | init?(from dictionary: [String: AnyObject], key: String) {
13 | guard let value = dictionary[key] as? Double else {
14 | return nil
15 | }
16 | super.init(value: value, maxFractionDigits: 2, minFractionDigits: 0)
17 | }
18 |
19 | init?(from object: AnyObject?, key: String) {
20 | guard let dictionary = object as? [String: AnyObject], let value = dictionary[key] as? Double else {
21 | return nil
22 | }
23 | super.init(value: value, maxFractionDigits: 2, minFractionDigits: 0)
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/LoopFollow/Metric/Metric.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Metric.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-17.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Metric {
12 | var value: Double
13 | var maxFractionDigits: Int
14 | var minFractionDigits: Int
15 |
16 | init(value: Double, maxFractionDigits: Int, minFractionDigits: Int) {
17 | self.value = value
18 | self.maxFractionDigits = maxFractionDigits
19 | self.minFractionDigits = minFractionDigits
20 | }
21 |
22 | func formattedValue() -> String {
23 | return Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/LoopFollow/Remote/Loop/LoopNightscoutRemoteView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoopNightscoutRemoteView.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-14.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct LoopNightscoutRemoteView: View {
12 | @Environment(\.presentationMode) var presentationMode
13 | @ObservedObject var nsAdmin = ObservableUserDefaults.shared.nsWriteAuth
14 |
15 | var body: some View {
16 | NavigationView {
17 | if !nsAdmin.value {
18 | ErrorMessageView(
19 | message: "Please update your token to include the 'admin' role in order to do remote commands with Loop."
20 | )} else {
21 | VStack {
22 | let columns = [
23 | GridItem(.flexible(), spacing: 16),
24 | GridItem(.flexible(), spacing: 16)
25 | ]
26 |
27 | LazyVGrid(columns: columns, spacing: 16) {
28 | CommandButtonView(command: "Overrides", iconName: "slider.horizontal.3", destination: LoopOverrideView())
29 | }
30 | .padding(.horizontal)
31 |
32 | Spacer()
33 | }
34 | .navigationBarTitle("Loop Remote Control", displayMode: .inline)
35 | }
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Remote/NoRemoteView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NoRemoteView.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-14.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct NoRemoteView: View {
12 | private let remoteController = TrioNightscoutRemoteController()
13 |
14 | var body: some View {
15 | NavigationView {
16 | VStack {
17 | ErrorMessageView(
18 | message: "Remote commands are currently only available for Trio and Loop."
19 | )
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/LoopFollow/Remote/RemoteType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RemoteType.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-08-18.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | enum RemoteType: String, Codable {
12 | case none = "None"
13 | case nightscout = "Nightscout"
14 | case trc = "Trio Remote Control"
15 | }
16 |
--------------------------------------------------------------------------------
/LoopFollow/Remote/TRC/TRCCommandType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TRCCommandType.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-10-05.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | enum TRCCommandType: String {
12 | case bolus = "bolus"
13 | case tempTarget = "temp_target"
14 | case cancelTempTarget = "cancel_temp_target"
15 | case meal = "meal"
16 | case startOverride = "start_override"
17 | case cancelOverride = "cancel_override"
18 | }
19 |
--------------------------------------------------------------------------------
/LoopFollow/Remote/TRC/TreatmentResponse.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TreatmentResponse.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-24.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct TreatmentResponse: Decodable {
12 | let enteredBy: String
13 | let eventType: String
14 | let reason: String
15 | let targetTop: Double
16 | let targetBottom: Double
17 | let duration: Int
18 | let createdAt: String
19 | let utcOffset: Int
20 | let id: String
21 |
22 | enum CodingKeys: String, CodingKey {
23 | case enteredBy = "enteredBy"
24 | case eventType = "eventType"
25 | case reason = "reason"
26 | case targetTop = "targetTop"
27 | case targetBottom = "targetBottom"
28 | case duration = "duration"
29 | case createdAt = "created_at"
30 | case utcOffset = "utcOffset"
31 | case id = "_id"
32 | }
33 | }
34 |
35 | struct TreatmentCancelResponse: Decodable {
36 | let enteredBy: String
37 | let eventType: String
38 | let reason: String
39 | let duration: Int
40 | let createdAt: String
41 | let utcOffset: Int
42 | let id: String
43 |
44 | enum CodingKeys: String, CodingKey {
45 | case enteredBy = "enteredBy"
46 | case eventType = "eventType"
47 | case reason = "reason"
48 | case duration = "duration"
49 | case createdAt = "created_at"
50 | case utcOffset = "utcOffset"
51 | case id = "_id"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/LoopFollow/Remote/TRC/TrioRemoteControlViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TrioRemoteControlViewModel.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-08-25.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class TrioRemoteControlViewModel: ObservableObject {
12 | }
13 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/1-millisecond-of-silence.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/1-millisecond-of-silence.mp3
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/20ms-of-silence.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/20ms-of-silence.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/500ms-of-silence.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/500ms-of-silence.mp3
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Alarm_Buzzer.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alarm_Buzzer.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Alarm_Clock.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alarm_Clock.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Busy.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Busy.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_1.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_1.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_2.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alert_Tone_Ringtone_2.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Alien_Siren.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Alien_Siren.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Ambulance.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Ambulance.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Analog_Watch_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Analog_Watch_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Big_Clock_Ticking.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Big_Clock_Ticking.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_1.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_1.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_2.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Burglar_Alarm_Siren_2.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/CSFX-2_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/CSFX-2_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Climb_Sneaky.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Climb_Sneaky.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Then_Descend.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Ascend_Then_Descend.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Bounce_To_Ceiling.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Bounce_To_Ceiling.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Dreamy_Glissando_Harp.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Dreamy_Glissando_Harp.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Fail_Strings_Trumpet.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Fail_Strings_Trumpet.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Machine_Clumsy_Loop.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Machine_Clumsy_Loop.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Siren.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Siren.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Tip_Toe_Sneaky_Walk.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Tip_Toe_Sneaky_Walk.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Uh_Oh.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Uh_Oh.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cartoon_Villain_Horns.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cartoon_Villain_Horns.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cell_Phone_Ring_Tone.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cell_Phone_Ring_Tone.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Chimes_Glassy.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Chimes_Glassy.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Computer_Magic.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Computer_Magic.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Cuckoo_Clock.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Cuckoo_Clock.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Dhol_Shuffleloop.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Dhol_Shuffleloop.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Discreet.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Discreet.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Early_Sunrise.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Early_Sunrise.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Carbon_Monoxide.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Carbon_Monoxide.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Siren.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Emergency_Alarm_Siren.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Ending_Reached.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Ending_Reached.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Fly.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Fly.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Ghost_Hover.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Ghost_Hover.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Good_Morning.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Good_Morning.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Hell_Yeah_Somewhat_Calmer.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Hell_Yeah_Somewhat_Calmer.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/In_A_Hurry.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/In_A_Hurry.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Indeed.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Indeed.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Insistently.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Insistently.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Jingle_All_The_Way.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Jingle_All_The_Way.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Laser_Shoot.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Laser_Shoot.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Machine_Charge.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Machine_Charge.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Magical_Twinkle.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Magical_Twinkle.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Marching_Heavy_Footed_Fat_Elephants.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Marching_Heavy_Footed_Fat_Elephants.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Marimba_Descend.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Marimba_Descend.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Marimba_Flutter_or_Shake.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Marimba_Flutter_or_Shake.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Martian_Gun.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Martian_Gun.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Martian_Scanner.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Martian_Scanner.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Metallic.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Metallic.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Nightguard.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Nightguard.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Not_Kiddin.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Not_Kiddin.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Open_Your_Eyes_And_See.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Open_Your_Eyes_And_See.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Orchestral_Horns.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Orchestral_Horns.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Oringz.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Oringz.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Pager_Beeps.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Pager_Beeps.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Remembers_Me_Of_Asia.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Remembers_Me_Of_Asia.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Rise_And_Shine.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Rise_And_Shine.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Rush.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Rush.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Air_Raid_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Air_Raid_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_1.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_1.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_2.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_2.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_3.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_3.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_4.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Alarm_Loop_4.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Computer_Console_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Computer_Console_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Console_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Console_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Eerie_Alarm.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Eerie_Alarm.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Engine_Shut_Down.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Engine_Shut_Down.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Incoming_Message_Alert.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Incoming_Message_Alert.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Message.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Message.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Warm_Up.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Spaceship_Warm_Up.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Warning.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sci-Fi_Warning.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Signature_Corporate.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Signature_Corporate.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Calibration_Needed.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Calibration_Needed.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Device_Muted.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Device_Muted.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Dropping_Fast.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Dropping_Fast.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Rising_Fast.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Glucose_Rising_Fast.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_High_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_High_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Low_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Low_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Missed_Readings.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Missed_Readings.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Transmitter_Battery_Low.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Transmitter_Battery_Low.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_High_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_High_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_Low_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Alert_Urgent_Low_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Calibration_Needed.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Calibration_Needed.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Device_Muted.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Device_Muted.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Dropping_Fast.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Dropping_Fast.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Rising_Fast.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Glucose_Rising_Fast.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_High_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_High_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Low_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Low_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Missed_Readings.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Missed_Readings.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Transmitter_Battery_Low.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Transmitter_Battery_Low.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Urgent_High_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Urgent_High_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Siri_Urgent_Low_Glucose.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Siri_Urgent_Low_Glucose.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Soft_Marimba_Pad_Positive.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Soft_Marimba_Pad_Positive.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Optimistic.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Optimistic.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Reassuring.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Soft_Warm_Airy_Reassuring.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Store_Door_Chime.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Store_Door_Chime.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Sunny.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Sunny.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Thunder_Sound_FX.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Thunder_Sound_FX.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Time_Has_Come.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Time_Has_Come.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Tornado_Siren.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Tornado_Siren.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Two_Turtle_Doves.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Two_Turtle_Doves.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Unpaved.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Unpaved.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Wake_Up_Will_You.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Wake_Up_Will_You.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Win_Gain.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Win_Gain.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/Wrong_Answer.caf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/Wrong_Answer.caf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/alarm-notification.m4a:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/alarm-notification.m4a
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/alarm.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/alarm.mp3
--------------------------------------------------------------------------------
/LoopFollow/Resources/Alarm Sounds/silence-1sec.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Alarm Sounds/silence-1sec.mp3
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120-1.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/120.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/152.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/167.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/180.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/20.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/29.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-1.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40-2.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/40.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58-1.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/58.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/60.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/76.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80-1.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/80.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/AppIcon.appiconset/87.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "0.500",
8 | "blue" : "0.988",
9 | "green" : "0.588",
10 | "red" : "0.118"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "0.500",
26 | "blue" : "0.988",
27 | "green" : "0.588",
28 | "red" : "0.118"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "1.000",
9 | "green" : "0.288",
10 | "red" : "0.118"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "1.000",
27 | "green" : "0.288",
28 | "red" : "0.118"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/Insulin.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.988",
9 | "green" : "0.588",
10 | "red" : "0.118"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.988",
27 | "green" : "0.588",
28 | "red" : "0.118"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/Lemon.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.089",
9 | "green" : "0.940",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.089",
27 | "green" : "0.940",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/LoopGray.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.741",
9 | "green" : "0.741",
10 | "red" : "0.741"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.741",
27 | "green" : "0.741",
28 | "red" : "0.741"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/LoopGreen.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.592",
9 | "green" : "0.812",
10 | "red" : "0.435"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.592",
27 | "green" : "0.812",
28 | "red" : "0.435"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/LoopPink.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.796",
9 | "green" : "0.750",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.796",
27 | "green" : "0.750",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/LoopRed.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.341",
9 | "green" : "0.341",
10 | "red" : "0.922"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.341",
27 | "green" : "0.341",
28 | "red" : "0.922"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/LoopYellow.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.271",
9 | "green" : "0.757",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.271",
27 | "green" : "0.757",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/ManualTempBasal.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.988",
9 | "green" : "0.588",
10 | "red" : "0.118"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.988",
27 | "green" : "0.588",
28 | "red" : "0.118"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/NonPumpInsulin.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "250",
9 | "green" : "213",
10 | "red" : "63"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "250",
27 | "green" : "213",
28 | "red" : "63"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/SMB.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "194",
9 | "green" : "117",
10 | "red" : "58"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "194",
27 | "green" : "117",
28 | "red" : "58"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/TempBasal.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "0.500",
8 | "blue" : "0.976",
9 | "green" : "0.839",
10 | "red" : "0.635"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.988",
27 | "green" : "0.588",
28 | "red" : "0.118"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/UAM.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.271",
9 | "green" : "0.518",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.271",
27 | "green" : "0.518",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/ZT.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.937",
9 | "green" : "0.380",
10 | "red" : "0.443"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.937",
27 | "green" : "0.380",
28 | "red" : "0.443"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/darkGray.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "extended-gray",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "white" : "0.145"
9 | }
10 | },
11 | "idiom" : "universal"
12 | },
13 | {
14 | "appearances" : [
15 | {
16 | "appearance" : "luminosity",
17 | "value" : "dark"
18 | }
19 | ],
20 | "color" : {
21 | "color-space" : "extended-gray",
22 | "components" : {
23 | "alpha" : "1.000",
24 | "white" : "0.145"
25 | }
26 | },
27 | "idiom" : "universal"
28 | }
29 | ],
30 | "info" : {
31 | "author" : "xcode",
32 | "version" : 1
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/minus.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.976",
9 | "green" : "0.839",
10 | "red" : "0.635"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.976",
27 | "green" : "0.839",
28 | "red" : "0.635"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Colors/warning.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "display-p3",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.269",
9 | "green" : "0.763",
10 | "red" : "0.917"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "platform" : "ios",
24 | "reference" : "systemYellowColor"
25 | },
26 | "idiom" : "universal"
27 | }
28 | ],
29 | "info" : {
30 | "author" : "xcode",
31 | "version" : 1
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/first.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "first.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | }
12 | }
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/first.imageset/first.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/first.imageset/first.pdf
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/second.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "second.pdf"
6 | }
7 | ],
8 | "info" : {
9 | "version" : 1,
10 | "author" : "xcode"
11 | }
12 | }
--------------------------------------------------------------------------------
/LoopFollow/Resources/Assets.xcassets/second.imageset/second.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/Assets.xcassets/second.imageset/second.pdf
--------------------------------------------------------------------------------
/LoopFollow/Resources/blank.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/blank.wav
--------------------------------------------------------------------------------
/LoopFollow/Resources/dragbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/dragbar.png
--------------------------------------------------------------------------------
/LoopFollow/Resources/silence.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/loopandlearn/LoopFollow/cca9730eaec2c2384ca2bad3748511d3b68184f0/LoopFollow/Resources/silence.mp3
--------------------------------------------------------------------------------
/LoopFollow/Storage/Observable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-25.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import HealthKit
11 |
12 | class Observable {
13 | static let shared = Observable()
14 |
15 | var tempTarget = ObservableValue(default: nil)
16 | var override = ObservableValue(default: nil)
17 | var lastRecBolusTriggered = ObservableValue(default: nil)
18 |
19 | private init() {}
20 | }
21 |
--------------------------------------------------------------------------------
/LoopFollow/Storage/ObservableUserDefaults.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableUserDefaults.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-24.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 |
12 | class ObservableUserDefaults {
13 | static let shared = ObservableUserDefaults()
14 |
15 | var url = ObservableUserDefaultsValue(key: "url", default: "")
16 | var device = ObservableUserDefaultsValue(key: "device", default: "")
17 | var nsWriteAuth = ObservableUserDefaultsValue(key: "nsWriteAuth", default: false)
18 | var nsAdminAuth = ObservableUserDefaultsValue(key: "nsAdminAuth", default: false)
19 |
20 | private init() {}
21 | }
22 |
--------------------------------------------------------------------------------
/LoopFollow/Storage/ObservableValue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableValue.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-07-25.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 | import HealthKit
12 | import SwiftUI
13 |
14 | class ObservableValue: ObservableObject {
15 | @Published var value: T
16 |
17 | init(default: T) {
18 | self.value = `default`
19 | }
20 |
21 | func set(_ newValue: T) {
22 | print("Setting new value: \(newValue)")
23 | DispatchQueue.main.async {
24 | self.value = newValue
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/LoopFollow/Storage/SecureStorageValue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SecureStorageValue.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-09-16.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 |
12 | class SecureStorageValue: ObservableObject {
13 | let key: String
14 |
15 | @Published var value: T {
16 | didSet {
17 | guard self.value != oldValue else { return }
18 | if let data = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true) {
19 | SecureStorageValue.defaults.set(data, forKey: key)
20 | }
21 | }
22 | }
23 |
24 | var exists: Bool {
25 | return SecureStorageValue.defaults.object(forKey: key) != nil
26 | }
27 |
28 | private static var defaults: UserDefaults {
29 | return UserDefaults.standard
30 | }
31 |
32 | init(key: String, defaultValue: T) {
33 | self.key = key
34 | if let data = SecureStorageValue.defaults.data(forKey: key),
35 | let decodedValue = try? NSKeyedUnarchiver.unarchivedObject(ofClass: T.self, from: data) {
36 | self.value = decodedValue
37 | } else {
38 | self.value = defaultValue
39 | }
40 | }
41 |
42 | func remove() {
43 | SecureStorageValue.defaults.removeObject(forKey: key)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/LoopFollow/Storage/StorageValue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StorageValue.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2024-08-25.
6 | // Copyright © 2024 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 |
12 | class StorageValue: ObservableObject {
13 | let key: String
14 |
15 | @Published var value: T {
16 | didSet {
17 | guard self.value != oldValue else { return }
18 |
19 | if let encodedData = try? JSONEncoder().encode(value) {
20 | StorageValue.defaults.set(encodedData, forKey: key)
21 | }
22 | }
23 | }
24 |
25 | var exists: Bool {
26 | return StorageValue.defaults.object(forKey: key) != nil
27 | }
28 |
29 | private static var defaults: UserDefaults {
30 | return UserDefaults.standard
31 | }
32 |
33 | init(key: String, defaultValue: T) {
34 | self.key = key
35 |
36 | if let data = StorageValue.defaults.data(forKey: key),
37 | let decodedValue = try? JSONDecoder().decode(T.self, from: data) {
38 | self.value = decodedValue
39 | } else {
40 | self.value = defaultValue
41 | }
42 | }
43 |
44 | func remove() {
45 | StorageValue.defaults.removeObject(forKey: key)
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/LoopFollow/Storage/UserData.xcdatamodeld/UserData.xcdatamodel/contents:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LoopFollow/Task/AlarmTask.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AlarmTask.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-12.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 | func scheduleAlarmTask(initialDelay: TimeInterval = 30) {
13 | let firstRun = Date().addingTimeInterval(initialDelay)
14 | TaskScheduler.shared.scheduleTask(id: .alarmCheck, nextRun: firstRun) { [weak self] in
15 | guard let self = self else { return }
16 | self.alarmTaskAction()
17 | }
18 | }
19 |
20 | func alarmTaskAction() {
21 | DispatchQueue.main.async {
22 | if self.bgData.count > 0 {
23 | self.checkAlarms(bgs: self.bgData)
24 | }
25 | if self.overrideGraphData.count > 0 {
26 | self.checkOverrideAlarms()
27 | }
28 | if self.tempTargetGraphData.count > 0 {
29 | self.checkTempTargetAlarms()
30 | }
31 |
32 | TaskScheduler.shared.rescheduleTask(id: .alarmCheck, to: Date().addingTimeInterval(30))
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/LoopFollow/Task/BGTask.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BGTask.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-11.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 | func scheduleBGTask(initialDelay: TimeInterval = 2) {
13 | let firstRun = Date().addingTimeInterval(initialDelay)
14 | TaskScheduler.shared.scheduleTask(id: .fetchBG, nextRun: firstRun) { [weak self] in
15 | guard let self = self else { return }
16 | self.bgTaskAction()
17 | }
18 | }
19 |
20 | func bgTaskAction() {
21 | // If anything goes wrong, try again in 60 seconds.
22 | TaskScheduler.shared.rescheduleTask(
23 | id: .fetchBG,
24 | to: Date().addingTimeInterval(60)
25 | )
26 |
27 | // If no Dexcom credentials and no Nightscout, schedule a retry in 60 seconds.
28 | if UserDefaultsRepository.shareUserName.value == "",
29 | UserDefaultsRepository.sharePassword.value == "",
30 | !IsNightscoutEnabled()
31 | {
32 | return
33 | }
34 |
35 | // If Dexcom credentials exist, fetch from DexShare
36 | if UserDefaultsRepository.shareUserName.value != "" &&
37 | UserDefaultsRepository.sharePassword.value != ""
38 | {
39 | self.webLoadDexShare()
40 | } else {
41 | self.webLoadNSBGData()
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/LoopFollow/Task/CalendarTask.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CalendarTask.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-12.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 | func scheduleCalendarTask(initialDelay: TimeInterval = 15) {
13 | let startTime = Date().addingTimeInterval(initialDelay)
14 | TaskScheduler.shared.scheduleTask(id: .calendarWrite, nextRun: startTime) { [weak self] in
15 | guard let self = self else { return }
16 | self.calendarTaskAction()
17 | }
18 | }
19 |
20 | func calendarTaskAction() {
21 | if UserDefaultsRepository.writeCalendarEvent.value,
22 | !UserDefaultsRepository.calendarIdentifier.value.isEmpty
23 | {
24 | self.writeCalendar()
25 | }
26 |
27 | TaskScheduler.shared.rescheduleTask(id: .calendarWrite, to: Date().addingTimeInterval(30))
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/LoopFollow/Task/DeviceStatusTask.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DeviceStatusTask.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-11.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 | func scheduleDeviceStatusTask(initialDelay: TimeInterval = 4) {
13 | let startTime = Date().addingTimeInterval(initialDelay)
14 | TaskScheduler.shared.scheduleTask(id: .deviceStatus, nextRun: startTime) { [weak self] in
15 | guard let self = self else { return }
16 | self.deviceStatusAction()
17 | }
18 | }
19 |
20 | func deviceStatusAction() {
21 | // If no NS config, we wait 60s before trying again:
22 | guard IsNightscoutEnabled() else {
23 | TaskScheduler.shared.rescheduleTask(id: .deviceStatus, to: Date().addingTimeInterval(60))
24 | return
25 | }
26 |
27 | webLoadNSDeviceStatus()
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/LoopFollow/Task/ProfileTask.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ProfileTask.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-11.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 | func scheduleProfileTask(initialDelay: TimeInterval = 3) {
13 | let firstRun = Date().addingTimeInterval(initialDelay)
14 |
15 | TaskScheduler.shared.scheduleTask(id: .profile, nextRun: firstRun) { [weak self] in
16 | guard let self = self else { return }
17 | self.profileTaskAction()
18 | }
19 | }
20 |
21 | func profileTaskAction() {
22 | guard IsNightscoutEnabled() else {
23 | TaskScheduler.shared.rescheduleTask(id: .profile, to: Date().addingTimeInterval(60))
24 | return
25 | }
26 |
27 | self.webLoadNSProfile()
28 |
29 | TaskScheduler.shared.rescheduleTask(id: .profile, to: Date().addingTimeInterval(10 * 60))
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/LoopFollow/Task/Task.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Task.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-12.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 |
13 | func scheduleAllTasks() {
14 | scheduleBGTask()
15 | scheduleProfileTask()
16 | scheduleDeviceStatusTask()
17 | scheduleTreatmentsTask()
18 | scheduleMinAgoTask()
19 | scheduleCalendarTask()
20 | scheduleAlarmTask()
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/LoopFollow/Task/TreatmentsTask.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TreatmentsTask.swift
3 | // LoopFollow
4 | //
5 | // Created by Jonas Björkert on 2025-01-11.
6 | // Copyright © 2025 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension MainViewController {
12 | func scheduleTreatmentsTask(initialDelay: TimeInterval = 5) {
13 | let firstRun = Date().addingTimeInterval(initialDelay)
14 | TaskScheduler.shared.scheduleTask(id: .treatments, nextRun: firstRun) { [weak self] in
15 | guard let self = self else { return }
16 | self.treatmentsTaskAction()
17 | }
18 | }
19 |
20 | func treatmentsTaskAction() {
21 | // If Nightscout not enabled, wait 60s and try again
22 | guard IsNightscoutEnabled(), UserDefaultsRepository.downloadTreatments.value else {
23 | TaskScheduler.shared.rescheduleTask(id: .treatments, to: Date().addingTimeInterval(60))
24 | return
25 | }
26 |
27 | WebLoadNSTreatments()
28 |
29 | TaskScheduler.shared.rescheduleTask(id: .treatments, to: Date().addingTimeInterval(2 * 60))
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/LoopFollow/ViewControllers/AppStateViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppStateViewController.swift
3 | // LoopFollow
4 | //
5 | // Created by Jose Paredes on 7/17/20.
6 | // Copyright © 2020 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class AppStateViewController {
12 | var appStateController: AppStateController?
13 | }
14 |
--------------------------------------------------------------------------------
/LoopFollow/ViewControllers/DebugViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DebugViewController.swift
3 | // LoopFollow
4 | //
5 | // Created by Jon Fawcett on 6/29/20.
6 | // Copyright © 2020 Jon Fawcett. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import UIKit
11 |
12 | class debugViewController: UIViewController {
13 |
14 |
15 | var appStateController: AppStateController?
16 |
17 | override func viewDidLoad() {
18 | super.viewDidLoad()
19 |
20 | }
21 |
22 |
23 |
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/LoopFollowDisplayNameConfig.xcconfig:
--------------------------------------------------------------------------------
1 | //
2 | // LoopFollowDisplayNameConfig.xcconfig
3 | //
4 | // Use this file to configure instance-specific settings for LoopFollow.
5 | //
6 |
7 | // App Suffix: Used to differentiate AppGroupIdentifier between different app instances.
8 | app_suffix =
9 |
10 | // Custom Display Name for Your LoopFollow App
11 | // ---------------------------------------------
12 | // The 'display_name' field allows you to personalize the name of this LoopFollow app instance.
13 | // This name appears on your device and helps to distinguish between different LoopFollow instances.
14 | //
15 | // How to Set:
16 | // 1. Replace 'LoopFollow' with the desired name of your app.
17 | // 2. Save the file and build the app for the changes to take effect.
18 | //
19 | display_name = LoopFollow
20 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | target 'LoopFollow' do
2 | use_frameworks!
3 |
4 | pod 'Charts'
5 | pod 'Eureka', :git => 'https://github.com/xmartlabs/Eureka.git'
6 | pod 'ShareClient', :git => 'https://github.com/loopandlearn/dexcom-share-client-swift.git', :branch => 'loopfollow'
7 |
8 | end
9 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Charts (4.1.0):
3 | - Charts/Core (= 4.1.0)
4 | - Charts/Core (4.1.0):
5 | - SwiftAlgorithms (~> 1.0)
6 | - Eureka (5.3.6)
7 | - ShareClient (1.2)
8 | - SwiftAlgorithms (1.0.0)
9 |
10 | DEPENDENCIES:
11 | - Charts
12 | - Eureka (from `https://github.com/xmartlabs/Eureka.git`)
13 | - ShareClient (from `https://github.com/loopandlearn/dexcom-share-client-swift.git`, branch `loopfollow`)
14 |
15 | SPEC REPOS:
16 | trunk:
17 | - Charts
18 | - SwiftAlgorithms
19 |
20 | EXTERNAL SOURCES:
21 | Eureka:
22 | :git: https://github.com/xmartlabs/Eureka.git
23 | ShareClient:
24 | :branch: loopfollow
25 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git
26 |
27 | CHECKOUT OPTIONS:
28 | Eureka:
29 | :commit: 044e31674d319c8edb19d993a5f8ea4e24641542
30 | :git: https://github.com/xmartlabs/Eureka.git
31 | ShareClient:
32 | :commit: d7a3323a014d41827ee177a92d528786f9f09e75
33 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git
34 |
35 | SPEC CHECKSUMS:
36 | Charts: ce0768268078eee0336f122c3c4ca248e4e204c5
37 | Eureka: 28ad9dec6286cd7cd601fdf8e8df39bb7356a8f4
38 | ShareClient: 60b911c95e73b0ea9c5aad6d194a9c6b5f34b741
39 | SwiftAlgorithms: 38dda4731d19027fdeee1125f973111bf3386b53
40 |
41 | PODFILE CHECKSUM: d241dda366d5454279fe3ff8869458d19e1bbebb
42 |
43 | COCOAPODS: 1.12.1
44 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Charts/BubbleChartView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BubbleChartView.swift
3 | // Charts
4 | //
5 | // Bubble chart implementation:
6 | // Copyright 2015 Pierre-Marc Airoldi
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | open class BubbleChartView: BarLineChartViewBase, BubbleChartDataProvider
16 | {
17 | open override func initialize()
18 | {
19 | super.initialize()
20 |
21 | renderer = BubbleChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler)
22 | }
23 |
24 | // MARK: - BubbleChartDataProvider
25 |
26 | open var bubbleData: BubbleChartData? { return data as? BubbleChartData }
27 | }
28 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Charts/CandleStickChartView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CandleStickChartView.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | /// Financial chart type that draws candle-sticks.
16 | open class CandleStickChartView: BarLineChartViewBase, CandleChartDataProvider
17 | {
18 | internal override func initialize()
19 | {
20 | super.initialize()
21 |
22 | renderer = CandleStickChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler)
23 |
24 | self.xAxis.spaceMin = 0.5
25 | self.xAxis.spaceMax = 0.5
26 | }
27 |
28 | // MARK: - CandleChartDataProvider
29 |
30 | open var candleData: CandleChartData?
31 | {
32 | return data as? CandleChartData
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Charts/LineChartView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LineChartView.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | /// Chart that draws lines, surfaces, circles, ...
16 | open class LineChartView: BarLineChartViewBase, LineChartDataProvider
17 | {
18 | internal override func initialize()
19 | {
20 | super.initialize()
21 |
22 | renderer = LineChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler)
23 | }
24 |
25 | // MARK: - LineChartDataProvider
26 |
27 | open var lineData: LineChartData? { return data as? LineChartData }
28 | }
29 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Charts/ScatterChartView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScatterChartView.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | /// The ScatterChart. Draws dots, triangles, squares and custom shapes into the chartview.
16 | open class ScatterChartView: BarLineChartViewBase, ScatterChartDataProvider
17 | {
18 | open override func initialize()
19 | {
20 | super.initialize()
21 |
22 | renderer = ScatterChartRenderer(dataProvider: self, animator: chartAnimator, viewPortHandler: viewPortHandler)
23 |
24 | xAxis.spaceMin = 0.5
25 | xAxis.spaceMax = 0.5
26 | }
27 |
28 | // MARK: - ScatterChartDataProvider
29 |
30 | open var scatterData: ScatterChartData? { return data as? ScatterChartData }
31 | }
32 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Components/ComponentBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ComponentBase.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 |
16 | /// This class encapsulates everything both Axis, Legend and LimitLines have in common
17 | @objc(ChartComponentBase)
18 | open class ComponentBase: NSObject
19 | {
20 | /// flag that indicates if this component is enabled or not
21 | @objc open var enabled = true
22 |
23 | /// The offset this component has on the x-axis
24 | /// **default**: 5.0
25 | @objc open var xOffset = CGFloat(5.0)
26 |
27 | /// The offset this component has on the x-axis
28 | /// **default**: 5.0 (or 0.0 on ChartYAxis)
29 | @objc open var yOffset = CGFloat(5.0)
30 |
31 | public override init()
32 | {
33 | super.init()
34 | }
35 |
36 | @objc open var isEnabled: Bool { return enabled }
37 | }
38 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Components/Description.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Description.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | #if canImport(UIKit)
16 | import UIKit
17 | #endif
18 |
19 | #if canImport(Cocoa)
20 | import Cocoa
21 | #endif
22 |
23 | @objc(ChartDescription)
24 | open class Description: ComponentBase
25 | {
26 | public override init()
27 | {
28 | #if os(tvOS)
29 | // 23 is the smallest recommended font size on the TV
30 | font = .systemFont(ofSize: 23)
31 | #elseif os(OSX)
32 | font = .systemFont(ofSize: NSUIFont.systemFontSize)
33 | #else
34 | font = .systemFont(ofSize: 8.0)
35 | #endif
36 |
37 | super.init()
38 | }
39 |
40 | /// The text to be shown as the description.
41 | @objc open var text: String?
42 |
43 | /// Custom position for the description text in pixels on the screen.
44 | open var position: CGPoint? = nil
45 |
46 | /// The text alignment of the description text. Default RIGHT.
47 | @objc open var textAlign: TextAlignment = TextAlignment.right
48 |
49 | /// Font object used for drawing the description text.
50 | @objc open var font: NSUIFont
51 |
52 | /// Text color used for drawing the description text
53 | @objc open var textColor = NSUIColor.labelOrBlack
54 | }
55 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BarLineScatterCandleBubbleChartData.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | open class BarLineScatterCandleBubbleChartData: ChartData
15 | {
16 | public required init()
17 | {
18 | super.init()
19 | }
20 |
21 | public override init(dataSets: [ChartDataSetProtocol])
22 | {
23 | super.init(dataSets: dataSets)
24 | }
25 |
26 | public required init(arrayLiteral elements: ChartDataSetProtocol...)
27 | {
28 | super.init(dataSets: elements)
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BarLineScatterCandleBubbleChartDataSet.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 |
16 | open class BarLineScatterCandleBubbleChartDataSet: ChartDataSet, BarLineScatterCandleBubbleChartDataSetProtocol
17 | {
18 | // MARK: - Data functions and accessors
19 |
20 | // MARK: - Styling functions and accessors
21 |
22 | open var highlightColor = NSUIColor(red: 255.0/255.0, green: 187.0/255.0, blue: 115.0/255.0, alpha: 1.0)
23 | open var highlightLineWidth = CGFloat(0.5)
24 | open var highlightLineDashPhase = CGFloat(0.0)
25 | open var highlightLineDashLengths: [CGFloat]?
26 |
27 | // MARK: - NSCopying
28 |
29 | open override func copy(with zone: NSZone? = nil) -> Any
30 | {
31 | let copy = super.copy(with: zone) as! BarLineScatterCandleBubbleChartDataSet
32 | copy.highlightColor = highlightColor
33 | copy.highlightLineWidth = highlightLineWidth
34 | copy.highlightLineDashPhase = highlightLineDashPhase
35 | copy.highlightLineDashLengths = highlightLineDashLengths
36 | return copy
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/BubbleChartData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BubbleChartData.swift
3 | // Charts
4 | //
5 | // Bubble chart implementation:
6 | // Copyright 2015 Pierre-Marc Airoldi
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | open class BubbleChartData: BarLineScatterCandleBubbleChartData
16 | {
17 | public required init()
18 | {
19 | super.init()
20 | }
21 |
22 | public override init(dataSets: [ChartDataSetProtocol])
23 | {
24 | super.init(dataSets: dataSets)
25 | }
26 |
27 | public required init(arrayLiteral elements: ChartDataSetProtocol...)
28 | {
29 | super.init(dataSets: elements)
30 | }
31 |
32 | /// Sets the width of the circle that surrounds the bubble when highlighted for all DataSet objects this data object contains
33 | @objc open func setHighlightCircleWidth(_ width: CGFloat)
34 | {
35 | (_dataSets as? [BubbleChartDataSetProtocol])?.forEach { $0.highlightCircleWidth = width }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/CandleChartData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CandleChartData.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | open class CandleChartData: BarLineScatterCandleBubbleChartData
15 | {
16 | public required init()
17 | {
18 | super.init()
19 | }
20 |
21 | public override init(dataSets: [ChartDataSetProtocol])
22 | {
23 | super.init(dataSets: dataSets)
24 | }
25 |
26 | public required init(arrayLiteral elements: ChartDataSetProtocol...)
27 | {
28 | super.init(dataSets: elements)
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/LineChartData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LineChartData.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | /// Data object that encapsulates all data associated with a LineChart.
15 | open class LineChartData: ChartData
16 | {
17 | public required init()
18 | {
19 | super.init()
20 | }
21 |
22 | public override init(dataSets: [ChartDataSetProtocol])
23 | {
24 | super.init(dataSets: dataSets)
25 | }
26 |
27 | public required init(arrayLiteral elements: ChartDataSetProtocol...)
28 | {
29 | super.init(dataSets: elements)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/RadarChartDataEntry.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RadarChartDataEntry.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | open class RadarChartDataEntry: ChartDataEntry
16 | {
17 | public required init()
18 | {
19 | super.init()
20 | }
21 |
22 | /// - Parameters:
23 | /// - value: The value on the y-axis.
24 | @objc public init(value: Double)
25 | {
26 | super.init(x: .nan, y: value)
27 | }
28 |
29 | /// - Parameters:
30 | /// - value: The value on the y-axis.
31 | /// - data: Spot for additional data this Entry represents.
32 | @objc public convenience init(value: Double, data: Any?)
33 | {
34 | self.init(value: value)
35 | self.data = data
36 | }
37 |
38 | // MARK: Data property accessors
39 |
40 | @objc open var value: Double
41 | {
42 | get { return y }
43 | set { y = newValue }
44 | }
45 |
46 | // MARK: NSCopying
47 |
48 | open override func copy(with zone: NSZone? = nil) -> Any
49 | {
50 | let copy = super.copy(with: zone) as! RadarChartDataEntry
51 |
52 | return copy
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Implementations/Standard/ScatterChartData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScatterChartData.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | open class ScatterChartData: BarLineScatterCandleBubbleChartData
16 | {
17 | public required init()
18 | {
19 | super.init()
20 | }
21 |
22 | public override init(dataSets: [ChartDataSetProtocol])
23 | {
24 | super.init(dataSets: dataSets)
25 | }
26 |
27 | public required init(arrayLiteral elements: ChartDataSetProtocol...)
28 | {
29 | super.init(dataSets: elements)
30 | }
31 |
32 | /// - Returns: The maximum shape-size across all DataSets.
33 | @objc open func getGreatestShapeSize() -> CGFloat
34 | {
35 | return (_dataSets as? [ScatterChartDataSetProtocol])?
36 | .max { $0.scatterShapeSize < $1.scatterShapeSize }?
37 | .scatterShapeSize ?? 0
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Interfaces/BarLineScatterCandleBubbleChartDataSetProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BarLineScatterCandleBubbleChartDataSetProtocol.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol BarLineScatterCandleBubbleChartDataSetProtocol: ChartDataSetProtocol
17 | {
18 | // MARK: - Data functions and accessors
19 |
20 | // MARK: - Styling functions and accessors
21 |
22 | var highlightColor: NSUIColor { get set }
23 | var highlightLineWidth: CGFloat { get set }
24 | var highlightLineDashPhase: CGFloat { get set }
25 | var highlightLineDashLengths: [CGFloat]? { get set }
26 | }
27 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Interfaces/BubbleChartDataSetProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BubbleChartDataSetProtocol.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol BubbleChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol
17 | {
18 | // MARK: - Data functions and accessors
19 |
20 | var maxSize: CGFloat { get }
21 | var isNormalizeSizeEnabled: Bool { get }
22 |
23 | // MARK: - Styling functions and accessors
24 |
25 | /// Sets/gets the width of the circle that surrounds the bubble when highlighted
26 | var highlightCircleWidth: CGFloat { get set }
27 | }
28 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Interfaces/LineScatterCandleRadarChartDataSetProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LineScatterCandleRadarChartDataSetProtocol.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | @objc
15 | public protocol LineScatterCandleRadarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetProtocol
16 | {
17 | // MARK: - Data functions and accessors
18 |
19 | // MARK: - Styling functions and accessors
20 |
21 | /// Enables / disables the horizontal highlight-indicator. If disabled, the indicator is not drawn.
22 | var drawHorizontalHighlightIndicatorEnabled: Bool { get set }
23 |
24 | /// Enables / disables the vertical highlight-indicator. If disabled, the indicator is not drawn.
25 | var drawVerticalHighlightIndicatorEnabled: Bool { get set }
26 |
27 | /// `true` if horizontal highlight indicator lines are enabled (drawn)
28 | var isHorizontalHighlightIndicatorEnabled: Bool { get }
29 |
30 | /// `true` if vertical highlight indicator lines are enabled (drawn)
31 | var isVerticalHighlightIndicatorEnabled: Bool { get }
32 |
33 | /// Enables / disables both vertical and horizontal highlight-indicators.
34 | /// :param: enabled
35 | func setDrawHighlightIndicators(_ enabled: Bool)
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Interfaces/RadarChartDataSetProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RadarChartDataSetProtocol.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol RadarChartDataSetProtocol: LineRadarChartDataSetProtocol
17 | {
18 | // MARK: - Data functions and accessors
19 |
20 | // MARK: - Styling functions and accessors
21 |
22 | /// flag indicating whether highlight circle should be drawn or not
23 | var drawHighlightCircleEnabled: Bool { get set }
24 |
25 | var isDrawHighlightCircleEnabled: Bool { get }
26 |
27 | var highlightCircleFillColor: NSUIColor? { get set }
28 |
29 | /// The stroke color for highlight circle.
30 | /// If `nil`, the color of the dataset is taken.
31 | var highlightCircleStrokeColor: NSUIColor? { get set }
32 |
33 | var highlightCircleStrokeAlpha: CGFloat { get set }
34 |
35 | var highlightCircleInnerRadius: CGFloat { get set }
36 |
37 | var highlightCircleOuterRadius: CGFloat { get set }
38 |
39 | var highlightCircleStrokeWidth: CGFloat { get set }
40 | }
41 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Data/Interfaces/ScatterChartDataSetProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScatterChartDataSetProtocol.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol ScatterChartDataSetProtocol: LineScatterCandleRadarChartDataSetProtocol
17 | {
18 | // MARK: - Data functions and accessors
19 |
20 | // MARK: - Styling functions and accessors
21 |
22 | /// - Returns: The size the scatter shape will have
23 | var scatterShapeSize: CGFloat { get }
24 |
25 | /// - Returns: The radius of the hole in the shape (applies to Square, Circle and Triangle)
26 | /// Set this to <= 0 to remove holes.
27 | /// **default**: 0.0
28 | var scatterShapeHoleRadius: CGFloat { get }
29 |
30 | /// - Returns: Color for the hole in the shape. Setting to `nil` will behave as transparent.
31 | /// **default**: nil
32 | var scatterShapeHoleColor: NSUIColor? { get }
33 |
34 | /// - Returns: The ShapeRenderer responsible for rendering this DataSet.
35 | var shapeRenderer: ShapeRenderer? { get }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Formatters/AxisValueFormatter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AxisValueFormatter.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | /// An interface for providing custom axis Strings.
15 | @objc(ChartAxisValueFormatter)
16 | public protocol AxisValueFormatter: AnyObject
17 | {
18 |
19 | /// Called when a value from an axis is formatted before being drawn.
20 | ///
21 | /// For performance reasons, avoid excessive calculations and memory allocations inside this method.
22 | ///
23 | /// - Parameters:
24 | /// - value: the value that is currently being drawn
25 | /// - axis: the axis that the value belongs to
26 | /// - Returns: The customized label that is drawn on the x-axis.
27 | func stringForValue(_ value: Double,
28 | axis: AxisBase?) -> String
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Formatters/FillFormatter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FillFormatter.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | /// Protocol for providing a custom logic to where the filling line of a LineDataSet should end. This of course only works if setFillEnabled(...) is set to true.
16 | @objc(ChartFillFormatter)
17 | public protocol FillFormatter
18 | {
19 | /// - Returns: The vertical (y-axis) position where the filled-line of the LineDataSet should end.
20 | func getFillLinePosition(dataSet: LineChartDataSetProtocol, dataProvider: LineChartDataProvider) -> CGFloat
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Formatters/IndexAxisValueFormatter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IndexAxisValueFormatter.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | /// This formatter is used for passing an array of x-axis labels, on whole x steps.
15 | @objc(ChartIndexAxisValueFormatter)
16 | open class IndexAxisValueFormatter: NSObject, AxisValueFormatter
17 | {
18 | @objc public var values: [String] = [String]()
19 |
20 | public override init()
21 | {
22 | super.init()
23 |
24 | }
25 |
26 | @objc public init(values: [String])
27 | {
28 | super.init()
29 |
30 | self.values = values
31 | }
32 |
33 | @objc public static func with(values: [String]) -> IndexAxisValueFormatter?
34 | {
35 | return IndexAxisValueFormatter(values: values)
36 | }
37 |
38 | open func stringForValue(_ value: Double,
39 | axis: AxisBase?) -> String
40 | {
41 | let index = Int(value.rounded())
42 | guard values.indices.contains(index), index == Int(value) else { return "" }
43 | return values[index]
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Formatters/ValueFormatter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ValueFormatter.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | /// Interface that allows custom formatting of all values inside the chart before they are drawn to the screen.
15 | ///
16 | /// Simply create your own formatting class and let it implement ValueFormatter. Then override the stringForValue()
17 | /// method and return whatever you want.
18 |
19 | @objc(ChartValueFormatter)
20 | public protocol ValueFormatter: AnyObject
21 | {
22 |
23 | /// Called when a value (from labels inside the chart) is formatted before being drawn.
24 | ///
25 | /// For performance reasons, avoid excessive calculations and memory allocations inside this method.
26 | ///
27 | /// - Parameters:
28 | /// - value: The value to be formatted
29 | /// - dataSetIndex: The index of the DataSet the entry in focus belongs to
30 | /// - viewPortHandler: provides information about the current chart state (scale, translation, ...)
31 | /// - Returns: The formatted label ready to be drawn
32 | func stringForValue(_ value: Double,
33 | entry: ChartDataEntry,
34 | dataSetIndex: Int,
35 | viewPortHandler: ViewPortHandler?) -> String
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Highlight/Highlighter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Highlighter.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc(ChartHighlighter)
16 | public protocol Highlighter: AnyObject
17 | {
18 | /// - Parameters:
19 | /// - x:
20 | /// - y:
21 | /// - Returns: A Highlight object corresponding to the given x- and y- touch positions in pixels.
22 | func getHighlight(x: CGFloat, y: CGFloat) -> Highlight?
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Highlight/PieHighlighter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PieHighlighter.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc(PieChartHighlighter)
16 | open class PieHighlighter: PieRadarHighlighter
17 | {
18 | open override func closestHighlight(index: Int, x: CGFloat, y: CGFloat) -> Highlight?
19 | {
20 | guard
21 | let set = chart?.data?[0],
22 | let entry = set.entryForIndex(index)
23 | else { return nil }
24 |
25 | return Highlight(x: Double(index), y: entry.y, xPx: x, yPx: y, dataSetIndex: 0, axis: set.axisDependency)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Highlight/Range.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Range.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 |
14 | @objc(ChartRange)
15 | open class Range: NSObject
16 | {
17 | @objc open var from: Double
18 | @objc open var to: Double
19 |
20 | @objc public init(from: Double, to: Double)
21 | {
22 | self.from = from
23 | self.to = to
24 |
25 | super.init()
26 | }
27 |
28 | /// - Parameters:
29 | /// - value:
30 | /// - Returns: `true` if this range contains (if the value is in between) the given value, `false` ifnot.
31 | @objc open func contains(_ value: Double) -> Bool
32 | {
33 | if value > from && value <= to
34 | {
35 | return true
36 | }
37 | else
38 | {
39 | return false
40 | }
41 | }
42 |
43 | @objc open func isLarger(_ value: Double) -> Bool
44 | {
45 | return value > to
46 | }
47 |
48 | @objc open func isSmaller(_ value: Double) -> Bool
49 | {
50 | return value < from
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/BarChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BarChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol BarChartDataProvider: BarLineScatterCandleBubbleChartDataProvider
17 | {
18 | var barData: BarChartData? { get }
19 |
20 | var isDrawBarShadowEnabled: Bool { get }
21 | var isDrawValueAboveBarEnabled: Bool { get }
22 | var isHighlightFullBarEnabled: Bool { get }
23 | }
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BarLineScatterCandleBubbleChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol BarLineScatterCandleBubbleChartDataProvider: ChartDataProvider
17 | {
18 | func getTransformer(forAxis: YAxis.AxisDependency) -> Transformer
19 | func isInverted(axis: YAxis.AxisDependency) -> Bool
20 |
21 | var lowestVisibleX: Double { get }
22 | var highestVisibleX: Double { get }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/BubbleChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BubbleChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol BubbleChartDataProvider: BarLineScatterCandleBubbleChartDataProvider
17 | {
18 | var bubbleData: BubbleChartData? { get }
19 | }
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/CandleChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CandleChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol CandleChartDataProvider: BarLineScatterCandleBubbleChartDataProvider
17 | {
18 | var candleData: CandleChartData? { get }
19 | }
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/ChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol ChartDataProvider
17 | {
18 | /// The minimum x-value of the chart, regardless of zoom or translation.
19 | var chartXMin: Double { get }
20 |
21 | /// The maximum x-value of the chart, regardless of zoom or translation.
22 | var chartXMax: Double { get }
23 |
24 | /// The minimum y-value of the chart, regardless of zoom or translation.
25 | var chartYMin: Double { get }
26 |
27 | /// The maximum y-value of the chart, regardless of zoom or translation.
28 | var chartYMax: Double { get }
29 |
30 | var maxHighlightDistance: CGFloat { get }
31 |
32 | var xRange: Double { get }
33 |
34 | var centerOffsets: CGPoint { get }
35 |
36 | var data: ChartData? { get }
37 |
38 | var maxVisibleCount: Int { get }
39 | }
40 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/CombinedChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CombinedChartDataProvider.swoft
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol CombinedChartDataProvider: LineChartDataProvider, BarChartDataProvider, BubbleChartDataProvider, CandleChartDataProvider, ScatterChartDataProvider
17 | {
18 | var combinedData: CombinedChartData? { get }
19 | }
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/LineChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LineChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol LineChartDataProvider: BarLineScatterCandleBubbleChartDataProvider
17 | {
18 | var lineData: LineChartData? { get }
19 |
20 | func getAxis(_ axis: YAxis.AxisDependency) -> YAxis
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Interfaces/ScatterChartDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScatterChartDataProvider.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol ScatterChartDataProvider: BarLineScatterCandleBubbleChartDataProvider
17 | {
18 | var scatterData: ScatterChartData? { get }
19 | }
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Jobs/AnimatedMoveViewJob.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnimatedMoveViewJob.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | open class AnimatedMoveViewJob: AnimatedViewPortJob
16 | {
17 | internal override func animationUpdate()
18 | {
19 | var pt = CGPoint(
20 | x: xOrigin + (CGFloat(xValue) - xOrigin) * phase,
21 | y: yOrigin + (CGFloat(yValue) - yOrigin) * phase
22 | )
23 |
24 | transformer.pointValueToPixel(&pt)
25 | viewPortHandler.centerViewPort(pt: pt, chart: view)
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Jobs/MoveViewJob.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MoveViewJob.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc(MoveChartViewJob)
16 | open class MoveViewJob: ViewPortJob
17 | {
18 | open override func doJob()
19 | {
20 | var pt = CGPoint(
21 | x: xValue,
22 | y: yValue
23 | )
24 |
25 | transformer.pointValueToPixel(&pt)
26 | viewPortHandler.centerViewPort(pt: pt, chart: view)
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Jobs/ViewPortJob.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewPortJob.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | // This defines a viewport modification job, used for delaying or animating viewport changes
16 | @objc(ChartViewPortJob)
17 | open class ViewPortJob: NSObject
18 | {
19 | internal var point: CGPoint = .zero
20 | internal unowned var viewPortHandler: ViewPortHandler
21 | internal var xValue = 0.0
22 | internal var yValue = 0.0
23 | internal unowned var transformer: Transformer
24 | internal unowned var view: ChartViewBase
25 |
26 | @objc public init(
27 | viewPortHandler: ViewPortHandler,
28 | xValue: Double,
29 | yValue: Double,
30 | transformer: Transformer,
31 | view: ChartViewBase)
32 | {
33 | self.viewPortHandler = viewPortHandler
34 | self.xValue = xValue
35 | self.yValue = yValue
36 | self.transformer = transformer
37 | self.view = view
38 |
39 | super.init()
40 | }
41 |
42 | @objc open func doJob()
43 | {
44 | fatalError("`doJob()` must be overridden by subclasses")
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/AxisRenderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AxisRenderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 |
16 | public protocol AxisRenderer: Renderer {
17 |
18 | associatedtype Axis: AxisBase
19 |
20 | /// base axis this axis renderer works with
21 | var axis: Axis { get }
22 |
23 | /// transformer to transform values to screen pixels and return
24 | var transformer: Transformer? { get }
25 |
26 | /// Draws the axis labels on the specified context
27 | func renderAxisLabels(context: CGContext)
28 |
29 | /// Draws the grid lines belonging to the axis.
30 | func renderGridLines(context: CGContext)
31 |
32 | /// Draws the line that goes alongside the axis.
33 | func renderAxisLine(context: CGContext)
34 |
35 | /// Draws the LimitLines associated with this axis to the screen.
36 | func renderLimitLines(context: CGContext)
37 |
38 | /// Computes the axis values.
39 | /// - parameter min: the minimum value in the data object for this axis
40 | /// - parameter max: the maximum value in the data object for this axis
41 | func computeAxis(min: Double, max: Double, inverted: Bool)
42 |
43 | /// Sets up the axis values. Computes the desired number of labels between the two given extremes.
44 | func computeAxisValues(min: Double, max: Double)
45 | }
46 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/Renderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Renderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc(ChartRenderer)
16 | public protocol Renderer {
17 |
18 | /// the component that handles the drawing area of the chart and it's offsets
19 | var viewPortHandler: ViewPortHandler { get }
20 | }
21 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/Scatter/ChevronDownShapeRenderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChevronDownShapeRenderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 | import Foundation
12 | import CoreGraphics
13 |
14 | open class ChevronDownShapeRenderer : NSObject, ShapeRenderer
15 | {
16 | open func renderShape(
17 | context: CGContext,
18 | dataSet: ScatterChartDataSetProtocol,
19 | viewPortHandler: ViewPortHandler,
20 | point: CGPoint,
21 | color: NSUIColor)
22 | {
23 | let shapeSize = dataSet.scatterShapeSize
24 | let shapeHalf = shapeSize / 2.0
25 |
26 | context.setLineWidth(1.0)
27 | context.setStrokeColor(color.cgColor)
28 |
29 | context.beginPath()
30 | context.move(to: CGPoint(x: point.x, y: point.y + 2 * shapeHalf))
31 | context.addLine(to: CGPoint(x: point.x + 2 * shapeHalf, y: point.y))
32 | context.move(to: CGPoint(x: point.x, y: point.y + 2 * shapeHalf))
33 | context.addLine(to: CGPoint(x: point.x - 2 * shapeHalf, y: point.y))
34 | context.strokePath()
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/Scatter/ChevronUpShapeRenderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ChevronUpShapeRenderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 | import Foundation
12 | import CoreGraphics
13 |
14 | open class ChevronUpShapeRenderer : NSObject, ShapeRenderer
15 | {
16 | open func renderShape(
17 | context: CGContext,
18 | dataSet: ScatterChartDataSetProtocol,
19 | viewPortHandler: ViewPortHandler,
20 | point: CGPoint,
21 | color: NSUIColor)
22 | {
23 | let shapeSize = dataSet.scatterShapeSize
24 | let shapeHalf = shapeSize / 2.0
25 |
26 | context.setLineWidth(1.0)
27 | context.setStrokeColor(color.cgColor)
28 |
29 | context.beginPath()
30 | context.move(to: CGPoint(x: point.x, y: point.y - 2 * shapeHalf))
31 | context.addLine(to: CGPoint(x: point.x + 2 * shapeHalf, y: point.y))
32 | context.move(to: CGPoint(x: point.x, y: point.y - 2 * shapeHalf))
33 | context.addLine(to: CGPoint(x: point.x - 2 * shapeHalf, y: point.y))
34 | context.strokePath()
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/Scatter/CrossShapeRenderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CrossShapeRenderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 | import Foundation
12 | import CoreGraphics
13 |
14 | open class CrossShapeRenderer : NSObject, ShapeRenderer
15 | {
16 | open func renderShape(
17 | context: CGContext,
18 | dataSet: ScatterChartDataSetProtocol,
19 | viewPortHandler: ViewPortHandler,
20 | point: CGPoint,
21 | color: NSUIColor)
22 | {
23 | let shapeSize = dataSet.scatterShapeSize
24 | let shapeHalf = shapeSize / 2.0
25 |
26 | context.setLineWidth(1.0)
27 | context.setStrokeColor(color.cgColor)
28 |
29 | context.beginPath()
30 | context.move(to: CGPoint(x: point.x - shapeHalf, y: point.y))
31 | context.addLine(to: CGPoint(x: point.x + shapeHalf, y: point.y))
32 | context.move(to: CGPoint(x: point.x, y: point.y - shapeHalf))
33 | context.addLine(to: CGPoint(x: point.x, y: point.y + shapeHalf))
34 | context.strokePath()
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/Scatter/ShapeRenderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ShapeRenderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc
16 | public protocol ShapeRenderer: AnyObject
17 | {
18 | /// Renders the provided ScatterDataSet with a shape.
19 | ///
20 | /// - Parameters:
21 | /// - context: CGContext for drawing on
22 | /// - dataSet: The DataSet to be drawn
23 | /// - viewPortHandler: Contains information about the current state of the view
24 | /// - point: Position to draw the shape at
25 | /// - color: Color to draw the shape
26 | func renderShape(
27 | context: CGContext,
28 | dataSet: ScatterChartDataSetProtocol,
29 | viewPortHandler: ViewPortHandler,
30 | point: CGPoint,
31 | color: NSUIColor)
32 | }
33 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Renderers/Scatter/XShapeRenderer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // XShapeRenderer.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 | import Foundation
12 | import CoreGraphics
13 |
14 | open class XShapeRenderer : NSObject, ShapeRenderer
15 | {
16 | open func renderShape(
17 | context: CGContext,
18 | dataSet: ScatterChartDataSetProtocol,
19 | viewPortHandler: ViewPortHandler,
20 | point: CGPoint,
21 | color: NSUIColor)
22 | {
23 | let shapeSize = dataSet.scatterShapeSize
24 | let shapeHalf = shapeSize / 2.0
25 |
26 | context.setLineWidth(1.0)
27 | context.setStrokeColor(color.cgColor)
28 |
29 | context.beginPath()
30 | context.move(to: CGPoint(x: point.x - shapeHalf, y: point.y - shapeHalf))
31 | context.addLine(to: CGPoint(x: point.x + shapeHalf, y: point.y + shapeHalf))
32 | context.move(to: CGPoint(x: point.x + shapeHalf, y: point.y - shapeHalf))
33 | context.addLine(to: CGPoint(x: point.x - shapeHalf, y: point.y + shapeHalf))
34 | context.strokePath()
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Utils/Platform+Color.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Platform+Color.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | #if canImport(UIKit)
13 | import UIKit
14 |
15 | public typealias NSUIColor = UIColor
16 | private func fetchLabelColor() -> UIColor
17 | {
18 | if #available(iOS 13, tvOS 13, *)
19 | {
20 | return .label
21 | }
22 | else
23 | {
24 | return .black
25 | }
26 | }
27 | private let labelColor: UIColor = fetchLabelColor()
28 |
29 | extension UIColor
30 | {
31 | static var labelOrBlack: UIColor { labelColor }
32 | }
33 | #endif
34 |
35 | #if canImport(AppKit) && !targetEnvironment(macCatalyst)
36 |
37 | import AppKit
38 |
39 | public typealias NSUIColor = NSColor
40 | private func fetchLabelColor() -> NSColor
41 | {
42 | if #available(macOS 10.14, *)
43 | {
44 | return .labelColor
45 | }
46 | else
47 | {
48 | return .black
49 | }
50 | }
51 | private let labelColor: NSColor = fetchLabelColor()
52 |
53 | extension NSColor
54 | {
55 | static var labelOrBlack: NSColor { labelColor }
56 | }
57 | #endif
58 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Utils/Sequence+KeyPath.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sequence+KeyPath.swift
3 | // Charts
4 | //
5 | // Created by Jacob Christie on 2020-12-15.
6 | //
7 |
8 | extension Sequence {
9 | func max(
10 | by keyPath: KeyPath,
11 | areInIncreasingOrder: (T, T) -> Bool
12 | ) -> Element? {
13 | self.max { areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) }
14 | }
15 |
16 | func max(by keyPath: KeyPath) -> Element? {
17 | max(by: keyPath, areInIncreasingOrder: <)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Pods/Charts/Source/Charts/Utils/TransformerHorizontalBarChart.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TransformerHorizontalBarChart.swift
3 | // Charts
4 | //
5 | // Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
6 | // A port of MPAndroidChart for iOS
7 | // Licensed under Apache License 2.0
8 | //
9 | // https://github.com/danielgindi/Charts
10 | //
11 |
12 | import Foundation
13 | import CoreGraphics
14 |
15 | @objc(ChartTransformerHorizontalBarChart)
16 | open class TransformerHorizontalBarChart: Transformer
17 | {
18 | /// Prepares the matrix that contains all offsets.
19 | open override func prepareMatrixOffset(inverted: Bool)
20 | {
21 | if !inverted
22 | {
23 | matrixOffset = CGAffineTransform(translationX: viewPortHandler.offsetLeft, y: viewPortHandler.chartHeight - viewPortHandler.offsetBottom)
24 | }
25 | else
26 | {
27 | matrixOffset = CGAffineTransform(scaleX: -1.0, y: 1.0)
28 | .translatedBy(x: -(viewPortHandler.chartWidth - viewPortHandler.offsetRight),
29 | y: viewPortHandler.chartHeight - viewPortHandler.offsetBottom)
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Pods/Eureka/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2019 XMARTLABS
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Pods/Eureka/Source/Core/SelectableRowType.swift:
--------------------------------------------------------------------------------
1 | // SelectableRowType.swift
2 | // Eureka ( https://github.com/xmartlabs/Eureka )
3 | //
4 | // Copyright (c) 2016 Xmartlabs ( http://xmartlabs.com )
5 | //
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 | // THE SOFTWARE.
24 |
25 | import Foundation
26 |
27 | /**
28 | * Every row that shall be used in a SelectableSection must conform to this protocol.
29 | */
30 | public protocol SelectableRowType: RowType {
31 | var selectableValue: Cell.Value? { get set }
32 | }
33 |
--------------------------------------------------------------------------------
/Pods/Eureka/Source/Validations/RuleEmail.swift:
--------------------------------------------------------------------------------
1 | // RuleEmail.swift
2 | // Eureka ( https://github.com/xmartlabs/Eureka )
3 | //
4 | // Copyright (c) 2016 Xmartlabs SRL ( http://xmartlabs.com )
5 | //
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 | // THE SOFTWARE.
24 |
25 | import Foundation
26 |
27 | public class RuleEmail: RuleRegExp {
28 |
29 | public init(msg: String = "Field value should be a valid email!", id: String? = nil) {
30 | super.init(regExpr: RegExprPattern.EmailAddress.rawValue, allowsEmpty: true, msg: msg, id: id)
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/Pods/Local Podspecs/Eureka.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Eureka",
3 | "version": "5.3.6",
4 | "license": "MIT",
5 | "summary": "Elegant iOS Forms in pure Swift",
6 | "homepage": "https://github.com/xmartlabs/Eureka",
7 | "social_media_url": "http://twitter.com/xmartlabs",
8 | "authors": {
9 | "Martin Barreto": "martin@xmartlabs.com",
10 | "Mathias Claassen": "mathias@xmartlabs.com"
11 | },
12 | "source": {
13 | "git": "https://github.com/xmartlabs/Eureka.git",
14 | "tag": "5.3.6"
15 | },
16 | "platforms": {
17 | "ios": "9.0"
18 | },
19 | "ios": {
20 | "frameworks": [
21 | "UIKit",
22 | "Foundation"
23 | ]
24 | },
25 | "source_files": "Source/**/*.swift",
26 | "requires_arc": true,
27 | "swift_versions": "5.0",
28 | "swift_version": "5.0"
29 | }
30 |
--------------------------------------------------------------------------------
/Pods/Local Podspecs/ShareClient.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ShareClient",
3 | "version": "1.2",
4 | "summary": "Dexcom Client Pod",
5 | "swift_versions": "5.0",
6 | "homepage": "https://github.com/loopandlearn/dexcom-share-client-swift",
7 | "license": "MIT",
8 | "authors": "jonfawcett",
9 | "platforms": {
10 | "ios": "10.0",
11 | "watchos": "6.0"
12 | },
13 | "source": {
14 | "git": "https://github.com/loopandlearn/dexcom-share-client-swift.git",
15 | "tag": "v1.2"
16 | },
17 | "source_files": "ShareClient/ShareClient.{h,swift}",
18 | "swift_version": "5.0"
19 | }
20 |
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Charts (4.1.0):
3 | - Charts/Core (= 4.1.0)
4 | - Charts/Core (4.1.0):
5 | - SwiftAlgorithms (~> 1.0)
6 | - Eureka (5.3.6)
7 | - ShareClient (1.2)
8 | - SwiftAlgorithms (1.0.0)
9 |
10 | DEPENDENCIES:
11 | - Charts
12 | - Eureka (from `https://github.com/xmartlabs/Eureka.git`)
13 | - ShareClient (from `https://github.com/loopandlearn/dexcom-share-client-swift.git`, branch `loopfollow`)
14 |
15 | SPEC REPOS:
16 | trunk:
17 | - Charts
18 | - SwiftAlgorithms
19 |
20 | EXTERNAL SOURCES:
21 | Eureka:
22 | :git: https://github.com/xmartlabs/Eureka.git
23 | ShareClient:
24 | :branch: loopfollow
25 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git
26 |
27 | CHECKOUT OPTIONS:
28 | Eureka:
29 | :commit: 044e31674d319c8edb19d993a5f8ea4e24641542
30 | :git: https://github.com/xmartlabs/Eureka.git
31 | ShareClient:
32 | :commit: d7a3323a014d41827ee177a92d528786f9f09e75
33 | :git: https://github.com/loopandlearn/dexcom-share-client-swift.git
34 |
35 | SPEC CHECKSUMS:
36 | Charts: ce0768268078eee0336f122c3c4ca248e4e204c5
37 | Eureka: 28ad9dec6286cd7cd601fdf8e8df39bb7356a8f4
38 | ShareClient: 60b911c95e73b0ea9c5aad6d194a9c6b5f34b741
39 | SwiftAlgorithms: 38dda4731d19027fdeee1125f973111bf3386b53
40 |
41 | PODFILE CHECKSUM: d241dda366d5454279fe3ff8869458d19e1bbebb
42 |
43 | COCOAPODS: 1.12.1
44 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/jon.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Charts.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 0
13 |
14 | Eureka.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 1
20 |
21 | Pods-LoopFollow.xcscheme
22 |
23 | isShown
24 |
25 | orderHint
26 | 2
27 |
28 | ShareClient.xcscheme
29 |
30 | isShown
31 |
32 | orderHint
33 | 3
34 |
35 | SwiftAlgorithms.xcscheme
36 |
37 | isShown
38 |
39 | orderHint
40 | 4
41 |
42 |
43 | SuppressBuildableAutocreation
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Pods/ShareClient/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Mark Wilson
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Pods/ShareClient/ShareClient/ShareClient.h:
--------------------------------------------------------------------------------
1 | //
2 | // ShareClient.h
3 | // ShareClient
4 | //
5 | // Created by Nathan Racklyeft on 5/8/16.
6 | // Copyright © 2016 Mark Wilson. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for ShareClient.
12 | FOUNDATION_EXPORT double ShareClientVersionNumber;
13 |
14 | //! Project version string for ShareClient.
15 | FOUNDATION_EXPORT const unsigned char ShareClientVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 4.1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Charts : NSObject
3 | @end
4 | @implementation PodsDummy_Charts
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double ChartsVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char ChartsVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Charts
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
6 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms"
7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
8 | PODS_BUILD_DIR = ${BUILD_DIR}
9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
10 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
11 | PODS_ROOT = ${SRCROOT}
12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Charts
13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
15 | SKIP_INSTALL = YES
16 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts.modulemap:
--------------------------------------------------------------------------------
1 | framework module Charts {
2 | umbrella header "Charts-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Charts/Charts.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Charts
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
6 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms"
7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
8 | PODS_BUILD_DIR = ${BUILD_DIR}
9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
10 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
11 | PODS_ROOT = ${SRCROOT}
12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Charts
13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
15 | SKIP_INSTALL = YES
16 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 5.3.6
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Eureka : NSObject
3 | @end
4 | @implementation PodsDummy_Eureka
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double EurekaVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char EurekaVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Eureka
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit"
6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
10 | PODS_ROOT = ${SRCROOT}
11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Eureka
12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka.modulemap:
--------------------------------------------------------------------------------
1 | framework module Eureka {
2 | umbrella header "Eureka-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Eureka/Eureka.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Eureka
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "UIKit"
6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
10 | PODS_ROOT = ${SRCROOT}
11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Eureka
12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_LoopFollow : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_LoopFollow
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/Charts/Charts.framework
3 | ${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework
4 | ${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework
5 | ${BUILT_PRODUCTS_DIR}/SwiftAlgorithms/Algorithms.framework
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Debug-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Charts.framework
2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework
3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ShareClient.framework
4 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Algorithms.framework
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/Charts/Charts.framework
3 | ${BUILT_PRODUCTS_DIR}/Eureka/Eureka.framework
4 | ${BUILT_PRODUCTS_DIR}/ShareClient/ShareClient.framework
5 | ${BUILT_PRODUCTS_DIR}/SwiftAlgorithms/Algorithms.framework
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-frameworks-Release-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Charts.framework
2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Eureka.framework
3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ShareClient.framework
4 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Algorithms.framework
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_LoopFollowVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_LoopFollowVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient/ShareClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms/Algorithms.framework/Headers"
6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms" -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "ShareClient" -framework "UIKit"
9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
10 | PODS_BUILD_DIR = ${BUILD_DIR}
11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
13 | PODS_ROOT = ${SRCROOT}/Pods
14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_LoopFollow {
2 | umbrella header "Pods-LoopFollow-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-LoopFollow/Pods-LoopFollow.release.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Charts/Charts.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Eureka/Eureka.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ShareClient/ShareClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms/Algorithms.framework/Headers"
6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 | OTHER_LDFLAGS = $(inherited) -framework "Algorithms" -framework "Charts" -framework "Eureka" -framework "Foundation" -framework "ShareClient" -framework "UIKit"
9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
10 | PODS_BUILD_DIR = ${BUILD_DIR}
11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
13 | PODS_ROOT = ${SRCROOT}/Pods
14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.2.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_ShareClient : NSObject
3 | @end
4 | @implementation PodsDummy_ShareClient
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 | #import "ShareClient.h"
14 |
15 | FOUNDATION_EXPORT double ShareClientVersionNumber;
16 | FOUNDATION_EXPORT const unsigned char ShareClientVersionString[];
17 |
18 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShareClient
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShareClient
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | SKIP_INSTALL = YES
14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
15 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient.modulemap:
--------------------------------------------------------------------------------
1 | framework module ShareClient {
2 | umbrella header "ShareClient-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/ShareClient/ShareClient.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShareClient
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShareClient
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | SKIP_INSTALL = YES
14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
15 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | ${PODS_DEVELOPMENT_LANGUAGE}
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_SwiftAlgorithms : NSObject
3 | @end
4 | @implementation PodsDummy_SwiftAlgorithms
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double AlgorithmsVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char AlgorithmsVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftAlgorithms
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | SKIP_INSTALL = YES
14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
15 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms.modulemap:
--------------------------------------------------------------------------------
1 | framework module Algorithms {
2 | umbrella header "SwiftAlgorithms-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftAlgorithms/SwiftAlgorithms.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftAlgorithms
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftAlgorithms
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | SKIP_INSTALL = YES
14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
15 |
--------------------------------------------------------------------------------
/blacklisted-versions.json:
--------------------------------------------------------------------------------
1 | {
2 | "blacklistedVersions": [
3 | {
4 | "version": "1.0.0"
5 | },
6 | {
7 | "version": "2.0.0"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/fastlane/Matchfile:
--------------------------------------------------------------------------------
1 |
2 | GITHUB_REPOSITORY_OWNER ||= ENV["GITHUB_REPOSITORY_OWNER"]
3 |
4 | git_url("https://github.com/#{GITHUB_REPOSITORY_OWNER}/Match-Secrets.git")
5 |
6 | storage_mode("git")
7 |
8 | type("appstore")
9 |
10 | # The docs are available on https://docs.fastlane.tools/actions/match
11 |
--------------------------------------------------------------------------------