├── solar-logo.png ├── Solar.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcshareddata │ └── xcschemes │ │ ├── Solar watchOS.xcscheme │ │ ├── Solar tvOS.xcscheme │ │ ├── Solar macOS.xcscheme │ │ └── Solar iOS.xcscheme └── project.pbxproj ├── .travis.yml ├── Package.swift ├── SolarTests ├── Info.plist ├── City.swift ├── SolarTests.swift └── CorrectResults.json ├── Solar.podspec ├── Solar-dev.podspec ├── Solar ├── Info.plist └── Solar.swift ├── LICENSE ├── .gitignore └── README.md /solar-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceeK/Solar/HEAD/solar-logo.png -------------------------------------------------------------------------------- /Solar.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Solar.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | 3 | xcode_project: Solar.xcodeproj 4 | xcode_scheme: SolarTests 5 | xcode_sdk: iphonesimulator14.2 6 | osx_image: xcode12.2 7 | 8 | script: 9 | - xcodebuild $ACTION -project Solar.xcodeproj -scheme "$SCHEME" -destination "$DESTINATION" 10 | 11 | env: 12 | - SCHEME='Solar iOS' ACTION=test DESTINATION='platform=iOS Simulator,name=iPhone X,OS=11.4' 13 | - SCHEME='Solar macOS' ACTION=test DESTINATION='platform=OS X' 14 | - SCHEME='Solar tvOS' ACTION=test DESTINATION='platform=tvOS Simulator,name=Apple TV,OS=14.2' 15 | - SCHEME='Solar watchOS' ACTION=build DESTINATION='platform=watchOS Simulator,name=Apple Watch Series 6 - 44mm,OS=7.1' 16 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Solar", 8 | platforms: [.iOS(.v9), .macOS(.v10_10), .watchOS(.v3), .tvOS(.v9)], 9 | products: [ 10 | .library(name: "Solar", targets: ["Solar"]), 11 | ], 12 | dependencies: [], 13 | targets: [ 14 | .target(name: "Solar", path: "Solar", exclude: ["Info.plist"]), 15 | .testTarget(name: "SolarTests", dependencies: ["Solar"], path: "SolarTests", exclude: ["Info.plist"], resources: [.copy("CorrectResults.json")]), 16 | ] 17 | ) 18 | -------------------------------------------------------------------------------- /SolarTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 3.0.1 19 | CFBundleVersion 20 | 4 21 | 22 | 23 | -------------------------------------------------------------------------------- /Solar.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "Solar" 3 | s.version = "3.0.1" 4 | s.summary = "A Swift library for generating Sunrise and Sunset times." 5 | s.description = "A Swift library for generating Sunrise and Sunset times. All calculations take place locally without the need for a network request." 6 | s.homepage = "http://github.com/ceek/solar" 7 | s.license = { :type => "MIT", :file => "LICENSE" } 8 | s.author = { "Chris Howell" => "chris.kevin.howell@gmail.com" } 9 | s.ios.deployment_target = '9.0' 10 | s.watchos.deployment_target = '3.0' 11 | s.tvos.deployment_target = '9.0' 12 | s.osx.deployment_target = '10.9' 13 | s.source = { :git => "https://github.com/ceek/Solar.git", :tag => "#{s.version}" } 14 | s.source_files = "Solar/*.{swift}" 15 | s.requires_arc = true 16 | s.swift_version = "5.0" 17 | end 18 | -------------------------------------------------------------------------------- /Solar-dev.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "Solar-dev" 3 | s.module_name = "Solar" 4 | s.version = "3.0.1" 5 | s.summary = "A Swift library for generating Sunrise and Sunset times." 6 | s.description = "A Swift library for generating Sunrise and Sunset times. All calculations take place locally without the need for a network request." 7 | s.homepage = "http://github.com/ceek/solar" 8 | s.license = { :type => "MIT", :file => "LICENSE" } 9 | s.author = { "Chris Howell" => "chris.kevin.howell@gmail.com" } 10 | s.ios.deployment_target = '9.0' 11 | s.watchos.deployment_target = '3.0' 12 | s.tvos.deployment_target = '9.0' 13 | s.osx.deployment_target = '10.9' 14 | s.source = { :git => "https://github.com/ceek/Solar.git", :tag => "#{s.version}" } 15 | s.source_files = "Solar/*.{swift}" 16 | s.requires_arc = true 17 | s.swift_version = "5.0" 18 | end 19 | -------------------------------------------------------------------------------- /Solar/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(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 | 3.0.1 19 | CFBundleVersion 20 | 4 21 | NSPrincipalClass 22 | 23 | NSHumanReadableCopyright 24 | Copyright © 2016–2021 Chris Howell. All rights reserved. 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016-2021 Chris Howell 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata 19 | 20 | ## Other 21 | *.xccheckout 22 | *.moved-aside 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | 26 | ## Obj-C/Swift specific 27 | *.hmap 28 | *.ipa 29 | 30 | # Swift Package Manager 31 | # 32 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 33 | # Packages/ 34 | .build/ 35 | .swiftpm/ 36 | 37 | # CocoaPods 38 | # 39 | # We recommend against adding the Pods directory to your .gitignore. However 40 | # you should judge for yourself, the pros and cons are mentioned at: 41 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 42 | # 43 | # Pods/ 44 | 45 | # Carthage 46 | # 47 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 48 | # Carthage/Checkouts 49 | 50 | Carthage/Build 51 | 52 | # fastlane 53 | # 54 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 55 | # screenshots whenever they are needed. 56 | # For more information about the recommended setup visit: 57 | # https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md 58 | 59 | fastlane/report.xml 60 | fastlane/screenshots 61 | -------------------------------------------------------------------------------- /SolarTests/City.swift: -------------------------------------------------------------------------------- 1 | // 2 | // City.swift 3 | // Solar 4 | // 5 | // Created by Chris Howell on 13/02/2017. 6 | // Copyright © 2017 Chris Howell. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import CoreLocation 11 | 12 | extension DateFormatter { 13 | 14 | @nonobjc static var isoDateFormatter: DateFormatter = { 15 | var dateFormatter = DateFormatter() 16 | dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 17 | return dateFormatter 18 | }() 19 | 20 | } 21 | 22 | struct City { 23 | let name: String 24 | let coordinate: CLLocationCoordinate2D 25 | let sunrise: Date 26 | let sunset: Date 27 | 28 | init(json: [String: Any]) { 29 | guard 30 | let name = json["city"] as? String, 31 | let latitude = json["latitude"] as? Double, 32 | let longitude = json["longitude"] as? Double, 33 | let sunriseString = json["sunrise"] as? String, 34 | let sunsetString = json["sunset"] as? String, 35 | let sunrise = DateFormatter.isoDateFormatter.date(from: sunriseString), 36 | let sunset = DateFormatter.isoDateFormatter.date(from: sunsetString) 37 | else { 38 | fatalError("Could not instantiate a city from JSON: \(json)") 39 | } 40 | let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 41 | guard CLLocationCoordinate2DIsValid(coordinate) else { 42 | fatalError("City has invalid coordinates: \(coordinate)") 43 | } 44 | 45 | self.name = name 46 | self.coordinate = coordinate 47 | self.sunrise = sunrise 48 | self.sunset = sunset 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Solar.xcodeproj/xcshareddata/xcschemes/Solar watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Solar.xcodeproj/xcshareddata/xcschemes/Solar tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Solar.xcodeproj/xcshareddata/xcschemes/Solar macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 77 | 83 | 84 | 85 | 86 | 92 | 93 | 99 | 100 | 101 | 102 | 104 | 105 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /Solar.xcodeproj/xcshareddata/xcschemes/Solar iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 52 | 53 | 54 | 55 | 57 | 63 | 64 | 65 | 66 | 67 | 77 | 78 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | # Solar 6 | 7 | [![Version](https://img.shields.io/cocoapods/v/Solar.svg?style=flat)](http://cocoapods.org/pods/Solar) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![POD compatible](https://img.shields.io/badge/Cocoapods-compatible-4BC51D.svg?style=flat)](https://cocoapods.org) [![SPM compatible](https://img.shields.io/badge/SPM-compatible-4BC51D.svg?style=flat)](https://swift.org/package-manager/) [![Build Status](https://travis-ci.org/ceeK/Solar.svg?branch=master)](https://travis-ci.org/ceeK/Solar) 8 | [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/hyperium/hyper/master/LICENSE) 9 | 10 | A Swift helper for generating Sunrise and Sunset times. 11 | 12 | Solar performs its calculations locally using an algorithm from the [United States Naval Observatory](http://edwilliams.org/sunrise_sunset_algorithm.htm), and thus does not require the use of a network. 13 | 14 | ## Usage 15 | 16 | Solar simply needs a date and a location specified as a latitude and longitude: 17 | 18 | ```swift 19 | let solar = Solar(for: someDate, coordinate: CLLocationCoordinate2D(latitude: 51.528308, longitude: -0.1340267)) 20 | let sunrise = solar?.sunrise 21 | let sunset = solar?.sunset 22 | ``` 23 | 24 | We can also omit providing a date if we just need the sunrise and sunset for the current date and time: 25 | 26 | ```swift 27 | let solar = Solar(coordinate: CLLocationCoordinate2D(latitude: 51.528308, longitude: -0.1340267)) 28 | let sunrise = solar?.sunrise 29 | let sunset = solar?.sunset 30 | ``` 31 | 32 | Note that all dates are UTC. Don't forget to format your date into the appropriate timezone if required. 33 | 34 | ### Types of sunrise and sunset 35 | 36 | There are several types of sunrise and sunset that Solar generates. They differ by how many degrees the sun lies below the horizon: 37 | 38 | - **Official** (~0°) 39 | 40 | - **Civil** (6° below horizon) 41 | 42 | - **Nautical** (12° below horizon) 43 | 44 | - **Astronomical** (18° below horizon) 45 | 46 | For more information, see https://www.timeanddate.com/astronomy/different-types-twilight.html 47 | 48 | ## Convenience methods 49 | 50 | Solar also comes packaged with some convenience methods: 51 | 52 | ```swift 53 | // Whether the location specified by the `latitude` and `longitude` is in daytime on `date` 54 | let isDaytime = solar.isDaytime 55 | 56 | // Whether the location specified by the `latitude` and `longitude` is in nighttime on `date` 57 | let isNighttime = solar.isNighttime 58 | ``` 59 | 60 | ## Installation 61 | 62 | Solar is available through CocoaPods, Carthage, and Swift Package Manager. 63 | 64 | ### CocoaPods 65 | 66 | To include Solar in an application, add the following [pod](https://guides.cocoapods.org/syntax/podfile.html#pod) to your Podfile, then run `pod install`: 67 | 68 | ```ruby 69 | pod "Solar-dev", "~> 3.0" 70 | ``` 71 | 72 | To include Solar in another pod, add the following [dependency](https://guides.cocoapods.org/syntax/podspec.html#dependency) to your podspec: 73 | 74 | ```ruby 75 | s.dependency "Solar", "~> 3.0" 76 | ``` 77 | 78 | ### Carthage 79 | 80 | Add the `ceek/Solar` project to your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile), then follow the rest of [Carthage’s XCFramework installation instructions](https://github.com/Carthage/Carthage#building-platform-independent-xcframeworks-xcode-12-and-above): 81 | 82 | ```ruby 83 | github "ceeK/Solar" ~> 3.0 84 | ``` 85 | 86 | ### Swift Package Manager 87 | 88 | To include Solar in an application in Xcode: 89 | 90 | 1. Go to File ‣ Swift Packages ‣ Add Package Dependency. 91 | 1. Enter `https://github.com/ceeK/Solar.git` as the package repository and click Next. 92 | 1. Set Rules to Version, Up to Next Major, and enter `3.0.0` as the minimum version requirement. Click Next. 93 | 94 | To include Solar in another Swift package, add the following [dependency](https://developer.apple.com/documentation/swift_packages/package/dependency) to your Package.swift: 95 | 96 | ```swift 97 | .package(name: "Solar", url: "https://github.com/ceeK/Solar.git", from: "3.0.0") 98 | ``` 99 | 100 | # License 101 | 102 | The MIT License (MIT) 103 | 104 | Copyright (c) 2016-2021 Chris Howell 105 | 106 | Permission is hereby granted, free of charge, to any person obtaining a copy 107 | of this software and associated documentation files (the "Software"), to deal 108 | in the Software without restriction, including without limitation the rights 109 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 110 | copies of the Software, and to permit persons to whom the Software is 111 | furnished to do so, subject to the following conditions: 112 | 113 | The above copyright notice and this permission notice shall be included in all 114 | copies or substantial portions of the Software. 115 | 116 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 117 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 118 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 119 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 120 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 121 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 122 | SOFTWARE. 123 | -------------------------------------------------------------------------------- /SolarTests/SolarTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SolarTests.swift 3 | // SolarTests 4 | // 5 | // Created by Chris Howell on 08/02/2017. 6 | // Copyright © 2017 Chris Howell. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import CoreLocation 11 | @testable import Solar 12 | 13 | final class SolarTests: XCTestCase { 14 | 15 | private let testDate = Date(timeIntervalSince1970: 1486598400) 16 | 17 | /// How accurate, in minutes either side of the actual sunrise sunset, we want to be 18 | /// This is necessary as the algorithm uses assumptions during calculation 19 | private let testAccuracy: TimeInterval = 60 * 5 20 | private var cities: [City]! 21 | 22 | let bundle: Bundle = { 23 | #if SWIFT_PACKAGE 24 | return Bundle.module 25 | #else 26 | return Bundle(for: SolarTests.self) 27 | #endif 28 | }() 29 | 30 | override func setUpWithError() throws { 31 | try super.setUpWithError() 32 | let resultsURL = try XCTUnwrap(bundle.url(forResource: "CorrectResults", withExtension: "json")) 33 | let data = try Data(contentsOf: resultsURL) 34 | let cityDictionaries = try XCTUnwrap(try JSONSerialization.jsonObject(with: data, options: []) as? [[String : Any]]) 35 | cities = cityDictionaries.map(City.init(json:)) 36 | } 37 | 38 | func testSunrise() { 39 | for city in cities { 40 | let solar = Solar(for: testDate, coordinate: city.coordinate) 41 | 42 | guard 43 | let sunrise = solar?.sunrise 44 | else { 45 | XCTFail("Sunrise cannot be generated for city \(city.name)") 46 | return 47 | } 48 | 49 | XCTAssertEqual(sunrise.timeIntervalSince1970, city.sunrise.timeIntervalSince1970, accuracy: testAccuracy, "\(city.name): \(sunrise) not close to \(city.sunrise)") 50 | } 51 | } 52 | 53 | func testSunrise_isNil_whenNoSunriseOccurs() { 54 | let solar = Solar(for: testDate, coordinate: CLLocationCoordinate2D(latitude: 78.2186, longitude: 15.64007)) // Location: Longyearbyen 55 | XCTAssertNotNil(solar) 56 | XCTAssertNil(solar?.sunrise) 57 | } 58 | 59 | func testSunset() { 60 | for city in cities { 61 | 62 | let solar = Solar(for: testDate, coordinate: city.coordinate) 63 | 64 | guard 65 | let sunset = solar?.sunset 66 | else { 67 | XCTFail("Sunset cannot be generated for city \(city.name)") 68 | return 69 | } 70 | 71 | XCTAssertEqual(sunset.timeIntervalSince1970, city.sunset.timeIntervalSince1970, accuracy: testAccuracy, "\(city.name): \(sunset) not close to \(city.sunset)") 72 | } 73 | } 74 | 75 | func testSunset_isNil_whenNoSunsetOccurs() { 76 | 77 | let solar = Solar(for: testDate, coordinate: CLLocationCoordinate2D(latitude: 78.2186, longitude: 15.64007)) // Location: Longyearbyen 78 | XCTAssertNotNil(solar) 79 | XCTAssertNil(solar?.sunset) 80 | } 81 | 82 | func testIsDayTime_isTrue_betweenSunriseAndSunset() { 83 | let daytime = Date(timeIntervalSince1970: 1486641600) // noon 84 | let city = cities.first(where: { $0.name == "London" })! 85 | 86 | guard 87 | let solar = Solar(for: daytime, coordinate: city.coordinate) 88 | else { 89 | XCTFail("Cannot get solar") 90 | return 91 | } 92 | 93 | XCTAssertTrue(solar.isDaytime, "isDaytime is false for date: \(daytime) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 94 | XCTAssertFalse(solar.isNighttime, "isNighttime is true for date: \(daytime) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 95 | } 96 | 97 | func testIsDayTime_isTrue_exactlyAtSunrise() { 98 | let sunrise = Date(timeIntervalSince1970: 1486625181) 99 | let city = cities.first(where: { $0.name == "London" })! 100 | 101 | guard 102 | let solar = Solar(for: sunrise, coordinate: city.coordinate) 103 | else { 104 | XCTFail("Cannot get solar") 105 | return 106 | } 107 | 108 | XCTAssertTrue(solar.isDaytime, "isDaytime is false for date: \(sunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 109 | XCTAssertFalse(solar.isNighttime, "isNighttime is true for date: \(sunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 110 | } 111 | 112 | func testIsDayTime_isFalse_exactlyAtSunset() { 113 | let sunset = Date(timeIntervalSince1970: 1486659846) 114 | let city = cities.first(where: { $0.name == "London" })! 115 | 116 | guard 117 | let solar = Solar(for: sunset, coordinate: city.coordinate) 118 | else { 119 | XCTFail("Cannot get solar") 120 | return 121 | } 122 | 123 | XCTAssertFalse(solar.isDaytime, "isDaytime is false for date: \(sunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 124 | XCTAssertTrue(solar.isNighttime, "isNighttime is true for date: \(sunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 125 | } 126 | 127 | func testIsDayTime_isFalse_beforeSunrise() { 128 | let beforeSunrise = Date(timeIntervalSince1970: 1486624980) 129 | let city = cities.first(where: { $0.name == "London" })! 130 | 131 | guard 132 | let solar = Solar(for: beforeSunrise, coordinate: city.coordinate) 133 | else { 134 | XCTFail("Cannot get solar") 135 | return 136 | } 137 | 138 | XCTAssertFalse(solar.isDaytime, "isDaytime is true for date: \(beforeSunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 139 | XCTAssertTrue(solar.isNighttime, "isNighttime is false for date: \(beforeSunrise) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 140 | } 141 | 142 | func testIsDayTime_isFalse_afterSunset() { 143 | let afterSunset = Date(timeIntervalSince1970: 1486659960) 144 | let city = cities.first(where: { $0.name == "London" })! 145 | 146 | guard 147 | let solar = Solar(for: afterSunset, coordinate: city.coordinate) 148 | else { 149 | XCTFail("Cannot get solar") 150 | return 151 | } 152 | 153 | XCTAssertFalse(solar.isDaytime, "isDaytime is true for date: \(afterSunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 154 | XCTAssertTrue(solar.isNighttime, "isNighttime is false for date: \(afterSunset) with sunrise: \(solar.sunrise!), sunset: \(solar.sunset!)") 155 | } 156 | 157 | func testSolar_ShouldReturnNilOnInit_GivenInvalidcoordinate() { 158 | 159 | let invalidCoordinate1 = CLLocationCoordinate2D(latitude: -100, longitude: 0) 160 | XCTAssertFalse(CLLocationCoordinate2DIsValid(invalidCoordinate1)) 161 | let solar1 = Solar(for: testDate, coordinate: invalidCoordinate1) 162 | XCTAssertNil(solar1) 163 | 164 | let invalidCoordinate2 = CLLocationCoordinate2D(latitude: 180, longitude: 190) 165 | XCTAssertFalse(CLLocationCoordinate2DIsValid(invalidCoordinate2)) 166 | let solar2 = Solar(for: testDate, coordinate: invalidCoordinate2) 167 | XCTAssertNil(solar2) 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /Solar/Solar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Solar.swift 3 | // SolarExample 4 | // 5 | // Created by Chris Howell on 16/01/2016. 6 | // Copyright © 2016 Chris Howell. All rights reserved. 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the “Software”), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | // 26 | 27 | import Foundation 28 | import CoreLocation 29 | 30 | public struct Solar { 31 | 32 | /// The coordinate that is used for the calculation 33 | public let coordinate: CLLocationCoordinate2D 34 | 35 | /// The date to generate sunrise / sunset times for 36 | public fileprivate(set) var date: Date 37 | 38 | public fileprivate(set) var sunrise: Date? 39 | public fileprivate(set) var sunset: Date? 40 | public fileprivate(set) var civilSunrise: Date? 41 | public fileprivate(set) var civilSunset: Date? 42 | public fileprivate(set) var nauticalSunrise: Date? 43 | public fileprivate(set) var nauticalSunset: Date? 44 | public fileprivate(set) var astronomicalSunrise: Date? 45 | public fileprivate(set) var astronomicalSunset: Date? 46 | 47 | // MARK: Init 48 | 49 | public init?(for date: Date = Date(), coordinate: CLLocationCoordinate2D) { 50 | self.date = date 51 | 52 | guard CLLocationCoordinate2DIsValid(coordinate) else { 53 | return nil 54 | } 55 | 56 | self.coordinate = coordinate 57 | 58 | // Fill this Solar object with relevant data 59 | calculate() 60 | } 61 | 62 | // MARK: - Public functions 63 | 64 | /// Sets all of the Solar object's sunrise / sunset variables, if possible. 65 | /// - Note: Can return `nil` objects if sunrise / sunset does not occur on that day. 66 | public mutating func calculate() { 67 | sunrise = calculate(.sunrise, for: date, and: .official) 68 | sunset = calculate(.sunset, for: date, and: .official) 69 | civilSunrise = calculate(.sunrise, for: date, and: .civil) 70 | civilSunset = calculate(.sunset, for: date, and: .civil) 71 | nauticalSunrise = calculate(.sunrise, for: date, and: .nautical) 72 | nauticalSunset = calculate(.sunset, for: date, and: .nautical) 73 | astronomicalSunrise = calculate(.sunrise, for: date, and: .astronimical) 74 | astronomicalSunset = calculate(.sunset, for: date, and: .astronimical) 75 | } 76 | 77 | // MARK: - Private functions 78 | 79 | fileprivate enum SunriseSunset { 80 | case sunrise 81 | case sunset 82 | } 83 | 84 | /// Used for generating several of the possible sunrise / sunset times 85 | fileprivate enum Zenith: Double { 86 | case official = 90.83 87 | case civil = 96 88 | case nautical = 102 89 | case astronimical = 108 90 | } 91 | 92 | fileprivate func calculate(_ sunriseSunset: SunriseSunset, for date: Date, and zenith: Zenith) -> Date? { 93 | guard let utcTimezone = TimeZone(identifier: "UTC") else { return nil } 94 | 95 | // Get the day of the year 96 | var calendar = Calendar(identifier: .gregorian) 97 | calendar.timeZone = utcTimezone 98 | guard let dayInt = calendar.ordinality(of: .day, in: .year, for: date) else { return nil } 99 | let day = Double(dayInt) 100 | 101 | // Convert longitude to hour value and calculate an approx. time 102 | let lngHour = coordinate.longitude / 15 103 | 104 | let hourTime: Double = sunriseSunset == .sunrise ? 6 : 18 105 | let t = day + ((hourTime - lngHour) / 24) 106 | 107 | // Calculate the suns mean anomaly 108 | let M = (0.9856 * t) - 3.289 109 | 110 | // Calculate the sun's true longitude 111 | let subexpression1 = 1.916 * sin(M.degreesToRadians) 112 | let subexpression2 = 0.020 * sin(2 * M.degreesToRadians) 113 | var L = M + subexpression1 + subexpression2 + 282.634 114 | 115 | // Normalise L into [0, 360] range 116 | L = normalise(L, withMaximum: 360) 117 | 118 | // Calculate the Sun's right ascension 119 | var RA = atan(0.91764 * tan(L.degreesToRadians)).radiansToDegrees 120 | 121 | // Normalise RA into [0, 360] range 122 | RA = normalise(RA, withMaximum: 360) 123 | 124 | // Right ascension value needs to be in the same quadrant as L... 125 | let Lquadrant = floor(L / 90) * 90 126 | let RAquadrant = floor(RA / 90) * 90 127 | RA = RA + (Lquadrant - RAquadrant) 128 | 129 | // Convert RA into hours 130 | RA = RA / 15 131 | 132 | // Calculate Sun's declination 133 | let sinDec = 0.39782 * sin(L.degreesToRadians) 134 | let cosDec = cos(asin(sinDec)) 135 | 136 | // Calculate the Sun's local hour angle 137 | let cosH = (cos(zenith.rawValue.degreesToRadians) - (sinDec * sin(coordinate.latitude.degreesToRadians))) / (cosDec * cos(coordinate.latitude.degreesToRadians)) 138 | 139 | // No sunrise 140 | guard cosH < 1 else { 141 | return nil 142 | } 143 | 144 | // No sunset 145 | guard cosH > -1 else { 146 | return nil 147 | } 148 | 149 | // Finish calculating H and convert into hours 150 | let tempH = sunriseSunset == .sunrise ? 360 - acos(cosH).radiansToDegrees : acos(cosH).radiansToDegrees 151 | let H = tempH / 15.0 152 | 153 | // Calculate local mean time of rising 154 | let T = H + RA - (0.06571 * t) - 6.622 155 | 156 | // Adjust time back to UTC 157 | var UT = T - lngHour 158 | 159 | // Normalise UT into [0, 24] range 160 | UT = normalise(UT, withMaximum: 24) 161 | 162 | // Calculate all of the sunrise's / sunset's date components 163 | let hour = floor(UT) 164 | let minute = floor((UT - hour) * 60.0) 165 | let second = (((UT - hour) * 60) - minute) * 60.0 166 | 167 | let shouldBeYesterday = lngHour > 0 && UT > 12 && sunriseSunset == .sunrise 168 | let shouldBeTomorrow = lngHour < 0 && UT < 12 && sunriseSunset == .sunset 169 | 170 | let setDate: Date 171 | if shouldBeYesterday { 172 | setDate = Date(timeInterval: -(60 * 60 * 24), since: date) 173 | } else if shouldBeTomorrow { 174 | setDate = Date(timeInterval: (60 * 60 * 24), since: date) 175 | } else { 176 | setDate = date 177 | } 178 | 179 | var components = calendar.dateComponents([.day, .month, .year], from: setDate) 180 | components.hour = Int(hour) 181 | components.minute = Int(minute) 182 | components.second = Int(second) 183 | 184 | calendar.timeZone = utcTimezone 185 | return calendar.date(from: components) 186 | } 187 | 188 | /// Normalises a value between 0 and `maximum`, by adding or subtracting `maximum` 189 | fileprivate func normalise(_ value: Double, withMaximum maximum: Double) -> Double { 190 | var value = value 191 | 192 | if value < 0 { 193 | value += maximum 194 | } 195 | 196 | if value > maximum { 197 | value -= maximum 198 | } 199 | 200 | return value 201 | } 202 | 203 | } 204 | 205 | extension Solar { 206 | 207 | /// Whether the location specified by the `latitude` and `longitude` is in daytime on `date` 208 | /// - Complexity: O(1) 209 | public var isDaytime: Bool { 210 | guard 211 | let sunrise = sunrise, 212 | let sunset = sunset 213 | else { 214 | return false 215 | } 216 | 217 | let beginningOfDay = sunrise.timeIntervalSince1970 218 | let endOfDay = sunset.timeIntervalSince1970 219 | let currentTime = self.date.timeIntervalSince1970 220 | 221 | let isSunriseOrLater = currentTime >= beginningOfDay 222 | let isBeforeSunset = currentTime < endOfDay 223 | 224 | return isSunriseOrLater && isBeforeSunset 225 | } 226 | 227 | /// Whether the location specified by the `latitude` and `longitude` is in nighttime on `date` 228 | /// - Complexity: O(1) 229 | public var isNighttime: Bool { 230 | return !isDaytime 231 | } 232 | 233 | } 234 | 235 | // MARK: - Helper extensions 236 | 237 | private extension Double { 238 | var degreesToRadians: Double { 239 | return Double(self) * (Double.pi / 180.0) 240 | } 241 | 242 | var radiansToDegrees: Double { 243 | return (Double(self) * 180.0) / Double.pi 244 | } 245 | } 246 | -------------------------------------------------------------------------------- /Solar.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1410E9C81EF12C1E001829A5 /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; }; 11 | 14381E7A1EF96100008E9826 /* Solar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7FC5B5A1D469B2700C4D3EB /* Solar.framework */; }; 12 | 14456B851EF96AC000D76A4D /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B831EF96ABA00D76A4D /* City.swift */; }; 13 | 14456B881EF96ACD00D76A4D /* SolarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B861EF96ACA00D76A4D /* SolarTests.swift */; }; 14 | 4CABE4EA2161610E009BAAB8 /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; }; 15 | 4CABE50A21616FFB009BAAB8 /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; }; 16 | DA3AAFF525DCBAB400FB1D88 /* CorrectResults.json in Resources */ = {isa = PBXBuildFile; fileRef = 14456B891EF96AD900D76A4D /* CorrectResults.json */; }; 17 | DA85D68225DCADA8008A2AD4 /* Solar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CABE4E2216160CF009BAAB8 /* Solar.framework */; }; 18 | DA85D6B225DCAECC008A2AD4 /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B831EF96ABA00D76A4D /* City.swift */; }; 19 | DA85D6B925DCAED0008A2AD4 /* CorrectResults.json in Resources */ = {isa = PBXBuildFile; fileRef = 14456B891EF96AD900D76A4D /* CorrectResults.json */; }; 20 | DA85D6D525DCB095008A2AD4 /* Solar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CABE500216169DE009BAAB8 /* Solar.framework */; }; 21 | DA85D6FE25DCB0DA008A2AD4 /* City.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B831EF96ABA00D76A4D /* City.swift */; }; 22 | DA85D70625DCB0DD008A2AD4 /* CorrectResults.json in Resources */ = {isa = PBXBuildFile; fileRef = 14456B891EF96AD900D76A4D /* CorrectResults.json */; }; 23 | DA85D70E25DCB0ED008A2AD4 /* SolarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B861EF96ACA00D76A4D /* SolarTests.swift */; }; 24 | DA85D71625DCB0FD008A2AD4 /* SolarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14456B861EF96ACA00D76A4D /* SolarTests.swift */; }; 25 | F7FC5B661D469B4E00C4D3EB /* Solar.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7FC5B651D469B4E00C4D3EB /* Solar.swift */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXContainerItemProxy section */ 29 | 97837EB11E4BB1DE000FEF64 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = F7FC5B511D469B2700C4D3EB /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = F7FC5B591D469B2700C4D3EB; 34 | remoteInfo = Solar; 35 | }; 36 | DA85D68325DCADA8008A2AD4 /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = F7FC5B511D469B2700C4D3EB /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = 4CABE4E1216160CF009BAAB8; 41 | remoteInfo = "Solar macOS"; 42 | }; 43 | DA85D6D625DCB095008A2AD4 /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = F7FC5B511D469B2700C4D3EB /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = 4CABE4FF216169DE009BAAB8; 48 | remoteInfo = "Solar tvOS"; 49 | }; 50 | /* End PBXContainerItemProxy section */ 51 | 52 | /* Begin PBXFileReference section */ 53 | 1410E9B71EF12AD4001829A5 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 1410E9C01EF12B5A001829A5 /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 14456B831EF96ABA00D76A4D /* City.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = City.swift; sourceTree = ""; }; 56 | 14456B861EF96ACA00D76A4D /* SolarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolarTests.swift; sourceTree = ""; }; 57 | 14456B891EF96AD900D76A4D /* CorrectResults.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CorrectResults.json; sourceTree = ""; }; 58 | 14456B8A1EF96AD900D76A4D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | 4CABE4E2216160CF009BAAB8 /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | 4CABE500216169DE009BAAB8 /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | 97837EAB1E4BB1DE000FEF64 /* SolarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SolarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | DA85D67D25DCADA8008A2AD4 /* SolarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SolarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | DA85D6D025DCB095008A2AD4 /* SolarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SolarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | F7FC5B5A1D469B2700C4D3EB /* Solar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Solar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | F7FC5B651D469B4E00C4D3EB /* Solar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Solar.swift; sourceTree = ""; }; 66 | /* End PBXFileReference section */ 67 | 68 | /* Begin PBXFrameworksBuildPhase section */ 69 | 1410E9BC1EF12B5A001829A5 /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | 4CABE4DF216160CF009BAAB8 /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | 4CABE4FD216169DE009BAAB8 /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | 97837EA81E4BB1DE000FEF64 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | 14381E7A1EF96100008E9826 /* Solar.framework in Frameworks */, 95 | ); 96 | runOnlyForDeploymentPostprocessing = 0; 97 | }; 98 | DA85D67A25DCADA8008A2AD4 /* Frameworks */ = { 99 | isa = PBXFrameworksBuildPhase; 100 | buildActionMask = 2147483647; 101 | files = ( 102 | DA85D68225DCADA8008A2AD4 /* Solar.framework in Frameworks */, 103 | ); 104 | runOnlyForDeploymentPostprocessing = 0; 105 | }; 106 | DA85D6CD25DCB095008A2AD4 /* Frameworks */ = { 107 | isa = PBXFrameworksBuildPhase; 108 | buildActionMask = 2147483647; 109 | files = ( 110 | DA85D6D525DCB095008A2AD4 /* Solar.framework in Frameworks */, 111 | ); 112 | runOnlyForDeploymentPostprocessing = 0; 113 | }; 114 | F7FC5B561D469B2700C4D3EB /* Frameworks */ = { 115 | isa = PBXFrameworksBuildPhase; 116 | buildActionMask = 2147483647; 117 | files = ( 118 | ); 119 | runOnlyForDeploymentPostprocessing = 0; 120 | }; 121 | /* End PBXFrameworksBuildPhase section */ 122 | 123 | /* Begin PBXGroup section */ 124 | 14456B801EF96A8F00D76A4D /* SolarTests */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 14456B861EF96ACA00D76A4D /* SolarTests.swift */, 128 | 14456B811EF96A9E00D76A4D /* Helpers */, 129 | 14456B821EF96AA500D76A4D /* Resources */, 130 | ); 131 | path = SolarTests; 132 | sourceTree = ""; 133 | }; 134 | 14456B811EF96A9E00D76A4D /* Helpers */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 14456B831EF96ABA00D76A4D /* City.swift */, 138 | ); 139 | name = Helpers; 140 | sourceTree = ""; 141 | }; 142 | 14456B821EF96AA500D76A4D /* Resources */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | 14456B8A1EF96AD900D76A4D /* Info.plist */, 146 | 14456B891EF96AD900D76A4D /* CorrectResults.json */, 147 | ); 148 | name = Resources; 149 | sourceTree = ""; 150 | }; 151 | F7FC5B501D469B2700C4D3EB = { 152 | isa = PBXGroup; 153 | children = ( 154 | F7FC5B5C1D469B2700C4D3EB /* Solar */, 155 | 14456B801EF96A8F00D76A4D /* SolarTests */, 156 | F7FC5B5B1D469B2700C4D3EB /* Products */, 157 | ); 158 | sourceTree = ""; 159 | }; 160 | F7FC5B5B1D469B2700C4D3EB /* Products */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | F7FC5B5A1D469B2700C4D3EB /* Solar.framework */, 164 | 97837EAB1E4BB1DE000FEF64 /* SolarTests.xctest */, 165 | 1410E9C01EF12B5A001829A5 /* Solar.framework */, 166 | 4CABE4E2216160CF009BAAB8 /* Solar.framework */, 167 | 4CABE500216169DE009BAAB8 /* Solar.framework */, 168 | DA85D67D25DCADA8008A2AD4 /* SolarTests.xctest */, 169 | DA85D6D025DCB095008A2AD4 /* SolarTests.xctest */, 170 | ); 171 | name = Products; 172 | sourceTree = ""; 173 | }; 174 | F7FC5B5C1D469B2700C4D3EB /* Solar */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | F7FC5B651D469B4E00C4D3EB /* Solar.swift */, 178 | 1410E9B71EF12AD4001829A5 /* Info.plist */, 179 | ); 180 | path = Solar; 181 | sourceTree = ""; 182 | }; 183 | /* End PBXGroup section */ 184 | 185 | /* Begin PBXHeadersBuildPhase section */ 186 | 1410E9BD1EF12B5A001829A5 /* Headers */ = { 187 | isa = PBXHeadersBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | 4CABE4DD216160CF009BAAB8 /* Headers */ = { 194 | isa = PBXHeadersBuildPhase; 195 | buildActionMask = 2147483647; 196 | files = ( 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | 4CABE4FB216169DE009BAAB8 /* Headers */ = { 201 | isa = PBXHeadersBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | }; 207 | F7FC5B571D469B2700C4D3EB /* Headers */ = { 208 | isa = PBXHeadersBuildPhase; 209 | buildActionMask = 2147483647; 210 | files = ( 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | /* End PBXHeadersBuildPhase section */ 215 | 216 | /* Begin PBXNativeTarget section */ 217 | 1410E9BF1EF12B5A001829A5 /* Solar watchOS */ = { 218 | isa = PBXNativeTarget; 219 | buildConfigurationList = 1410E9C51EF12B5A001829A5 /* Build configuration list for PBXNativeTarget "Solar watchOS" */; 220 | buildPhases = ( 221 | 1410E9BB1EF12B5A001829A5 /* Sources */, 222 | 1410E9BC1EF12B5A001829A5 /* Frameworks */, 223 | 1410E9BD1EF12B5A001829A5 /* Headers */, 224 | 1410E9BE1EF12B5A001829A5 /* Resources */, 225 | ); 226 | buildRules = ( 227 | ); 228 | dependencies = ( 229 | ); 230 | name = "Solar watchOS"; 231 | productName = Solar; 232 | productReference = 1410E9C01EF12B5A001829A5 /* Solar.framework */; 233 | productType = "com.apple.product-type.framework"; 234 | }; 235 | 4CABE4E1216160CF009BAAB8 /* Solar macOS */ = { 236 | isa = PBXNativeTarget; 237 | buildConfigurationList = 4CABE4E7216160CF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar macOS" */; 238 | buildPhases = ( 239 | 4CABE4DD216160CF009BAAB8 /* Headers */, 240 | 4CABE4DE216160CF009BAAB8 /* Sources */, 241 | 4CABE4DF216160CF009BAAB8 /* Frameworks */, 242 | 4CABE4E0216160CF009BAAB8 /* Resources */, 243 | ); 244 | buildRules = ( 245 | ); 246 | dependencies = ( 247 | ); 248 | name = "Solar macOS"; 249 | productName = Solar_macOS; 250 | productReference = 4CABE4E2216160CF009BAAB8 /* Solar.framework */; 251 | productType = "com.apple.product-type.framework"; 252 | }; 253 | 4CABE4FF216169DE009BAAB8 /* Solar tvOS */ = { 254 | isa = PBXNativeTarget; 255 | buildConfigurationList = 4CABE505216169DF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar tvOS" */; 256 | buildPhases = ( 257 | 4CABE4FB216169DE009BAAB8 /* Headers */, 258 | 4CABE4FC216169DE009BAAB8 /* Sources */, 259 | 4CABE4FD216169DE009BAAB8 /* Frameworks */, 260 | 4CABE4FE216169DE009BAAB8 /* Resources */, 261 | ); 262 | buildRules = ( 263 | ); 264 | dependencies = ( 265 | ); 266 | name = "Solar tvOS"; 267 | productName = Solar_tvOS; 268 | productReference = 4CABE500216169DE009BAAB8 /* Solar.framework */; 269 | productType = "com.apple.product-type.framework"; 270 | }; 271 | 97837EAA1E4BB1DE000FEF64 /* SolarTests iOS */ = { 272 | isa = PBXNativeTarget; 273 | buildConfigurationList = 97837EB51E4BB1DE000FEF64 /* Build configuration list for PBXNativeTarget "SolarTests iOS" */; 274 | buildPhases = ( 275 | 97837EA71E4BB1DE000FEF64 /* Sources */, 276 | 97837EA81E4BB1DE000FEF64 /* Frameworks */, 277 | 97837EA91E4BB1DE000FEF64 /* Resources */, 278 | ); 279 | buildRules = ( 280 | ); 281 | dependencies = ( 282 | 97837EB21E4BB1DE000FEF64 /* PBXTargetDependency */, 283 | ); 284 | name = "SolarTests iOS"; 285 | productName = SolarTests; 286 | productReference = 97837EAB1E4BB1DE000FEF64 /* SolarTests.xctest */; 287 | productType = "com.apple.product-type.bundle.unit-test"; 288 | }; 289 | DA85D67C25DCADA8008A2AD4 /* SolarTests macOS */ = { 290 | isa = PBXNativeTarget; 291 | buildConfigurationList = DA85D68525DCADA8008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests macOS" */; 292 | buildPhases = ( 293 | DA85D67925DCADA8008A2AD4 /* Sources */, 294 | DA85D67A25DCADA8008A2AD4 /* Frameworks */, 295 | DA85D67B25DCADA8008A2AD4 /* Resources */, 296 | ); 297 | buildRules = ( 298 | ); 299 | dependencies = ( 300 | DA85D68425DCADA8008A2AD4 /* PBXTargetDependency */, 301 | ); 302 | name = "SolarTests macOS"; 303 | productName = SolarTests; 304 | productReference = DA85D67D25DCADA8008A2AD4 /* SolarTests.xctest */; 305 | productType = "com.apple.product-type.bundle.unit-test"; 306 | }; 307 | DA85D6CF25DCB095008A2AD4 /* SolarTests tvOS */ = { 308 | isa = PBXNativeTarget; 309 | buildConfigurationList = DA85D6DA25DCB095008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests tvOS" */; 310 | buildPhases = ( 311 | DA85D6CC25DCB095008A2AD4 /* Sources */, 312 | DA85D6CD25DCB095008A2AD4 /* Frameworks */, 313 | DA85D6CE25DCB095008A2AD4 /* Resources */, 314 | ); 315 | buildRules = ( 316 | ); 317 | dependencies = ( 318 | DA85D6D725DCB095008A2AD4 /* PBXTargetDependency */, 319 | ); 320 | name = "SolarTests tvOS"; 321 | productName = SolarTests; 322 | productReference = DA85D6D025DCB095008A2AD4 /* SolarTests.xctest */; 323 | productType = "com.apple.product-type.bundle.unit-test"; 324 | }; 325 | F7FC5B591D469B2700C4D3EB /* Solar iOS */ = { 326 | isa = PBXNativeTarget; 327 | buildConfigurationList = F7FC5B621D469B2700C4D3EB /* Build configuration list for PBXNativeTarget "Solar iOS" */; 328 | buildPhases = ( 329 | F7FC5B551D469B2700C4D3EB /* Sources */, 330 | F7FC5B561D469B2700C4D3EB /* Frameworks */, 331 | F7FC5B571D469B2700C4D3EB /* Headers */, 332 | F7FC5B581D469B2700C4D3EB /* Resources */, 333 | ); 334 | buildRules = ( 335 | ); 336 | dependencies = ( 337 | ); 338 | name = "Solar iOS"; 339 | productName = Solar; 340 | productReference = F7FC5B5A1D469B2700C4D3EB /* Solar.framework */; 341 | productType = "com.apple.product-type.framework"; 342 | }; 343 | /* End PBXNativeTarget section */ 344 | 345 | /* Begin PBXProject section */ 346 | F7FC5B511D469B2700C4D3EB /* Project object */ = { 347 | isa = PBXProject; 348 | attributes = { 349 | LastSwiftUpdateCheck = 1240; 350 | LastUpgradeCheck = 1250; 351 | ORGANIZATIONNAME = "Chris Howell"; 352 | TargetAttributes = { 353 | 1410E9BF1EF12B5A001829A5 = { 354 | CreatedOnToolsVersion = 8.3.3; 355 | ProvisioningStyle = Manual; 356 | }; 357 | 4CABE4E1216160CF009BAAB8 = { 358 | CreatedOnToolsVersion = 10.1; 359 | ProvisioningStyle = Manual; 360 | }; 361 | 4CABE4FF216169DE009BAAB8 = { 362 | CreatedOnToolsVersion = 10.1; 363 | ProvisioningStyle = Automatic; 364 | }; 365 | 97837EAA1E4BB1DE000FEF64 = { 366 | CreatedOnToolsVersion = 8.2.1; 367 | LastSwiftMigration = 1100; 368 | ProvisioningStyle = Automatic; 369 | }; 370 | DA85D67C25DCADA8008A2AD4 = { 371 | CreatedOnToolsVersion = 12.4; 372 | ProvisioningStyle = Automatic; 373 | }; 374 | DA85D6CF25DCB095008A2AD4 = { 375 | CreatedOnToolsVersion = 12.4; 376 | ProvisioningStyle = Automatic; 377 | }; 378 | F7FC5B591D469B2700C4D3EB = { 379 | CreatedOnToolsVersion = 7.3.1; 380 | LastSwiftMigration = 1100; 381 | }; 382 | }; 383 | }; 384 | buildConfigurationList = F7FC5B541D469B2700C4D3EB /* Build configuration list for PBXProject "Solar" */; 385 | compatibilityVersion = "Xcode 3.2"; 386 | developmentRegion = en; 387 | hasScannedForEncodings = 0; 388 | knownRegions = ( 389 | en, 390 | Base, 391 | ); 392 | mainGroup = F7FC5B501D469B2700C4D3EB; 393 | productRefGroup = F7FC5B5B1D469B2700C4D3EB /* Products */; 394 | projectDirPath = ""; 395 | projectRoot = ""; 396 | targets = ( 397 | F7FC5B591D469B2700C4D3EB /* Solar iOS */, 398 | 97837EAA1E4BB1DE000FEF64 /* SolarTests iOS */, 399 | 4CABE4E1216160CF009BAAB8 /* Solar macOS */, 400 | DA85D67C25DCADA8008A2AD4 /* SolarTests macOS */, 401 | 4CABE4FF216169DE009BAAB8 /* Solar tvOS */, 402 | DA85D6CF25DCB095008A2AD4 /* SolarTests tvOS */, 403 | 1410E9BF1EF12B5A001829A5 /* Solar watchOS */, 404 | ); 405 | }; 406 | /* End PBXProject section */ 407 | 408 | /* Begin PBXResourcesBuildPhase section */ 409 | 1410E9BE1EF12B5A001829A5 /* Resources */ = { 410 | isa = PBXResourcesBuildPhase; 411 | buildActionMask = 2147483647; 412 | files = ( 413 | ); 414 | runOnlyForDeploymentPostprocessing = 0; 415 | }; 416 | 4CABE4E0216160CF009BAAB8 /* Resources */ = { 417 | isa = PBXResourcesBuildPhase; 418 | buildActionMask = 2147483647; 419 | files = ( 420 | ); 421 | runOnlyForDeploymentPostprocessing = 0; 422 | }; 423 | 4CABE4FE216169DE009BAAB8 /* Resources */ = { 424 | isa = PBXResourcesBuildPhase; 425 | buildActionMask = 2147483647; 426 | files = ( 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | }; 430 | 97837EA91E4BB1DE000FEF64 /* Resources */ = { 431 | isa = PBXResourcesBuildPhase; 432 | buildActionMask = 2147483647; 433 | files = ( 434 | DA3AAFF525DCBAB400FB1D88 /* CorrectResults.json in Resources */, 435 | ); 436 | runOnlyForDeploymentPostprocessing = 0; 437 | }; 438 | DA85D67B25DCADA8008A2AD4 /* Resources */ = { 439 | isa = PBXResourcesBuildPhase; 440 | buildActionMask = 2147483647; 441 | files = ( 442 | DA85D6B925DCAED0008A2AD4 /* CorrectResults.json in Resources */, 443 | ); 444 | runOnlyForDeploymentPostprocessing = 0; 445 | }; 446 | DA85D6CE25DCB095008A2AD4 /* Resources */ = { 447 | isa = PBXResourcesBuildPhase; 448 | buildActionMask = 2147483647; 449 | files = ( 450 | DA85D70625DCB0DD008A2AD4 /* CorrectResults.json in Resources */, 451 | ); 452 | runOnlyForDeploymentPostprocessing = 0; 453 | }; 454 | F7FC5B581D469B2700C4D3EB /* Resources */ = { 455 | isa = PBXResourcesBuildPhase; 456 | buildActionMask = 2147483647; 457 | files = ( 458 | ); 459 | runOnlyForDeploymentPostprocessing = 0; 460 | }; 461 | /* End PBXResourcesBuildPhase section */ 462 | 463 | /* Begin PBXSourcesBuildPhase section */ 464 | 1410E9BB1EF12B5A001829A5 /* Sources */ = { 465 | isa = PBXSourcesBuildPhase; 466 | buildActionMask = 2147483647; 467 | files = ( 468 | 1410E9C81EF12C1E001829A5 /* Solar.swift in Sources */, 469 | ); 470 | runOnlyForDeploymentPostprocessing = 0; 471 | }; 472 | 4CABE4DE216160CF009BAAB8 /* Sources */ = { 473 | isa = PBXSourcesBuildPhase; 474 | buildActionMask = 2147483647; 475 | files = ( 476 | 4CABE4EA2161610E009BAAB8 /* Solar.swift in Sources */, 477 | ); 478 | runOnlyForDeploymentPostprocessing = 0; 479 | }; 480 | 4CABE4FC216169DE009BAAB8 /* Sources */ = { 481 | isa = PBXSourcesBuildPhase; 482 | buildActionMask = 2147483647; 483 | files = ( 484 | 4CABE50A21616FFB009BAAB8 /* Solar.swift in Sources */, 485 | ); 486 | runOnlyForDeploymentPostprocessing = 0; 487 | }; 488 | 97837EA71E4BB1DE000FEF64 /* Sources */ = { 489 | isa = PBXSourcesBuildPhase; 490 | buildActionMask = 2147483647; 491 | files = ( 492 | 14456B851EF96AC000D76A4D /* City.swift in Sources */, 493 | 14456B881EF96ACD00D76A4D /* SolarTests.swift in Sources */, 494 | ); 495 | runOnlyForDeploymentPostprocessing = 0; 496 | }; 497 | DA85D67925DCADA8008A2AD4 /* Sources */ = { 498 | isa = PBXSourcesBuildPhase; 499 | buildActionMask = 2147483647; 500 | files = ( 501 | DA85D6B225DCAECC008A2AD4 /* City.swift in Sources */, 502 | DA85D70E25DCB0ED008A2AD4 /* SolarTests.swift in Sources */, 503 | ); 504 | runOnlyForDeploymentPostprocessing = 0; 505 | }; 506 | DA85D6CC25DCB095008A2AD4 /* Sources */ = { 507 | isa = PBXSourcesBuildPhase; 508 | buildActionMask = 2147483647; 509 | files = ( 510 | DA85D6FE25DCB0DA008A2AD4 /* City.swift in Sources */, 511 | DA85D71625DCB0FD008A2AD4 /* SolarTests.swift in Sources */, 512 | ); 513 | runOnlyForDeploymentPostprocessing = 0; 514 | }; 515 | F7FC5B551D469B2700C4D3EB /* Sources */ = { 516 | isa = PBXSourcesBuildPhase; 517 | buildActionMask = 2147483647; 518 | files = ( 519 | F7FC5B661D469B4E00C4D3EB /* Solar.swift in Sources */, 520 | ); 521 | runOnlyForDeploymentPostprocessing = 0; 522 | }; 523 | /* End PBXSourcesBuildPhase section */ 524 | 525 | /* Begin PBXTargetDependency section */ 526 | 97837EB21E4BB1DE000FEF64 /* PBXTargetDependency */ = { 527 | isa = PBXTargetDependency; 528 | target = F7FC5B591D469B2700C4D3EB /* Solar iOS */; 529 | targetProxy = 97837EB11E4BB1DE000FEF64 /* PBXContainerItemProxy */; 530 | }; 531 | DA85D68425DCADA8008A2AD4 /* PBXTargetDependency */ = { 532 | isa = PBXTargetDependency; 533 | target = 4CABE4E1216160CF009BAAB8 /* Solar macOS */; 534 | targetProxy = DA85D68325DCADA8008A2AD4 /* PBXContainerItemProxy */; 535 | }; 536 | DA85D6D725DCB095008A2AD4 /* PBXTargetDependency */ = { 537 | isa = PBXTargetDependency; 538 | target = 4CABE4FF216169DE009BAAB8 /* Solar tvOS */; 539 | targetProxy = DA85D6D625DCB095008A2AD4 /* PBXContainerItemProxy */; 540 | }; 541 | /* End PBXTargetDependency section */ 542 | 543 | /* Begin XCBuildConfiguration section */ 544 | 1410E9C61EF12B5A001829A5 /* Debug */ = { 545 | isa = XCBuildConfiguration; 546 | buildSettings = { 547 | APPLICATION_EXTENSION_API_ONLY = YES; 548 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 549 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 550 | CODE_SIGN_IDENTITY = ""; 551 | DEFINES_MODULE = YES; 552 | DEVELOPMENT_TEAM = ""; 553 | DYLIB_COMPATIBILITY_VERSION = 1; 554 | DYLIB_CURRENT_VERSION = 4; 555 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 556 | INFOPLIST_FILE = Solar/Info.plist; 557 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 558 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 559 | MARKETING_VERSION = 2.2.0; 560 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 561 | PRODUCT_NAME = Solar; 562 | PROVISIONING_PROFILE_SPECIFIER = ""; 563 | SDKROOT = watchos; 564 | SKIP_INSTALL = YES; 565 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 566 | TARGETED_DEVICE_FAMILY = 4; 567 | }; 568 | name = Debug; 569 | }; 570 | 1410E9C71EF12B5A001829A5 /* Release */ = { 571 | isa = XCBuildConfiguration; 572 | buildSettings = { 573 | APPLICATION_EXTENSION_API_ONLY = YES; 574 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 575 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 576 | CODE_SIGN_IDENTITY = ""; 577 | DEFINES_MODULE = YES; 578 | DEVELOPMENT_TEAM = ""; 579 | DYLIB_COMPATIBILITY_VERSION = 1; 580 | DYLIB_CURRENT_VERSION = 4; 581 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 582 | INFOPLIST_FILE = Solar/Info.plist; 583 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 584 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 585 | MARKETING_VERSION = 2.2.0; 586 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 587 | PRODUCT_NAME = Solar; 588 | PROVISIONING_PROFILE_SPECIFIER = ""; 589 | SDKROOT = watchos; 590 | SKIP_INSTALL = YES; 591 | TARGETED_DEVICE_FAMILY = 4; 592 | }; 593 | name = Release; 594 | }; 595 | 4CABE4E8216160CF009BAAB8 /* Debug */ = { 596 | isa = XCBuildConfiguration; 597 | buildSettings = { 598 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 599 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 600 | CLANG_ENABLE_OBJC_WEAK = YES; 601 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 602 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 603 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 604 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 605 | CODE_SIGN_IDENTITY = "-"; 606 | CODE_SIGN_STYLE = Manual; 607 | COMBINE_HIDPI_IMAGES = YES; 608 | DEFINES_MODULE = YES; 609 | DEVELOPMENT_TEAM = ""; 610 | DYLIB_COMPATIBILITY_VERSION = 1; 611 | DYLIB_CURRENT_VERSION = 4; 612 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 613 | FRAMEWORK_VERSION = A; 614 | GCC_C_LANGUAGE_STANDARD = gnu11; 615 | INFOPLIST_FILE = Solar/Info.plist; 616 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 617 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 618 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 619 | MTL_FAST_MATH = YES; 620 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 621 | PRODUCT_NAME = Solar; 622 | PROVISIONING_PROFILE_SPECIFIER = ""; 623 | SDKROOT = macosx; 624 | SKIP_INSTALL = YES; 625 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 626 | }; 627 | name = Debug; 628 | }; 629 | 4CABE4E9216160CF009BAAB8 /* Release */ = { 630 | isa = XCBuildConfiguration; 631 | buildSettings = { 632 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 633 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 634 | CLANG_ENABLE_OBJC_WEAK = YES; 635 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 636 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 637 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 638 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 639 | CODE_SIGN_IDENTITY = "-"; 640 | CODE_SIGN_STYLE = Manual; 641 | COMBINE_HIDPI_IMAGES = YES; 642 | DEFINES_MODULE = YES; 643 | DEVELOPMENT_TEAM = ""; 644 | DYLIB_COMPATIBILITY_VERSION = 1; 645 | DYLIB_CURRENT_VERSION = 4; 646 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 647 | FRAMEWORK_VERSION = A; 648 | GCC_C_LANGUAGE_STANDARD = gnu11; 649 | INFOPLIST_FILE = Solar/Info.plist; 650 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 651 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 652 | MTL_FAST_MATH = YES; 653 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 654 | PRODUCT_NAME = Solar; 655 | PROVISIONING_PROFILE_SPECIFIER = ""; 656 | SDKROOT = macosx; 657 | SKIP_INSTALL = YES; 658 | }; 659 | name = Release; 660 | }; 661 | 4CABE506216169DF009BAAB8 /* Debug */ = { 662 | isa = XCBuildConfiguration; 663 | buildSettings = { 664 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 665 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 666 | CLANG_ENABLE_OBJC_WEAK = YES; 667 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 668 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 669 | CODE_SIGN_IDENTITY = ""; 670 | CODE_SIGN_STYLE = Automatic; 671 | DEFINES_MODULE = YES; 672 | DYLIB_COMPATIBILITY_VERSION = 1; 673 | DYLIB_CURRENT_VERSION = 4; 674 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 675 | GCC_C_LANGUAGE_STANDARD = gnu11; 676 | INFOPLIST_FILE = Solar/Info.plist; 677 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 678 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 679 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 680 | MTL_FAST_MATH = YES; 681 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 682 | PRODUCT_NAME = Solar; 683 | SDKROOT = appletvos; 684 | SKIP_INSTALL = YES; 685 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 686 | TARGETED_DEVICE_FAMILY = 3; 687 | }; 688 | name = Debug; 689 | }; 690 | 4CABE507216169DF009BAAB8 /* Release */ = { 691 | isa = XCBuildConfiguration; 692 | buildSettings = { 693 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 694 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 695 | CLANG_ENABLE_OBJC_WEAK = YES; 696 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 697 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 698 | CODE_SIGN_IDENTITY = ""; 699 | CODE_SIGN_STYLE = Automatic; 700 | DEFINES_MODULE = YES; 701 | DYLIB_COMPATIBILITY_VERSION = 1; 702 | DYLIB_CURRENT_VERSION = 4; 703 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 704 | GCC_C_LANGUAGE_STANDARD = gnu11; 705 | INFOPLIST_FILE = Solar/Info.plist; 706 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 707 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 708 | MTL_FAST_MATH = YES; 709 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 710 | PRODUCT_NAME = Solar; 711 | SDKROOT = appletvos; 712 | SKIP_INSTALL = YES; 713 | TARGETED_DEVICE_FAMILY = 3; 714 | }; 715 | name = Release; 716 | }; 717 | 97837EB31E4BB1DE000FEF64 /* Debug */ = { 718 | isa = XCBuildConfiguration; 719 | buildSettings = { 720 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 721 | CODE_SIGN_IDENTITY = "Apple Development"; 722 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; 723 | CODE_SIGN_STYLE = Automatic; 724 | DEVELOPMENT_TEAM = ""; 725 | INFOPLIST_FILE = SolarTests/Info.plist; 726 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 727 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests; 728 | PRODUCT_NAME = SolarTests; 729 | PROVISIONING_PROFILE_SPECIFIER = ""; 730 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; 731 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 732 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 733 | }; 734 | name = Debug; 735 | }; 736 | 97837EB41E4BB1DE000FEF64 /* Release */ = { 737 | isa = XCBuildConfiguration; 738 | buildSettings = { 739 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 740 | CODE_SIGN_IDENTITY = "Apple Development"; 741 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; 742 | CODE_SIGN_STYLE = Automatic; 743 | DEVELOPMENT_TEAM = ""; 744 | INFOPLIST_FILE = SolarTests/Info.plist; 745 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 746 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests; 747 | PRODUCT_NAME = SolarTests; 748 | PROVISIONING_PROFILE_SPECIFIER = ""; 749 | "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; 750 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 751 | }; 752 | name = Release; 753 | }; 754 | DA85D68625DCADA8008A2AD4 /* Debug */ = { 755 | isa = XCBuildConfiguration; 756 | buildSettings = { 757 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 758 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 759 | CLANG_ENABLE_OBJC_WEAK = YES; 760 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 761 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 762 | CODE_SIGN_STYLE = Automatic; 763 | COMBINE_HIDPI_IMAGES = YES; 764 | GCC_C_LANGUAGE_STANDARD = gnu11; 765 | INFOPLIST_FILE = SolarTests/Info.plist; 766 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 767 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 768 | MTL_FAST_MATH = YES; 769 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests; 770 | PRODUCT_NAME = SolarTests; 771 | SDKROOT = macosx; 772 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 773 | }; 774 | name = Debug; 775 | }; 776 | DA85D68725DCADA8008A2AD4 /* Release */ = { 777 | isa = XCBuildConfiguration; 778 | buildSettings = { 779 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 780 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 781 | CLANG_ENABLE_OBJC_WEAK = YES; 782 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 783 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 784 | CODE_SIGN_STYLE = Automatic; 785 | COMBINE_HIDPI_IMAGES = YES; 786 | GCC_C_LANGUAGE_STANDARD = gnu11; 787 | INFOPLIST_FILE = SolarTests/Info.plist; 788 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 789 | MTL_FAST_MATH = YES; 790 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests; 791 | PRODUCT_NAME = SolarTests; 792 | SDKROOT = macosx; 793 | }; 794 | name = Release; 795 | }; 796 | DA85D6D825DCB095008A2AD4 /* Debug */ = { 797 | isa = XCBuildConfiguration; 798 | buildSettings = { 799 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 800 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 801 | CLANG_ENABLE_OBJC_WEAK = YES; 802 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 803 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 804 | CODE_SIGN_STYLE = Automatic; 805 | GCC_C_LANGUAGE_STANDARD = gnu11; 806 | INFOPLIST_FILE = SolarTests/Info.plist; 807 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 808 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 809 | MTL_FAST_MATH = YES; 810 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests; 811 | PRODUCT_NAME = SolarTests; 812 | SDKROOT = appletvos; 813 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 814 | SWIFT_VERSION = 5.0; 815 | TARGETED_DEVICE_FAMILY = 3; 816 | }; 817 | name = Debug; 818 | }; 819 | DA85D6D925DCB095008A2AD4 /* Release */ = { 820 | isa = XCBuildConfiguration; 821 | buildSettings = { 822 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 823 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 824 | CLANG_ENABLE_OBJC_WEAK = YES; 825 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 826 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 827 | CODE_SIGN_STYLE = Automatic; 828 | GCC_C_LANGUAGE_STANDARD = gnu11; 829 | INFOPLIST_FILE = SolarTests/Info.plist; 830 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 831 | MTL_FAST_MATH = YES; 832 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.SolarTests; 833 | PRODUCT_NAME = SolarTests; 834 | SDKROOT = appletvos; 835 | SWIFT_VERSION = 5.0; 836 | TARGETED_DEVICE_FAMILY = 3; 837 | }; 838 | name = Release; 839 | }; 840 | F7FC5B601D469B2700C4D3EB /* Debug */ = { 841 | isa = XCBuildConfiguration; 842 | buildSettings = { 843 | ALWAYS_SEARCH_USER_PATHS = NO; 844 | CLANG_ANALYZER_NONNULL = YES; 845 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 846 | CLANG_CXX_LIBRARY = "libc++"; 847 | CLANG_ENABLE_MODULES = YES; 848 | CLANG_ENABLE_OBJC_ARC = YES; 849 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 850 | CLANG_WARN_BOOL_CONVERSION = YES; 851 | CLANG_WARN_COMMA = YES; 852 | CLANG_WARN_CONSTANT_CONVERSION = YES; 853 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 854 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 855 | CLANG_WARN_EMPTY_BODY = YES; 856 | CLANG_WARN_ENUM_CONVERSION = YES; 857 | CLANG_WARN_INFINITE_RECURSION = YES; 858 | CLANG_WARN_INT_CONVERSION = YES; 859 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 860 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 861 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 862 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 863 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 864 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 865 | CLANG_WARN_STRICT_PROTOTYPES = YES; 866 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 867 | CLANG_WARN_UNREACHABLE_CODE = YES; 868 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 869 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 870 | COPY_PHASE_STRIP = NO; 871 | CURRENT_PROJECT_VERSION = 4; 872 | DEBUG_INFORMATION_FORMAT = dwarf; 873 | ENABLE_HARDENED_RUNTIME = NO; 874 | ENABLE_STRICT_OBJC_MSGSEND = YES; 875 | ENABLE_TESTABILITY = YES; 876 | GCC_C_LANGUAGE_STANDARD = gnu99; 877 | GCC_DYNAMIC_NO_PIC = NO; 878 | GCC_NO_COMMON_BLOCKS = YES; 879 | GCC_OPTIMIZATION_LEVEL = 0; 880 | GCC_PREPROCESSOR_DEFINITIONS = ( 881 | "DEBUG=1", 882 | "$(inherited)", 883 | ); 884 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 885 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 886 | GCC_WARN_UNDECLARED_SELECTOR = YES; 887 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 888 | GCC_WARN_UNUSED_FUNCTION = YES; 889 | GCC_WARN_UNUSED_VARIABLE = YES; 890 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 891 | MACOSX_DEPLOYMENT_TARGET = 10.9; 892 | MTL_ENABLE_DEBUG_INFO = YES; 893 | ONLY_ACTIVE_ARCH = YES; 894 | SDKROOT = iphoneos; 895 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 896 | SWIFT_VERSION = 5.0; 897 | TARGETED_DEVICE_FAMILY = "1,2"; 898 | TVOS_DEPLOYMENT_TARGET = 9.0; 899 | VERSIONING_SYSTEM = "apple-generic"; 900 | VERSION_INFO_PREFIX = ""; 901 | WATCHOS_DEPLOYMENT_TARGET = 3.0; 902 | }; 903 | name = Debug; 904 | }; 905 | F7FC5B611D469B2700C4D3EB /* Release */ = { 906 | isa = XCBuildConfiguration; 907 | buildSettings = { 908 | ALWAYS_SEARCH_USER_PATHS = NO; 909 | CLANG_ANALYZER_NONNULL = YES; 910 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 911 | CLANG_CXX_LIBRARY = "libc++"; 912 | CLANG_ENABLE_MODULES = YES; 913 | CLANG_ENABLE_OBJC_ARC = YES; 914 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 915 | CLANG_WARN_BOOL_CONVERSION = YES; 916 | CLANG_WARN_COMMA = YES; 917 | CLANG_WARN_CONSTANT_CONVERSION = YES; 918 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 919 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 920 | CLANG_WARN_EMPTY_BODY = YES; 921 | CLANG_WARN_ENUM_CONVERSION = YES; 922 | CLANG_WARN_INFINITE_RECURSION = YES; 923 | CLANG_WARN_INT_CONVERSION = YES; 924 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 925 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 926 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 927 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 928 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 929 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 930 | CLANG_WARN_STRICT_PROTOTYPES = YES; 931 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 932 | CLANG_WARN_UNREACHABLE_CODE = YES; 933 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 934 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 935 | COPY_PHASE_STRIP = NO; 936 | CURRENT_PROJECT_VERSION = 4; 937 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 938 | ENABLE_HARDENED_RUNTIME = NO; 939 | ENABLE_NS_ASSERTIONS = NO; 940 | ENABLE_STRICT_OBJC_MSGSEND = YES; 941 | GCC_C_LANGUAGE_STANDARD = gnu99; 942 | GCC_NO_COMMON_BLOCKS = YES; 943 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 944 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 945 | GCC_WARN_UNDECLARED_SELECTOR = YES; 946 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 947 | GCC_WARN_UNUSED_FUNCTION = YES; 948 | GCC_WARN_UNUSED_VARIABLE = YES; 949 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 950 | MACOSX_DEPLOYMENT_TARGET = 10.9; 951 | MTL_ENABLE_DEBUG_INFO = NO; 952 | SDKROOT = iphoneos; 953 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 954 | SWIFT_VERSION = 5.0; 955 | TARGETED_DEVICE_FAMILY = "1,2"; 956 | TVOS_DEPLOYMENT_TARGET = 9.0; 957 | VALIDATE_PRODUCT = YES; 958 | VERSIONING_SYSTEM = "apple-generic"; 959 | VERSION_INFO_PREFIX = ""; 960 | WATCHOS_DEPLOYMENT_TARGET = 3.0; 961 | }; 962 | name = Release; 963 | }; 964 | F7FC5B631D469B2700C4D3EB /* Debug */ = { 965 | isa = XCBuildConfiguration; 966 | buildSettings = { 967 | APPLICATION_EXTENSION_API_ONLY = YES; 968 | CLANG_ENABLE_MODULES = YES; 969 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 970 | DEFINES_MODULE = YES; 971 | DYLIB_COMPATIBILITY_VERSION = 1; 972 | DYLIB_CURRENT_VERSION = 4; 973 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 974 | INFOPLIST_FILE = Solar/Info.plist; 975 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 976 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 977 | MARKETING_VERSION = 2.2.0; 978 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 979 | PRODUCT_NAME = Solar; 980 | SDKROOT = iphoneos; 981 | SKIP_INSTALL = YES; 982 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 983 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 984 | }; 985 | name = Debug; 986 | }; 987 | F7FC5B641D469B2700C4D3EB /* Release */ = { 988 | isa = XCBuildConfiguration; 989 | buildSettings = { 990 | APPLICATION_EXTENSION_API_ONLY = YES; 991 | CLANG_ENABLE_MODULES = YES; 992 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 993 | DEFINES_MODULE = YES; 994 | DYLIB_COMPATIBILITY_VERSION = 1; 995 | DYLIB_CURRENT_VERSION = 4; 996 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 997 | INFOPLIST_FILE = Solar/Info.plist; 998 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 999 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1000 | MARKETING_VERSION = 2.2.0; 1001 | PRODUCT_BUNDLE_IDENTIFIER = me.chrishowell.Solar; 1002 | PRODUCT_NAME = Solar; 1003 | SDKROOT = iphoneos; 1004 | SKIP_INSTALL = YES; 1005 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 1006 | }; 1007 | name = Release; 1008 | }; 1009 | /* End XCBuildConfiguration section */ 1010 | 1011 | /* Begin XCConfigurationList section */ 1012 | 1410E9C51EF12B5A001829A5 /* Build configuration list for PBXNativeTarget "Solar watchOS" */ = { 1013 | isa = XCConfigurationList; 1014 | buildConfigurations = ( 1015 | 1410E9C61EF12B5A001829A5 /* Debug */, 1016 | 1410E9C71EF12B5A001829A5 /* Release */, 1017 | ); 1018 | defaultConfigurationIsVisible = 0; 1019 | defaultConfigurationName = Release; 1020 | }; 1021 | 4CABE4E7216160CF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar macOS" */ = { 1022 | isa = XCConfigurationList; 1023 | buildConfigurations = ( 1024 | 4CABE4E8216160CF009BAAB8 /* Debug */, 1025 | 4CABE4E9216160CF009BAAB8 /* Release */, 1026 | ); 1027 | defaultConfigurationIsVisible = 0; 1028 | defaultConfigurationName = Release; 1029 | }; 1030 | 4CABE505216169DF009BAAB8 /* Build configuration list for PBXNativeTarget "Solar tvOS" */ = { 1031 | isa = XCConfigurationList; 1032 | buildConfigurations = ( 1033 | 4CABE506216169DF009BAAB8 /* Debug */, 1034 | 4CABE507216169DF009BAAB8 /* Release */, 1035 | ); 1036 | defaultConfigurationIsVisible = 0; 1037 | defaultConfigurationName = Release; 1038 | }; 1039 | 97837EB51E4BB1DE000FEF64 /* Build configuration list for PBXNativeTarget "SolarTests iOS" */ = { 1040 | isa = XCConfigurationList; 1041 | buildConfigurations = ( 1042 | 97837EB31E4BB1DE000FEF64 /* Debug */, 1043 | 97837EB41E4BB1DE000FEF64 /* Release */, 1044 | ); 1045 | defaultConfigurationIsVisible = 0; 1046 | defaultConfigurationName = Release; 1047 | }; 1048 | DA85D68525DCADA8008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests macOS" */ = { 1049 | isa = XCConfigurationList; 1050 | buildConfigurations = ( 1051 | DA85D68625DCADA8008A2AD4 /* Debug */, 1052 | DA85D68725DCADA8008A2AD4 /* Release */, 1053 | ); 1054 | defaultConfigurationIsVisible = 0; 1055 | defaultConfigurationName = Release; 1056 | }; 1057 | DA85D6DA25DCB095008A2AD4 /* Build configuration list for PBXNativeTarget "SolarTests tvOS" */ = { 1058 | isa = XCConfigurationList; 1059 | buildConfigurations = ( 1060 | DA85D6D825DCB095008A2AD4 /* Debug */, 1061 | DA85D6D925DCB095008A2AD4 /* Release */, 1062 | ); 1063 | defaultConfigurationIsVisible = 0; 1064 | defaultConfigurationName = Release; 1065 | }; 1066 | F7FC5B541D469B2700C4D3EB /* Build configuration list for PBXProject "Solar" */ = { 1067 | isa = XCConfigurationList; 1068 | buildConfigurations = ( 1069 | F7FC5B601D469B2700C4D3EB /* Debug */, 1070 | F7FC5B611D469B2700C4D3EB /* Release */, 1071 | ); 1072 | defaultConfigurationIsVisible = 0; 1073 | defaultConfigurationName = Release; 1074 | }; 1075 | F7FC5B621D469B2700C4D3EB /* Build configuration list for PBXNativeTarget "Solar iOS" */ = { 1076 | isa = XCConfigurationList; 1077 | buildConfigurations = ( 1078 | F7FC5B631D469B2700C4D3EB /* Debug */, 1079 | F7FC5B641D469B2700C4D3EB /* Release */, 1080 | ); 1081 | defaultConfigurationIsVisible = 0; 1082 | defaultConfigurationName = Release; 1083 | }; 1084 | /* End XCConfigurationList section */ 1085 | }; 1086 | rootObject = F7FC5B511D469B2700C4D3EB /* Project object */; 1087 | } 1088 | -------------------------------------------------------------------------------- /SolarTests/CorrectResults.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "city": "Abu Dhabi", 3 | "latitude": 24.46667, 4 | "longitude": 54.36667, 5 | "sunrise": "2017-02-09T02:59:40+00:00", 6 | "sunset": "2017-02-09T14:13:47+00:00" 7 | }, { 8 | "city": "Abuja", 9 | "latitude": 9.05735, 10 | "longitude": 7.48976, 11 | "sunrise": "2017-02-09T05:50:01+00:00", 12 | "sunset": "2017-02-09T17:38:27+00:00" 13 | }, { 14 | "city": "Accra", 15 | "latitude": 5.55602, 16 | "longitude": -0.1969, 17 | "sunrise": "2017-02-09T06:17:09+00:00", 18 | "sunset": "2017-02-09T18:12:49+00:00" 19 | }, { 20 | "city": "Adamstown", 21 | "latitude": -25.06597, 22 | "longitude": -130.10147, 23 | "sunrise": "2017-02-09T14:23:26+00:00", 24 | "sunset": "2017-02-10T03:25:47+00:00" 25 | }, { 26 | "city": "Addis Ababa", 27 | "latitude": 9.02497, 28 | "longitude": 38.74689, 29 | "sunrise": "2017-02-09T03:44:59+00:00", 30 | "sunset": "2017-02-09T15:33:26+00:00" 31 | }, { 32 | "city": "Algiers", 33 | "latitude": 36.7525, 34 | "longitude": 3.04197, 35 | "sunrise": "2017-02-09T06:41:38+00:00", 36 | "sunset": "2017-02-09T17:22:25+00:00" 37 | }, { 38 | "city": "Alofi", 39 | "latitude": -19.05952, 40 | "longitude": -169.91867, 41 | "sunrise": "2017-02-09T17:10:04+00:00", 42 | "sunset": "2017-02-10T05:57:41+00:00" 43 | }, { 44 | "city": "Amman", 45 | "latitude": 31.95522, 46 | "longitude": 35.94503, 47 | "sunrise": "2017-02-09T04:23:02+00:00", 48 | "sunset": "2017-02-09T15:17:47+00:00" 49 | }, { 50 | "city": "Amsterdam", 51 | "latitude": 52.37403, 52 | "longitude": 4.88969, 53 | "sunrise": "2017-02-09T07:06:08+00:00", 54 | "sunset": "2017-02-09T16:43:09+00:00" 55 | }, { 56 | "city": "Andorra la Vella", 57 | "latitude": 42.50779, 58 | "longitude": 1.52109, 59 | "sunrise": "2017-02-09T06:57:28+00:00", 60 | "sunset": "2017-02-09T17:18:45+00:00" 61 | }, { 62 | "city": "Ankara", 63 | "latitude": 39.91987, 64 | "longitude": 32.85427, 65 | "sunrise": "2017-02-09T04:47:39+00:00", 66 | "sunset": "2017-02-09T15:17:54+00:00" 67 | }, { 68 | "city": "Antananarivo", 69 | "latitude": -18.91433, 70 | "longitude": 47.53098, 71 | "sunrise": "2017-02-09T02:40:08+00:00", 72 | "sunset": "2017-02-09T15:28:00+00:00" 73 | }, { 74 | "city": "Apia", 75 | "latitude": -13.83333, 76 | "longitude": -171.76666, 77 | "sunrise": "2017-02-09T17:23:21+00:00", 78 | "sunset": "2017-02-10T05:59:12+00:00" 79 | }, { 80 | "city": "Ashgabat", 81 | "latitude": 37.95, 82 | "longitude": 58.38333, 83 | "sunrise": "2017-02-09T03:02:20+00:00", 84 | "sunset": "2017-02-09T13:38:59+00:00" 85 | }, { 86 | "city": "Asmara", 87 | "latitude": 15.33333, 88 | "longitude": 38.93333, 89 | "sunrise": "2017-02-09T03:50:56+00:00", 90 | "sunset": "2017-02-09T15:25:59+00:00" 91 | }, { 92 | "city": "Astana", 93 | "latitude": 51.1801, 94 | "longitude": 71.44598, 95 | "sunrise": "2017-02-09T02:37:03+00:00", 96 | "sunset": "2017-02-09T12:19:47+00:00" 97 | }, { 98 | "city": "Asunci??n", 99 | "latitude": -25.30066, 100 | "longitude": -57.63591, 101 | "sunrise": "2017-02-09T09:33:08+00:00", 102 | "sunset": "2017-02-09T22:36:22+00:00" 103 | }, { 104 | "city": "Athens", 105 | "latitude": 37.97945, 106 | "longitude": 23.71622, 107 | "sunrise": "2017-02-09T05:20:57+00:00", 108 | "sunset": "2017-02-09T15:57:43+00:00" 109 | }, { 110 | "city": "Avarua", 111 | "latitude": -21.20778, 112 | "longitude": -159.775, 113 | "sunrise": "2017-02-09T16:26:57+00:00", 114 | "sunset": "2017-02-10T05:19:39+00:00" 115 | }, { 116 | "city": "Baghdad", 117 | "latitude": 33.34058, 118 | "longitude": 44.40088, 119 | "sunrise": "2017-02-09T03:51:12+00:00", 120 | "sunset": "2017-02-09T14:41:59+00:00" 121 | }, { 122 | "city": "Baku", 123 | "latitude": 40.37767, 124 | "longitude": 49.89201, 125 | "sunrise": "2017-02-09T03:40:20+00:00", 126 | "sunset": "2017-02-09T14:08:55+00:00" 127 | }, { 128 | "city": "Bamako", 129 | "latitude": 12.65, 130 | "longitude": -8, 131 | "sunrise": "2017-02-09T06:55:45+00:00", 132 | "sunset": "2017-02-09T18:36:39+00:00" 133 | }, { 134 | "city": "Bandar Seri Begawan", 135 | "latitude": 4.94029, 136 | "longitude": 114.94806, 137 | "sunrise": "2017-02-08T22:35:58+00:00", 138 | "sunset": "2017-02-09T10:32:50+00:00" 139 | }, { 140 | "city": "Bangkok", 141 | "latitude": 13.75, 142 | "longitude": 100.51667, 143 | "sunrise": "2017-02-08T23:42:57+00:00", 144 | "sunset": "2017-02-09T11:21:18+00:00" 145 | }, { 146 | "city": "Bangui", 147 | "latitude": 4.36122, 148 | "longitude": 18.55496, 149 | "sunrise": "2017-02-09T05:00:55+00:00", 150 | "sunset": "2017-02-09T16:59:02+00:00" 151 | }, { 152 | "city": "Banjul", 153 | "latitude": 13.45274, 154 | "longitude": -16.57803, 155 | "sunrise": "2017-02-09T07:30:54+00:00", 156 | "sunset": "2017-02-09T19:10:07+00:00" 157 | }, { 158 | "city": "Basseterre", 159 | "latitude": 17.29484, 160 | "longitude": -62.7261, 161 | "sunrise": "2017-02-09T10:39:37+00:00", 162 | "sunset": "2017-02-09T22:10:36+00:00" 163 | }, { 164 | "city": "Basse-Terre", 165 | "latitude": 15.99854, 166 | "longitude": -61.72548, 167 | "sunrise": "2017-02-09T10:34:11+00:00", 168 | "sunset": "2017-02-09T22:08:01+00:00" 169 | }, { 170 | "city": "Beijing", 171 | "latitude": 39.9075, 172 | "longitude": 116.39723, 173 | "sunrise": "2017-02-08T23:13:43+00:00", 174 | "sunset": "2017-02-09T09:43:29+00:00" 175 | }, { 176 | "city": "Beirut", 177 | "latitude": 33.88894, 178 | "longitude": 35.49442, 179 | "sunrise": "2017-02-09T04:27:36+00:00", 180 | "sunset": "2017-02-09T15:16:50+00:00" 181 | }, { 182 | "city": "Belgrade", 183 | "latitude": 44.80401, 184 | "longitude": 20.46513, 185 | "sunrise": "2017-02-09T05:46:11+00:00", 186 | "sunset": "2017-02-09T15:58:29+00:00" 187 | }, { 188 | "city": "Belmopan", 189 | "latitude": 17.25, 190 | "longitude": -88.76667, 191 | "sunrise": "2017-02-09T12:23:42+00:00", 192 | "sunset": "2017-02-09T23:54:50+00:00" 193 | }, { 194 | "city": "Berlin", 195 | "latitude": 52.52437, 196 | "longitude": 13.41053, 197 | "sunrise": "2017-02-09T06:32:30+00:00", 198 | "sunset": "2017-02-09T16:08:36+00:00" 199 | }, { 200 | "city": "Bern", 201 | "latitude": 46.94809, 202 | "longitude": 7.44744, 203 | "sunrise": "2017-02-09T06:42:41+00:00", 204 | "sunset": "2017-02-09T16:46:08+00:00" 205 | }, { 206 | "city": "Bishkek", 207 | "latitude": 42.87306, 208 | "longitude": 74.60028, 209 | "sunrise": "2017-02-09T02:06:06+00:00", 210 | "sunset": "2017-02-09T12:25:29+00:00" 211 | }, { 212 | "city": "Bissau", 213 | "latitude": 11.85, 214 | "longitude": -15.58333, 215 | "sunrise": "2017-02-09T07:25:13+00:00", 216 | "sunset": "2017-02-09T19:07:50+00:00" 217 | }, { 218 | "city": "Bogot?�", 219 | "latitude": 4.60971, 220 | "longitude": -74.08175, 221 | "sunrise": "2017-02-09T11:11:42+00:00", 222 | "sunset": "2017-02-09T23:09:21+00:00" 223 | }, { 224 | "city": "Bras??lia", 225 | "latitude": -15.77972, 226 | "longitude": -47.92972, 227 | "sunrise": "2017-02-09T09:05:42+00:00", 228 | "sunset": "2017-02-09T21:46:08+00:00" 229 | }, { 230 | "city": "Bratislava", 231 | "latitude": 48.14816, 232 | "longitude": 17.10674, 233 | "sunrise": "2017-02-09T06:06:45+00:00", 234 | "sunset": "2017-02-09T16:04:47+00:00" 235 | }, { 236 | "city": "Brazzaville", 237 | "latitude": -4.2669, 238 | "longitude": 15.28327, 239 | "sunrise": "2017-02-09T05:05:09+00:00", 240 | "sunset": "2017-02-09T17:20:59+00:00" 241 | }, { 242 | "city": "Bridgetown", 243 | "latitude": 13.1, 244 | "longitude": -59.61667, 245 | "sunrise": "2017-02-09T10:22:39+00:00", 246 | "sunset": "2017-02-09T22:02:41+00:00" 247 | }, { 248 | "city": "Brussels", 249 | "latitude": 50.85045, 250 | "longitude": 4.34878, 251 | "sunrise": "2017-02-09T07:04:15+00:00", 252 | "sunset": "2017-02-09T16:49:21+00:00" 253 | }, { 254 | "city": "Bucure�?ti", 255 | "latitude": 44.43225, 256 | "longitude": 26.10626, 257 | "sunrise": "2017-02-09T05:22:54+00:00", 258 | "sunset": "2017-02-09T15:36:38+00:00" 259 | }, { 260 | "city": "Budapest", 261 | "latitude": 47.49801, 262 | "longitude": 19.03991, 263 | "sunrise": "2017-02-09T05:57:34+00:00", 264 | "sunset": "2017-02-09T15:58:30+00:00" 265 | }, { 266 | "city": "Buenos Aires", 267 | "latitude": -34.61315, 268 | "longitude": -58.37723, 269 | "sunrise": "2017-02-09T09:22:49+00:00", 270 | "sunset": "2017-02-09T22:52:36+00:00" 271 | }, { 272 | "city": "Bujumbura", 273 | "latitude": -3.37611, 274 | "longitude": 29.36, 275 | "sunrise": "2017-02-09T04:09:45+00:00", 276 | "sunset": "2017-02-09T16:23:45+00:00" 277 | }, { 278 | "city": "Cairo", 279 | "latitude": 30.06263, 280 | "longitude": 31.24967, 281 | "sunrise": "2017-02-09T04:39:14+00:00", 282 | "sunset": "2017-02-09T15:39:10+00:00" 283 | }, { 284 | "city": "Canberra", 285 | "latitude": -35.28346, 286 | "longitude": 149.12807, 287 | "sunrise": "2017-02-08T19:31:08+00:00", 288 | "sunset": "2017-02-09T09:04:13+00:00" 289 | }, { 290 | "city": "Caracas", 291 | "latitude": 10.5, 292 | "longitude": -66.91667, 293 | "sunrise": "2017-02-09T10:49:06+00:00", 294 | "sunset": "2017-02-09T22:34:37+00:00" 295 | }, { 296 | "city": "Castries", 297 | "latitude": 13.9957, 298 | "longitude": -61.00614, 299 | "sunrise": "2017-02-09T10:29:09+00:00", 300 | "sunset": "2017-02-09T22:07:17+00:00" 301 | }, { 302 | "city": "Cayenne", 303 | "latitude": 4.93333, 304 | "longitude": -52.33333, 305 | "sunrise": "2017-02-09T09:45:02+00:00", 306 | "sunset": "2017-02-09T21:42:01+00:00" 307 | }, { 308 | "city": "Charlotte Amalie", 309 | "latitude": 18.3419, 310 | "longitude": -64.9307, 311 | "sunrise": "2017-02-09T10:49:35+00:00", 312 | "sunset": "2017-02-09T22:18:16+00:00" 313 | }, { 314 | "city": "Chi�?in��u", 315 | "latitude": 47.00556, 316 | "longitude": 28.8575, 317 | "sunrise": "2017-02-09T05:17:15+00:00", 318 | "sunset": "2017-02-09T15:20:16+00:00" 319 | }, { 320 | "city": "Cockburn Town", 321 | "latitude": 21.46122, 322 | "longitude": -71.14188, 323 | "sunrise": "2017-02-09T11:17:57+00:00", 324 | "sunset": "2017-02-09T22:39:35+00:00" 325 | }, { 326 | "city": "Colombo", 327 | "latitude": 6.93194, 328 | "longitude": 79.84778, 329 | "sunrise": "2017-02-09T00:58:25+00:00", 330 | "sunset": "2017-02-09T12:51:11+00:00" 331 | }, { 332 | "city": "Conakry", 333 | "latitude": 9.53795, 334 | "longitude": -13.67729, 335 | "sunrise": "2017-02-09T07:15:11+00:00", 336 | "sunset": "2017-02-09T19:02:38+00:00" 337 | }, { 338 | "city": "Copenhagen", 339 | "latitude": 55.67594, 340 | "longitude": 12.56553, 341 | "sunrise": "2017-02-09T06:45:21+00:00", 342 | "sunset": "2017-02-09T16:02:31+00:00" 343 | }, { 344 | "city": "Dakar", 345 | "latitude": 14.6937, 346 | "longitude": -17.44406, 347 | "sunrise": "2017-02-09T07:35:42+00:00", 348 | "sunset": "2017-02-09T19:12:15+00:00" 349 | }, { 350 | "city": "Damascus", 351 | "latitude": 33.5102, 352 | "longitude": 36.29128, 353 | "sunrise": "2017-02-09T04:23:52+00:00", 354 | "sunset": "2017-02-09T15:14:12+00:00" 355 | }, { 356 | "city": "Dhaka", 357 | "latitude": 23.7104, 358 | "longitude": 90.40744, 359 | "sunrise": "2017-02-09T00:34:39+00:00", 360 | "sunset": "2017-02-09T11:50:28+00:00" 361 | }, { 362 | "city": "Dili", 363 | "latitude": -8.55861, 364 | "longitude": 125.57361, 365 | "sunrise": "2017-02-08T21:39:25+00:00", 366 | "sunset": "2017-02-09T10:04:22+00:00" 367 | }, { 368 | "city": "Djibouti", 369 | "latitude": 11.58767, 370 | "longitude": 43.14468, 371 | "sunrise": "2017-02-09T03:30:05+00:00", 372 | "sunset": "2017-02-09T15:13:09+00:00" 373 | }, { 374 | "city": "Dodoma", 375 | "latitude": -6.17486, 376 | "longitude": 35.73792, 377 | "sunrise": "2017-02-09T03:41:20+00:00", 378 | "sunset": "2017-02-09T16:01:09+00:00" 379 | }, { 380 | "city": "Doha", 381 | "latitude": 25.27932, 382 | "longitude": 51.52245, 383 | "sunrise": "2017-02-09T03:12:02+00:00", 384 | "sunset": "2017-02-09T14:24:10+00:00" 385 | }, { 386 | "city": "Douglas", 387 | "latitude": 54.15, 388 | "longitude": -4.48333, 389 | "sunrise": "2017-02-09T07:48:40+00:00", 390 | "sunset": "2017-02-09T17:15:35+00:00" 391 | }, { 392 | "city": "Dublin", 393 | "latitude": 53.34399, 394 | "longitude": -6.26719, 395 | "sunrise": "2017-02-09T07:53:26+00:00", 396 | "sunset": "2017-02-09T17:25:06+00:00" 397 | }, { 398 | "city": "Dushanbe", 399 | "latitude": 38.53575, 400 | "longitude": 68.77905, 401 | "sunrise": "2017-02-09T02:21:44+00:00", 402 | "sunset": "2017-02-09T12:56:25+00:00" 403 | }, { 404 | "city": "Flying Fish Cove", 405 | "latitude": -10.42172, 406 | "longitude": 105.67912, 407 | "sunrise": "2017-02-08T22:57:01+00:00", 408 | "sunset": "2017-02-09T11:25:56+00:00" 409 | }, { 410 | "city": "Fort-de-France", 411 | "latitude": 14.60892, 412 | "longitude": -61.07334, 413 | "sunrise": "2017-02-09T10:30:05+00:00", 414 | "sunset": "2017-02-09T22:06:54+00:00" 415 | }, { 416 | "city": "Freetown", 417 | "latitude": 8.484, 418 | "longitude": -13.22994, 419 | "sunrise": "2017-02-09T07:12:18+00:00", 420 | "sunset": "2017-02-09T19:01:56+00:00" 421 | }, { 422 | "city": "Funafuti", 423 | "latitude": -8.52425, 424 | "longitude": 179.19417, 425 | "sunrise": "2017-02-08T18:04:57+00:00", 426 | "sunset": "2017-02-09T06:29:53+00:00" 427 | }, { 428 | "city": "Gaborone", 429 | "latitude": -24.65451, 430 | "longitude": 25.90859, 431 | "sunrise": "2017-02-09T03:59:37+00:00", 432 | "sunset": "2017-02-09T17:01:30+00:00" 433 | }, { 434 | "city": "George Town", 435 | "latitude": 19.28692, 436 | "longitude": -81.36706, 437 | "sunrise": "2017-02-09T11:56:22+00:00", 438 | "sunset": "2017-02-09T23:22:58+00:00" 439 | }, { 440 | "city": "Georgetown", 441 | "latitude": 6.80448, 442 | "longitude": -58.15527, 443 | "sunrise": "2017-02-09T10:10:15+00:00", 444 | "sunset": "2017-02-09T22:03:24+00:00" 445 | }, { 446 | "city": "Gibraltar", 447 | "latitude": 36.14474, 448 | "longitude": -5.35257, 449 | "sunrise": "2017-02-09T07:14:15+00:00", 450 | "sunset": "2017-02-09T17:56:58+00:00" 451 | }, { 452 | "city": "Grytviken", 453 | "latitude": -54.28111, 454 | "longitude": -36.5092, 455 | "sunrise": "2017-02-09T07:10:34+00:00", 456 | "sunset": "2017-02-09T22:09:54+00:00" 457 | }, { 458 | "city": "Guatemala City", 459 | "latitude": 14.64072, 460 | "longitude": -90.51327, 461 | "sunrise": "2017-02-09T12:27:51+00:00", 462 | "sunset": "2017-02-10T00:04:39+00:00" 463 | }, { 464 | "city": "Gustavia", 465 | "latitude": 17.89618, 466 | "longitude": -62.84978, 467 | "sunrise": "2017-02-09T10:40:46+00:00", 468 | "sunset": "2017-02-09T22:10:26+00:00" 469 | }, { 470 | "city": "H?� N��?i", 471 | "latitude": 21.0245, 472 | "longitude": 105.84117, 473 | "sunrise": "2017-02-08T23:29:46+00:00", 474 | "sunset": "2017-02-09T10:51:53+00:00" 475 | }, { 476 | "city": "Hag?�t?�a", 477 | "latitude": 13.47417, 478 | "longitude": 144.74778, 479 | "sunrise": "2017-02-08T20:45:46+00:00", 480 | "sunset": "2017-02-09T08:24:38+00:00" 481 | }, { 482 | "city": "Hamilton", 483 | "latitude": 32.29149, 484 | "longitude": -64.77797, 485 | "sunrise": "2017-02-09T11:06:10+00:00", 486 | "sunset": "2017-02-09T22:00:27+00:00" 487 | }, { 488 | "city": "Harare", 489 | "latitude": -17.82935, 490 | "longitude": 31.05389, 491 | "sunrise": "2017-02-09T03:47:20+00:00", 492 | "sunset": "2017-02-09T16:32:37+00:00" 493 | }, { 494 | "city": "Havana", 495 | "latitude": 23.13302, 496 | "longitude": -82.38304, 497 | "sunrise": "2017-02-09T12:04:51+00:00", 498 | "sunset": "2017-02-09T23:22:37+00:00" 499 | }, { 500 | "city": "Helsinki", 501 | "latitude": 60.16952, 502 | "longitude": 24.93545, 503 | "sunrise": "2017-02-09T06:12:49+00:00", 504 | "sunset": "2017-02-09T14:56:06+00:00" 505 | }, { 506 | "city": "Hong Kong", 507 | "latitude": 22.28552, 508 | "longitude": 114.15769, 509 | "sunrise": "2017-02-08T22:58:00+00:00", 510 | "sunset": "2017-02-09T10:17:08+00:00" 511 | }, { 512 | "city": "Honiara", 513 | "latitude": -9.43333, 514 | "longitude": 159.95, 515 | "sunrise": "2017-02-08T19:20:58+00:00", 516 | "sunset": "2017-02-09T07:47:49+00:00" 517 | }, { 518 | "city": "Isl��m��b��d", 519 | "latitude": 33.72148, 520 | "longitude": 73.04329, 521 | "sunrise": "2017-02-09T01:57:15+00:00", 522 | "sunset": "2017-02-09T12:46:47+00:00" 523 | }, { 524 | "city": "Jakarta", 525 | "latitude": -6.21462, 526 | "longitude": 106.84513, 527 | "sunrise": "2017-02-08T22:56:50+00:00", 528 | "sunset": "2017-02-09T11:16:47+00:00" 529 | }, { 530 | "city": "Jamestown", 531 | "latitude": -15.93872, 532 | "longitude": -5.71675, 533 | "sunrise": "2017-02-09T06:16:38+00:00", 534 | "sunset": "2017-02-09T18:57:30+00:00" 535 | }, { 536 | "city": "Kabul", 537 | "latitude": 34.52813, 538 | "longitude": 69.17233, 539 | "sunrise": "2017-02-09T02:13:55+00:00", 540 | "sunset": "2017-02-09T13:01:06+00:00" 541 | }, { 542 | "city": "Kampala", 543 | "latitude": 0.31628, 544 | "longitude": 32.58219, 545 | "sunrise": "2017-02-09T04:00:40+00:00", 546 | "sunset": "2017-02-09T16:07:04+00:00" 547 | }, { 548 | "city": "Kathmandu", 549 | "latitude": 27.70169, 550 | "longitude": 85.3206, 551 | "sunrise": "2017-02-09T00:59:57+00:00", 552 | "sunset": "2017-02-09T12:05:52+00:00" 553 | }, { 554 | "city": "Khartoum", 555 | "latitude": 15.54665, 556 | "longitude": 32.53361, 557 | "sunrise": "2017-02-09T04:16:46+00:00", 558 | "sunset": "2017-02-09T15:51:22+00:00" 559 | }, { 560 | "city": "Kiev", 561 | "latitude": 50.45466, 562 | "longitude": 30.5238, 563 | "sunrise": "2017-02-09T05:18:40+00:00", 564 | "sunset": "2017-02-09T15:05:32+00:00" 565 | }, { 566 | "city": "Kigali", 567 | "latitude": -1.94995, 568 | "longitude": 30.05885, 569 | "sunrise": "2017-02-09T04:08:26+00:00", 570 | "sunset": "2017-02-09T16:19:29+00:00" 571 | }, { 572 | "city": "Kingston", 573 | "latitude": -29.05459, 574 | "longitude": 167.96628, 575 | "sunrise": "2017-02-08T18:25:11+00:00", 576 | "sunset": "2017-02-09T07:39:28+00:00" 577 | }, { 578 | "city": "Kingston", 579 | "latitude": 17.99702, 580 | "longitude": -76.79358, 581 | "sunrise": "2017-02-09T11:36:38+00:00", 582 | "sunset": "2017-02-09T23:06:07+00:00" 583 | }, { 584 | "city": "Kingstown", 585 | "latitude": 13.15872, 586 | "longitude": -61.22475, 587 | "sunrise": "2017-02-09T10:29:08+00:00", 588 | "sunset": "2017-02-09T22:09:03+00:00" 589 | }, { 590 | "city": "Kinshasa", 591 | "latitude": -4.32459, 592 | "longitude": 15.32146, 593 | "sunrise": "2017-02-09T05:04:56+00:00", 594 | "sunset": "2017-02-09T17:20:53+00:00" 595 | }, { 596 | "city": "Kuala Lumpur", 597 | "latitude": 3.1412, 598 | "longitude": 101.68653, 599 | "sunrise": "2017-02-08T23:27:09+00:00", 600 | "sunset": "2017-02-09T11:27:44+00:00" 601 | }, { 602 | "city": "Kuwait", 603 | "latitude": 29.36972, 604 | "longitude": 47.97833, 605 | "sunrise": "2017-02-09T03:31:26+00:00", 606 | "sunset": "2017-02-09T14:33:08+00:00" 607 | }, { 608 | "city": "La Paz", 609 | "latitude": -16.5, 610 | "longitude": -68.15, 611 | "sunrise": "2017-02-09T10:25:48+00:00", 612 | "sunset": "2017-02-09T23:07:48+00:00" 613 | }, { 614 | "city": "Libreville", 615 | "latitude": 0.38333, 616 | "longitude": 9.45, 617 | "sunrise": "2017-02-09T05:33:16+00:00", 618 | "sunset": "2017-02-09T17:39:32+00:00" 619 | }, { 620 | "city": "Lilongwe", 621 | "latitude": -13.98333, 622 | "longitude": 33.78333, 623 | "sunrise": "2017-02-09T03:40:46+00:00", 624 | "sunset": "2017-02-09T16:17:21+00:00" 625 | }, { 626 | "city": "Lima", 627 | "latitude": -12.04318, 628 | "longitude": -77.02824, 629 | "sunrise": "2017-02-09T11:06:15+00:00", 630 | "sunset": "2017-02-09T23:38:23+00:00" 631 | }, { 632 | "city": "Lisbon", 633 | "latitude": 38.71667, 634 | "longitude": -9.13333, 635 | "sunrise": "2017-02-09T07:33:27+00:00", 636 | "sunset": "2017-02-09T18:08:01+00:00" 637 | }, { 638 | "city": "Ljubljana", 639 | "latitude": 46.05108, 640 | "longitude": 14.50513, 641 | "sunrise": "2017-02-09T06:12:34+00:00", 642 | "sunset": "2017-02-09T16:19:47+00:00" 643 | }, { 644 | "city": "Lom??", 645 | "latitude": 6.13748, 646 | "longitude": 1.21227, 647 | "sunrise": "2017-02-09T06:12:07+00:00", 648 | "sunset": "2017-02-09T18:06:35+00:00" 649 | }, { 650 | "city": "London", 651 | "latitude": 51.50853, 652 | "longitude": -0.12574, 653 | "sunrise": "2017-02-09T07:23:50+00:00", 654 | "sunset": "2017-02-09T17:05:34+00:00" 655 | }, { 656 | "city": "Luanda", 657 | "latitude": -8.83833, 658 | "longitude": 13.23444, 659 | "sunrise": "2017-02-09T05:08:33+00:00", 660 | "sunset": "2017-02-09T17:33:57+00:00" 661 | }, { 662 | "city": "Lusaka", 663 | "latitude": -15.40809, 664 | "longitude": 28.28636, 665 | "sunrise": "2017-02-09T04:01:10+00:00", 666 | "sunset": "2017-02-09T16:40:55+00:00" 667 | }, { 668 | "city": "Luxembourg", 669 | "latitude": 49.61167, 670 | "longitude": 6.13, 671 | "sunrise": "2017-02-09T06:54:03+00:00", 672 | "sunset": "2017-02-09T16:45:18+00:00" 673 | }, { 674 | "city": "Macau", 675 | "latitude": 22.20056, 676 | "longitude": 113.54611, 677 | "sunrise": "2017-02-08T23:00:20+00:00", 678 | "sunset": "2017-02-09T10:19:40+00:00" 679 | }, { 680 | "city": "Madrid", 681 | "latitude": 40.4165, 682 | "longitude": -3.70256, 683 | "sunrise": "2017-02-09T07:14:37+00:00", 684 | "sunset": "2017-02-09T17:43:24+00:00" 685 | }, { 686 | "city": "Majuro", 687 | "latitude": 7.08971, 688 | "longitude": 171.38027, 689 | "sunrise": "2017-02-08T18:52:29+00:00", 690 | "sunset": "2017-02-09T06:44:51+00:00" 691 | }, { 692 | "city": "Malabo", 693 | "latitude": 3.75, 694 | "longitude": 8.78333, 695 | "sunrise": "2017-02-09T05:39:23+00:00", 696 | "sunset": "2017-02-09T17:38:45+00:00" 697 | }, { 698 | "city": "Male", 699 | "latitude": 4.1748, 700 | "longitude": 73.50888, 701 | "sunrise": "2017-02-09T01:20:55+00:00", 702 | "sunset": "2017-02-09T13:19:23+00:00" 703 | }, { 704 | "city": "Mamoudzou", 705 | "latitude": -12.77944, 706 | "longitude": 45.22722, 707 | "sunrise": "2017-02-09T02:56:19+00:00", 708 | "sunset": "2017-02-09T15:30:15+00:00" 709 | }, { 710 | "city": "Managua", 711 | "latitude": 12.13282, 712 | "longitude": -86.2504, 713 | "sunrise": "2017-02-09T12:08:08+00:00", 714 | "sunset": "2017-02-09T23:50:16+00:00" 715 | }, { 716 | "city": "Manama", 717 | "latitude": 26.21536, 718 | "longitude": 50.5832, 719 | "sunrise": "2017-02-09T03:16:57+00:00", 720 | "sunset": "2017-02-09T14:26:46+00:00" 721 | }, { 722 | "city": "Manila", 723 | "latitude": 14.6042, 724 | "longitude": 120.9822, 725 | "sunrise": "2017-02-08T22:22:02+00:00", 726 | "sunset": "2017-02-09T09:58:30+00:00" 727 | }, { 728 | "city": "Maputo", 729 | "latitude": -25.96528, 730 | "longitude": 32.58917, 731 | "sunrise": "2017-02-09T03:31:11+00:00", 732 | "sunset": "2017-02-09T16:36:29+00:00" 733 | }, { 734 | "city": "Mariehamn", 735 | "latitude": 60.09726, 736 | "longitude": 19.93481, 737 | "sunrise": "2017-02-09T06:32:28+00:00", 738 | "sunset": "2017-02-09T15:16:27+00:00" 739 | }, { 740 | "city": "Marigot", 741 | "latitude": 18.06667, 742 | "longitude": -63.08333, 743 | "sunrise": "2017-02-09T10:41:53+00:00", 744 | "sunset": "2017-02-09T22:11:10+00:00" 745 | }, { 746 | "city": "Maseru", 747 | "latitude": -29.31667, 748 | "longitude": 27.48333, 749 | "sunrise": "2017-02-09T03:47:04+00:00", 750 | "sunset": "2017-02-09T17:01:28+00:00" 751 | }, { 752 | "city": "Mat?�'utu", 753 | "latitude": -13.28163, 754 | "longitude": -176.17453, 755 | "sunrise": "2017-02-09T17:41:35+00:00", 756 | "sunset": "2017-02-10T06:16:13+00:00" 757 | }, { 758 | "city": "Mbabane", 759 | "latitude": -26.31667, 760 | "longitude": 31.13333, 761 | "sunrise": "2017-02-09T03:36:33+00:00", 762 | "sunset": "2017-02-09T16:42:47+00:00" 763 | }, { 764 | "city": "Mexico City", 765 | "latitude": 19.42847, 766 | "longitude": -99.12766, 767 | "sunrise": "2017-02-09T13:07:33+00:00", 768 | "sunset": "2017-02-10T00:33:53+00:00" 769 | }, { 770 | "city": "Minsk", 771 | "latitude": 53.9, 772 | "longitude": 27.56667, 773 | "sunrise": "2017-02-09T05:39:54+00:00", 774 | "sunset": "2017-02-09T15:07:57+00:00" 775 | }, { 776 | "city": "Mogadishu", 777 | "latitude": 2.03711, 778 | "longitude": 45.34375, 779 | "sunrise": "2017-02-09T03:11:23+00:00", 780 | "sunset": "2017-02-09T15:14:15+00:00" 781 | }, { 782 | "city": "Monaco", 783 | "latitude": 43.73333, 784 | "longitude": 7.41667, 785 | "sunrise": "2017-02-09T06:36:14+00:00", 786 | "sunset": "2017-02-09T16:52:50+00:00" 787 | }, { 788 | "city": "Monrovia", 789 | "latitude": 6.30054, 790 | "longitude": -10.7969, 791 | "sunrise": "2017-02-09T07:00:19+00:00", 792 | "sunset": "2017-02-09T18:54:27+00:00" 793 | }, { 794 | "city": "Montevideo", 795 | "latitude": -34.83346, 796 | "longitude": -56.16735, 797 | "sunrise": "2017-02-09T09:13:37+00:00", 798 | "sunset": "2017-02-09T22:44:07+00:00" 799 | }, { 800 | "city": "Moroni", 801 | "latitude": -11.70216, 802 | "longitude": 43.25506, 803 | "sunrise": "2017-02-09T03:05:23+00:00", 804 | "sunset": "2017-02-09T15:36:58+00:00" 805 | }, { 806 | "city": "Moscow", 807 | "latitude": 55.75222, 808 | "longitude": 37.61556, 809 | "sunrise": "2017-02-09T05:05:33+00:00", 810 | "sunset": "2017-02-09T14:21:55+00:00" 811 | }, { 812 | "city": "Muscat", 813 | "latitude": 23.61333, 814 | "longitude": 58.59333, 815 | "sunrise": "2017-02-09T02:41:45+00:00", 816 | "sunset": "2017-02-09T13:57:54+00:00" 817 | }, { 818 | "city": "Nairobi", 819 | "latitude": -1.28333, 820 | "longitude": 36.81667, 821 | "sunrise": "2017-02-09T03:42:05+00:00", 822 | "sunset": "2017-02-09T15:51:46+00:00" 823 | }, { 824 | "city": "Nassau", 825 | "latitude": 25.05823, 826 | "longitude": -77.34306, 827 | "sunrise": "2017-02-09T11:47:00+00:00", 828 | "sunset": "2017-02-09T23:00:08+00:00" 829 | }, { 830 | "city": "Nay Pyi Taw", 831 | "latitude": 19.745, 832 | "longitude": 96.12972, 833 | "sunrise": "2017-02-09T00:07:08+00:00", 834 | "sunset": "2017-02-09T11:32:13+00:00" 835 | }, { 836 | "city": "N'Djamena", 837 | "latitude": 12.11058, 838 | "longitude": 15.03479, 839 | "sunrise": "2017-02-09T05:23:03+00:00", 840 | "sunset": "2017-02-09T17:05:04+00:00" 841 | }, { 842 | "city": "New Delhi", 843 | "latitude": 28.63576, 844 | "longitude": 77.22445, 845 | "sunrise": "2017-02-09T01:33:32+00:00", 846 | "sunset": "2017-02-09T12:37:03+00:00" 847 | }, { 848 | "city": "Ngerulmud", 849 | "latitude": 7.50043, 850 | "longitude": 134.62355, 851 | "sunrise": "2017-02-08T21:19:56+00:00", 852 | "sunset": "2017-02-09T09:11:28+00:00" 853 | }, { 854 | "city": "Niamey", 855 | "latitude": 13.5125, 856 | "longitude": 2.11178, 857 | "sunrise": "2017-02-09T06:16:13+00:00", 858 | "sunset": "2017-02-09T17:55:16+00:00" 859 | }, { 860 | "city": "Nicosia", 861 | "latitude": 35.16667, 862 | "longitude": 33.36667, 863 | "sunrise": "2017-02-09T04:38:00+00:00", 864 | "sunset": "2017-02-09T15:23:28+00:00" 865 | }, { 866 | "city": "Nouakchott", 867 | "latitude": 18.10033, 868 | "longitude": -15.94975, 869 | "sunrise": "2017-02-09T07:33:27+00:00", 870 | "sunset": "2017-02-09T19:02:32+00:00" 871 | }, { 872 | "city": "Noum??a", 873 | "latitude": -22.27631, 874 | "longitude": 166.4572, 875 | "sunrise": "2017-02-08T18:40:11+00:00", 876 | "sunset": "2017-02-09T07:36:32+00:00" 877 | }, { 878 | "city": "Nuku`alofa", 879 | "latitude": -21.13333, 880 | "longitude": -175.2, 881 | "sunrise": "2017-02-09T17:28:46+00:00", 882 | "sunset": "2017-02-10T06:21:15+00:00" 883 | }, { 884 | "city": "Nuuk", 885 | "latitude": 64.18347, 886 | "longitude": -51.72157, 887 | "sunrise": "2017-02-09T11:38:57+00:00", 888 | "sunset": "2017-02-09T19:43:13+00:00" 889 | }, { 890 | "city": "Oranjestad", 891 | "latitude": 12.52398, 892 | "longitude": -70.02703, 893 | "sunrise": "2017-02-09T11:03:40+00:00", 894 | "sunset": "2017-02-09T22:44:57+00:00" 895 | }, { 896 | "city": "Oslo", 897 | "latitude": 59.91273, 898 | "longitude": 10.74609, 899 | "sunrise": "2017-02-09T07:08:22+00:00", 900 | "sunset": "2017-02-09T15:54:03+00:00" 901 | }, { 902 | "city": "Ottawa", 903 | "latitude": 45.41117, 904 | "longitude": -75.69812, 905 | "sunrise": "2017-02-09T12:11:42+00:00", 906 | "sunset": "2017-02-09T22:22:17+00:00" 907 | }, { 908 | "city": "Ouagadougou", 909 | "latitude": 12.36423, 910 | "longitude": -1.53834, 911 | "sunrise": "2017-02-09T06:29:36+00:00", 912 | "sunset": "2017-02-09T18:11:06+00:00" 913 | }, { 914 | "city": "Pago Pago", 915 | "latitude": -14.27806, 916 | "longitude": -170.7025, 917 | "sunrise": "2017-02-09T17:18:36+00:00", 918 | "sunset": "2017-02-10T05:55:25+00:00" 919 | }, { 920 | "city": "Palikir - National Government Center", 921 | "latitude": 6.92477, 922 | "longitude": 158.16109, 923 | "sunrise": "2017-02-08T19:45:11+00:00", 924 | "sunset": "2017-02-09T07:37:54+00:00" 925 | }, { 926 | "city": "Panam?�", 927 | "latitude": 8.9936, 928 | "longitude": -79.51973, 929 | "sunrise": "2017-02-09T11:37:57+00:00", 930 | "sunset": "2017-02-09T23:26:37+00:00" 931 | }, { 932 | "city": "Papeete", 933 | "latitude": -17.53333, 934 | "longitude": -149.56667, 935 | "sunrise": "2017-02-09T15:50:24+00:00", 936 | "sunset": "2017-02-10T04:34:33+00:00" 937 | }, { 938 | "city": "Paramaribo", 939 | "latitude": 5.86638, 940 | "longitude": -55.16682, 941 | "sunrise": "2017-02-09T09:57:20+00:00", 942 | "sunset": "2017-02-09T21:52:24+00:00" 943 | }, { 944 | "city": "Paris", 945 | "latitude": 48.85341, 946 | "longitude": 2.3488, 947 | "sunrise": "2017-02-09T07:07:21+00:00", 948 | "sunset": "2017-02-09T17:02:15+00:00" 949 | }, { 950 | "city": "Philipsburg", 951 | "latitude": 18.026, 952 | "longitude": -63.04582, 953 | "sunrise": "2017-02-09T10:41:42+00:00", 954 | "sunset": "2017-02-09T22:11:04+00:00" 955 | }, { 956 | "city": "Phnom Penh", 957 | "latitude": 11.56245, 958 | "longitude": 104.91601, 959 | "sunrise": "2017-02-08T23:23:01+00:00", 960 | "sunset": "2017-02-09T11:06:03+00:00" 961 | }, { 962 | "city": "Plymouth", 963 | "latitude": 16.70555, 964 | "longitude": -62.21292, 965 | "sunrise": "2017-02-09T10:36:55+00:00", 966 | "sunset": "2017-02-09T22:09:11+00:00" 967 | }, { 968 | "city": "Podgorica", 969 | "latitude": 42.44111, 970 | "longitude": 19.26361, 971 | "sunrise": "2017-02-09T05:46:27+00:00", 972 | "sunset": "2017-02-09T16:07:50+00:00" 973 | }, { 974 | "city": "Port Louis", 975 | "latitude": -20.16194, 976 | "longitude": 57.49889, 977 | "sunrise": "2017-02-09T01:58:46+00:00", 978 | "sunset": "2017-02-09T14:49:37+00:00" 979 | }, { 980 | "city": "Port Moresby", 981 | "latitude": -9.44314, 982 | "longitude": 147.17972, 983 | "sunrise": "2017-02-08T20:12:02+00:00", 984 | "sunset": "2017-02-09T08:38:54+00:00" 985 | }, { 986 | "city": "Port-au-Prince", 987 | "latitude": 18.53917, 988 | "longitude": -72.335, 989 | "sunrise": "2017-02-09T11:19:25+00:00", 990 | "sunset": "2017-02-09T22:47:40+00:00" 991 | }, { 992 | "city": "Port-aux-Fran??ais", 993 | "latitude": -49.35, 994 | "longitude": 70.21667, 995 | "sunrise": "2017-02-09T00:17:56+00:00", 996 | "sunset": "2017-02-09T14:48:43+00:00" 997 | }, { 998 | "city": "Port-of-Spain", 999 | "latitude": 10.66617, 1000 | "longitude": -61.51657, 1001 | "sunrise": "2017-02-09T10:27:41+00:00", 1002 | "sunset": "2017-02-09T22:12:51+00:00" 1003 | }, { 1004 | "city": "Porto-Novo", 1005 | "latitude": 6.49646, 1006 | "longitude": 2.60359, 1007 | "sunrise": "2017-02-09T06:06:55+00:00", 1008 | "sunset": "2017-02-09T18:00:39+00:00" 1009 | }, { 1010 | "city": "Port-Vila", 1011 | "latitude": -17.73381, 1012 | "longitude": 168.32188, 1013 | "sunrise": "2017-02-08T18:38:12+00:00", 1014 | "sunset": "2017-02-09T07:23:36+00:00" 1015 | }, { 1016 | "city": "Praha", 1017 | "latitude": 50.08804, 1018 | "longitude": 14.42076, 1019 | "sunrise": "2017-02-09T06:22:06+00:00", 1020 | "sunset": "2017-02-09T16:10:56+00:00" 1021 | }, { 1022 | "city": "Praia", 1023 | "latitude": 14.92148, 1024 | "longitude": -23.50868, 1025 | "sunrise": "2017-02-09T08:00:12+00:00", 1026 | "sunset": "2017-02-09T19:36:16+00:00" 1027 | }, { 1028 | "city": "Pretoria", 1029 | "latitude": -25.74486, 1030 | "longitude": 28.18783, 1031 | "sunrise": "2017-02-09T03:49:05+00:00", 1032 | "sunset": "2017-02-09T16:53:48+00:00" 1033 | }, { 1034 | "city": "Pristina", 1035 | "latitude": 42.67272, 1036 | "longitude": 21.16688, 1037 | "sunrise": "2017-02-09T05:39:16+00:00", 1038 | "sunset": "2017-02-09T15:59:47+00:00" 1039 | }, { 1040 | "city": "Pyongyang", 1041 | "latitude": 39.03385, 1042 | "longitude": 125.75432, 1043 | "sunrise": "2017-02-08T22:34:50+00:00", 1044 | "sunset": "2017-02-09T09:07:30+00:00" 1045 | }, { 1046 | "city": "Quito", 1047 | "latitude": -0.22985, 1048 | "longitude": -78.52495, 1049 | "sunrise": "2017-02-09T11:24:32+00:00", 1050 | "sunset": "2017-02-09T23:32:03+00:00" 1051 | }, { 1052 | "city": "Rabat", 1053 | "latitude": 34.01325, 1054 | "longitude": -6.83255, 1055 | "sunrise": "2017-02-09T07:16:59+00:00", 1056 | "sunset": "2017-02-09T18:06:04+00:00" 1057 | }, { 1058 | "city": "Reykjav??k", 1059 | "latitude": 64.13548, 1060 | "longitude": -21.89541, 1061 | "sunrise": "2017-02-09T09:39:38+00:00", 1062 | "sunset": "2017-02-09T17:43:56+00:00" 1063 | }, { 1064 | "city": "Riga", 1065 | "latitude": 56.946, 1066 | "longitude": 24.10589, 1067 | "sunrise": "2017-02-09T06:03:34+00:00", 1068 | "sunset": "2017-02-09T15:11:58+00:00" 1069 | }, { 1070 | "city": "Riyadh", 1071 | "latitude": 24.68773, 1072 | "longitude": 46.72185, 1073 | "sunrise": "2017-02-09T03:30:31+00:00", 1074 | "sunset": "2017-02-09T14:44:06+00:00" 1075 | }, { 1076 | "city": "Road Town", 1077 | "latitude": 18.41667, 1078 | "longitude": -64.61667, 1079 | "sunrise": "2017-02-09T10:48:25+00:00", 1080 | "sunset": "2017-02-09T22:16:55+00:00" 1081 | }, { 1082 | "city": "Roma", 1083 | "latitude": 41.89474, 1084 | "longitude": 12.4839, 1085 | "sunrise": "2017-02-09T06:12:32+00:00", 1086 | "sunset": "2017-02-09T16:35:59+00:00" 1087 | }, { 1088 | "city": "Roseau", 1089 | "latitude": 15.30174, 1090 | "longitude": -61.38808, 1091 | "sunrise": "2017-02-09T10:32:05+00:00", 1092 | "sunset": "2017-02-09T22:07:25+00:00" 1093 | }, { 1094 | "city": "S?�o Tom??", 1095 | "latitude": 0.33654, 1096 | "longitude": 6.72732, 1097 | "sunrise": "2017-02-09T05:44:06+00:00", 1098 | "sunset": "2017-02-09T17:50:28+00:00" 1099 | }, { 1100 | "city": "Saint George's", 1101 | "latitude": 12.05644, 1102 | "longitude": -61.74849, 1103 | "sunrise": "2017-02-09T10:30:04+00:00", 1104 | "sunset": "2017-02-09T22:12:19+00:00" 1105 | }, { 1106 | "city": "Saint Helier", 1107 | "latitude": 49.18333, 1108 | "longitude": -2.1, 1109 | "sunrise": "2017-02-09T07:25:54+00:00", 1110 | "sunset": "2017-02-09T17:19:17+00:00" 1111 | }, { 1112 | "city": "Saint John�??s", 1113 | "latitude": 17.11667, 1114 | "longitude": -61.85, 1115 | "sunrise": "2017-02-09T10:35:55+00:00", 1116 | "sunset": "2017-02-09T22:07:17+00:00" 1117 | }, { 1118 | "city": "Saint Peter Port", 1119 | "latitude": 49.45981, 1120 | "longitude": -2.53527, 1121 | "sunrise": "2017-02-09T07:28:18+00:00", 1122 | "sunset": "2017-02-09T17:20:22+00:00" 1123 | }, { 1124 | "city": "Saint-Denis", 1125 | "latitude": -20.88231, 1126 | "longitude": 55.4504, 1127 | "sunrise": "2017-02-09T02:06:06+00:00", 1128 | "sunset": "2017-02-09T14:58:41+00:00" 1129 | }, { 1130 | "city": "Saint-Pierre", 1131 | "latitude": 46.76544, 1132 | "longitude": -56.16949, 1133 | "sunrise": "2017-02-09T10:56:29+00:00", 1134 | "sunset": "2017-02-09T21:01:16+00:00" 1135 | }, { 1136 | "city": "San Jos??", 1137 | "latitude": 9.93333, 1138 | "longitude": -84.08333, 1139 | "sunrise": "2017-02-09T11:57:10+00:00", 1140 | "sunset": "2017-02-09T23:43:54+00:00" 1141 | }, { 1142 | "city": "San Juan", 1143 | "latitude": 18.46633, 1144 | "longitude": -66.10572, 1145 | "sunrise": "2017-02-09T10:54:25+00:00", 1146 | "sunset": "2017-02-09T22:22:49+00:00" 1147 | }, { 1148 | "city": "San Marino", 1149 | "latitude": 43.93333, 1150 | "longitude": 12.45, 1151 | "sunrise": "2017-02-09T06:16:30+00:00", 1152 | "sunset": "2017-02-09T16:32:17+00:00" 1153 | }, { 1154 | "city": "San Salvador", 1155 | "latitude": 13.68935, 1156 | "longitude": -89.18718, 1157 | "sunrise": "2017-02-09T12:21:32+00:00", 1158 | "sunset": "2017-02-10T00:00:22+00:00" 1159 | }, { 1160 | "city": "Sanaa", 1161 | "latitude": 15.35472, 1162 | "longitude": 44.20667, 1163 | "sunrise": "2017-02-09T03:29:52+00:00", 1164 | "sunset": "2017-02-09T15:04:52+00:00" 1165 | }, { 1166 | "city": "Santiago", 1167 | "latitude": -33.42628, 1168 | "longitude": -70.56656, 1169 | "sunrise": "2017-02-09T10:13:28+00:00", 1170 | "sunset": "2017-02-09T23:39:28+00:00" 1171 | }, { 1172 | "city": "Santo Domingo", 1173 | "latitude": 18.50012, 1174 | "longitude": -69.98857, 1175 | "sunrise": "2017-02-09T11:09:59+00:00", 1176 | "sunset": "2017-02-09T22:38:19+00:00" 1177 | }, { 1178 | "city": "Sarajevo", 1179 | "latitude": 43.84864, 1180 | "longitude": 18.35644, 1181 | "sunrise": "2017-02-09T05:52:44+00:00", 1182 | "sunset": "2017-02-09T16:08:48+00:00" 1183 | }, { 1184 | "city": "Seoul", 1185 | "latitude": 37.56826, 1186 | "longitude": 126.97783, 1187 | "sunrise": "2017-02-08T22:27:33+00:00", 1188 | "sunset": "2017-02-09T09:05:01+00:00" 1189 | }, { 1190 | "city": "Singapore", 1191 | "latitude": 1.28967, 1192 | "longitude": 103.85007, 1193 | "sunrise": "2017-02-08T23:16:36+00:00", 1194 | "sunset": "2017-02-09T11:20:59+00:00" 1195 | }, { 1196 | "city": "Skopje", 1197 | "latitude": 42, 1198 | "longitude": 21.43333, 1199 | "sunrise": "2017-02-09T05:36:58+00:00", 1200 | "sunset": "2017-02-09T15:59:58+00:00" 1201 | }, { 1202 | "city": "Sofia", 1203 | "latitude": 42.69751, 1204 | "longitude": 23.32415, 1205 | "sunrise": "2017-02-09T05:30:42+00:00", 1206 | "sunset": "2017-02-09T15:51:06+00:00" 1207 | }, { 1208 | "city": "Stanley", 1209 | "latitude": -51.7, 1210 | "longitude": -57.85, 1211 | "sunrise": "2017-02-09T08:44:14+00:00", 1212 | "sunset": "2017-02-09T23:26:58+00:00" 1213 | }, { 1214 | "city": "Stockholm", 1215 | "latitude": 59.33258, 1216 | "longitude": 18.0649, 1217 | "sunrise": "2017-02-09T06:36:44+00:00", 1218 | "sunset": "2017-02-09T15:27:09+00:00" 1219 | }, { 1220 | "city": "Sucre", 1221 | "latitude": -19.03332, 1222 | "longitude": -65.26274, 1223 | "sunrise": "2017-02-09T10:11:20+00:00", 1224 | "sunset": "2017-02-09T22:59:10+00:00" 1225 | }, { 1226 | "city": "Suva", 1227 | "latitude": -18.14161, 1228 | "longitude": 178.44149, 1229 | "sunrise": "2017-02-08T17:57:14+00:00", 1230 | "sunset": "2017-02-09T06:43:37+00:00" 1231 | }, { 1232 | "city": "T??rshavn", 1233 | "latitude": 62.00973, 1234 | "longitude": -6.77164, 1235 | "sunrise": "2017-02-09T08:27:53+00:00", 1236 | "sunset": "2017-02-09T16:54:41+00:00" 1237 | }, { 1238 | "city": "Taipei", 1239 | "latitude": 25.04776, 1240 | "longitude": 121.53185, 1241 | "sunrise": "2017-02-08T22:31:50+00:00", 1242 | "sunset": "2017-02-09T09:44:17+00:00" 1243 | }, { 1244 | "city": "Tallinn", 1245 | "latitude": 59.43696, 1246 | "longitude": 24.75353, 1247 | "sunrise": "2017-02-09T06:10:27+00:00", 1248 | "sunset": "2017-02-09T14:59:55+00:00" 1249 | }, { 1250 | "city": "Tarawa", 1251 | "latitude": 1.3278, 1252 | "longitude": 172.97696, 1253 | "sunrise": "2017-02-08T18:40:08+00:00", 1254 | "sunset": "2017-02-09T06:44:26+00:00" 1255 | }, { 1256 | "city": "Tashkent", 1257 | "latitude": 41.26465, 1258 | "longitude": 69.21627, 1259 | "sunrise": "2017-02-09T02:24:40+00:00", 1260 | "sunset": "2017-02-09T12:49:59+00:00" 1261 | }, { 1262 | "city": "Tbilisi", 1263 | "latitude": 41.69411, 1264 | "longitude": 44.83368, 1265 | "sunrise": "2017-02-09T04:02:53+00:00", 1266 | "sunset": "2017-02-09T14:26:50+00:00" 1267 | }, { 1268 | "city": "Tegucigalpa", 1269 | "latitude": 14.0818, 1270 | "longitude": -87.20681, 1271 | "sunrise": "2017-02-09T12:14:02+00:00", 1272 | "sunset": "2017-02-09T23:52:02+00:00" 1273 | }, { 1274 | "city": "Tehr��n", 1275 | "latitude": 35.69439, 1276 | "longitude": 51.42151, 1277 | "sunrise": "2017-02-09T03:26:37+00:00", 1278 | "sunset": "2017-02-09T14:10:24+00:00" 1279 | }, { 1280 | "city": "The Valley", 1281 | "latitude": 18.21704, 1282 | "longitude": -63.05783, 1283 | "sunrise": "2017-02-09T10:41:57+00:00", 1284 | "sunset": "2017-02-09T22:10:54+00:00" 1285 | }, { 1286 | "city": "Thimphu", 1287 | "latitude": 27.46609, 1288 | "longitude": 89.64191, 1289 | "sunrise": "2017-02-09T00:42:23+00:00", 1290 | "sunset": "2017-02-09T11:48:52+00:00" 1291 | }, { 1292 | "city": "Tirana", 1293 | "latitude": 41.3275, 1294 | "longitude": 19.81889, 1295 | "sunrise": "2017-02-09T05:42:12+00:00", 1296 | "sunset": "2017-02-09T16:07:38+00:00" 1297 | }, { 1298 | "city": "Tokyo", 1299 | "latitude": 35.61488, 1300 | "longitude": 139.5813, 1301 | "sunrise": "2017-02-08T21:34:06+00:00", 1302 | "sunset": "2017-02-09T08:17:38+00:00" 1303 | }, { 1304 | "city": "Tripoli", 1305 | "latitude": 32.87519, 1306 | "longitude": 13.18746, 1307 | "sunrise": "2017-02-09T05:55:19+00:00", 1308 | "sunset": "2017-02-09T16:47:35+00:00" 1309 | }, { 1310 | "city": "Tunis", 1311 | "latitude": 36.81897, 1312 | "longitude": 10.16579, 1313 | "sunrise": "2017-02-09T06:13:16+00:00", 1314 | "sunset": "2017-02-09T16:53:48+00:00" 1315 | }, { 1316 | "city": "Ulaanbaatar", 1317 | "latitude": 47.90771, 1318 | "longitude": 106.88324, 1319 | "sunrise": "2017-02-09T00:07:30+00:00", 1320 | "sunset": "2017-02-09T10:05:49+00:00" 1321 | }, { 1322 | "city": "Vaduz", 1323 | "latitude": 47.14151, 1324 | "longitude": 9.52154, 1325 | "sunrise": "2017-02-09T06:34:49+00:00", 1326 | "sunset": "2017-02-09T16:37:24+00:00" 1327 | }, { 1328 | "city": "Valletta", 1329 | "latitude": 35.89972, 1330 | "longitude": 14.51472, 1331 | "sunrise": "2017-02-09T05:54:28+00:00", 1332 | "sunset": "2017-02-09T16:37:49+00:00" 1333 | }, { 1334 | "city": "Vatican City", 1335 | "latitude": 41.90236, 1336 | "longitude": 12.45332, 1337 | "sunrise": "2017-02-09T06:12:40+00:00", 1338 | "sunset": "2017-02-09T16:36:05+00:00" 1339 | }, { 1340 | "city": "Victoria", 1341 | "latitude": -4.61667, 1342 | "longitude": 55.45, 1343 | "sunrise": "2017-02-09T02:24:06+00:00", 1344 | "sunset": "2017-02-09T14:40:41+00:00" 1345 | }, { 1346 | "city": "Vienna", 1347 | "latitude": 48.20849, 1348 | "longitude": 16.37208, 1349 | "sunrise": "2017-02-09T06:09:50+00:00", 1350 | "sunset": "2017-02-09T16:07:35+00:00" 1351 | }, { 1352 | "city": "Vientiane", 1353 | "latitude": 17.96667, 1354 | "longitude": 102.6, 1355 | "sunrise": "2017-02-08T23:39:15+00:00", 1356 | "sunset": "2017-02-09T11:08:20+00:00" 1357 | }, { 1358 | "city": "Vilnius", 1359 | "latitude": 54.68916, 1360 | "longitude": 25.2798, 1361 | "sunrise": "2017-02-09T05:51:26+00:00", 1362 | "sunset": "2017-02-09T15:14:43+00:00" 1363 | }, { 1364 | "city": "Warsaw", 1365 | "latitude": 52.22977, 1366 | "longitude": 21.01178, 1367 | "sunrise": "2017-02-09T06:01:20+00:00", 1368 | "sunset": "2017-02-09T15:38:58+00:00" 1369 | }, { 1370 | "city": "Washington, D. C.", 1371 | "latitude": 38.89511, 1372 | "longitude": -77.03637, 1373 | "sunrise": "2017-02-09T12:05:09+00:00", 1374 | "sunset": "2017-02-09T22:39:33+00:00" 1375 | }, { 1376 | "city": "Wellington", 1377 | "latitude": -41.28664, 1378 | "longitude": 174.77557, 1379 | "sunrise": "2017-02-08T17:37:42+00:00", 1380 | "sunset": "2017-02-09T07:32:28+00:00" 1381 | }, { 1382 | "city": "West Island", 1383 | "latitude": -12.15681, 1384 | "longitude": 96.82251, 1385 | "sunrise": "2017-02-08T23:30:34+00:00", 1386 | "sunset": "2017-02-09T12:03:14+00:00" 1387 | }, { 1388 | "city": "Willemstad", 1389 | "latitude": 12.1084, 1390 | "longitude": -68.93354, 1391 | "sunrise": "2017-02-09T10:58:51+00:00", 1392 | "sunset": "2017-02-09T22:41:00+00:00" 1393 | }, { 1394 | "city": "Windhoek", 1395 | "latitude": -22.55941, 1396 | "longitude": 17.08323, 1397 | "sunrise": "2017-02-09T04:37:35+00:00", 1398 | "sunset": "2017-02-09T17:34:09+00:00" 1399 | }, { 1400 | "city": "Yamoussoukro", 1401 | "latitude": 6.81667, 1402 | "longitude": -5.28333, 1403 | "sunrise": "2017-02-09T06:38:47+00:00", 1404 | "sunset": "2017-02-09T18:31:52+00:00" 1405 | }, { 1406 | "city": "Yaound??", 1407 | "latitude": 3.86667, 1408 | "longitude": 11.51667, 1409 | "sunrise": "2017-02-09T05:28:34+00:00", 1410 | "sunset": "2017-02-09T17:27:42+00:00" 1411 | }, { 1412 | "city": "Yerevan", 1413 | "latitude": 40.18111, 1414 | "longitude": 44.51361, 1415 | "sunrise": "2017-02-09T04:01:30+00:00", 1416 | "sunset": "2017-02-09T14:30:47+00:00" 1417 | }, { 1418 | "city": "Zagreb", 1419 | "latitude": 45.81444, 1420 | "longitude": 15.97798, 1421 | "sunrise": "2017-02-09T06:06:11+00:00", 1422 | "sunset": "2017-02-09T16:14:23+00:00" 1423 | }] 1424 | --------------------------------------------------------------------------------