From d4ec96ae467358bc93f9d214be83a5fe494d23ca Mon Sep 17 00:00:00 2001 From: merlos Date: Sun, 27 Sep 2020 22:24:36 -0400 Subject: [PATCH 1/4] updated MapCache to v0.8.0 --- Podfile | 2 +- Podfile.lock | 8 +- Pods/Manifest.lock | 8 +- Pods/MapCache/LICENSE | 2 +- .../MapCache/Classes/CachedTileOverlay.swift | 82 +- .../Classes/CachedTileOverlayRenderer.swift | 73 ++ .../Classes/DiskCache/DiskCache.swift | 83 +- .../DiskCache/FileManager+DiskCache.swift | 21 +- .../MapCache/Classes/DiskCache/MD5.swift | 37 +- .../Classes/DiskCache/String+DiskCache.swift | 7 + .../Classes/DiskCache/URL+DiskCache.swift | 2 +- .../MapCache/Classes/LoadTileMode.swift | 33 + Pods/MapCache/MapCache/Classes/Log.swift | 50 +- .../MapCache/Classes/MKMapView+MapCache.swift | 32 +- .../Classes/MKTileOverlayPath+MapCache.swift | 4 +- .../Classes/MKZoomScale+MapCache.swift | 23 + Pods/MapCache/MapCache/Classes/MapCache.swift | 162 +++- .../MapCache/Classes/MapCacheConfig.swift | 66 +- .../MapCache/Classes/MapCacheProtocol.swift | 16 +- .../MapCache/Classes/RegionDownloader.swift | 75 +- .../Classes/RegionDownloaderDelegate.swift | 9 +- .../MapCache/MapCache/Classes/ReplaceMe.swift | 0 .../MapCache/Classes/TileCoords.swift | 29 +- .../MapCache/Classes/TileCoordsRegion.swift | 47 +- .../MapCache/MapCache/Classes/TileRange.swift | 33 +- .../MapCache/Classes/TileRangeIterator.swift | 17 +- .../MapCache/MapCache/Classes/ZoomRange.swift | 20 +- .../MapCache/Classes/ZoomRangeIterator.swift | 12 +- .../MapCache/Classes/ZoomableTile.swift | 28 + Pods/MapCache/README.md | 127 ++- Pods/Pods.xcodeproj/project.pbxproj | 738 +++++++++--------- .../MapCache/MapCache-Info.plist | 2 +- .../MapCache/MapCache.xcconfig | 2 +- ...s-OpenGpxTracker-acknowledgements.markdown | 2 +- ...Pods-OpenGpxTracker-acknowledgements.plist | 2 +- .../Pods-OpenGpxTracker.debug.xcconfig | 2 +- .../Pods-OpenGpxTracker.release.xcconfig | 2 +- 37 files changed, 1245 insertions(+), 613 deletions(-) create mode 100644 Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift create mode 100644 Pods/MapCache/MapCache/Classes/LoadTileMode.swift create mode 100644 Pods/MapCache/MapCache/Classes/MKZoomScale+MapCache.swift delete mode 100644 Pods/MapCache/MapCache/Classes/ReplaceMe.swift create mode 100644 Pods/MapCache/MapCache/Classes/ZoomableTile.swift diff --git a/Podfile b/Podfile index 63363716..4da0510c 100644 --- a/Podfile +++ b/Podfile @@ -7,7 +7,7 @@ end target 'OpenGpxTracker' do platform :ios, '8.0' shared_pods - pod 'MapCache', '~> 0.6.0' + pod 'MapCache', '~> 0.8.0' #pod 'MapCache', git: 'https://github.com/merlos/MapCache.git' :branch => 'master' end diff --git a/Podfile.lock b/Podfile.lock index 66a367f9..88aae30c 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,10 +1,10 @@ PODS: - CoreGPX (0.7.4) - - MapCache (0.6.0) + - MapCache (0.8.0) DEPENDENCIES: - CoreGPX - - MapCache (~> 0.6.0) + - MapCache (~> 0.8.0) SPEC REPOS: https://github.com/cocoapods/specs.git: @@ -13,8 +13,8 @@ SPEC REPOS: SPEC CHECKSUMS: CoreGPX: 9927a0158614c4baed08ecdb772fdc24efd92e49 - MapCache: 8afa98ddc3539a384ba75b019284cded95aaccab + MapCache: dce6387196fb94e58f8ac3ae7b8ca6bda15f15ae -PODFILE CHECKSUM: 97ad10775e58ef7100c884ba0bf97867e159a041 +PODFILE CHECKSUM: c49315bb353e7304cd79b1e2ecb18a9a923e10b3 COCOAPODS: 1.7.5 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 66a367f9..88aae30c 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,10 +1,10 @@ PODS: - CoreGPX (0.7.4) - - MapCache (0.6.0) + - MapCache (0.8.0) DEPENDENCIES: - CoreGPX - - MapCache (~> 0.6.0) + - MapCache (~> 0.8.0) SPEC REPOS: https://github.com/cocoapods/specs.git: @@ -13,8 +13,8 @@ SPEC REPOS: SPEC CHECKSUMS: CoreGPX: 9927a0158614c4baed08ecdb772fdc24efd92e49 - MapCache: 8afa98ddc3539a384ba75b019284cded95aaccab + MapCache: dce6387196fb94e58f8ac3ae7b8ca6bda15f15ae -PODFILE CHECKSUM: 97ad10775e58ef7100c884ba0bf97867e159a041 +PODFILE CHECKSUM: c49315bb353e7304cd79b1e2ecb18a9a923e10b3 COCOAPODS: 1.7.5 diff --git a/Pods/MapCache/LICENSE b/Pods/MapCache/LICENSE index 7df50471..252c6efd 100644 --- a/Pods/MapCache/LICENSE +++ b/Pods/MapCache/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2019 Juan M. Merlos @merlos +Copyright (c) 2019-2020 Juan M. Merlos @merlos Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift b/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift index 247f79f3..87ff5312 100644 --- a/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift +++ b/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift @@ -10,14 +10,22 @@ import MapKit /// -/// Overwrites the default overlay to store downloaded images +/// Whenever a tile is requested by the `MapView`, it calls the `MKTileOverlay.loadTile`. +/// This class overrides the default `MKTileOverlay`to provide support to `MapCache`. +/// +/// - SeeAlso: `MkMapView+MapCache` /// public class CachedTileOverlay : MKTileOverlay { + /// A class that implements the `MapCacheProtocol` let mapCache : MapCacheProtocol + /// If true `loadTile` uses the implementation of the `mapCache` var. If `false`, uses the + /// default `MKTileOverlay`implementation from Apple. public var useCache: Bool = true + /// Constructor. + /// - Parameter withCache: the cache to be used on `loadTile` public init(withCache cache: MapCacheProtocol) { mapCache = cache super.init(urlTemplate: mapCache.config.urlTemplate) @@ -25,9 +33,9 @@ public class CachedTileOverlay : MKTileOverlay { /// /// Generates the URL for the tile to be requested. - /// It replaces the values of {z},{x} and {y} in the urlTemplate defined in GPXTileServer + /// It replaces the values of {z},{x} and {y} in the `urlTemplate`defined in `mapCache.config` /// - /// -SeeAlso: GPXTileServer + /// - SeeAlso: `MapCache`, `MapCacheConfig` /// override public func url(forTilePath path: MKTileOverlayPath) -> URL { //print("CachedTileOverlay:: url() urlTemplate: \(urlTemplate)") @@ -35,18 +43,72 @@ public class CachedTileOverlay : MKTileOverlay { } /// - /// Loads the tile from the network or from cache - /// - /// If the internal app cache is activated,it tries to get the tile from it. - /// If not, it uses the default system cache (managed by the OS). + /// When invoked it will load the tile using the standard OS implementation (if `useCache`is `false`) + /// or from the cache (if `useCache` is `true` /// override public func loadTile(at path: MKTileOverlayPath, - result: @escaping (Data?, Error?) -> Void) { + result: @escaping (Data?, Error?) -> Void) { if !self.useCache { // Use cache by use cache is not set. - // print("loadTile:: not using cache") + // print("loadTile:: not using cache") return super.loadTile(at: path, result: result) } else { - return mapCache.loadTile(at: path, result: result) + return mapCache.loadTile(at: path, result: result) + } + } + + /// + /// Tells whether or not to upsample and show a lesser detailed z level + /// takes into account `useZoom` configuration as well as current and `maximumZ` values + /// - Parameter at current zoom. + func shouldZoom(at scale: MKZoomScale) -> Bool { + guard mapCache.config.overZoomMaximumZ else { return false } + return scale.toZoomLevel(tileSize: mapCache.config.tileSize) > mapCache.config.maximumZ + } + + /// + /// Given the maximum zoom level for the tileset `(mapCache.config.maximumZ`) it will return the tile, map rects, and additional scaling factor for upscaling tiles. + /// + /// - Parameter rect: map rectangle for which we want to get the tile set + /// - Parameter scale: current zoom scale + /// + func tilesInMapRect(rect: MKMapRect, scale: MKZoomScale) -> [ZoomableTile] { + var tiles: [ZoomableTile] = [] + let tileSize = mapCache.config.tileSize + var z = scale.toZoomLevel(tileSize: tileSize) + + // Represents the number of tiles the current tile is going to be divided + var overZoom = 1 + let tileSetMaxZ = mapCache.config.maximumZ + if (z > tileSetMaxZ) { + overZoom = Int(pow(2.0, Double(z - tileSetMaxZ))) + z = tileSetMaxZ + } + + let adjustedTileSize = Double(overZoom * Int(tileSize.width)) + + let minX = Int(floor((rect.minX * Double(scale)) / adjustedTileSize)) + let maxX = Int(floor((rect.maxX * Double(scale)) / adjustedTileSize)) + let minY = Int(floor((rect.minY * Double(scale)) / adjustedTileSize)) + let maxY = Int(floor((rect.maxY * Double(scale)) / adjustedTileSize)) + + for x in minX ... maxX { + for y in minY ... maxY { + + let point = MKMapPoint(x: (Double(x) * adjustedTileSize) / Double(scale), + y: (Double(y) * adjustedTileSize) / Double(scale)) + let size = MKMapSize(width: adjustedTileSize / Double(scale), + height: adjustedTileSize / Double(scale)) + let tileRect = MKMapRect(origin: point, size: size) + + // check that a portion of the tile intersects with the maps rect + // no need to do the work on a tile that won't be seen + guard rect.intersects(tileRect) else { continue } + + let path = MKTileOverlayPath(x: x, y: y, z: z, contentScaleFactor: scale) + let tile = ZoomableTile(maximumZPath: path, rect: tileRect, overZoom: Zoom(overZoom)) + tiles.append(tile) + } } + return tiles } } diff --git a/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift b/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift new file mode 100644 index 00000000..6c0481e2 --- /dev/null +++ b/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift @@ -0,0 +1,73 @@ +// +// CachedTileZoomRenderer.swift +// MapCache +// +// Created by Cameron Deardorff on 9/20/20. +// +// + +import Foundation +import MapKit + +/// +/// A Tile overlay that supports to zoom beyond the maximumZ +/// +/// Tile servers allow from 1 to a certain zoom level typically between 16 and 21 (set in `MapCacheConfig.maximumZ`). +/// Beyond that zoom levels tiles are not available in the server +/// +/// This renderer takes the maximumZ tile and extracts the portion that would correspond to the requested level. +/// +class CachedTileOverlayRenderer: MKTileOverlayRenderer { + + /// Indicates if the renderer is ready to draw. It´s always true + /// - SeeAlso: [MKOverlayRenderer](https://developer.apple.com/documentation/mapkit/mkoverlayrenderer) + override func canDraw(_ mapRect: MKMapRect, zoomScale: MKZoomScale) -> Bool { + // very important to call super.canDraw first, some sort of side effect happening which allows this to work (???). + let _ = super.canDraw(mapRect, zoomScale: zoomScale) + return true + } + + /// Draws the tile in the map + /// - Parameters: + /// - mapRect: the map rect where the tiles need to be drawn + /// - zoomScale: current zoom in the map + override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) { + + // use default rendering if the type of overlay is not CachedTileOverlay + guard let cachedOverlay = overlay as? CachedTileOverlay else { + super.draw(mapRect, zoomScale: zoomScale, in: context) + return + } + + // use default rendering when tiles are available + guard cachedOverlay.shouldZoom(at: zoomScale) else { + super.draw(mapRect, zoomScale: zoomScale, in: context) + return + } + + //Extract the zoomable tiles for this mapRect + let tiles = cachedOverlay.tilesInMapRect(rect: mapRect, scale: zoomScale) + + for tile in tiles { + cachedOverlay.loadTile(at: tile.maximumZPath) { [weak self] (data, error) in + guard let strongSelf = self, + let data = data, + let provider = CGDataProvider(data: data as CFData), + let image = CGImage(jpegDataProviderSource: provider, decode: nil, shouldInterpolate: false, intent: CGColorRenderingIntent.defaultIntent) + ?? CGImage(pngDataProviderSource: provider, decode: nil, shouldInterpolate: false, intent: CGColorRenderingIntent.defaultIntent) + else { return } + + let tileScaleFactor = CGFloat(tile.overZoom) / zoomScale + let cgRect = strongSelf.rect(for: tile.rect) + let drawRect = CGRect(x: 0, y: 0, width: CGFloat(image.width), height: CGFloat(image.height)) + context.saveGState() + context.translateBy(x: cgRect.minX, y: cgRect.minY) + context.scaleBy(x: tileScaleFactor, y: tileScaleFactor) + context.translateBy(x: 0, y: CGFloat(image.height)) + context.scaleBy(x: 1, y: -1) + context.draw(image, in: drawRect) + context.restoreGState() + } + } + } +} diff --git a/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift b/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift index ab37cefc..10b333af 100644 --- a/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift +++ b/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift @@ -10,11 +10,14 @@ import Foundation +/// +/// A specialized cache for storing data in disk. +/// Based on [Haneke Disk Cache](https://github.com/Haneke/HanekeSwift) and customized for the MapCache project. +/// open class DiskCache { - //TODO REMOVE + /// Gets the root base folder to be used. open class func baseURL() -> URL { - // where should you put your files // https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW28 let cachePath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] @@ -22,10 +25,10 @@ open class DiskCache { return baseURL } - /// URL of the physical folder of the Cache in the file system + /// URL of the physical folder of the Cache in the file system. public let folderURL: URL - /// A shortcut for folderURL.path + /// A shortcut for `folderURL.path`. open var path: String { get { return self.folderURL.path @@ -33,24 +36,27 @@ open class DiskCache { } /// Sum of the allocated size in disk for the cache expressed in bytes. + /// /// Note that, this size is the actual disk allocation. It is equivalent with the amount of bytes /// that would become available on the volume if the directory is deleted. - /// For example a file may just contain 156 bytes of data (size listed in `ls` command), however its + /// + /// For example, a file may just contain 156 bytes of data (size listed in `ls` command), however its /// disk size is 4096, 1 volume block (as listed using `du -h`) /// /// This size is calculated each time open var diskSize : UInt64 = 0 - /// This is the sum of the sizes of the files within the diskCache + /// This is the sum of the data sizes of the files within the `DiskCache` /// /// This size is calculated each time it is used - /// - seealso: diskSize + /// - Seealso: `diskSize` + open var fileSize: UInt64? { return try? FileManager.default.fileSizeForDirectory(at: folderURL) } - /// Maximum allowed cache disk allocated size for this DiskCache - /// Defaults to unlimited capacity (UINT64_MAX) + /// Maximum allowed cache disk allocated size for this `DiskCache`` + /// Defaults to unlimited capacity (`UINT64_MAX`) open var capacity : UInt64 = UINT64_MAX { didSet { self.cacheQueue.async(execute: { @@ -59,12 +65,16 @@ open class DiskCache { } } + /// Queue for making async operations. open lazy var cacheQueue : DispatchQueue = { let queueName = "DiskCache.\(folderURL.lastPathComponent)" let cacheQueue = DispatchQueue(label: queueName, attributes: []) return cacheQueue }() + /// Constructor + /// - Parameter withName: Name of the cache, will be the subfolder name too. + /// - Parameter capacity: capacity of the cache in bytes. Defaults to virutally unlimited capacity (`UINT64_MAX`) public init(withName cacheName: String, capacity: UInt64 = UINT64_MAX) { folderURL = DiskCache.baseURL().appendingPathComponent(cacheName, isDirectory: true) do { @@ -81,20 +91,20 @@ open class DiskCache { } - /// Get the path for key + /// Get the path for key. open func path(forKey key: String) -> String { return self.folderURL.appendingPathComponent(key.toMD5()).path } - /// Sets the data for the key asyncronously - /// Use this function for writing into the cache + /// Sets the data for the key asyncronously. + /// Use this function for writing into the cache. open func setData( _ data: Data, forKey key: String) { cacheQueue.async(execute: { self.setDataSync(data, forKey: key) }) } - /// Sets the data for the key synchronously + /// Sets the data for the key synchronously. open func setDataSync(_ data: Data, forKey key: String) { let filePath = path(forKey: key) @@ -116,26 +126,27 @@ open class DiskCache { self.controlCapacity() } - - open func fetchData(forKey key: String, failure fail: ((Error?) -> ())? = nil, success succeed: @escaping (Data) -> ()) { - cacheQueue.async { - let path = self.path(forKey: key) - do { - let data = try Data(contentsOf: URL(fileURLWithPath: path), options: Data.ReadingOptions()) - DispatchQueue.main.async { - succeed(data) - } - self.updateDiskAccessDate(atPath: path) - } catch { - if let block = fail { - DispatchQueue.main.async { - block(error) - } - } + /// Fetches the image data from storage synchronously. + /// + /// - Parameter forKey: Key within the cache + /// - Parameter failure: closure to be run in case of error + /// - Parameter success: closure to be run once the data is ready + /// + open func fetchDataSync(forKey key: String, failure fail: ((Error?) -> ())? = nil, success succeed: @escaping (Data) -> ()) { + let path = self.path(forKey: key) + do { + let data = try Data(contentsOf: URL(fileURLWithPath: path), options: Data.ReadingOptions()) + succeed(data) + self.updateDiskAccessDate(atPath: path) + } catch { + if let block = fail { + block(error) } } } + /// Removes asynchronously the data from the diskcache for the key passed as argument. + /// - Parameter withKey: key to be removed open func removeData(withKey key: String) { cacheQueue.async(execute: { let path = self.path(forKey: key) @@ -143,6 +154,9 @@ open class DiskCache { }) } + /// Removes asynchronously all data from the cache. + /// Calls completition closure once the task is done. + /// - Parameter completition: closure run once all the files are deleted from the cache open func removeAllData(_ completion: (() -> ())? = nil) { let fileManager = FileManager.default cacheQueue.async(execute: { @@ -183,6 +197,7 @@ open class DiskCache { } } + /// Asynchronously updates the access date of a file. open func updateAccessDate( _ getData: @autoclosure @escaping () -> Data?, key: String) { cacheQueue.async(execute: { let path = self.path(forKey: key) @@ -197,6 +212,7 @@ open class DiskCache { }) } + /// Calculates the size used by all the files in the cache. public func calculateDiskSize() -> UInt64 { let fileManager = FileManager.default var currentSize : UInt64 = 0 @@ -211,6 +227,7 @@ open class DiskCache { // MARK: Private + /// It checks if the capacity of the cache has been reached. If so, it removes the least recently used file (LRU). fileprivate func controlCapacity() { if self.diskSize <= self.capacity { return } @@ -224,7 +241,7 @@ open class DiskCache { stop = self.diskSize <= self.capacity } } - + /// Updates the time a file was accessed for the last time. @discardableResult fileprivate func updateDiskAccessDate(atPath path: String) -> Bool { let fileManager = FileManager.default let now = Date() @@ -237,6 +254,7 @@ open class DiskCache { } } + /// Removes a file syncrhonously. fileprivate func removeFile(atPath path: String) { let fileManager = FileManager.default do { @@ -253,6 +271,10 @@ open class DiskCache { } } + /// Substracts from the cachesize the disk size passed as parameter. + /// Logs an error message if the amount to be substracted is larger than the current used disk space. + /// + /// - Parameter diskSize: disksize to be deducted fileprivate func substract(diskSize : UInt64) { if (self.diskSize >= diskSize) { self.diskSize -= diskSize @@ -263,6 +285,7 @@ open class DiskCache { } } +/// Error when there is not a file. private func isNoSuchFileError(_ error : Error?) -> Bool { if let error = error { return NSCocoaErrorDomain == (error as NSError).domain && (error as NSError).code == NSFileReadNoSuchFileError diff --git a/Pods/MapCache/MapCache/Classes/DiskCache/FileManager+DiskCache.swift b/Pods/MapCache/MapCache/Classes/DiskCache/FileManager+DiskCache.swift index 31383adc..574cb9af 100644 --- a/Pods/MapCache/MapCache/Classes/DiskCache/FileManager+DiskCache.swift +++ b/Pods/MapCache/MapCache/Classes/DiskCache/FileManager+DiskCache.swift @@ -13,10 +13,18 @@ import Foundation +/// +/// Class for handling the operations with file folders. +/// +/// Original source code from [Haneke](https://github.com/Haneke/HanekeSwift/blob/master/Haneke/NSFileManager%2BHaneke.swift) +/// extension FileManager { - - + /// Gets the list of files of this the directory. + /// - Parameter atPath: path of the directory. + /// - Parameter orderedByProperty: property to be used for ordeing the contents. + /// - Parameter ascending: if true it is ordered ascending. + /// - Parameter usingBlock: block being used. func enumerateContentsOfDirectory(atPath path: String, orderedByProperty property: String, ascending: Bool, usingBlock block: (URL, Int, inout Bool) -> Void ) { let directoryURL = URL(fileURLWithPath: path) @@ -72,12 +80,14 @@ extension FileManager { /// The resulting value is roughly equivalent with the amount of bytes /// that would become available on the volume if the directory would be deleted. /// - /// - note: There are a couple of oddities that are not taken into account (like symbolic links, meta data of + /// - Note: There are a couple of oddities that are not taken into account (like symbolic links, meta data of /// directories, hard links, ...). func allocatedDiskSizeForDirectory(at directoryURL: URL) throws -> UInt64 { // The error handler simply stores the error and stops traversal var enumeratorError: Error? = nil + + /// Error handler in case there is a problem when getting the information from the disk func errorHandler(_: URL, error: Error) -> Bool { enumeratorError = error return false @@ -115,10 +125,12 @@ extension FileManager { return accumulatedSize } - // Calculates the actual sum of file sizes + /// Calculates the actual sum of file sizes func fileSizeForDirectory(at directoryURL: URL) throws -> UInt64 { // The error handler simply stores the error and stops traversal var enumeratorError: Error? = nil + + /// Handler in case of error when calculating the filesize func errorHandler(_: URL, error: Error) -> Bool { enumeratorError = error return false @@ -150,6 +162,7 @@ extension FileManager { } } +/// Overload of the the `<` operator func < (lhs: NSNumber, rhs: NSNumber) -> Bool { return lhs.compare(rhs) == ComparisonResult.orderedAscending } diff --git a/Pods/MapCache/MapCache/Classes/DiskCache/MD5.swift b/Pods/MapCache/MapCache/Classes/DiskCache/MD5.swift index 20fc924b..bbc1cb66 100644 --- a/Pods/MapCache/MapCache/Classes/DiskCache/MD5.swift +++ b/Pods/MapCache/MapCache/Classes/DiskCache/MD5.swift @@ -13,6 +13,7 @@ // The following is an altered source version that only includes MD5. The original software can be found at: // https://github.com/krzyzanowskim/CryptoSwift // This is the original copyright notice: + /* Copyright (C) 2014 Marcin Krzyżanowski This software is provided 'as-is', without any express or implied warranty. @@ -25,7 +26,7 @@ import Foundation -/** array of bytes, little-endian representation */ +/// array of bytes, little-endian representation func arrayOfBytes(value:T, length:Int? = nil) -> [UInt8] { let totalBytes = length ?? MemoryLayout.size @@ -44,27 +45,34 @@ func arrayOfBytes(value:T, length:Int? = nil) -> [UInt8] { return bytes } +/// Extension for the implementation of MD5 extension Int { - /** Array of bytes with optional padding (little-endian) */ + /// Array of bytes with optional padding (little-endian) public func bytes(totalBytes: Int = MemoryLayout.size) -> [UInt8] { return arrayOfBytes(value: self, length: totalBytes) } } +/// Extension for the implementation of MD5 extension NSMutableData { - /** Convenient way to append bytes */ + /// Convenient way to append bytes internal func appendBytes(arrayOfBytes: [UInt8]) { self.append(arrayOfBytes, length: arrayOfBytes.count) } } +/// Bytes sequence for the implementation of MD5 +/// The following is an altered source version that only includes MD5. The original software can be found at: +/// https://github.com/krzyzanowskim/CryptoSwift struct BytesSequence: Sequence { + /// Chunk size let chunkSize: Int + /// Data let data: [UInt8] - + /// makeIterator func makeIterator() -> AnyIterator> { var offset:Int = 0 return AnyIterator { @@ -76,16 +84,24 @@ struct BytesSequence: Sequence { } } +/// HashBase +/// The following is an altered source version that only includes MD5. The original software can be found at: +/// https://github.com/krzyzanowskim/CryptoSwift class HashBase { + /// static let size:Int = 16 // 128 / 8 + + /// Message to be converted into a MD5 string let message: [UInt8] + /// Constructor + /// - Parameter message the string as an array of UInt8 init (_ message: [UInt8]) { self.message = message } - /** Common part for hash calculation. Prepare header data. */ + /// Common part for hash calculation. Prepare header data. func prepare(_ len:Int) -> [UInt8] { var tmpMessage = message @@ -106,10 +122,12 @@ class HashBase { } } +/// Rotate left for MD5 implementation func rotateLeft(v: UInt32, n: UInt32) -> UInt32 { return ((v << n) & 0xFFFFFFFF) | (v >> (32 - n)) } +/// sliceToUInt32 for MD5 implementation func sliceToUInt32Array(_ slice: ArraySlice) -> [UInt32] { var result = [UInt32]() result.reserveCapacity(16) @@ -124,16 +142,19 @@ func sliceToUInt32Array(_ slice: ArraySlice) -> [UInt32] { return result } +/// An actual implementation of the MD5 +/// The following is an altered source version that only includes MD5. The original software can be found at: +/// https://github.com/krzyzanowskim/CryptoSwift class MD5 : HashBase { - /** specifies the per-round shift amounts */ + /// specifies the per-round shift amounts private let s: [UInt32] = [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21] - /** binary integer part of the sines of integers (Radians) */ + /// binary integer part of the sines of integers (Radians) private let k: [UInt32] = [0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee, 0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501, 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be, @@ -151,8 +172,10 @@ class MD5 : HashBase { 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1, 0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391] + /// H private let h: [UInt32] = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476] + /// Calculates the MD5 as an array of UInt8 func calculate() -> [UInt8] { var tmpMessage = prepare(64) tmpMessage.reserveCapacity(tmpMessage.count + 4) diff --git a/Pods/MapCache/MapCache/Classes/DiskCache/String+DiskCache.swift b/Pods/MapCache/MapCache/Classes/DiskCache/String+DiskCache.swift index 014bcb31..dd15a8b0 100644 --- a/Pods/MapCache/MapCache/Classes/DiskCache/String+DiskCache.swift +++ b/Pods/MapCache/MapCache/Classes/DiskCache/String+DiskCache.swift @@ -12,8 +12,11 @@ import Foundation +/// +/// Extension that adds a few methods that are useful for the `DiskCache`. extension String { + /// Returns the escaped version of a filename. func escapedFilename() -> String { return [ "\0":"%00", ":":"%3A", "/":"%2F" ] .reduce(self.components(separatedBy: "%").joined(separator: "%25")) { @@ -21,6 +24,7 @@ extension String { } } + /// Returns the md5 digest of this string. func toMD5() -> String { guard let data = self.data(using: String.Encoding.utf8) else { return self @@ -37,6 +41,9 @@ extension String { return MD5String as String } + /// Returns the path for the filename whose name is hold in this string. + /// + /// This method is used to get the md5 file name from a string that is key filename. func MD5Filename() -> String { let MD5String = self.toMD5() diff --git a/Pods/MapCache/MapCache/Classes/DiskCache/URL+DiskCache.swift b/Pods/MapCache/MapCache/Classes/DiskCache/URL+DiskCache.swift index 00eb02ca..23a21d51 100644 --- a/Pods/MapCache/MapCache/Classes/DiskCache/URL+DiskCache.swift +++ b/Pods/MapCache/MapCache/Classes/DiskCache/URL+DiskCache.swift @@ -35,7 +35,7 @@ extension URL { } - /// Returns the allocated file a regular file in bytes + /// Returns the allocated file a regular file in bytes. func regularFileSize() throws -> UInt64 { let allocatedSizeResourceKeys: Set = [ .isRegularFileKey, diff --git a/Pods/MapCache/MapCache/Classes/LoadTileMode.swift b/Pods/MapCache/MapCache/Classes/LoadTileMode.swift new file mode 100644 index 00000000..7d45f4a2 --- /dev/null +++ b/Pods/MapCache/MapCache/Classes/LoadTileMode.swift @@ -0,0 +1,33 @@ +// +// LoadTileMode.swift +// MapCache +// +// Created by merlos on 09/05/2020. +// + +import Foundation + +/// Defines the strategies that can be used for retrieving the tiles from the cache +/// Used by `MapCache.loadTile()` method. +/// +/// - SeeAlso: `MapCache`, `MapCacheConfig` + +public enum LoadTileMode { + + /// Default. If the tile exists in the cache, return it, otherwise, fetch it from server (and cache the result). + case cacheThenServer + + /// Always return the tile from the server unless there is some problem with the network. + /// Cache is updated everytime the tile is received. + /// Basically uses the cache as internet connection fallback + case serverThenCache + + /// Only return data from cache. + /// Useful for fully offline preloaded maps. + case cacheOnly + + /// Always return the tile from the server, as well as updating the cache. + /// This mode may be useful for donwloading a whole map region. + /// If a tile was not downloaded fron the server error is returned. + case serverOnly + } diff --git a/Pods/MapCache/MapCache/Classes/Log.swift b/Pods/MapCache/MapCache/Classes/Log.swift index 7740a85c..fe952a9d 100644 --- a/Pods/MapCache/MapCache/Classes/Log.swift +++ b/Pods/MapCache/MapCache/Classes/Log.swift @@ -11,30 +11,72 @@ import Foundation - +/// +/// For logging messages on console. +/// +/// The log format is ` [with error ]`: +/// Examples: +/// ``` +/// [MapCache][DEBUG] Welcome to MapCache +/// [MapCache][ERROR] Could not download file with error Unknown address +/// +/// ``` +/// +/// struct Log { - fileprivate static let Tag = "[MAPCACHE]" + /// The tag [MapCache] + fileprivate static let tag = "[MapCache]" + /// Log Levels fileprivate enum Level : String { + /// `[Debug]` For displaying messages useful during development. case Debug = "[DEBUG]" + /// `[ERROR]`For displaying messages of bad situations, very, very bad situations. case Error = "[ERROR]" } + /// + /// The actual method that prints. + /// - Parameter level: log level to show + /// - Parameter message: message to show + /// - Parameter error: error to show if any on addition to the message. Uses the pattern `{message} with error {error}` fileprivate static func log(_ level: Level, _ message: @autoclosure () -> String, _ error: Error? = nil) { if let error = error { - print("\(Tag)\(level.rawValue) \(message()) with error \(error)") + print("\(tag)\(level.rawValue) \(message()) with error \(error)") } else { - print("\(Tag)\(level.rawValue) \(message())") + print("\(tag)\(level.rawValue) \(message())") } } + /// + /// For displaying messages. Useful during development of this package. + /// + /// Example: + /// ``` + /// Log.debug("Hello world") // prints: [MapCache][DEBUG] Hello word + /// ``` + /// + /// These messages are displayed only if DEBUG is defined. + /// - Parameter message: message to display + /// - Parameter error: error to display if any. static func debug(message: @autoclosure () -> String, error: Error? = nil) { #if DEBUG log(.Debug, message(), error) #endif } + /// + /// These messages are displayed independently of the debug mode. + /// Used to provide useful information on exceptional situations to library users. + /// Example: + /// ``` + /// Log.error("Could not download tile", error) // prints: [MapCache][ERROR] Could not download tile with error No internet connection. + /// ``` + /// + /// - Parameter message: message to display + /// - Parameter error: error to display + static func error(message: @autoclosure () -> String, error: Error? = nil) { log(.Error, message(), error) } diff --git a/Pods/MapCache/MapCache/Classes/MKMapView+MapCache.swift b/Pods/MapCache/MapCache/Classes/MKMapView+MapCache.swift index db0d16c9..3da423cc 100644 --- a/Pods/MapCache/MapCache/Classes/MKMapView+MapCache.swift +++ b/Pods/MapCache/MapCache/Classes/MKMapView+MapCache.swift @@ -8,40 +8,54 @@ import Foundation import MapKit -/// Extension that provides MKMapView support to use MapCache +/// Extension that provides MKMapView support to use MapCache. /// /// - SeeAlso: Readme documentation extension MKMapView { - /// Will tell the map to use the cache passed as parameter. - public func useCache(_ cache: MapCache) -> CachedTileOverlay { - + /// Will tell the map to use the cache passed as parameter for getting the tiles. + /// + /// - Parameter cache: A cache that implements the `MapCacheProtocol`. Typically an instance of `MapCache` + /// + /// - SeeAlso: `Readme` + @discardableResult + public func useCache(_ cache: MapCacheProtocol) -> CachedTileOverlay { + let tileServerOverlay = CachedTileOverlay(withCache: cache) tileServerOverlay.canReplaceMapContent = true - + + // Don't set `maximumZ` when wanting "over zooming". + // TileOverlay will stop trying in zoom levels beyond `maximumZ`. + // Our custom renderer `CachedTileOverlayZoomRenderer` will catch these "over zooms". + if !cache.config.overZoomMaximumZ && cache.config.maximumZ > 0 { + tileServerOverlay.maximumZ = cache.config.maximumZ + } if cache.config.maximumZ > 0 { tileServerOverlay.maximumZ = cache.config.maximumZ } - + if cache.config.minimumZ > 0 { tileServerOverlay.minimumZ = cache.config.minimumZ } + + tileServerOverlay.tileSize = cache.config.tileSize self.insertOverlay(tileServerOverlay, at: 0, level: .aboveLabels) return tileServerOverlay } - + /// Call this method within the MKMapView delegate function /// `mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer` /// /// - SeeAlso: Example project and Readme documentation public func mapCacheRenderer(forOverlay overlay: MKOverlay) -> MKOverlayRenderer { if overlay.isKind(of: MKTileOverlay.self) { - return MKTileOverlayRenderer(overlay: overlay) + return CachedTileOverlayRenderer(overlay: overlay) } return MKOverlayRenderer() } - + /// + /// TODO: Implement this correctly. /// Returns current zoom level /// public var zoomLevel: Int { diff --git a/Pods/MapCache/MapCache/Classes/MKTileOverlayPath+MapCache.swift b/Pods/MapCache/MapCache/Classes/MKTileOverlayPath+MapCache.swift index 90cf970e..f0601717 100644 --- a/Pods/MapCache/MapCache/Classes/MKTileOverlayPath+MapCache.swift +++ b/Pods/MapCache/MapCache/Classes/MKTileOverlayPath+MapCache.swift @@ -12,7 +12,8 @@ import MapKit /// extension MKTileOverlayPath { - /// Creates a MkTileOverlayPath from a MapCache `TileCoords` + /// Creates a `MkTileOverlayPath` from a MapCache `TileCoords` + /// - Parameter tileCoords: coordinates of the tile init(tileCoords: TileCoords) { self.init() x = Int(tileCoords.tileX) @@ -20,6 +21,7 @@ extension MKTileOverlayPath { z = Int(tileCoords.zoom) } + /// Returns the tile overlay path as a `TileCoords` object. func toTileCoords() -> TileCoords? { return TileCoords(tileX: UInt64(x), tileY: UInt64(y), zoom: UInt8(z)) } diff --git a/Pods/MapCache/MapCache/Classes/MKZoomScale+MapCache.swift b/Pods/MapCache/MapCache/Classes/MKZoomScale+MapCache.swift new file mode 100644 index 00000000..84578443 --- /dev/null +++ b/Pods/MapCache/MapCache/Classes/MKZoomScale+MapCache.swift @@ -0,0 +1,23 @@ +// +// MKZoomScale+MapCache.swift +// MapCache +// +// Created by merlos on 26/09/2020. +// + +import Foundation +import MapKit + +/// Extension for MapCache +extension MKZoomScale { + /// + /// Converts from standard MapKit MKZoomScale to tile zoom level + /// - Parameter tileSize: current map tile size in pixels. Typically set in MapCacheConfig + /// - Returns: Corresponding zoom level for a tile + func toZoomLevel(tileSize: CGSize) -> Int { + let numTilesAt1_0 = MKMapSize.world.width / Double(tileSize.width) + let zoomLevelAt1_0 = log2(numTilesAt1_0) + let zoomLevel: Double = Double.maximum(0, zoomLevelAt1_0 + Double(floor(log2(self) + 0.5))) + return Int(zoomLevel) + } +} diff --git a/Pods/MapCache/MapCache/Classes/MapCache.swift b/Pods/MapCache/MapCache/Classes/MapCache.swift index 86bcd4f9..94e921b6 100644 --- a/Pods/MapCache/MapCache/Classes/MapCache.swift +++ b/Pods/MapCache/MapCache/Classes/MapCache.swift @@ -9,78 +9,180 @@ import Foundation import MapKit -/// The real brain +/// +/// This is the main implementation of the MapCacheProtocol, the actual cache +/// + public class MapCache : MapCacheProtocol { - + /// + /// Cofiguration that will be used to set up the behavior of the `MapCache` instance + /// public var config : MapCacheConfig + + /// + /// It manages the physical storage of the tile images in the device + /// public var diskCache : DiskCache + + /// + /// Manages the queue of network requests for retrieving the tiles + /// let operationQueue = OperationQueue() + /// + /// Constructor. It sets the `config` variable and initializes the `diskCache` with the name and capacity set in the config. + /// + /// - Parameter withConfig Cofiguration that will be used to set up the behavior of the MapCache instance + /// public init(withConfig config: MapCacheConfig ) { self.config = config diskCache = DiskCache(withName: config.cacheName, capacity: config.capacity) } + /// + /// Returns the URL for a tile. + /// + /// Basically replaces in `config.urlTemplate` the substrings `{z}`,`{x}`, `{y}` + /// with the values of the `forTilePath` + /// If ` {s}` is defined in the template, it aplies the Round Robin algorithm. + /// + /// - Parameter forTilePath: is the path for the tile in (x, y, z) tile coordinates. + /// + /// - SeeAlso: MapCacheConfig.roundRoubinSubdomain() + public func url(forTilePath path: MKTileOverlayPath) -> URL { //print("CachedTileOverlay:: url() urlTemplate: \(urlTemplate)") var urlString = config.urlTemplate.replacingOccurrences(of: "{z}", with: String(path.z)) urlString = urlString.replacingOccurrences(of: "{x}", with: String(path.x)) urlString = urlString.replacingOccurrences(of: "{y}", with: String(path.y)) urlString = urlString.replacingOccurrences(of: "{s}", with: config.roundRobinSubdomain() ?? "") - print("MapCache::url() urlString: \(urlString)") + Log.debug(message: "MapCache::url() urlString: \(urlString)") return URL(string: urlString)! } + /// For the path passed as argument it creates a unique key to be used in `DiskCache`. + /// + /// The output is a string that has the following format `{config.urlTemplate}-{x}-{y}-{z}` where: + /// - config.urlTemplate is the template url template and + /// - x, y and z are the coords of the path + /// + /// - Parameter forPath: is the path of the tile you want the cache + public func cacheKey(forPath path: MKTileOverlayPath) -> String { return "\(config.urlTemplate)-\(path.x)-\(path.y)-\(path.z)" } - public func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) { - // Use cache - // is the file alread in the system? - let key = cacheKey(forPath: path) - - - // If fetching data from cache is successfull => return the data - let fetchSuccess = {(data: Data) -> () in - print ("MapCache::loadTile() found! cacheKey=\(key)" ) - result (data, nil) - return - } - // Closure to run if error found while fetching data from cache - let fetChfailure = { (error: Error?) -> () in - print ("MapCache::loadTile() Not found! cacheKey=\(key)" ) - } - // Fetch the data - diskCache.fetchData(forKey: key, failure: fetChfailure, success: fetchSuccess) + /// + /// Fetches tile from server. + /// It resolves the url for the tile at the path. Then it tries to download the tile image from the server. If everything goes ok it + /// and updates the image in `diskCache` and returns the received `Data` through the `sucess` closure. + /// If something goes wrong it invokes the `failure`closure passing the `error`returned by the system. + /// + /// - Parameter at: Path for the tile + /// - Parameter failure: if the tile cannot be retrieved from the server this closure is called + /// - Parameter success: if the image is downloaded + + public func fetchTileFromServer(at path: MKTileOverlayPath, + failure fail: ((Error?) -> ())? = nil, + success succeed: @escaping (Data) -> ()) { let url = self.url(forTilePath: path) - print ("MapCache::loadTile() url=\(url)") - print("Requesting data...."); + print ("MapCache::fetchTileFromServer() url=\(url)") let task = URLSession.shared.dataTask(with: url) {(data, response, error) in if error != nil { - print("!!! MapCache::loadTile Error for key= \(key)") - //print(error) - result(nil,error) + print("!!! MapCache::fetchTileFromServer Error for url= \(url) \(error.debugDescription)") + fail!(error) + return + } + guard let data = data else { + print("!!! MapCache::fetchTileFromServer No data for url= \(url)") + fail!(nil) return } - guard let data = data else { return } - self.diskCache.setData(data, forKey: key) - print ("CachedTileOverlay:: Data received saved cacheKey=\(key)" ) - result(data,nil) + guard let httpResponse = response as? HTTPURLResponse, + (200...299).contains(httpResponse.statusCode) else { + print("!!! MapCache::fetchTileFromServer statusCode != 2xx url= \(url)") + fail!(nil) + return + } + + succeed(data) } task.resume() } + /// Returns the tile to be displayed on the overlay. + /// The strategy used to retrieve the tile (i.e. from network or from the `diskCache`) depends on the `config.loadTileMode`. + /// + /// - Parameter at the path of the tile to be retrived + /// - Parameter result is the closure that will be run once the tile or an error is received. + /// + /// - SeeAlso: `LoadTileMode` + /// + public func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) { + + let key = cacheKey(forPath: path) + + // Tries to load the tile from the server. + // If it fails returns error to the caller. + let tileFromServerFallback = { () -> () in + print ("MapCache::tileFromServerFallback:: key=\(key)" ) + self.fetchTileFromServer(at: path, + failure: {error in result(nil, error)}, + success: {data in + self.diskCache.setData(data, forKey: key) + print ("MapCache::fetchTileFromServer:: Data received saved cacheKey=\(key)" ) + result(data, nil)}) + } + + // Tries to load the tile from the cache. + // If it fails returns error to the caller. + let tileFromCacheFallback = { () -> () in + self.diskCache.fetchDataSync(forKey: key, + failure: {error in result(nil, error)}, + success: {data in result(data, nil)}) + + } + + switch config.loadTileMode { + case .cacheThenServer: + diskCache.fetchDataSync(forKey: key, + failure: {error in tileFromServerFallback()}, + success: {data in result(data, nil) }) + case .serverThenCache: + fetchTileFromServer(at: path, failure: {error in tileFromCacheFallback()}, + success: {data in result(data, nil) }) + case .serverOnly: + fetchTileFromServer(at: path, failure: {error in result(nil, error)}, + success: {data in result(data, nil)}) + case .cacheOnly: + diskCache.fetchDataSync(forKey: key, + failure: {error in result(nil, error)}, + success: {data in result(data, nil)}) + } + } + + //TODO review why does it have two ways of retrieving the cache size. + + /// Currently size of the cache public var diskSize: UInt64 { get { return diskCache.diskSize } } + /// Calculates the disk space allocated in dis for the cache + /// + /// - SeeAlso: DiskCache public func calculateDiskSize() -> UInt64 { return diskCache.calculateDiskSize() } + /// Clears the cache. + /// Removes all files in the `diskCache` + /// As it may take some time to remove all files it calls the completition closure upon finishing the removal. + /// + /// - Parameter completition: code to run upon the cache is cleared. + public func clear(completition: (() -> ())? ) { diskCache.removeAllData(completition) } diff --git a/Pods/MapCache/MapCache/Classes/MapCacheConfig.swift b/Pods/MapCache/MapCache/Classes/MapCacheConfig.swift index c0bbb5c4..0db93d87 100644 --- a/Pods/MapCache/MapCache/Classes/MapCacheConfig.swift +++ b/Pods/MapCache/MapCache/Classes/MapCacheConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import CoreGraphics /// @@ -14,28 +15,49 @@ import Foundation /// public struct MapCacheConfig { + /// Each time a tile is going to be retrieved from the server its x,y and z (zoom) values are plugged into this URL template. /// + /// Default value `"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png` + /// + /// Where + /// 1. `{s}` Replaced with one of the subdomains defined in `subdomains`. + /// 2. `{z}` Replaced with the zoom level value. + /// 3. `{x}` Replaced with the position of the tile in the X asis for this zoom level + /// 4. `{y}` Replaced with the position of the tile in the X asis for this zoom level + /// + /// - SeeAlso: [Tiles servers in OpenStreetMap wiki](https://en.wikipedia.org/wiki/Tiled_web_map) + /// - SeeAlso: [Tiled we maps in wikipedia](https://en.wikipedia.org/wiki/Tiled_web_map) public var urlTemplate: String = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" + /// Subdomains used on the `urlTemplate` public var subdomains: [String] = ["a","b","c"] + /// + /// It must be smaller or equal than `maximumZ` + /// + /// Default value is 0. + public var minimumZ: Int = 0 + /// /// Maximum supported zoom by the tile server /// - /// If the tile server supported zoom is smaller than `maximumZ` tiles won't be rendered as a HTTP 404 error - /// will be returned by the server for not supported zoom levels. + /// Tiles with a z zoom beyond `maximumZ` supported by the tile server will return a HTTP 404 error. /// /// Values vary from server to server. For example OpenStreetMap supports 19, but OpenCycleMap supports 22 - /// - see https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames /// /// Default value: 19. If 0 or negative is set iOS default value (i.e. 21) + /// + /// - SeeAlso: [OpenStreetMap Wiki Slippy map tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) + /// public var maximumZ: Int = 19 - + /// - /// It must be smaller or equal than `maximumZ` + /// If set to true when zooming in beyond `maximumZ` the tiles at `maximumZ` will be upsampled and shown. + /// This mitigates the issue of showing an empty map when zooming in beyond `maximumZ`. + /// + /// `maximumZ` is vital to zoom working, make sure it is properly set. /// - /// Default value is 0. - public var minimumZ: Int = 0 + public var overZoomMaximumZ: Bool = true /// /// Name of the cache @@ -49,13 +71,39 @@ public struct MapCacheConfig { /// public var capacity: UInt64 = UINT64_MAX + /// + /// Tile size of the tile. Default is 256x256 + /// + public var tileSize: CGSize = CGSize(width: 256, height: 256) + + + /// + /// Load tile mode. + /// Sets the strategy to be used when loading a tile. + /// By default loads from the cache and if it fails loads from the server + /// + /// - SeeAlso: `LoadTileMode` + + public var loadTileMode: LoadTileMode = .cacheThenServer + + /// + /// Constructor with all the default values. + /// public init() { } + /// + ///Constructor that overwrites the `urlTemplate`` + /// + /// - Parameter withUrlTemplate: is the string of the `urlTemplate` + /// public init(withUrlTemplate urlTemplate: String) { self.urlTemplate = urlTemplate } + /// + /// Selects one of the subdomains randomly. + /// public func randomSubdomain() -> String? { if subdomains.count == 0 { return nil @@ -64,13 +112,13 @@ public struct MapCacheConfig { return subdomains[rand] } - /// Keeps track of the last subdomain requested. + /// Keeps track of the index of the last subdomain requested for round robin private var subdomainRoundRobin: Int = 0 /// Round Robin algorithm /// If subdomains are a,b,c then it makes requests to a,b,c,a,b,c,a,b,c... /// - /// It uniformly makes requests + /// It uniformly makes requests to all the subdomains. public mutating func roundRobinSubdomain() -> String? { if subdomains.count == 0 { return nil diff --git a/Pods/MapCache/MapCache/Classes/MapCacheProtocol.swift b/Pods/MapCache/MapCache/Classes/MapCacheProtocol.swift index 8fc87249..d741022a 100644 --- a/Pods/MapCache/MapCache/Classes/MapCacheProtocol.swift +++ b/Pods/MapCache/MapCache/Classes/MapCacheProtocol.swift @@ -8,13 +8,27 @@ import Foundation import MapKit +/// +/// This protocol shall be implemented by any cache used in MapCache. +/// +/// - SeeAlso: [Main Readme page](/) +/// public protocol MapCacheProtocol { + /// An instance of `MapCacheConfig` var config: MapCacheConfig { get set } + /// The implementation shall convert a tile path into a URL object + /// + /// Typically it will use the `config.urlTemplate` and `config.subdomains`. + /// + /// An example of implementation can be found in the class`MapCache` func url(forTilePath path: MKTileOverlayPath) -> URL - /// Shall load a tile based on MKTileOverlayPath + /// + /// The implementation shall return either the tile as a Data object or an Error if the tile could not be retrieved. + /// + /// - SeeAlso [MapKit.MkTileOverlay](https://developer.apple.com/documentation/mapkit/mktileoverlay) func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) } diff --git a/Pods/MapCache/MapCache/Classes/RegionDownloader.swift b/Pods/MapCache/MapCache/Classes/RegionDownloader.swift index 55f5962b..fedcffa7 100644 --- a/Pods/MapCache/MapCache/Classes/RegionDownloader.swift +++ b/Pods/MapCache/MapCache/Classes/RegionDownloader.swift @@ -8,36 +8,50 @@ import Foundation import MapKit -/// Hey! I need to download this area +/// Hey! I need to download this area of the map. /// No problemo. +/// +/// This class allows you to download all the tiles of a region of the map. +/// +/// Internally what it does is to iterate over every tile coordinate within the region and request to a +/// mapCache to download it by calling its `loadTile` method. +/// +/// In order to keep track of the downloaded data you can implement `ReguionDownloaderDelegate`. +/// +/// Based on the value of `incrementInPercentageNotification` the delegate will be called. +/// +/// Experimental @objc public class RegionDownloader: NSObject { - /// Average number of bytes of a tile + + /// Approximation of the average number of bytes of a tile (used with 256x256 tiles). static let defaultAverageTileSizeBytes : UInt64 = 11664 - /// region that will be downloaded + /// Region that will be downloaded. + /// + /// Initialized in the constructor public let region: TileCoordsRegion /// Cache that is going to be used for saving/loading the files. public let mapCache: MapCacheProtocol - /// Total number of tiles to be downloaded + /// Total number of tiles to be downloaded. public var totalTilesToDownload: TileNumber { get { return region.count } } - /// Number of tiles pending to be downloaded + /// Number of tiles pending to be downloaded. public var pendingTilesToDownload: TileNumber { get { return region.count - downloadedTiles } } - + /// The variable that actually keeps the count of the downloaded bytes. private var _downloadedBytes: UInt64 = 0 - /// Total number of downloaded data bytes + /// Total number of downloaded data bytes. public var downloadedBytes: UInt64 { get { return _downloadedBytes @@ -46,7 +60,7 @@ import MapKit /// Returns the average /// - /// This can be used to estimate the + /// This can be used to estimate the amount of bytes pending to be downloaded. public var averageTileSizeBytes: UInt64 { get { if downloadedTiles != 0 { @@ -64,7 +78,7 @@ import MapKit } } - /// + /// Number of successfully downloaded tiles. private var _successfulTileDownloads : TileNumber = 0 /// Keeps the number of tiles already downloaded. @@ -74,8 +88,8 @@ import MapKit } } - /// Keeps the number of tiles failes to be downloaded - /// Publicly accessible through failledTIleDownloads + /// Keeps the number of tiles failes to be downloaded. + /// Publicly accessible through failledTIleDownloads. private var _failedTileDownloads : TileNumber = 0 /// Number of tiles to be downloaded @@ -85,17 +99,17 @@ import MapKit } } - /// Percentage to notify thought delegate - /// If set to >100 will only notify on finish download - /// If set to a percentage < `downloadedPercentage`, will never notify. + /// Percentage to notify thought delegate. + /// If set to >100 will only notify on finish download. + /// If set to a percentage smaller than `downloadedPercentage`, it will never notify. public var nextPercentageToNotify: Double = 5.0 - /// The downloader will notify the delegate every time this - /// For example if you set this to 5, it will notify when 5%, 10%, 15%, etc... - /// default value 5. + /// The downloader will notify the delegate every time this. + /// For example if you set this to 5, it will notify when 5%, 10%, 15%, etc. + /// Default value 5. public var incrementInPercentageNotification: Double = 5.0 - /// Last notified + /// Last percentage notified to the deletage. var lastPercentageNotified: Double = 0.0 @@ -106,11 +120,11 @@ import MapKit } } - /// Delegate + /// Delegate. public var delegate : RegionDownloaderDelegate? - /// Queue to download stuff. + /// Queue to download the stuff. lazy var downloaderQueue : DispatchQueue = { let queueName = "MapCache.Downloader." + self.mapCache.config.cacheName //let downloaderQueue = DispatchQueue(label: queueName, attributes: []) @@ -120,16 +134,29 @@ import MapKit /// - /// initializes the downloader with the region and the MapCache + /// Initializes the downloader with the region and the MapCache. + /// + /// - Parameter forRegion: the region to be downloaded. + /// - Parameter mapCache: the `MapCache` implementation used to download and store the downloaded data /// public init(forRegion region: TileCoordsRegion, mapCache: MapCacheProtocol) { self.region = region self.mapCache = mapCache } - /// Starts download + /// Resets downloader counters. + public func resetCounters() { + _downloadedBytes = 0 + _successfulTileDownloads = 0 + _failedTileDownloads = 0 + lastPercentageNotified = 0.0 + nextPercentageToNotify = incrementInPercentageNotification + } + + /// Starts download. public func start() { //Downloads stuff + resetCounters() downloaderQueue.async { for range: TileRange in self.region.tileRanges() ?? [] { for tileCoords: TileCoords in range { @@ -139,6 +166,8 @@ import MapKit if error != nil { print(error?.localizedDescription ?? "Error downloading tile") self._failedTileDownloads += 1 + // TODO add to an array of tiles not downloaded + // so a retry can be performed } else { self._successfulTileDownloads += 1 print("RegionDownloader:: Donwloaded zoom: \(tileCoords.zoom) (x:\(tileCoords.tileX),y:\(tileCoords.tileY)) \(self.downloadedTiles)/\(self.totalTilesToDownload) \(self.downloadedPercentage)%") @@ -163,7 +192,7 @@ import MapKit } /// Returns an estimation of the total number of bytes the whole region may occupy. - /// It is an estimation. + /// Again, it is an estimation. public func estimateRegionByteSize() -> UInt64 { return RegionDownloader.defaultAverageTileSizeBytes * self.region.count } diff --git a/Pods/MapCache/MapCache/Classes/RegionDownloaderDelegate.swift b/Pods/MapCache/MapCache/Classes/RegionDownloaderDelegate.swift index 90bd3a1e..59444bca 100644 --- a/Pods/MapCache/MapCache/Classes/RegionDownloaderDelegate.swift +++ b/Pods/MapCache/MapCache/Classes/RegionDownloaderDelegate.swift @@ -8,14 +8,15 @@ import Foundation /// -/// Delegate protocol of `RegionDownloader` -/// +/// Delegate protocol of `RegionDownloader`. +/// Implement this protocol whenever you use `RegionDownloader` it drovides feedback while donwloading a +/// region (f.i, downloaded %) and callsback the delegate once the download finished. /// @objc public protocol RegionDownloaderDelegate: class { - /// Did download the percentage + /// Did download the percentage. @objc func regionDownloader(_ regionDownloader: RegionDownloader, didDownloadPercentage percentage: Double) - /// Did Finish Download all tiles + /// Did Finish Download all tiles. func regionDownloader(_ regionDownloader: RegionDownloader, didFinishDownload tilesDownloaded: TileNumber) } diff --git a/Pods/MapCache/MapCache/Classes/ReplaceMe.swift b/Pods/MapCache/MapCache/Classes/ReplaceMe.swift deleted file mode 100644 index e69de29b..00000000 diff --git a/Pods/MapCache/MapCache/Classes/TileCoords.swift b/Pods/MapCache/MapCache/Classes/TileCoords.swift index c03baab5..d8f02762 100644 --- a/Pods/MapCache/MapCache/Classes/TileCoords.swift +++ b/Pods/MapCache/MapCache/Classes/TileCoords.swift @@ -14,29 +14,34 @@ import Foundation public typealias Zoom = UInt8 /// Tile number in a map. -/// - SeeAlso TileCoords +/// - SeeAlso: TileCoords public typealias TileNumber = UInt64 -/// Errors for Zoom +/// Errors for Zoom. enum ZoomError: Error { - /// Zoom largest value is 19 + /// Zoom largest value is 19. case largerThan19 } -/// Errors for a latitude +/// Errors for a latitude. enum LatitudeError: Error { + /// Overflow if latitud is smaller than the minimum. case overflowMin + /// Overflow if latitud is greater than the maximum. case overflowMax } -/// Errors for a longitude +/// Errors for a longitude. enum LongitudeError: Error { + /// Overflow if latitud is smaller than the minimum. case overflowMin + /// Overflow if latitud is greater than the maximum. case overflowMax } /// Errors for a tile enum TileError: Error { + /// Overflow in the tile case overflow } @@ -172,7 +177,8 @@ public class TileCoords { return latitude } - /// Holds the zoom level + /// Holds the zoom level. + /// For internal use only. private var _zoom : Zoom = 0 /// Zoom level. Read only. Use setZoom() to change it. @@ -182,8 +188,10 @@ public class TileCoords { } } - /// Latitude for this tile. Use setCoords() to change it. + /// Holds the actual latitude private var _latitude: Double = 0.0 + + /// Latitude for this tile. Use set() to change it. public var latitude: Double { get { return _latitude @@ -210,9 +218,10 @@ public class TileCoords { } } - // Tile in the Y axis for current latitude and zoom. Use set() to change it. + /// Holds the actual tileY private var _tileY: TileNumber = 0 + /// Tile in the Y axis for current latitude and zoom. Use set() to change it. public var tileY : TileNumber { get { return _tileY @@ -238,7 +247,7 @@ public class TileCoords { _tileY = tileY } - /// Sets latitude and longitude + /// Sets latitude and longitude. /// Throws LatitudeError and LongitudeError if they are out of range. public func set(latitude: Double, longitude: Double) throws { @@ -279,7 +288,7 @@ public class TileCoords { /// /// Creates a new Tile Coord with the same latitude and longitude - /// as the the parameter but with a different zoom + /// as the the parameter but with a different zoom. public init?(_ tileCoords: TileCoords, zoom: Zoom) { // we can assume that these are coorect so no need o test. self._latitude = tileCoords.latitude diff --git a/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift b/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift index 3f0bdb55..9e305a44 100644 --- a/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift +++ b/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift @@ -37,13 +37,13 @@ import Foundation /// public class TileCoordsRegion { - // Top left tile/coordinate + /// Top left tile/coordinate. public var topLeft : TileCoords - // Bottom right tile/coordinate + /// Bottom right tile/coordinate. public var bottomRight : TileCoords - //Zoom range for the region + /// Zoom range for the region. public var zoomRange: ZoomRange { get { let z1 = topLeft.zoom @@ -55,7 +55,7 @@ public class TileCoordsRegion { } } - //Total number of tiles in this region for all zoom levels + /// Total number of tiles in this region for all zoom levels. public var count : TileNumber { get { var counted: TileNumber = 0 @@ -67,7 +67,7 @@ public class TileCoordsRegion { } /// The region will be the area that holds the line from any top left point (P1) to any - /// bottom rightpoint 2 (P2) + /// bottom rightpoint 2 (P2). public init?(topLeftLatitude: Double, topLeftLongitude: Double, bottomRightLatitude: Double, bottomRightLongitude: Double, minZoom: UInt8, maxZoom: UInt8) { guard let _topLeft = TileCoords(latitude: topLeftLatitude, longitude: topLeftLongitude, zoom: minZoom) else { return nil } guard let _bottomRight = TileCoords(latitude: bottomRightLatitude, longitude: bottomRightLongitude, zoom: maxZoom) else { return nil} @@ -76,7 +76,7 @@ public class TileCoordsRegion { } /// The region will be the area that holds the line from any top left point (P1) to any - /// bottom rightpoint 2 (P2) + /// bottom rightpoint 2 (P2). /// For example, in this map: /// /// +---------------------++---------------------++---------------------+ @@ -91,7 +91,7 @@ public class TileCoordsRegion { /// | . || \· || | /// | + . .||. * P2 || | /// +---------------------++---------------------++---------------------+ - /// -180 180 -180 180 + /// -180 180 -180 180 /// /// The area will be the one denoted with the dots. /// @@ -105,7 +105,7 @@ public class TileCoordsRegion { self.bottomRight = bottomRight } - //Counts for the zoom + /// Counts for the zoom public func count(forZoom zoom: Zoom) -> TileNumber { guard let ranges = tileRanges(forZoom: zoom) else { return 0 @@ -117,28 +117,27 @@ public class TileCoordsRegion { return counted } - // All the tile ranges for this particular zoom. - // There may be 1 or 2. + /// All the tile ranges for this particular zoom. + /// There may be 1 or 2. /// /// For example, in this map there are two ranges. One that covers the area A1 /// and other that covers the area A2 /// - /// +----------------------++---------------------++---------------------+ - /// | P1 || || | - /// | *.....||...+ || | - /// | . \ .||. · || | - /// | Map 1 . \ .||. · Map 2 || Map 3 | - /// | . \.||. · || | - /// | . \||.A2· || | - /// | . A1.|\. · || | - /// | . .||\ · || | - /// | . .||.\ · || | - /// | +.....||...* P2 || | - /// +----------------------++---------------------++---------------------+ - /// -180 180 -180 180 + /// +----------------------++---------------------++--------------------+ + /// | P1 || || | + /// | *.....||...+ || | + /// | . \ .||. · || | + /// | Map 1 . \ .||. · Map 2 || Map 3 | + /// | . \.||. · || | + /// | . \||.A2· || | + /// | . A1.|\. · || | + /// | . .||\ · || | + /// | . .||.\ · || | + /// | +.....||...* P2 || | + /// +----------------------++---------------------++--------------------+ + /// -180 180 -180 180 /// /// - public func tileRanges(forZoom zoom: Zoom) -> [TileRange]? { //We create new tileCoords at the zoom guard let topLeftForZoom = TileCoords(topLeft,zoom: zoom) else { diff --git a/Pods/MapCache/MapCache/Classes/TileRange.swift b/Pods/MapCache/MapCache/Classes/TileRange.swift index b80c634c..c06f17aa 100644 --- a/Pods/MapCache/MapCache/Classes/TileRange.swift +++ b/Pods/MapCache/MapCache/Classes/TileRange.swift @@ -7,13 +7,14 @@ import Foundation -// +/// Errors for tile range enum TileRangeError: Error { + /// Error to be thrown in case of an issue during creation. case TileRangeCreation } -/// For a particular zoom level, defines a range of tiles -/// It can be iterated in a for loop. It will get the TileCoord +/// For a particular zoom level, defines a range of tiles. +/// It can be iterated in a for loop. It will get the `TileCoord`` /// /// The following conditions shall always be true /// @@ -26,49 +27,49 @@ enum TileRangeError: Error { /// public struct TileRange: Sequence { - //Zoom level + /// Zoom level. var zoom: Zoom - //min value of tile in X axis + /// Min value of tile in X axis. var minTileX: TileNumber - //max value of tile in X axis + /// Max value of tile in X axis. var maxTileX: TileNumber - //min value of tile in Y axis + /// Min value of tile in Y axis. var minTileY: TileNumber - //min value of tile in Y axis + /// Min value of tile in Y axis. var maxTileY: TileNumber - /// difference between X + /// Difference between `maxTileX` and `minTileX` var diffX : TileNumber { get { return maxTileX - minTileX } } - /// difference between maxTileY and minTileY + /// Difference between `maxTileY` and `minTileY` var diffY : TileNumber { get { return maxTileY - minTileY } } - /// Number of rows in the range + /// Number of rows in the range. var rows : TileNumber { get { return diffY + 1 } } - /// Number of columns in the range + /// Number of columns in the range. var columns : TileNumber { get { return diffX + 1 } } - /// Counts the number of tiles in the range (columns x rows) + /// Counts the number of tiles in the range (columns x rows). var count : TileNumber { get { return rows * columns @@ -76,11 +77,11 @@ public struct TileRange: Sequence { } /// Sequence iterator. - /// This allows TileRange to be used in for loops. - /// In each iteration it returns a TileCoord. + /// This allows `TileRange` to be used in for loops. + /// In each iteration it returns a `TileCoord`. /// It starts from the top left corner of the range and iterates row by row. /// - /// - See https://developer.apple.com/documentation/swift/iteratorprotocol + /// - SeeAlso: [IteratorProtocol](https://developer.apple.com/documentation/swift/iteratorprotocol) public func makeIterator() -> TileRangeIterator { return TileRangeIterator(self) } diff --git a/Pods/MapCache/MapCache/Classes/TileRangeIterator.swift b/Pods/MapCache/MapCache/Classes/TileRangeIterator.swift index 4d474411..35b11835 100644 --- a/Pods/MapCache/MapCache/Classes/TileRangeIterator.swift +++ b/Pods/MapCache/MapCache/Classes/TileRangeIterator.swift @@ -7,13 +7,13 @@ import Foundation -// +/// Iterator of a TileRange. public struct TileRangeIterator: IteratorProtocol { /// Range for the counter let range: TileRange - /// Counter + /// Current counter value var counter: UInt64 /// Max value counter can take. @@ -24,8 +24,9 @@ public struct TileRangeIterator: IteratorProtocol { /// Number of rows let rows : TileNumber - /// initializer of the iterator. - /// Sets range, counter, maxCounter and diffX + + /// Initializer of the iterator. + /// Sets `range`,` counter`, `maxCounter` and `diffX` init(_ range: TileRange) { self.range = range counter = 0 @@ -38,12 +39,12 @@ public struct TileRangeIterator: IteratorProtocol { } /// The function that is required by the Iterator protocol. - /// - Returns: the TileCoord for the current iteration. /// - /// - TODO: because there are no validations of the range in TileRange, - /// this function may fail. Pending to fix it. + /// - Returns: the `TileCoord` for the current iteration. + /// + /// - TODO: because there are no validations of the range in TileRange, this function may fail. Pending to fix it. /// - /// See: https://developer.apple.com/documentation/swift/iteratorprotocol + /// - SeeAlso: [IteratorProtocol](https://developer.apple.com/documentation/swift/iteratorprotocol) mutating public func next() -> TileCoords? { guard counter < maxCounter else { return nil } let currentColumn = counter % columns diff --git a/Pods/MapCache/MapCache/Classes/ZoomRange.swift b/Pods/MapCache/MapCache/Classes/ZoomRange.swift index 44d93cb8..3c2a0ece 100644 --- a/Pods/MapCache/MapCache/Classes/ZoomRange.swift +++ b/Pods/MapCache/MapCache/Classes/ZoomRange.swift @@ -17,20 +17,20 @@ import Foundation /// Usage example: /// /// let zR = ZoomRange(2,5).toArray() -// print(zR.count) // => 4 +/// print(zR.count) // => 4 /// /// It strictly stores z1 and z2, and the rest of the range -/// is built upon request +/// is built upon request. /// public struct ZoomRange : Sequence { - /// Minimum zoom in this range + /// Minimum zoom in this range. public let min: Zoom - /// Maximum zoom in this range + /// Maximum zoom in this range. public let max: Zoom - /// difference between max zoom and min zoom + /// Difference between max zoom and min zoom. var diffZoom: Zoom { get { return max - min @@ -43,13 +43,14 @@ public struct ZoomRange : Sequence { /// /// let zR = ZoomRange(2,2) /// print(zR.count) // => 1 + public var count: Zoom { get { return diffZoom + 1 } } - /// Creates the range of zooms + /// Creates the range of zooms. public init?(_ z1: Zoom, _ z2: Zoom) { do { try TileCoords.validate(zoom: z1) @@ -61,8 +62,7 @@ public struct ZoomRange : Sequence { self.max = z1 >= z2 ? z1 : z2 } - /// Converts to array - /// For instance, + /// Converts the zoom range in to an array`.` func toArray() -> [Zoom] { var ret : [Zoom] = [] for i in min...max { @@ -72,9 +72,9 @@ public struct ZoomRange : Sequence { } /// Returns the iterator for this range. - /// It allows to use ZoomRange in for loops. + /// It allows to use `ZoomRange` in for loops. /// - /// - More info: https://developer.apple.com/documentation/swift/iteratorprotocol + /// - SeeAlso: [IteratorProtocol](https://developer.apple.com/documentation/swift/iteratorprotocol) public func makeIterator() -> ZoomRangeIterator{ return ZoomRangeIterator(self) } diff --git a/Pods/MapCache/MapCache/Classes/ZoomRangeIterator.swift b/Pods/MapCache/MapCache/Classes/ZoomRangeIterator.swift index 33a52257..42e677dd 100644 --- a/Pods/MapCache/MapCache/Classes/ZoomRangeIterator.swift +++ b/Pods/MapCache/MapCache/Classes/ZoomRangeIterator.swift @@ -7,23 +7,23 @@ import Foundation -/// Iterator that allows the use of ZoomRange in a for loop +/// Iterator that allows the use of ZoomRange in a for loop. /// -/// - SeeAlso: https://developer.apple.com/documentation/swift/iteratorprotocol +/// - SeeAlso: [IteratorProtocol](https://developer.apple.com/documentation/swift/iteratorprotocol) public struct ZoomRangeIterator: IteratorProtocol { - /// keeps the counter of the iterator + /// Keeps the counter of the iterator. var counter : UInt8 = 0 - /// the range in question + /// The zoom range in question. var range: ZoomRange - /// receives the range to iterate. + /// Receives the range to iterate. init(_ range: ZoomRange) { self.range = range } - /// Gets next zoom value + /// Gets next zoom value. mutating public func next() -> Zoom? { guard counter < range.count else { return nil } let next = range.min + counter diff --git a/Pods/MapCache/MapCache/Classes/ZoomableTile.swift b/Pods/MapCache/MapCache/Classes/ZoomableTile.swift new file mode 100644 index 00000000..4560d328 --- /dev/null +++ b/Pods/MapCache/MapCache/Classes/ZoomableTile.swift @@ -0,0 +1,28 @@ +// +// ZoomableTile.swift +// MapCache +// +// Created by merlos on 26/09/2020. +// + +import Foundation +import MapKit + +/// +/// Specifies a single tile and area of the tile that should upscaled. +/// +struct ZoomableTile { + + /// Path for the tile with `maximumZ` supported by the tile server set in the config. + /// This is the path with the best resolution tile from wich this zoomable tile can be interpolated. + /// - SeeAlso: `MapCacheConfig`` + let maximumZPath: MKTileOverlayPath + + /// Rectangle area ocupied by this tile + let rect: MKMapRect + + /// Delta from given tile z to desired tile z. + /// Example: maximum zoom supported by the server is 20 and the desired tile is in zoom level 24, the delta is 4. + let overZoom: Zoom +} + diff --git a/Pods/MapCache/README.md b/Pods/MapCache/README.md index a22008ae..a2774bb5 100644 --- a/Pods/MapCache/README.md +++ b/Pods/MapCache/README.md @@ -3,25 +3,27 @@

-[![CI Status](https://travis-ci.com/merlos/MapCache.svg?branch=master)](https://travis-ci.org/merlos/MapCache) +[![CI Status](https://travis-ci.com/merlos/MapCache.svg?branch=master)](https://travis-ci.org/github/merlos/MapCache) [![Version](https://img.shields.io/cocoapods/v/MapCache.svg?style=flat)](https://cocoapods.org/pods/MapCache) [![License](https://img.shields.io/cocoapods/l/MapCache.svg?style=flat)](https://cocoapods.org/pods/MapCache) [![Platform](https://img.shields.io/cocoapods/p/MapCache.svg?style=flat)](https://cocoapods.org/pods/MapCache) [![Documentation](https://www.merlos.org/MapCache/badge.svg)](http://merlos.org/MapCache) +![Swift](https://github.com/merlos/MapCache/workflows/Swift/badge.svg) The missing part of [MapKit](https://developer.apple.com/documentation/mapkit): A simple way to cache [map tiles](https://en.wikipedia.org/wiki/Tiled_web_map) and support offline browsing of maps. -Current features: +Current features: * Automatically save tiles in a disk cache as user browses the map. * You can to set cache capacity. Once the cache is full it will use a LRU (Least Recently Used) algorithm. * Get Current cache size * Clear existing cache -* Download a full region of the map - +* Download a full region of the map (experimental) + What is coming: + * Improve documentation * Smart predownloading/caching: anticipate tiles that may be needed during network idle * Background cache updates downloads - * Improve documentation + ## Installation MapCache is available through [CocoaPods](https://cocoapods.org). To install @@ -31,7 +33,7 @@ it, simply add the following line to your `Podfile`: pod 'MapCache' ``` -## How to use the MapCache? +## How to use MapCache? In the view controller where you have the `MKMapView` import `MapCache` ```swift @@ -54,14 +56,18 @@ class ViewController: UIViewController { ... - // First setup the your cache - let config = MapCacheConfig(withTileUrlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") + // First setup the config of our cache. + // The only thing we must provide is the url template of the tile server. + // (All other config options are explained below in the section MapCache Configuration) + let config = MapCacheConfig(withUrlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") // initialize the cache with our config - mapCache = MapCache(withConfig: config) + let mapCache = MapCache(withConfig: config) - // We tell the MKMapView to use our cache - _ = map.useCache(mapCache!) + // We tell the MKMapView to use the cache + // So whenever it requires a tile, it will be requested to the + // cache + map.useCache(mapCache) ... } @@ -82,7 +88,8 @@ extension ViewController : MKMapViewDelegate { ``` After setting up map cache browsed areas of the map will be kept on disk. If user browses again that area it will use the local version. -Note that in current version `0.1.0` cache has not expiration date so if you need to get a new version of the map you must call `clear()` which will wipe out the whole cache. + +Note that in current version cache has not expiration date so if you need to get an updated version of the tiles you must call `clear()` which will wipe out the whole cache. ```swift mapCache.clear() { @@ -94,35 +101,37 @@ mapCache.clear() { To get current cache size: ```swift -mapCache.calculateSize() -``` +mapCache.calculateDiskSize() +``` + +You can take a look at the [**Example/ folder**](https://github.com/merlos/MapCache/tree/master/Example/MapCache) to see a complete implementation. ## MapCache configuration -Config map cache is pretty straight forward, typically you will need to set only `urlTemplate` and probably the `subdomains`. +Config map cache is pretty straight forward, typically you will need to set only `urlTemplate` and probably the `subdomains`. These are the options: ```swift var config = MapCacheConfig() -// Set the URL template. +// Set the URL template. // For Open Street Maps you can chose: https://wiki.openstreetmap.org/wiki/Tile_servers -// It defaults to OpenStreetMaps servers +// It defaults to OpenStreetMaps servers // // Below we set cartoDB Base map server (https://github.com/CartoDB/cartodb/wiki/BaseMaps-available) config.urlTemplate: "https://${s}.basemaps.cartocdn.com/base-light/${z}/${x}/${y}.png" -// In the urlTemplate ${s} stands for subdomains, which allows you to balance +// In the urlTemplate ${s} stands for subdomains, which allows you to balance // the load among the // different tile servers. // Default value is ["a","b","c"]. -config.subdomains = ["a", "b"] +config.subdomains = ["a", "b"] // Cache Name is basically is the subfolder name in which the tiles are store. // Default value is "MapCache" -config.cacheName = "Carto" +config.cacheName = "Carto" // Max zoom supported by the tile server @@ -130,21 +139,89 @@ config.cacheName = "Carto" config.maximumZ = 21 // Minimum zoom can also be set. -// config.minimumZ = 0 +// config.minimumZ = 0 +// Continues to show map tiles even beyond maximumZ +// config.overZoomMaximumZ = true -// Capacity of the cache in bytes. Once the cache is full it uses a LRU algorithm -// (Least Recently Used), that is, it removes the tiles last used a lot of time ago. +// Capacity of the cache in bytes. Once the cache is full it uses a LRU algorithm +// (Least Recently Used), that is, it removes the tiles last used a lot of time ago. // Each time a tile is retrieved from the cache it is updated the value of last time used. // Default value of the capacity is unlimited. -config.capacity = 200 * 1024 * 1024 // 20 Megabytes +config.capacity = 200 * 1024 * 1024 // 200 Megabytes ``` If you need to use MapCache in different controllers, to avoid issues just be sure to use the same values in the config. +## How does `MapCache` work behind the scenes + +If you need to build on something top of MapCache read this. If not, you can ignore + +MapCache is a hack of [MapKit](https://developer.apple.com/documentation/mapkit), the map framework of Apple. + +### Understanding MapCache bootstrap + +As explained in _How to use MapCache?_ section, in order to bootstrap MapCache we have to call this method + +```swift +map.useCache(mapCache) +``` + +Where map is an instance of `MKMapView`, the main class used to display a map in iOS. What MapCache does through the extension (`MKMapView+MapCache`) is to add a new method `useCache` that tells `MKMapView` to display in the map a new tile layer on top of the default layers. Because of this while the tiles are loaded you may see the names of the default Apple Maps. + +This extension also adds a variable in the `MKMapView` to keep the cache config. + +A layer in the map is called _overlay_ in the MapKit terminology. MapCache uses [tile based overlay](https://en.wikipedia.org/wiki/Tiled_web_map). implemented in the class `CachedTileOverlay` which is a subclass of [MKTileOverlay](https://developer.apple.com/documentation/mapkit/mktileoverlay). + +Overlays, have associated _renderers_ that are the actual classes that draw the content of an overlay in the screen. For example, there are rendererers for points, lines, polygons, and tiles. When `MapView` needs to display an overlay it calls the delegate with the overlay it is going to render and you need to provide the renderer to use. In order to do that, We added a method `mapCacheRenderer` that just returns the default [MKTileOverlayRenderer](https://developer.apple.com/documentation/mapkit/mktileoverlay) when the class of the overlay passed as argument is of the type `CachedTileOverlay`. That is why we need to add this code on the application in the delegate of the map view (`MKMapViewDelegate`) : + +```swift +extension ViewController : MKMapViewDelegate { + func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { + return mapView.mapCacheRenderer(forOverlay: overlay) + } +} +``` + +### `CachedTileOverlay` and `MapCacheProtocol` + +As mentioned earlier, `CachedTileOverlay` is tile based layer that is implemented as a subclass of [MKTileOverlay](https://developer.apple.com/documentation/mapkit/mktileoverlay). Basically, the only thing that it does is to override two methods of the parent class: + +1. `func url(forTilePath path: MKTileOverlayPath) -> URL`. The goal of this method is to return the URL of the tile. We need to overwrite it to be able to use the tile server of our preference. + +2. `func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void)`. This method is the one that returns the actual Tile. + +If you take a look to the [implementation of `CachedTileOverlay`](https://github.com/merlos/MapCache/blob/master/MapCache/Classes/CachedTileOverlay.swift) you will notice that it only forwards the request a method with the same signature of a variable called `mapCache` which is an instance of a class that implements `MapCacheProtocol` + +``` +override public func url(forTilePath path: MKTileOverlayPath) -> URL {` + return mapCache.url(forTilePath: path) + } +``` + +The [`MapCacheProtocol definition`](https://github.com/merlos/MapCache/blob/master/MapCache/Classes/MapCacheProtocol.swift) is pretty simple, it just requires to have a config variable instance of a `MapCacheConfig` and an implementation of the two methods that are called from `CachedTileOverlay` + +``` +public protocol MapCacheProtocol { + + var config: MapCacheConfig { get set } + + func url(forTilePath path: MKTileOverlayPath) -> URL + + func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) +``` + +If you need to create a custom implementation of the cache, you just need to create a class that implements this protocol and initialize the cache using `map.useCache(myCustomCacheImplementationInstance)`. The implementation provided by the library is on the class named as `MapCache`. + +Something that may be useful too is the `DiskCache` class. + +If you need further information you can take a look at + +### [Reference documentation of MapCache](http://www.merlos.org/MapCache/). + ## You may also like @@ -153,7 +230,7 @@ If you need to use MapCache in different controllers, to avoid issues just be su ## License - MIT -Copyright (c) 2019 Juan M. Merlos [@merlos](http://twitter.com/merlos) +Copyright (c) 2019-2020 Juan M. Merlos [@merlos](http://twitter.com/merlos), and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 12217795..11445573 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -8,95 +8,97 @@ /* Begin PBXBuildFile section */ 0051F071C41EE79A1E0A27EE20E5B085 /* Pods-OpenGpxTracker-Watch Extension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ACC647A22F623093983DA656039BCC39 /* Pods-OpenGpxTracker-Watch Extension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 009062F9877D6BC0B5EBB94EE26181A6 /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3E0E841ED4EC506A4C54A932F4D45D3 /* NSMutableString+XML.swift */; }; - 09E384876EF6B4429D5F842FD0AEB6D2 /* MapCacheConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C5ACD3F0566369CDB535E1A71596329 /* MapCacheConfig.swift */; }; - 0A17EF26C41586A52FD0F5962E32E3BB /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 432E5952D82C81E738E48D236684E841 /* GPXRoute.swift */; }; - 0D17527D7F4F848A264ECEBFB281A53A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C88210CE8E7FCAB8640FC827745208 /* Foundation.framework */; }; - 0F4DA559092D4C2B144DCB33B92CEC68 /* ReplaceMe.swift in Sources */ = {isa = PBXBuildFile; fileRef = E59CE3751DA14E624409E1C6A754F9DD /* ReplaceMe.swift */; }; - 107030F1982ABB361FFE86CB55AFDC16 /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF24FEE85921ED98A1E05D2F851ADAA /* GPXElement.swift */; }; - 12D17C49D1D78C45AA269B3AAF18D81E /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF24FEE85921ED98A1E05D2F851ADAA /* GPXElement.swift */; }; - 13791F91C39F408FDD0DC652B1D7CADE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09B0E7E80D881072DB518C322C620DCB /* UIKit.framework */; }; + 009062F9877D6BC0B5EBB94EE26181A6 /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */; }; + 0375EE2E92C662E84645B1B7B045E531 /* TileRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D67FB075DEA05080400263F50BEF253C /* TileRangeIterator.swift */; }; + 041CD9B69E76FB24E8F8DA7E4DF83256 /* CachedTileOverlayRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B2AFE1856369898D29D7DD5B9A1068A /* CachedTileOverlayRenderer.swift */; }; + 0A17EF26C41586A52FD0F5962E32E3BB /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */; }; + 0C772E8D6AE87CFF3980634D4CB2D8F2 /* ZoomRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65B4BAD4E12A8C423C1F521177B2BB6C /* ZoomRange.swift */; }; + 0D17527D7F4F848A264ECEBFB281A53A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */; }; + 107030F1982ABB361FFE86CB55AFDC16 /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */; }; + 12D17C49D1D78C45AA269B3AAF18D81E /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */; }; 1563F52C4589BEAE34FDFA4FD8AD4558 /* Pods-OpenGpxTracker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F48E60050E3150BF104D2316FA1C144 /* Pods-OpenGpxTracker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1663A9527B6D3C34A3A9C40B6C6B97E3 /* TileCoords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B9C379D0D00DFEEEB0613DF3545FD9 /* TileCoords.swift */; }; - 17A2706D3466A9BAC139A7B984247F2F /* TileCoordsRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8F88DAD4BA9E938DB642C8DF2C7A730 /* TileCoordsRegion.swift */; }; - 1B4F048FF9AAF1741501A7E0ABDFB7D8 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5618810E26374AB0477FFB0209B71C4 /* MapKit.framework */; }; - 1E5DFEFB3DC77CC15F41E0FECA3F3A31 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFFEBE8A1266620BC10893FC9EA8500 /* GPXPerson.swift */; }; - 212FC03237B03A9FB986CEDB67E81DA4 /* URL+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C502364799695EAEDC4756E9D5A1205 /* URL+DiskCache.swift */; }; - 245F1C280C96E219A394F34A549812B6 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF98BD3AFEB124A15D75336F9884B498 /* Log.swift */; }; - 2C56C05D43748A5652780B10AEE55652 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B40AEE8EEBC209AD4583EED9C390CCB /* GPXRoot.swift */; }; - 2D30C313F53F61A3DD4D71D8D9DE5D34 /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 620ABF49A5144FE6B77811D9AC91BB8E /* GPXEmail.swift */; }; - 3006DA8C4ACEC8B1D7919414BBCC3C7B /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3023FD085C0CB6B3BE39FD73E5023DDF /* GPXTrack.swift */; }; - 35A73DC235D024AE79DE76F9A18DDD09 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 338544B97C455AC0CBB46D5E681A50DD /* GPXLink.swift */; }; - 3B80E04855F0A3FACBD1974A8A25D74C /* MKTileOverlayPath+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F143442C924D8CFBDE83CD8D796862E5 /* MKTileOverlayPath+MapCache.swift */; }; - 3B9DD8E0581146ED0D56D013DBDF050C /* MKMapView+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DADF2A23891D035DBE699F8BAF466FE /* MKMapView+MapCache.swift */; }; - 420608CA619361F85C87352B59F99AD9 /* CoreGPX-watchOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 975293F9C701550B15C6C9F23744FAE5 /* CoreGPX-watchOS-dummy.m */; }; - 42D0BAB0F4CE1722E881484B1BE3160B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37E97FC270E4B8C36C8785FAB7B59D60 /* Foundation.framework */; }; - 43013E97314F046F1375397503261FAF /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3023FD085C0CB6B3BE39FD73E5023DDF /* GPXTrack.swift */; }; - 46226773B5C468E2F7F1375A904FBB06 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D8D1DED1F005B37B8B7EA7EEA506150 /* GPXCopyright.swift */; }; - 49DF2D1EF0E1859867D4867B27D5458F /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85ED93B5014415CBD8BA0BF730FA2F73 /* GPXTrackPoint.swift */; }; - 4D9CB99D76F28673C665ED494AEE13A9 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A515C4676C00644B188BF9A8A3B5E85C /* GPXAuthor.swift */; }; - 5153651B6BE1F467AA82E8FEABE3A127 /* CoreGPX-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B7C30D100031985EAB6A564E5ACA038 /* CoreGPX-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5172547C32B319C8E182BE6A3FA94072 /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4841B29E07C787F40AFFF04B3C1C6B19 /* GPXRoutePoint.swift */; }; - 51F907CB337FB84E6979FF884B56610A /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2711AB617B58FCD305DCF40EFFE6AAF /* GPXRawElement.swift */; }; - 5376F8C3B3547ECDBE3667EDF3BA5219 /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E9EA5512495BCA472290FF6FA3E6C1A /* GPXExtensionsElement.swift */; }; - 554B1B922F5400AA99A6300C161F2252 /* TileRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE064037540B14A8E118809F82543C4C /* TileRangeIterator.swift */; }; - 58FAE43FA4577895A9B7FDE6C268D5F0 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F925E102F6CE02BEC92A655A753E884F /* GPXParser.swift */; }; - 5AA7C37FDCDCBBFB5AECBCB3805F2875 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E44C569958F1BDC20289894B250A5F7 /* GPXError.swift */; }; - 5E2D81508D8D80DB99F3A8A244165F00 /* CachedTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D49C9C34BAD7C0C873ABB6F1ADAF08 /* CachedTileOverlay.swift */; }; - 5E3244DCD8570F8B4E79F15703FCE72A /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F3559D4E1B568F69970D2CAC61718EA /* DateTimeParsers.swift */; }; - 5EDAAEEA92F9FBC307987C4532579C72 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27333A72D16BC7A61D8D5BD0635B3EB0 /* GPXFix.swift */; }; - 618B6936A8979FA637CC195B73BFA571 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8189C2486B67082E7A39BD1365AA3B1F /* GPXPoint.swift */; }; - 62FEDFC036FFB09D0439E8E5DBD74DD1 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = F320F5409E87EB5BC5E1AA94302BAE23 /* GPXBounds.swift */; }; - 63762975220A63D72236FF64F84E28E4 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B40AEE8EEBC209AD4583EED9C390CCB /* GPXRoot.swift */; }; - 64EB038F5F947A8ED5406BA15DD049FE /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2521A32E3DEB73401C8102BBF55F6EB3 /* GPXTrackSegment.swift */; }; - 654BF22B5735845268FB11A2F2ACB354 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E44C569958F1BDC20289894B250A5F7 /* GPXError.swift */; }; - 695DE091483BE3D820B51FA13012F775 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2801BD0ED9724E4929695898DF9416E /* Converters.swift */; }; - 6B0E6136E1A46C685E8A7EC9B433A8FB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37E97FC270E4B8C36C8785FAB7B59D60 /* Foundation.framework */; }; - 6F634D1BD2438165DDF570613D5469A5 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = F320F5409E87EB5BC5E1AA94302BAE23 /* GPXBounds.swift */; }; - 70EE5EF537DD26C3211215D5615A3932 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F925E102F6CE02BEC92A655A753E884F /* GPXParser.swift */; }; - 741FC84507C11779BA12C56C9C21D80D /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3E0E841ED4EC506A4C54A932F4D45D3 /* NSMutableString+XML.swift */; }; - 7D29673703BC46418F274CBC5C14A60D /* CoreGPX-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 20DC0B72E98A72FDAAA92C5742805A2F /* CoreGPX-iOS-dummy.m */; }; - 7D353EA3E3E4221419EDB623C9518A73 /* MapCacheProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69C0565E9F01D38425F9922DF9D018BE /* MapCacheProtocol.swift */; }; - 7F93B344D032932509A2F80F22E3441E /* ZoomRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 925C0B72AB03AB9C805CF1053CF7E060 /* ZoomRangeIterator.swift */; }; - 836519803F630D9F093EB968CE6AF589 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C201D8C285A968523E3AAE43B42366 /* GPXMetadata.swift */; }; - 871385C4364090FF4EE7222150301D19 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8189C2486B67082E7A39BD1365AA3B1F /* GPXPoint.swift */; }; - 878F0474D84D790D1268F9AC54B51E53 /* MapCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CCFFA343FBFC8B45C36D6E700340DDB /* MapCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8C302606B27B3F212B51A2A85CDEA8A2 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A515C4676C00644B188BF9A8A3B5E85C /* GPXAuthor.swift */; }; - 8C9AE2FC1392CC93678F534D20C705E0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C88210CE8E7FCAB8640FC827745208 /* Foundation.framework */; }; - 8EAA95CC8C16FE5BE72426E94D45232A /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2711AB617B58FCD305DCF40EFFE6AAF /* GPXRawElement.swift */; }; - 8F1B8DEAC05D0D3E5D72AD8C22071A00 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27333A72D16BC7A61D8D5BD0635B3EB0 /* GPXFix.swift */; }; - 8F23CA2CA147503050CFC903BDF497EB /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3893F715A86769D69295C7E3E6BA9315 /* GPXWaypoint.swift */; }; - 8FA7EB9DBA0BB5F070061E9B2031701B /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3893F715A86769D69295C7E3E6BA9315 /* GPXWaypoint.swift */; }; - 943F1CCA42130FF576D7E97D0C9BA39C /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E9EA5512495BCA472290FF6FA3E6C1A /* GPXExtensionsElement.swift */; }; - 95AD4B7017BBD30A7408B35A054D758C /* DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA7A862EA393B749AE348C487F44F413 /* DiskCache.swift */; }; - 99F98F80935F5327E3A602AE4538B989 /* FileManager+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCEACE398B8C0966093DAE99152A1FE /* FileManager+DiskCache.swift */; }; - 9A3A289384D1E07371494FF3C2AA5D80 /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9707D4AD8EF177D9ACA977AEEF70E011 /* GPXPointSegment.swift */; }; - 9B2DF887EAD080B7BD1B4F83339FE4EC /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075290FCBBB2588D91AC2A3BA1768600 /* GPXExtensions.swift */; }; - 9D4D8710743732371A6CD22F15FF0E11 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2801BD0ED9724E4929695898DF9416E /* Converters.swift */; }; - A506775F260622154170ABCEF83100D8 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D8D1DED1F005B37B8B7EA7EEA506150 /* GPXCopyright.swift */; }; - A55433663AE83E51EB96C54950361247 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37E97FC270E4B8C36C8785FAB7B59D60 /* Foundation.framework */; }; - A66EF2DC60C754AA0122E88914B9F046 /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 620ABF49A5144FE6B77811D9AC91BB8E /* GPXEmail.swift */; }; - AF2651F13B56F5D2916FF5A569D357EF /* TileRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9483D3C4375BB16628D1704C779F80C2 /* TileRange.swift */; }; - B284CAB0650646942C09CCF50DCBB8DD /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4841B29E07C787F40AFFF04B3C1C6B19 /* GPXRoutePoint.swift */; }; - B4672BB887DAAC717AC718283CEC8590 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB8F395AF437FA529C05109A8582CBD /* MD5.swift */; }; - B48DE77C180BCC2AF32970D85D66C2CF /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9707D4AD8EF177D9ACA977AEEF70E011 /* GPXPointSegment.swift */; }; - B60DE171E0ABE3D2A6C67381F19595B9 /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85ED93B5014415CBD8BA0BF730FA2F73 /* GPXTrackPoint.swift */; }; - BC8258058992A57CCAC74F1EF09850F7 /* ZoomRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = E72DF4AF99C8484B904437B95AEA0CFB /* ZoomRange.swift */; }; + 1E5DFEFB3DC77CC15F41E0FECA3F3A31 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */; }; + 25B6302DB6939000B5EF749B59265B1D /* MapCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A2EB3E111AAF694C172E44D777068D8 /* MapCache-dummy.m */; }; + 26A27A1B3AFE785AFEEBF7647A3AA253 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89F414C094DE05C12057B20E10C5CE9E /* Log.swift */; }; + 2B5A89E0874574FF51352ACA145FCA5A /* MapCacheProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEEAAE6861DF69429716546DCB5DD19 /* MapCacheProtocol.swift */; }; + 2C56C05D43748A5652780B10AEE55652 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */; }; + 2D30C313F53F61A3DD4D71D8D9DE5D34 /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */; }; + 3006DA8C4ACEC8B1D7919414BBCC3C7B /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */; }; + 312D9BC80C5E8D0195025E21B13EC222 /* RegionDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C221067826D0447A87CFE92995927F2 /* RegionDownloader.swift */; }; + 35A73DC235D024AE79DE76F9A18DDD09 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */; }; + 412B5E2A93B344EE32D57B8CDCAB736E /* MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC9B244E86B1B9B7C3A82C92B680331 /* MapCache.swift */; }; + 420608CA619361F85C87352B59F99AD9 /* CoreGPX-watchOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C2C91E379F32D690954020D76CCE86B8 /* CoreGPX-watchOS-dummy.m */; }; + 42D0BAB0F4CE1722E881484B1BE3160B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; + 43013E97314F046F1375397503261FAF /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */; }; + 43E08817051E3364B6F2CC24C928F54F /* LoadTileMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC064B24DAF80027DC3257EC4EBB97D9 /* LoadTileMode.swift */; }; + 46226773B5C468E2F7F1375A904FBB06 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */; }; + 49DF2D1EF0E1859867D4867B27D5458F /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */; }; + 4D9CB99D76F28673C665ED494AEE13A9 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */; }; + 5153651B6BE1F467AA82E8FEABE3A127 /* CoreGPX-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B41BF1EF4026DDA7AFE957BA641A0 /* CoreGPX-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5172547C32B319C8E182BE6A3FA94072 /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */; }; + 51F907CB337FB84E6979FF884B56610A /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */; }; + 5376F8C3B3547ECDBE3667EDF3BA5219 /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */; }; + 58FAE43FA4577895A9B7FDE6C268D5F0 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */; }; + 5AA7C37FDCDCBBFB5AECBCB3805F2875 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80821163141F0F8117650C1345828B5 /* GPXError.swift */; }; + 5E3244DCD8570F8B4E79F15703FCE72A /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */; }; + 5EDAAEEA92F9FBC307987C4532579C72 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */; }; + 618B6936A8979FA637CC195B73BFA571 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */; }; + 62FEDFC036FFB09D0439E8E5DBD74DD1 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */; }; + 63762975220A63D72236FF64F84E28E4 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */; }; + 64EB038F5F947A8ED5406BA15DD049FE /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */; }; + 654BF22B5735845268FB11A2F2ACB354 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80821163141F0F8117650C1345828B5 /* GPXError.swift */; }; + 695DE091483BE3D820B51FA13012F775 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */; }; + 6B0E6136E1A46C685E8A7EC9B433A8FB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; + 6DF3C0198357F132325BAE47D50002C0 /* ZoomableTile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 468421C6F7FCD08F0B79F3FEF9604F8B /* ZoomableTile.swift */; }; + 6F634D1BD2438165DDF570613D5469A5 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */; }; + 70EE5EF537DD26C3211215D5615A3932 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */; }; + 741FC84507C11779BA12C56C9C21D80D /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */; }; + 77485EFA0FAF7EBBF5085756212C0FB2 /* MapCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CA7937AC1BC42AE7FAB402479DF51B6F /* MapCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7BE03A30129E4746B0CB56A40EE5642D /* MKTileOverlayPath+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1DF50AD03036FAABFBBC7F4EFF6A31C /* MKTileOverlayPath+MapCache.swift */; }; + 7D29673703BC46418F274CBC5C14A60D /* CoreGPX-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE232748F7B2BA73CE1A3F8B1E74FEE /* CoreGPX-iOS-dummy.m */; }; + 836519803F630D9F093EB968CE6AF589 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */; }; + 871385C4364090FF4EE7222150301D19 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */; }; + 8C302606B27B3F212B51A2A85CDEA8A2 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */; }; + 8C9AE2FC1392CC93678F534D20C705E0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */; }; + 8EAA95CC8C16FE5BE72426E94D45232A /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */; }; + 8F1B8DEAC05D0D3E5D72AD8C22071A00 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */; }; + 8F23CA2CA147503050CFC903BDF497EB /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */; }; + 8FA7EB9DBA0BB5F070061E9B2031701B /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */; }; + 941D993668AA41C37AF7319394107BB1 /* TileCoords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59247885B54F8930AD4F496A77591067 /* TileCoords.swift */; }; + 943F1CCA42130FF576D7E97D0C9BA39C /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */; }; + 97F1DAA08287D0EC866D97A8C4710614 /* String+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7358F0911BADCC9FDA1557086429677B /* String+DiskCache.swift */; }; + 9A3A289384D1E07371494FF3C2AA5D80 /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */; }; + 9B2DF887EAD080B7BD1B4F83339FE4EC /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */; }; + 9C830BA8C8637026C5E9AE501B0C5FCE /* MKMapView+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C8D2D5CC8DAE5FD408E1623ECDBFEC /* MKMapView+MapCache.swift */; }; + 9D4D8710743732371A6CD22F15FF0E11 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */; }; + 9FA12E3DBD8602DF0AE18CA2FBC2748C /* ZoomRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F396FA1CBD4144C467134B8541119C7 /* ZoomRangeIterator.swift */; }; + A0B60561FA2530E2C419FF2FE2959326 /* MapCacheConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D8423EBC93D6201AB2E2C875E229289 /* MapCacheConfig.swift */; }; + A506775F260622154170ABCEF83100D8 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */; }; + A66EF2DC60C754AA0122E88914B9F046 /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */; }; + AF400669D1D3B159A0E17AADDCF4E2AF /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 777D6AC9AD5B1E309E7EFBE542592CAC /* MapKit.framework */; }; + B284CAB0650646942C09CCF50DCBB8DD /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */; }; + B48DE77C180BCC2AF32970D85D66C2CF /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */; }; + B60DE171E0ABE3D2A6C67381F19595B9 /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */; }; C0F242B2CB8ADA68816EAE9A2FAE4112 /* Pods-OpenGpxTracker-Watch Extension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 57A236C1233AC0E09BB8F4F947211E82 /* Pods-OpenGpxTracker-Watch Extension-dummy.m */; }; - C15E6244EB32EE278FD8CC7AAE5E973D /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F3559D4E1B568F69970D2CAC61718EA /* DateTimeParsers.swift */; }; - CA02089B8130465A2308045DF6EDC2C7 /* CoreGPX-watchOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 38D87D08954CB9AD633FB4C339112C79 /* CoreGPX-watchOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CA0CEB8B8BF7770D87A3D2047E6279D8 /* RegionDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEF4E6C5F26FE200D88064B6793D6C5A /* RegionDownloader.swift */; }; - D5763373293E932C5E39E0ECDD7817E2 /* MapCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DCCBF1D2128EA856D99C635FA80FAC37 /* MapCache-dummy.m */; }; - DCCA8F1F66CAA83CD1D88D98B6342067 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C201D8C285A968523E3AAE43B42366 /* GPXMetadata.swift */; }; - E1AE1CA9CB6D2461737600154B826EC5 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFFEBE8A1266620BC10893FC9EA8500 /* GPXPerson.swift */; }; - E1B69E0E1568D6B8DAE8A6E312BD0BB4 /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 432E5952D82C81E738E48D236684E841 /* GPXRoute.swift */; }; - E2D7CA756695D8D6B430C17D9831B792 /* MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABF75C4DB9018B92AE87ACBDDEFC0ACE /* MapCache.swift */; }; + C15E6244EB32EE278FD8CC7AAE5E973D /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */; }; + C302B8A05364F3D5FA39822535CB1C20 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848B05EAE3F3BAAD88AFC7740E0A6C2C /* MD5.swift */; }; + C3CE80F691E604441201151C1542FCBE /* FileManager+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAF6090F534DF134AA7073BD40491CB /* FileManager+DiskCache.swift */; }; + CA02089B8130465A2308045DF6EDC2C7 /* CoreGPX-watchOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 15EED6EB217C84A054B784BB28CF700B /* CoreGPX-watchOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC0CA1CE5F5219D7B9404F4307E650C3 /* CachedTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D929E30D122B203391F76E79F3D451 /* CachedTileOverlay.swift */; }; + D60203A041A730BE3DED9777C9823738 /* TileRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BA57BA400F6937E611771CCF94C05B /* TileRange.swift */; }; + DCCA8F1F66CAA83CD1D88D98B6342067 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */; }; + DD1173A899B9DB47C5EBAFAF41A98888 /* RegionDownloaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5639CE67FF2A8442B101B0C79C5D2C48 /* RegionDownloaderDelegate.swift */; }; + E0E99A03DBBF6D1BA71FED141CFD87D3 /* DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B476B9D1912FD83D07E2C4110C0F17 /* DiskCache.swift */; }; + E1AE1CA9CB6D2461737600154B826EC5 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */; }; + E1B69E0E1568D6B8DAE8A6E312BD0BB4 /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */; }; E67A06D5C12D739DBDAF6DAA699D55AE /* Pods-OpenGpxTracker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BD5E8F43EC1C8559EF6193B14855AE7 /* Pods-OpenGpxTracker-dummy.m */; }; - ED6A6EF4385FCC472AF596F16083DE7F /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2521A32E3DEB73401C8102BBF55F6EB3 /* GPXTrackSegment.swift */; }; - F6262510200AB990D82DA37744C5C284 /* RegionDownloaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278ECBA841B7B42A625D20EAD18CF7AB /* RegionDownloaderDelegate.swift */; }; - F6B4CDE78BCDAC50CC342741CE20500A /* String+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5E9431C3E1717C959BE7B7763716357 /* String+DiskCache.swift */; }; - F8A381DDDA9147EBA1F5600BD815F0D6 /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075290FCBBB2588D91AC2A3BA1768600 /* GPXExtensions.swift */; }; - FD432C8D38CA0E67CD1193C04314EC42 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 338544B97C455AC0CBB46D5E681A50DD /* GPXLink.swift */; }; + E7D461768AF6AF3EE4AA2EFCD3E70AAA /* URL+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506D45752B948FC2F8D878A4C4DCE6E5 /* URL+DiskCache.swift */; }; + ED6A6EF4385FCC472AF596F16083DE7F /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */; }; + EEF09ED996B646FCCAC72AEA941FA2E7 /* TileCoordsRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47D8CDC2B842B73A94F6CF799F3146CB /* TileCoordsRegion.swift */; }; + F37E5D553251C1080C36A9C64ACA219C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; + F8A381DDDA9147EBA1F5600BD815F0D6 /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */; }; + FB2D25D799CD4266890309FB2FE6D99C /* MKZoomScale+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E897F17A3A8D93DF567E358F1D21697E /* MKZoomScale+MapCache.swift */; }; + FD432C8D38CA0E67CD1193C04314EC42 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -124,99 +126,101 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 075290FCBBB2588D91AC2A3BA1768600 /* GPXExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensions.swift; path = Classes/GPXExtensions.swift; sourceTree = ""; }; + 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Converters.swift; path = Classes/Converters.swift; sourceTree = ""; }; + 028480ADA0CFB69206E51736A19F9040 /* CoreGPX-watchOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "CoreGPX-watchOS-Info.plist"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; sourceTree = ""; }; + 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CoreGPX-iOS.xcconfig"; sourceTree = ""; }; 078E5B78D31CEDCC266B51303D291BCB /* Pods-OpenGpxTracker-Watch Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker-Watch Extension.debug.xcconfig"; sourceTree = ""; }; - 09B0E7E80D881072DB518C322C620DCB /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 0FB8F395AF437FA529C05109A8582CBD /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = MapCache/Classes/DiskCache/MD5.swift; sourceTree = ""; }; + 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXParser.swift; path = Classes/GPXParser.swift; sourceTree = ""; }; 115747451E3769DDB80BB07379405375 /* MapCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MapCache.framework; path = MapCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 171C7CC05BA3E5EAB6A26E600908689B /* CoreGPX-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "CoreGPX-iOS.modulemap"; sourceTree = ""; }; + 15EED6EB217C84A054B784BB28CF700B /* CoreGPX-watchOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-umbrella.h"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-umbrella.h"; sourceTree = ""; }; + 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrack.swift; path = Classes/GPXTrack.swift; sourceTree = ""; }; 1BD5E8F43EC1C8559EF6193B14855AE7 /* Pods-OpenGpxTracker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OpenGpxTracker-dummy.m"; sourceTree = ""; }; - 20DC0B72E98A72FDAAA92C5742805A2F /* CoreGPX-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CoreGPX-iOS-dummy.m"; sourceTree = ""; }; - 2521A32E3DEB73401C8102BBF55F6EB3 /* GPXTrackSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackSegment.swift; path = Classes/GPXTrackSegment.swift; sourceTree = ""; }; - 26B9C379D0D00DFEEEB0613DF3545FD9 /* TileCoords.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoords.swift; path = MapCache/Classes/TileCoords.swift; sourceTree = ""; }; - 27333A72D16BC7A61D8D5BD0635B3EB0 /* GPXFix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXFix.swift; path = Classes/GPXFix.swift; sourceTree = ""; }; - 278ECBA841B7B42A625D20EAD18CF7AB /* RegionDownloaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloaderDelegate.swift; path = MapCache/Classes/RegionDownloaderDelegate.swift; sourceTree = ""; }; - 29D49C9C34BAD7C0C873ABB6F1ADAF08 /* CachedTileOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlay.swift; path = MapCache/Classes/CachedTileOverlay.swift; sourceTree = ""; }; - 2C5ACD3F0566369CDB535E1A71596329 /* MapCacheConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheConfig.swift; path = MapCache/Classes/MapCacheConfig.swift; sourceTree = ""; }; - 3023FD085C0CB6B3BE39FD73E5023DDF /* GPXTrack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrack.swift; path = Classes/GPXTrack.swift; sourceTree = ""; }; - 338544B97C455AC0CBB46D5E681A50DD /* GPXLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXLink.swift; path = Classes/GPXLink.swift; sourceTree = ""; }; - 37E97FC270E4B8C36C8785FAB7B59D60 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 3893F715A86769D69295C7E3E6BA9315 /* GPXWaypoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXWaypoint.swift; path = Classes/GPXWaypoint.swift; sourceTree = ""; }; - 38D87D08954CB9AD633FB4C339112C79 /* CoreGPX-watchOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-umbrella.h"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-umbrella.h"; sourceTree = ""; }; - 3BA1A4375577044C4A915EF1FC5F1197 /* MapCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MapCache.modulemap; sourceTree = ""; }; - 3EA6CC0C7D9BDC90D312C1947A630C9E /* MapCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MapCache-Info.plist"; sourceTree = ""; }; + 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXElement.swift; path = Classes/GPXElement.swift; sourceTree = ""; }; + 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXMetadata.swift; path = Classes/GPXMetadata.swift; sourceTree = ""; }; + 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoutePoint.swift; path = Classes/GPXRoutePoint.swift; sourceTree = ""; }; + 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXLink.swift; path = Classes/GPXLink.swift; sourceTree = ""; }; + 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPointSegment.swift; path = Classes/GPXPointSegment.swift; sourceTree = ""; }; + 32C8D2D5CC8DAE5FD408E1623ECDBFEC /* MKMapView+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKMapView+MapCache.swift"; path = "MapCache/Classes/MKMapView+MapCache.swift"; sourceTree = ""; }; + 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoot.swift; path = Classes/GPXRoot.swift; sourceTree = ""; }; + 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MapCache.xcconfig; sourceTree = ""; }; + 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoute.swift; path = Classes/GPXRoute.swift; sourceTree = ""; }; + 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensionsElement.swift; path = Classes/GPXExtensionsElement.swift; sourceTree = ""; }; 3F48E60050E3150BF104D2316FA1C144 /* Pods-OpenGpxTracker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OpenGpxTracker-umbrella.h"; sourceTree = ""; }; - 432E5952D82C81E738E48D236684E841 /* GPXRoute.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoute.swift; path = Classes/GPXRoute.swift; sourceTree = ""; }; - 4841B29E07C787F40AFFF04B3C1C6B19 /* GPXRoutePoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoutePoint.swift; path = Classes/GPXRoutePoint.swift; sourceTree = ""; }; + 3FE232748F7B2BA73CE1A3F8B1E74FEE /* CoreGPX-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CoreGPX-iOS-dummy.m"; sourceTree = ""; }; + 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackSegment.swift; path = Classes/GPXTrackSegment.swift; sourceTree = ""; }; + 468421C6F7FCD08F0B79F3FEF9604F8B /* ZoomableTile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomableTile.swift; path = MapCache/Classes/ZoomableTile.swift; sourceTree = ""; }; + 47D8CDC2B842B73A94F6CF799F3146CB /* TileCoordsRegion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoordsRegion.swift; path = MapCache/Classes/TileCoordsRegion.swift; sourceTree = ""; }; + 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTimeParsers.swift; path = Classes/DateTimeParsers.swift; sourceTree = ""; }; + 4D8423EBC93D6201AB2E2C875E229289 /* MapCacheConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheConfig.swift; path = MapCache/Classes/MapCacheConfig.swift; sourceTree = ""; }; + 506D45752B948FC2F8D878A4C4DCE6E5 /* URL+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+DiskCache.swift"; path = "MapCache/Classes/DiskCache/URL+DiskCache.swift"; sourceTree = ""; }; 5186880E91A7B0727CD5B90A0ACD9B22 /* Pods-OpenGpxTracker-Watch Extension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-Watch Extension-acknowledgements.plist"; sourceTree = ""; }; - 53C88210CE8E7FCAB8640FC827745208 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 5639CE67FF2A8442B101B0C79C5D2C48 /* RegionDownloaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloaderDelegate.swift; path = MapCache/Classes/RegionDownloaderDelegate.swift; sourceTree = ""; }; 57A236C1233AC0E09BB8F4F947211E82 /* Pods-OpenGpxTracker-Watch Extension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OpenGpxTracker-Watch Extension-dummy.m"; sourceTree = ""; }; - 5DADF2A23891D035DBE699F8BAF466FE /* MKMapView+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKMapView+MapCache.swift"; path = "MapCache/Classes/MKMapView+MapCache.swift"; sourceTree = ""; }; - 5F3559D4E1B568F69970D2CAC61718EA /* DateTimeParsers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTimeParsers.swift; path = Classes/DateTimeParsers.swift; sourceTree = ""; }; - 620ABF49A5144FE6B77811D9AC91BB8E /* GPXEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXEmail.swift; path = Classes/GPXEmail.swift; sourceTree = ""; }; - 67D6BA71624E38E7B69D68D62ACA7066 /* CoreGPX-watchOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "CoreGPX-watchOS.xcconfig"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.xcconfig"; sourceTree = ""; }; - 69C0565E9F01D38425F9922DF9D018BE /* MapCacheProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheProtocol.swift; path = MapCache/Classes/MapCacheProtocol.swift; sourceTree = ""; }; - 69EDA2D93FF1BAF905DB34FBA4687373 /* MapCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-prefix.pch"; sourceTree = ""; }; - 6A5AA73FFB148AB134CB60B3387AE63F /* CoreGPX-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CoreGPX-iOS-Info.plist"; sourceTree = ""; }; - 6B7C30D100031985EAB6A564E5ACA038 /* CoreGPX-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-umbrella.h"; sourceTree = ""; }; - 6C502364799695EAEDC4756E9D5A1205 /* URL+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+DiskCache.swift"; path = "MapCache/Classes/DiskCache/URL+DiskCache.swift"; sourceTree = ""; }; + 59247885B54F8930AD4F496A77591067 /* TileCoords.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoords.swift; path = MapCache/Classes/TileCoords.swift; sourceTree = ""; }; + 5A2EB3E111AAF694C172E44D777068D8 /* MapCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MapCache-dummy.m"; sourceTree = ""; }; + 5B5085D8B7976F2A72B7BFD97CBE25D2 /* MapCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-prefix.pch"; sourceTree = ""; }; + 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPerson.swift; path = Classes/GPXPerson.swift; sourceTree = ""; }; + 648D9012B748837AAE9FAF083A111C18 /* MapCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MapCache-Info.plist"; sourceTree = ""; }; + 65B4BAD4E12A8C423C1F521177B2BB6C /* ZoomRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRange.swift; path = MapCache/Classes/ZoomRange.swift; sourceTree = ""; }; + 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensions.swift; path = Classes/GPXExtensions.swift; sourceTree = ""; }; + 67B476B9D1912FD83D07E2C4110C0F17 /* DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskCache.swift; path = MapCache/Classes/DiskCache/DiskCache.swift; sourceTree = ""; }; 6DD862570929D701173800FC5B8781CF /* Pods-OpenGpxTracker-Watch Extension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-OpenGpxTracker-Watch Extension.modulemap"; sourceTree = ""; }; - 6E9EA5512495BCA472290FF6FA3E6C1A /* GPXExtensionsElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensionsElement.swift; path = Classes/GPXExtensionsElement.swift; sourceTree = ""; }; + 6E35B5FC97B0568CF89238C96D8567A6 /* MapCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MapCache.modulemap; sourceTree = ""; }; + 6F396FA1CBD4144C467134B8541119C7 /* ZoomRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRangeIterator.swift; path = MapCache/Classes/ZoomRangeIterator.swift; sourceTree = ""; }; + 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackPoint.swift; path = Classes/GPXTrackPoint.swift; sourceTree = ""; }; + 7358F0911BADCC9FDA1557086429677B /* String+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+DiskCache.swift"; path = "MapCache/Classes/DiskCache/String+DiskCache.swift"; sourceTree = ""; }; 73E097AB8D67061734EC7A63ABBF2E20 /* CoreGPX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CoreGPX.framework; path = "CoreGPX-watchOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXEmail.swift; path = Classes/GPXEmail.swift; sourceTree = ""; }; + 777D6AC9AD5B1E309E7EFBE542592CAC /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; + 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRawElement.swift; path = Classes/GPXRawElement.swift; sourceTree = ""; }; 7882EE95967EA16611254BD23321635B /* Pods-OpenGpxTracker-Watch Extension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-Watch Extension-Info.plist"; sourceTree = ""; }; - 79195CD91E40D944B12F0DD9F7D8F5B0 /* MapCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MapCache.xcconfig; sourceTree = ""; }; 797EEC4171ED3C5633DA28C7D3F4502D /* Pods-OpenGpxTracker-Watch Extension-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-OpenGpxTracker-Watch Extension-frameworks.sh"; sourceTree = ""; }; - 7B40AEE8EEBC209AD4583EED9C390CCB /* GPXRoot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoot.swift; path = Classes/GPXRoot.swift; sourceTree = ""; }; - 8189C2486B67082E7A39BD1365AA3B1F /* GPXPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPoint.swift; path = Classes/GPXPoint.swift; sourceTree = ""; }; - 85ED93B5014415CBD8BA0BF730FA2F73 /* GPXTrackPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackPoint.swift; path = Classes/GPXTrackPoint.swift; sourceTree = ""; }; - 890CAEB1E3B05707CDDC56F3AFD86A4F /* CoreGPX-watchOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "CoreGPX-watchOS-Info.plist"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; sourceTree = ""; }; - 8D8D1DED1F005B37B8B7EA7EEA506150 /* GPXCopyright.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCopyright.swift; path = Classes/GPXCopyright.swift; sourceTree = ""; }; - 925C0B72AB03AB9C805CF1053CF7E060 /* ZoomRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRangeIterator.swift; path = MapCache/Classes/ZoomRangeIterator.swift; sourceTree = ""; }; - 9483D3C4375BB16628D1704C779F80C2 /* TileRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRange.swift; path = MapCache/Classes/TileRange.swift; sourceTree = ""; }; - 96493AD08B5873D1870B217469227614 /* CoreGPX-iOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CoreGPX-iOS.xcconfig"; sourceTree = ""; }; - 9707D4AD8EF177D9ACA977AEEF70E011 /* GPXPointSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPointSegment.swift; path = Classes/GPXPointSegment.swift; sourceTree = ""; }; - 975293F9C701550B15C6C9F23744FAE5 /* CoreGPX-watchOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CoreGPX-watchOS-dummy.m"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-dummy.m"; sourceTree = ""; }; - 9CCFFA343FBFC8B45C36D6E700340DDB /* MapCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-umbrella.h"; sourceTree = ""; }; + 7BAF6090F534DF134AA7073BD40491CB /* FileManager+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+DiskCache.swift"; path = "MapCache/Classes/DiskCache/FileManager+DiskCache.swift"; sourceTree = ""; }; + 7C3C3A0ABE34802BDF74DE131470E238 /* CoreGPX-watchOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-prefix.pch"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; sourceTree = ""; }; + 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCopyright.swift; path = Classes/GPXCopyright.swift; sourceTree = ""; }; + 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 848B05EAE3F3BAAD88AFC7740E0A6C2C /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = MapCache/Classes/DiskCache/MD5.swift; sourceTree = ""; }; + 89F414C094DE05C12057B20E10C5CE9E /* Log.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Log.swift; path = MapCache/Classes/Log.swift; sourceTree = ""; }; + 8B2AFE1856369898D29D7DD5B9A1068A /* CachedTileOverlayRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlayRenderer.swift; path = MapCache/Classes/CachedTileOverlayRenderer.swift; sourceTree = ""; }; + 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPoint.swift; path = Classes/GPXPoint.swift; sourceTree = ""; }; + 9C221067826D0447A87CFE92995927F2 /* RegionDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloader.swift; path = MapCache/Classes/RegionDownloader.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E44C569958F1BDC20289894B250A5F7 /* GPXError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXError.swift; path = Classes/GPXError.swift; sourceTree = ""; }; + 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXBounds.swift; path = Classes/GPXBounds.swift; sourceTree = ""; }; + 9EEEAAE6861DF69429716546DCB5DD19 /* MapCacheProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheProtocol.swift; path = MapCache/Classes/MapCacheProtocol.swift; sourceTree = ""; }; + A1DF50AD03036FAABFBBC7F4EFF6A31C /* MKTileOverlayPath+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKTileOverlayPath+MapCache.swift"; path = "MapCache/Classes/MKTileOverlayPath+MapCache.swift"; sourceTree = ""; }; A2E63597C890C9957E7BE7DC463D9F45 /* Pods-OpenGpxTracker-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-OpenGpxTracker-acknowledgements.markdown"; sourceTree = ""; }; - A3AE7048F08D2F64AF651CC94245094C /* CoreGPX-watchOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "CoreGPX-watchOS.modulemap"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; sourceTree = ""; }; - A515C4676C00644B188BF9A8A3B5E85C /* GPXAuthor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXAuthor.swift; path = Classes/GPXAuthor.swift; sourceTree = ""; }; A68164FEC7AC344ECCFCE91085E5426A /* Pods-OpenGpxTracker-Watch Extension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-OpenGpxTracker-Watch Extension-acknowledgements.markdown"; sourceTree = ""; }; - A86961A90D89F5B9066FF63CCCE526E8 /* CoreGPX-watchOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-prefix.pch"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; sourceTree = ""; }; - AA7A862EA393B749AE348C487F44F413 /* DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskCache.swift; path = MapCache/Classes/DiskCache/DiskCache.swift; sourceTree = ""; }; - ABF75C4DB9018B92AE87ACBDDEFC0ACE /* MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCache.swift; path = MapCache/Classes/MapCache.swift; sourceTree = ""; }; + A80821163141F0F8117650C1345828B5 /* GPXError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXError.swift; path = Classes/GPXError.swift; sourceTree = ""; }; ACC647A22F623093983DA656039BCC39 /* Pods-OpenGpxTracker-Watch Extension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OpenGpxTracker-Watch Extension-umbrella.h"; sourceTree = ""; }; + AEC9B244E86B1B9B7C3A82C92B680331 /* MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCache.swift; path = MapCache/Classes/MapCache.swift; sourceTree = ""; }; + AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "CoreGPX-watchOS.xcconfig"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.xcconfig"; sourceTree = ""; }; B18FC1D6D85686B9480155EEDEC49DA1 /* Pods-OpenGpxTracker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker.debug.xcconfig"; sourceTree = ""; }; + B69D2F031C2DD6F9887624CF0347BD51 /* CoreGPX-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "CoreGPX-iOS.modulemap"; sourceTree = ""; }; + B927F65DA1019B281FB628C7320274F0 /* CoreGPX-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-prefix.pch"; sourceTree = ""; }; BB28532C209E3063F9373DFB929A840D /* Pods_OpenGpxTracker.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_OpenGpxTracker.framework; path = "Pods-OpenGpxTracker.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - BEF4E6C5F26FE200D88064B6793D6C5A /* RegionDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloader.swift; path = MapCache/Classes/RegionDownloader.swift; sourceTree = ""; }; - C2711AB617B58FCD305DCF40EFFE6AAF /* GPXRawElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRawElement.swift; path = Classes/GPXRawElement.swift; sourceTree = ""; }; - C2801BD0ED9724E4929695898DF9416E /* Converters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Converters.swift; path = Classes/Converters.swift; sourceTree = ""; }; - C5618810E26374AB0477FFB0209B71C4 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; + BC064B24DAF80027DC3257EC4EBB97D9 /* LoadTileMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadTileMode.swift; path = MapCache/Classes/LoadTileMode.swift; sourceTree = ""; }; + BF0B41BF1EF4026DDA7AFE957BA641A0 /* CoreGPX-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-umbrella.h"; sourceTree = ""; }; + C2C91E379F32D690954020D76CCE86B8 /* CoreGPX-watchOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CoreGPX-watchOS-dummy.m"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-dummy.m"; sourceTree = ""; }; + C2F0B8F9C22D2E7D0D313C7AC102022F /* CoreGPX-watchOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "CoreGPX-watchOS.modulemap"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; sourceTree = ""; }; + C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSMutableString+XML.swift"; path = "Classes/NSMutableString+XML.swift"; sourceTree = ""; }; C5C1D4A56AD0F3360E927F474B255D47 /* Pods-OpenGpxTracker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker.release.xcconfig"; sourceTree = ""; }; + C9D929E30D122B203391F76E79F3D451 /* CachedTileOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlay.swift; path = MapCache/Classes/CachedTileOverlay.swift; sourceTree = ""; }; + CA7937AC1BC42AE7FAB402479DF51B6F /* MapCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-umbrella.h"; sourceTree = ""; }; CFF13F6F7F8932222CD5F2B41321A72F /* Pods-OpenGpxTracker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-OpenGpxTracker.modulemap"; sourceTree = ""; }; D1F6F978401AA9203C0068794566FB46 /* Pods-OpenGpxTracker-Watch Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker-Watch Extension.release.xcconfig"; sourceTree = ""; }; - D3E0E841ED4EC506A4C54A932F4D45D3 /* NSMutableString+XML.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSMutableString+XML.swift"; path = "Classes/NSMutableString+XML.swift"; sourceTree = ""; }; + D2BA57BA400F6937E611771CCF94C05B /* TileRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRange.swift; path = MapCache/Classes/TileRange.swift; sourceTree = ""; }; + D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXFix.swift; path = Classes/GPXFix.swift; sourceTree = ""; }; D5AB2CCD36447D3D914BCD88DF72C30B /* Pods-OpenGpxTracker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-Info.plist"; sourceTree = ""; }; - DCCBF1D2128EA856D99C635FA80FAC37 /* MapCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MapCache-dummy.m"; sourceTree = ""; }; - DCCEACE398B8C0966093DAE99152A1FE /* FileManager+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+DiskCache.swift"; path = "MapCache/Classes/DiskCache/FileManager+DiskCache.swift"; sourceTree = ""; }; + D67FB075DEA05080400263F50BEF253C /* TileRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRangeIterator.swift; path = MapCache/Classes/TileRangeIterator.swift; sourceTree = ""; }; E2743C4C98C8F0EEEB54228B67543388 /* Pods-OpenGpxTracker-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-acknowledgements.plist"; sourceTree = ""; }; - E59CE3751DA14E624409E1C6A754F9DD /* ReplaceMe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaceMe.swift; path = MapCache/Classes/ReplaceMe.swift; sourceTree = ""; }; E5A52280BF76FE36D8C9028535627888 /* Pods-OpenGpxTracker-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-OpenGpxTracker-frameworks.sh"; sourceTree = ""; }; - E5E9431C3E1717C959BE7B7763716357 /* String+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+DiskCache.swift"; path = "MapCache/Classes/DiskCache/String+DiskCache.swift"; sourceTree = ""; }; - E72DF4AF99C8484B904437B95AEA0CFB /* ZoomRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRange.swift; path = MapCache/Classes/ZoomRange.swift; sourceTree = ""; }; - E8BDDB8B7F4537AEFDE2BC0AD67F0E5B /* CoreGPX-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-prefix.pch"; sourceTree = ""; }; - E8F88DAD4BA9E938DB642C8DF2C7A730 /* TileCoordsRegion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoordsRegion.swift; path = MapCache/Classes/TileCoordsRegion.swift; sourceTree = ""; }; + E7AF5A757CA353CB80FF808CD858DB06 /* CoreGPX-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CoreGPX-iOS-Info.plist"; sourceTree = ""; }; + E897F17A3A8D93DF567E358F1D21697E /* MKZoomScale+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKZoomScale+MapCache.swift"; path = "MapCache/Classes/MKZoomScale+MapCache.swift"; sourceTree = ""; }; E9C30547DF968C73398DDA33A4BBDFB3 /* CoreGPX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CoreGPX.framework; path = "CoreGPX-iOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - EBFFEBE8A1266620BC10893FC9EA8500 /* GPXPerson.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPerson.swift; path = Classes/GPXPerson.swift; sourceTree = ""; }; - EF98BD3AFEB124A15D75336F9884B498 /* Log.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Log.swift; path = MapCache/Classes/Log.swift; sourceTree = ""; }; - EFF24FEE85921ED98A1E05D2F851ADAA /* GPXElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXElement.swift; path = Classes/GPXElement.swift; sourceTree = ""; }; + EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXAuthor.swift; path = Classes/GPXAuthor.swift; sourceTree = ""; }; F0FF0F6580378BD21A07C3AFAA1FFFA0 /* Pods_OpenGpxTracker_Watch_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_OpenGpxTracker_Watch_Extension.framework; path = "Pods-OpenGpxTracker-Watch Extension.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - F143442C924D8CFBDE83CD8D796862E5 /* MKTileOverlayPath+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKTileOverlayPath+MapCache.swift"; path = "MapCache/Classes/MKTileOverlayPath+MapCache.swift"; sourceTree = ""; }; - F320F5409E87EB5BC5E1AA94302BAE23 /* GPXBounds.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXBounds.swift; path = Classes/GPXBounds.swift; sourceTree = ""; }; - F925E102F6CE02BEC92A655A753E884F /* GPXParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXParser.swift; path = Classes/GPXParser.swift; sourceTree = ""; }; - F9C201D8C285A968523E3AAE43B42366 /* GPXMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXMetadata.swift; path = Classes/GPXMetadata.swift; sourceTree = ""; }; - FE064037540B14A8E118809F82543C4C /* TileRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRangeIterator.swift; path = MapCache/Classes/TileRangeIterator.swift; sourceTree = ""; }; + FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXWaypoint.swift; path = Classes/GPXWaypoint.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -236,21 +240,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3EA64315E5EB0CD69C8F937119DDBC02 /* Frameworks */ = { + 8CC81CC3D830FF4BB0C98F0CDD1EB074 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A55433663AE83E51EB96C54950361247 /* Foundation.framework in Frameworks */, - 1B4F048FF9AAF1741501A7E0ABDFB7D8 /* MapKit.framework in Frameworks */, - 13791F91C39F408FDD0DC652B1D7CADE /* UIKit.framework in Frameworks */, + 6B0E6136E1A46C685E8A7EC9B433A8FB /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8CC81CC3D830FF4BB0C98F0CDD1EB074 /* Frameworks */ = { + A7CFDE07CFAC9DF29E57AA54350FA102 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6B0E6136E1A46C685E8A7EC9B433A8FB /* Foundation.framework in Frameworks */, + F37E5D553251C1080C36A9C64ACA219C /* Foundation.framework in Frameworks */, + AF400669D1D3B159A0E17AADDCF4E2AF /* MapKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -265,6 +268,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 002FC2840F803E54F3467DE9608342BB /* Frameworks */ = { + isa = PBXGroup; + children = ( + 44EEE5A81684442C022C7DA5065B2D6B /* iOS */, + D608852FF902E3CD7A04345C3B976189 /* watchOS */, + ); + name = Frameworks; + sourceTree = ""; + }; 10BAB8A7894F634629C3D5D731E26E72 /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -286,71 +298,27 @@ name = Products; sourceTree = ""; }; - 2089253EFEF81175BEB8BD7DB47A231A /* Support Files */ = { - isa = PBXGroup; - children = ( - 171C7CC05BA3E5EAB6A26E600908689B /* CoreGPX-iOS.modulemap */, - 96493AD08B5873D1870B217469227614 /* CoreGPX-iOS.xcconfig */, - 20DC0B72E98A72FDAAA92C5742805A2F /* CoreGPX-iOS-dummy.m */, - 6A5AA73FFB148AB134CB60B3387AE63F /* CoreGPX-iOS-Info.plist */, - E8BDDB8B7F4537AEFDE2BC0AD67F0E5B /* CoreGPX-iOS-prefix.pch */, - 6B7C30D100031985EAB6A564E5ACA038 /* CoreGPX-iOS-umbrella.h */, - A3AE7048F08D2F64AF651CC94245094C /* CoreGPX-watchOS.modulemap */, - 67D6BA71624E38E7B69D68D62ACA7066 /* CoreGPX-watchOS.xcconfig */, - 975293F9C701550B15C6C9F23744FAE5 /* CoreGPX-watchOS-dummy.m */, - 890CAEB1E3B05707CDDC56F3AFD86A4F /* CoreGPX-watchOS-Info.plist */, - A86961A90D89F5B9066FF63CCCE526E8 /* CoreGPX-watchOS-prefix.pch */, - 38D87D08954CB9AD633FB4C339112C79 /* CoreGPX-watchOS-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/CoreGPX-iOS"; - sourceTree = ""; - }; - 25B553403BBD4EEF4B3150C900C0B8AB /* watchOS */ = { - isa = PBXGroup; - children = ( - 53C88210CE8E7FCAB8640FC827745208 /* Foundation.framework */, - ); - name = watchOS; - sourceTree = ""; - }; - 269AEE0DC2F16DC2EE478F99C61630C9 /* MapCache */ = { + 44EEE5A81684442C022C7DA5065B2D6B /* iOS */ = { isa = PBXGroup; children = ( - 29D49C9C34BAD7C0C873ABB6F1ADAF08 /* CachedTileOverlay.swift */, - AA7A862EA393B749AE348C487F44F413 /* DiskCache.swift */, - DCCEACE398B8C0966093DAE99152A1FE /* FileManager+DiskCache.swift */, - EF98BD3AFEB124A15D75336F9884B498 /* Log.swift */, - ABF75C4DB9018B92AE87ACBDDEFC0ACE /* MapCache.swift */, - 2C5ACD3F0566369CDB535E1A71596329 /* MapCacheConfig.swift */, - 69C0565E9F01D38425F9922DF9D018BE /* MapCacheProtocol.swift */, - 0FB8F395AF437FA529C05109A8582CBD /* MD5.swift */, - 5DADF2A23891D035DBE699F8BAF466FE /* MKMapView+MapCache.swift */, - F143442C924D8CFBDE83CD8D796862E5 /* MKTileOverlayPath+MapCache.swift */, - BEF4E6C5F26FE200D88064B6793D6C5A /* RegionDownloader.swift */, - 278ECBA841B7B42A625D20EAD18CF7AB /* RegionDownloaderDelegate.swift */, - E59CE3751DA14E624409E1C6A754F9DD /* ReplaceMe.swift */, - E5E9431C3E1717C959BE7B7763716357 /* String+DiskCache.swift */, - 26B9C379D0D00DFEEEB0613DF3545FD9 /* TileCoords.swift */, - E8F88DAD4BA9E938DB642C8DF2C7A730 /* TileCoordsRegion.swift */, - 9483D3C4375BB16628D1704C779F80C2 /* TileRange.swift */, - FE064037540B14A8E118809F82543C4C /* TileRangeIterator.swift */, - 6C502364799695EAEDC4756E9D5A1205 /* URL+DiskCache.swift */, - E72DF4AF99C8484B904437B95AEA0CFB /* ZoomRange.swift */, - 925C0B72AB03AB9C805CF1053CF7E060 /* ZoomRangeIterator.swift */, - A7F2A423A3223827F8D6ECBA2CC2A93E /* Support Files */, + 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */, + 777D6AC9AD5B1E309E7EFBE542592CAC /* MapKit.framework */, ); - name = MapCache; - path = MapCache; + name = iOS; sourceTree = ""; }; - 5F552BA8C0B6FFE90D708008E949D996 /* Pods */ = { + 4FF1A62C1F86DD95501EA84A61457BA0 /* Support Files */ = { isa = PBXGroup; children = ( - 739EDF7C7E784A042967F2563681EB2F /* CoreGPX */, - 269AEE0DC2F16DC2EE478F99C61630C9 /* MapCache */, + 6E35B5FC97B0568CF89238C96D8567A6 /* MapCache.modulemap */, + 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */, + 5A2EB3E111AAF694C172E44D777068D8 /* MapCache-dummy.m */, + 648D9012B748837AAE9FAF083A111C18 /* MapCache-Info.plist */, + 5B5085D8B7976F2A72B7BFD97CBE25D2 /* MapCache-prefix.pch */, + CA7937AC1BC42AE7FAB402479DF51B6F /* MapCache-umbrella.h */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/MapCache"; sourceTree = ""; }; 69AD0D65D9C064ADA517276C9233866F /* Pods-OpenGpxTracker-Watch Extension */ = { @@ -370,85 +338,122 @@ path = "Target Support Files/Pods-OpenGpxTracker-Watch Extension"; sourceTree = ""; }; - 739EDF7C7E784A042967F2563681EB2F /* CoreGPX */ = { + 99610597C5CA682DD838583D2757816D /* CoreGPX */ = { isa = PBXGroup; children = ( - C2801BD0ED9724E4929695898DF9416E /* Converters.swift */, - 5F3559D4E1B568F69970D2CAC61718EA /* DateTimeParsers.swift */, - A515C4676C00644B188BF9A8A3B5E85C /* GPXAuthor.swift */, - F320F5409E87EB5BC5E1AA94302BAE23 /* GPXBounds.swift */, - 8D8D1DED1F005B37B8B7EA7EEA506150 /* GPXCopyright.swift */, - EFF24FEE85921ED98A1E05D2F851ADAA /* GPXElement.swift */, - 620ABF49A5144FE6B77811D9AC91BB8E /* GPXEmail.swift */, - 9E44C569958F1BDC20289894B250A5F7 /* GPXError.swift */, - 075290FCBBB2588D91AC2A3BA1768600 /* GPXExtensions.swift */, - 6E9EA5512495BCA472290FF6FA3E6C1A /* GPXExtensionsElement.swift */, - 27333A72D16BC7A61D8D5BD0635B3EB0 /* GPXFix.swift */, - 338544B97C455AC0CBB46D5E681A50DD /* GPXLink.swift */, - F9C201D8C285A968523E3AAE43B42366 /* GPXMetadata.swift */, - F925E102F6CE02BEC92A655A753E884F /* GPXParser.swift */, - EBFFEBE8A1266620BC10893FC9EA8500 /* GPXPerson.swift */, - 8189C2486B67082E7A39BD1365AA3B1F /* GPXPoint.swift */, - 9707D4AD8EF177D9ACA977AEEF70E011 /* GPXPointSegment.swift */, - C2711AB617B58FCD305DCF40EFFE6AAF /* GPXRawElement.swift */, - 7B40AEE8EEBC209AD4583EED9C390CCB /* GPXRoot.swift */, - 432E5952D82C81E738E48D236684E841 /* GPXRoute.swift */, - 4841B29E07C787F40AFFF04B3C1C6B19 /* GPXRoutePoint.swift */, - 3023FD085C0CB6B3BE39FD73E5023DDF /* GPXTrack.swift */, - 85ED93B5014415CBD8BA0BF730FA2F73 /* GPXTrackPoint.swift */, - 2521A32E3DEB73401C8102BBF55F6EB3 /* GPXTrackSegment.swift */, - 3893F715A86769D69295C7E3E6BA9315 /* GPXWaypoint.swift */, - D3E0E841ED4EC506A4C54A932F4D45D3 /* NSMutableString+XML.swift */, - 2089253EFEF81175BEB8BD7DB47A231A /* Support Files */, + 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */, + 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */, + EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */, + 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */, + 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */, + 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */, + 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */, + A80821163141F0F8117650C1345828B5 /* GPXError.swift */, + 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */, + 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */, + D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */, + 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */, + 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */, + 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */, + 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */, + 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */, + 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */, + 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */, + 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */, + 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */, + 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */, + 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */, + 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */, + 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */, + FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */, + C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */, + A15C81CC7BC7F8259B1159211955821F /* Support Files */, ); name = CoreGPX; path = CoreGPX; sourceTree = ""; }; - 84830FBDF4734B88BE1421E325255033 /* iOS */ = { + A15C81CC7BC7F8259B1159211955821F /* Support Files */ = { isa = PBXGroup; children = ( - 37E97FC270E4B8C36C8785FAB7B59D60 /* Foundation.framework */, - C5618810E26374AB0477FFB0209B71C4 /* MapKit.framework */, - 09B0E7E80D881072DB518C322C620DCB /* UIKit.framework */, + B69D2F031C2DD6F9887624CF0347BD51 /* CoreGPX-iOS.modulemap */, + 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */, + 3FE232748F7B2BA73CE1A3F8B1E74FEE /* CoreGPX-iOS-dummy.m */, + E7AF5A757CA353CB80FF808CD858DB06 /* CoreGPX-iOS-Info.plist */, + B927F65DA1019B281FB628C7320274F0 /* CoreGPX-iOS-prefix.pch */, + BF0B41BF1EF4026DDA7AFE957BA641A0 /* CoreGPX-iOS-umbrella.h */, + C2F0B8F9C22D2E7D0D313C7AC102022F /* CoreGPX-watchOS.modulemap */, + AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */, + C2C91E379F32D690954020D76CCE86B8 /* CoreGPX-watchOS-dummy.m */, + 028480ADA0CFB69206E51736A19F9040 /* CoreGPX-watchOS-Info.plist */, + 7C3C3A0ABE34802BDF74DE131470E238 /* CoreGPX-watchOS-prefix.pch */, + 15EED6EB217C84A054B784BB28CF700B /* CoreGPX-watchOS-umbrella.h */, ); - name = iOS; + name = "Support Files"; + path = "../Target Support Files/CoreGPX-iOS"; sourceTree = ""; }; - A7F2A423A3223827F8D6ECBA2CC2A93E /* Support Files */ = { + AFFB3AD9C2AE50CFE9C67E4869730C79 /* Pods */ = { isa = PBXGroup; children = ( - 3BA1A4375577044C4A915EF1FC5F1197 /* MapCache.modulemap */, - 79195CD91E40D944B12F0DD9F7D8F5B0 /* MapCache.xcconfig */, - DCCBF1D2128EA856D99C635FA80FAC37 /* MapCache-dummy.m */, - 3EA6CC0C7D9BDC90D312C1947A630C9E /* MapCache-Info.plist */, - 69EDA2D93FF1BAF905DB34FBA4687373 /* MapCache-prefix.pch */, - 9CCFFA343FBFC8B45C36D6E700340DDB /* MapCache-umbrella.h */, + 99610597C5CA682DD838583D2757816D /* CoreGPX */, + CB8EF991DE62863D8CF24A496AB755B9 /* MapCache */, ); - name = "Support Files"; - path = "../Target Support Files/MapCache"; + name = Pods; sourceTree = ""; }; - BFC9A8986ED351F9B00BE7521FE1A3E8 /* Frameworks */ = { + CB8EF991DE62863D8CF24A496AB755B9 /* MapCache */ = { isa = PBXGroup; children = ( - 84830FBDF4734B88BE1421E325255033 /* iOS */, - 25B553403BBD4EEF4B3150C900C0B8AB /* watchOS */, + C9D929E30D122B203391F76E79F3D451 /* CachedTileOverlay.swift */, + 8B2AFE1856369898D29D7DD5B9A1068A /* CachedTileOverlayRenderer.swift */, + 67B476B9D1912FD83D07E2C4110C0F17 /* DiskCache.swift */, + 7BAF6090F534DF134AA7073BD40491CB /* FileManager+DiskCache.swift */, + BC064B24DAF80027DC3257EC4EBB97D9 /* LoadTileMode.swift */, + 89F414C094DE05C12057B20E10C5CE9E /* Log.swift */, + AEC9B244E86B1B9B7C3A82C92B680331 /* MapCache.swift */, + 4D8423EBC93D6201AB2E2C875E229289 /* MapCacheConfig.swift */, + 9EEEAAE6861DF69429716546DCB5DD19 /* MapCacheProtocol.swift */, + 848B05EAE3F3BAAD88AFC7740E0A6C2C /* MD5.swift */, + 32C8D2D5CC8DAE5FD408E1623ECDBFEC /* MKMapView+MapCache.swift */, + A1DF50AD03036FAABFBBC7F4EFF6A31C /* MKTileOverlayPath+MapCache.swift */, + E897F17A3A8D93DF567E358F1D21697E /* MKZoomScale+MapCache.swift */, + 9C221067826D0447A87CFE92995927F2 /* RegionDownloader.swift */, + 5639CE67FF2A8442B101B0C79C5D2C48 /* RegionDownloaderDelegate.swift */, + 7358F0911BADCC9FDA1557086429677B /* String+DiskCache.swift */, + 59247885B54F8930AD4F496A77591067 /* TileCoords.swift */, + 47D8CDC2B842B73A94F6CF799F3146CB /* TileCoordsRegion.swift */, + D2BA57BA400F6937E611771CCF94C05B /* TileRange.swift */, + D67FB075DEA05080400263F50BEF253C /* TileRangeIterator.swift */, + 506D45752B948FC2F8D878A4C4DCE6E5 /* URL+DiskCache.swift */, + 468421C6F7FCD08F0B79F3FEF9604F8B /* ZoomableTile.swift */, + 65B4BAD4E12A8C423C1F521177B2BB6C /* ZoomRange.swift */, + 6F396FA1CBD4144C467134B8541119C7 /* ZoomRangeIterator.swift */, + 4FF1A62C1F86DD95501EA84A61457BA0 /* Support Files */, ); - name = Frameworks; + name = MapCache; + path = MapCache; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - BFC9A8986ED351F9B00BE7521FE1A3E8 /* Frameworks */, - 5F552BA8C0B6FFE90D708008E949D996 /* Pods */, + 002FC2840F803E54F3467DE9608342BB /* Frameworks */, + AFFB3AD9C2AE50CFE9C67E4869730C79 /* Pods */, 1BB3EDF6BEBFEFDD929CFBA635912B7A /* Products */, 10BAB8A7894F634629C3D5D731E26E72 /* Targets Support Files */, ); sourceTree = ""; }; + D608852FF902E3CD7A04345C3B976189 /* watchOS */ = { + isa = PBXGroup; + children = ( + 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */, + ); + name = watchOS; + sourceTree = ""; + }; F7FF33953E2DCD1125050F2F5F7DF931 /* Pods-OpenGpxTracker */ = { isa = PBXGroup; children = ( @@ -469,19 +474,19 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 1E02EB737F98B5603A1E1116B442E692 /* Headers */ = { + 2A7B4113D0E9DD88F259D82AEBFD53A6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 878F0474D84D790D1268F9AC54B51E53 /* MapCache-umbrella.h in Headers */, + 1563F52C4589BEAE34FDFA4FD8AD4558 /* Pods-OpenGpxTracker-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2A7B4113D0E9DD88F259D82AEBFD53A6 /* Headers */ = { + 54B3AC7F569025F4BEE5F3D8A8D19011 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1563F52C4589BEAE34FDFA4FD8AD4558 /* Pods-OpenGpxTracker-umbrella.h in Headers */, + 77485EFA0FAF7EBBF5085756212C0FB2 /* MapCache-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -569,12 +574,12 @@ }; D26394E74B3D99783EE42885C06E286A /* MapCache */ = { isa = PBXNativeTarget; - buildConfigurationList = 243B31D03F19B8A1D875D1E7FB12AEE3 /* Build configuration list for PBXNativeTarget "MapCache" */; + buildConfigurationList = 272115438C930133EF435FEDE8D36127 /* Build configuration list for PBXNativeTarget "MapCache" */; buildPhases = ( - 1E02EB737F98B5603A1E1116B442E692 /* Headers */, - 988C86E7562B7A1291127DA948764063 /* Sources */, - 3EA64315E5EB0CD69C8F937119DDBC02 /* Frameworks */, - 63E180BFD732553B8F2FB89A230C7AC5 /* Resources */, + 54B3AC7F569025F4BEE5F3D8A8D19011 /* Headers */, + 078BBDC2C1218BE0503BDCB76EC5081B /* Sources */, + A7CFDE07CFAC9DF29E57AA54350FA102 /* Frameworks */, + 5A39DA49F15B54AD3CFA24C03D3B9D01 /* Resources */, ); buildRules = ( ); @@ -650,7 +655,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 63E180BFD732553B8F2FB89A230C7AC5 /* Resources */ = { + 5A39DA49F15B54AD3CFA24C03D3B9D01 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -674,6 +679,38 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 078BBDC2C1218BE0503BDCB76EC5081B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CC0CA1CE5F5219D7B9404F4307E650C3 /* CachedTileOverlay.swift in Sources */, + 041CD9B69E76FB24E8F8DA7E4DF83256 /* CachedTileOverlayRenderer.swift in Sources */, + E0E99A03DBBF6D1BA71FED141CFD87D3 /* DiskCache.swift in Sources */, + C3CE80F691E604441201151C1542FCBE /* FileManager+DiskCache.swift in Sources */, + 43E08817051E3364B6F2CC24C928F54F /* LoadTileMode.swift in Sources */, + 26A27A1B3AFE785AFEEBF7647A3AA253 /* Log.swift in Sources */, + 25B6302DB6939000B5EF749B59265B1D /* MapCache-dummy.m in Sources */, + 412B5E2A93B344EE32D57B8CDCAB736E /* MapCache.swift in Sources */, + A0B60561FA2530E2C419FF2FE2959326 /* MapCacheConfig.swift in Sources */, + 2B5A89E0874574FF51352ACA145FCA5A /* MapCacheProtocol.swift in Sources */, + C302B8A05364F3D5FA39822535CB1C20 /* MD5.swift in Sources */, + 9C830BA8C8637026C5E9AE501B0C5FCE /* MKMapView+MapCache.swift in Sources */, + 7BE03A30129E4746B0CB56A40EE5642D /* MKTileOverlayPath+MapCache.swift in Sources */, + FB2D25D799CD4266890309FB2FE6D99C /* MKZoomScale+MapCache.swift in Sources */, + 312D9BC80C5E8D0195025E21B13EC222 /* RegionDownloader.swift in Sources */, + DD1173A899B9DB47C5EBAFAF41A98888 /* RegionDownloaderDelegate.swift in Sources */, + 97F1DAA08287D0EC866D97A8C4710614 /* String+DiskCache.swift in Sources */, + 941D993668AA41C37AF7319394107BB1 /* TileCoords.swift in Sources */, + EEF09ED996B646FCCAC72AEA941FA2E7 /* TileCoordsRegion.swift in Sources */, + D60203A041A730BE3DED9777C9823738 /* TileRange.swift in Sources */, + 0375EE2E92C662E84645B1B7B045E531 /* TileRangeIterator.swift in Sources */, + E7D461768AF6AF3EE4AA2EFCD3E70AAA /* URL+DiskCache.swift in Sources */, + 6DF3C0198357F132325BAE47D50002C0 /* ZoomableTile.swift in Sources */, + 0C772E8D6AE87CFF3980634D4CB2D8F2 /* ZoomRange.swift in Sources */, + 9FA12E3DBD8602DF0AE18CA2FBC2748C /* ZoomRangeIterator.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 0D4ABC39291C726D6E9EE20874CA0FE4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -724,35 +761,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 988C86E7562B7A1291127DA948764063 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E2D81508D8D80DB99F3A8A244165F00 /* CachedTileOverlay.swift in Sources */, - 95AD4B7017BBD30A7408B35A054D758C /* DiskCache.swift in Sources */, - 99F98F80935F5327E3A602AE4538B989 /* FileManager+DiskCache.swift in Sources */, - 245F1C280C96E219A394F34A549812B6 /* Log.swift in Sources */, - D5763373293E932C5E39E0ECDD7817E2 /* MapCache-dummy.m in Sources */, - E2D7CA756695D8D6B430C17D9831B792 /* MapCache.swift in Sources */, - 09E384876EF6B4429D5F842FD0AEB6D2 /* MapCacheConfig.swift in Sources */, - 7D353EA3E3E4221419EDB623C9518A73 /* MapCacheProtocol.swift in Sources */, - B4672BB887DAAC717AC718283CEC8590 /* MD5.swift in Sources */, - 3B9DD8E0581146ED0D56D013DBDF050C /* MKMapView+MapCache.swift in Sources */, - 3B80E04855F0A3FACBD1974A8A25D74C /* MKTileOverlayPath+MapCache.swift in Sources */, - CA0CEB8B8BF7770D87A3D2047E6279D8 /* RegionDownloader.swift in Sources */, - F6262510200AB990D82DA37744C5C284 /* RegionDownloaderDelegate.swift in Sources */, - 0F4DA559092D4C2B144DCB33B92CEC68 /* ReplaceMe.swift in Sources */, - F6B4CDE78BCDAC50CC342741CE20500A /* String+DiskCache.swift in Sources */, - 1663A9527B6D3C34A3A9C40B6C6B97E3 /* TileCoords.swift in Sources */, - 17A2706D3466A9BAC139A7B984247F2F /* TileCoordsRegion.swift in Sources */, - AF2651F13B56F5D2916FF5A569D357EF /* TileRange.swift in Sources */, - 554B1B922F5400AA99A6300C161F2252 /* TileRangeIterator.swift in Sources */, - 212FC03237B03A9FB986CEDB67E81DA4 /* URL+DiskCache.swift in Sources */, - BC8258058992A57CCAC74F1EF09850F7 /* ZoomRange.swift in Sources */, - 7F93B344D032932509A2F80F22E3441E /* ZoomRangeIterator.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; D108EC2C81B7704F22B538D242E8F3FC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -845,11 +853,10 @@ }; name = Release; }; - 46DDC9C402FB5EF07B37591FAD616F0B /* Release */ = { + 1DE3C96890408587FED34BA3499F71D6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 67D6BA71624E38E7B69D68D62ACA7066 /* CoreGPX-watchOS.xcconfig */; + baseConfigurationReference = 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -859,29 +866,30 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; - PRODUCT_MODULE_NAME = CoreGPX; - PRODUCT_NAME = CoreGPX; - SDKROOT = watchos; + MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; + PRODUCT_MODULE_NAME = MapCache; + PRODUCT_NAME = MapCache; + SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; - 47D31B5539BD1CE3B6BAAB64CA419DDC /* Debug */ = { + 46DDC9C402FB5EF07B37591FAD616F0B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 79195CD91E40D944B12F0DD9F7D8F5B0 /* MapCache.xcconfig */; + baseConfigurationReference = AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -891,23 +899,24 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; - PRODUCT_MODULE_NAME = MapCache; - PRODUCT_NAME = MapCache; - SDKROOT = iphoneos; + MODULEMAP_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; + PRODUCT_MODULE_NAME = CoreGPX; + PRODUCT_NAME = CoreGPX; + SDKROOT = watchos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 4; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; - name = Debug; + name = Release; }; 4C771D53BEC20A7F3A2447BF15FA5607 /* Release */ = { isa = XCBuildConfiguration; @@ -970,6 +979,37 @@ }; name = Release; }; + 645772151481CFCC65006B3AA0710D3A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; + PRODUCT_MODULE_NAME = MapCache; + PRODUCT_NAME = MapCache; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 6877882AFAECC941FE73DFD5568ABDCC /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = D1F6F978401AA9203C0068794566FB46 /* Pods-OpenGpxTracker-Watch Extension.release.xcconfig */; @@ -1007,7 +1047,7 @@ }; 6D71E263965D2E7194C751DA24849F73 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 96493AD08B5873D1870B217469227614 /* CoreGPX-iOS.xcconfig */; + baseConfigurationReference = 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1137,7 +1177,7 @@ }; DC8F050C9E455164E5F902002F788040 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 67D6BA71624E38E7B69D68D62ACA7066 /* CoreGPX-watchOS.xcconfig */; + baseConfigurationReference = AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; @@ -1203,7 +1243,7 @@ }; EFF75F42316CA032945DBC62DD10C102 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 96493AD08B5873D1870B217469227614 /* CoreGPX-iOS.xcconfig */; + baseConfigurationReference = 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1232,46 +1272,14 @@ }; name = Debug; }; - F0871D787CFB2C72B27B7541C17E1CA7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 79195CD91E40D944B12F0DD9F7D8F5B0 /* MapCache.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; - PRODUCT_MODULE_NAME = MapCache; - PRODUCT_NAME = MapCache; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 243B31D03F19B8A1D875D1E7FB12AEE3 /* Build configuration list for PBXNativeTarget "MapCache" */ = { + 272115438C930133EF435FEDE8D36127 /* Build configuration list for PBXNativeTarget "MapCache" */ = { isa = XCConfigurationList; buildConfigurations = ( - 47D31B5539BD1CE3B6BAAB64CA419DDC /* Debug */, - F0871D787CFB2C72B27B7541C17E1CA7 /* Release */, + 645772151481CFCC65006B3AA0710D3A /* Debug */, + 1DE3C96890408587FED34BA3499F71D6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/MapCache/MapCache-Info.plist b/Pods/Target Support Files/MapCache/MapCache-Info.plist index 89a577b2..2cf03a7f 100644 --- a/Pods/Target Support Files/MapCache/MapCache-Info.plist +++ b/Pods/Target Support Files/MapCache/MapCache-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.6.0 + 0.8.0 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/MapCache/MapCache.xcconfig b/Pods/Target Support Files/MapCache/MapCache.xcconfig index 87ce7815..7cb928bd 100644 --- a/Pods/Target Support Files/MapCache/MapCache.xcconfig +++ b/Pods/Target Support Files/MapCache/MapCache.xcconfig @@ -1,6 +1,6 @@ CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MapCache GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -framework "MapKit" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "MapKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.markdown b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.markdown index 989d45c7..343e6c68 100644 --- a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.markdown @@ -28,7 +28,7 @@ SOFTWARE. ## MapCache -Copyright (c) 2019 Juan M. Merlos @merlos +Copyright (c) 2019-2020 Juan M. Merlos @merlos Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.plist b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.plist index 2417f843..67a8aafa 100644 --- a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-acknowledgements.plist @@ -45,7 +45,7 @@ SOFTWARE. FooterText - Copyright (c) 2019 Juan M. Merlos @merlos + Copyright (c) 2019-2020 Juan M. Merlos @merlos Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.debug.xcconfig b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.debug.xcconfig index 769c21f0..049a669c 100644 --- a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.debug.xcconfig +++ b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.debug.xcconfig @@ -3,7 +3,7 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX-i GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX-iOS/CoreGPX.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MapCache/MapCache.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "CoreGPX" -framework "MapCache" -framework "MapKit" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -framework "CoreGPX" -framework "Foundation" -framework "MapCache" -framework "MapKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.release.xcconfig b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.release.xcconfig index 769c21f0..049a669c 100644 --- a/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.release.xcconfig +++ b/Pods/Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.release.xcconfig @@ -3,7 +3,7 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX-i GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX-iOS/CoreGPX.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MapCache/MapCache.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "CoreGPX" -framework "MapCache" -framework "MapKit" -framework "UIKit" +OTHER_LDFLAGS = $(inherited) -framework "CoreGPX" -framework "Foundation" -framework "MapCache" -framework "MapKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) From 8654d49aa27b8255b2e1df71bb80d57811b6e5f5 Mon Sep 17 00:00:00 2001 From: merlos Date: Sun, 27 Sep 2020 22:26:30 -0400 Subject: [PATCH 2/4] Allow unlimited zoom using CachedTileOverlayRenderer from MapCache --- OpenGpxTracker/GPXTileServer.swift | 6 +++--- OpenGpxTracker/MapViewDelegate.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenGpxTracker/GPXTileServer.swift b/OpenGpxTracker/GPXTileServer.swift index 643f28d3..8c262144 100644 --- a/OpenGpxTracker/GPXTileServer.swift +++ b/OpenGpxTracker/GPXTileServer.swift @@ -120,9 +120,9 @@ enum GPXTileServer: Int { var minCameraDistance: Double { switch self { case .apple: return -1.0 // Not limited - case .openStreetMap: return 750.0 - case .cartoDB: return 200.0 - case .openTopoMap: return 2850.0 + case .openStreetMap: return -1.0 + case .cartoDB: return -1.0 + case .openTopoMap: return -1.0 } } diff --git a/OpenGpxTracker/MapViewDelegate.swift b/OpenGpxTracker/MapViewDelegate.swift index 506db56f..f18a48ab 100644 --- a/OpenGpxTracker/MapViewDelegate.swift +++ b/OpenGpxTracker/MapViewDelegate.swift @@ -40,7 +40,7 @@ class MapViewDelegate: NSObject, MKMapViewDelegate, UIAlertViewDelegate { /// Displays the line for each segment func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { if overlay.isKind(of: MKTileOverlay.self) { - return MKTileOverlayRenderer(overlay: overlay) + return mapView.mapCacheRenderer(forOverlay: overlay) } if overlay is MKPolyline { From fddf5969e5381085313d40fd95fd51523e6e0305 Mon Sep 17 00:00:00 2001 From: merlos Date: Sun, 27 Sep 2020 22:34:58 -0400 Subject: [PATCH 3/4] Remove code that is no longer necessary for the minCameraZoom --- OpenGpxTracker/GPXMapView.swift | 9 --------- OpenGpxTracker/GPXTileServer.swift | 17 +---------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/OpenGpxTracker/GPXMapView.swift b/OpenGpxTracker/GPXMapView.swift index c8e42669..ce58a03d 100644 --- a/OpenGpxTracker/GPXMapView.swift +++ b/OpenGpxTracker/GPXMapView.swift @@ -76,13 +76,6 @@ class GPXMapView: MKMapView { removeOverlay(tileServerOverlay) } - /// Min distance to the floor of the camera - if #available(iOS 13, *) { - let zoomRange = MKMapView.CameraZoomRange(minCenterCoordinateDistance: newValue.minCameraDistance, - maxCenterCoordinateDistance: -1) - setCameraZoomRange(zoomRange, animated: true) - } - //add new overlay to map if not using Apple Maps if newValue != .apple { //Update cacheConfig @@ -102,7 +95,6 @@ class GPXMapView: MKMapView { } } didSet { - if #available(iOS 13, *) { if tileServer == .apple { overrideUserInterfaceStyle = .unspecified @@ -112,7 +104,6 @@ class GPXMapView: MKMapView { NotificationCenter.default.post(name: .updateAppearance, object: nil, userInfo: nil) } } - } } diff --git a/OpenGpxTracker/GPXTileServer.swift b/OpenGpxTracker/GPXTileServer.swift index 8c262144..8315f236 100644 --- a/OpenGpxTracker/GPXTileServer.swift +++ b/OpenGpxTracker/GPXTileServer.swift @@ -67,6 +67,7 @@ enum GPXTileServer: Int { case .openTopoMap: return ["a", "b", "c"] } } + /// Maximum zoom level the tile server supports /// Tile servers provide files till a certain level of zoom that ranges from 0 to maximumZ. /// If map zooms more than the limit level, tiles won't be requested. @@ -109,22 +110,6 @@ enum GPXTileServer: Int { return 0 } } - - /// Minimum distance from the floor of the camera (in meters) - /// - /// Note that there is a relationship between the mazimumZ and the camera distance to the floor. - /// Because of that, this parameter be automatically calculated in the future. - /// For existing tile servers, it was calculated with trial and error. - /// - /// Negative value means no limit. - var minCameraDistance: Double { - switch self { - case .apple: return -1.0 // Not limited - case .openStreetMap: return -1.0 - case .cartoDB: return -1.0 - case .openTopoMap: return -1.0 - } - } /// Returns the number of tile servers currently defined static var count: Int { return GPXTileServer.openTopoMap.rawValue + 1} From 64f6c6e9cd49accecb5fcf4b68e7392f65f66b2b Mon Sep 17 00:00:00 2001 From: merlos Date: Sun, 4 Oct 2020 11:25:04 -0400 Subject: [PATCH 4/4] Updated MapCache and CoreGPX pods --- OpenGpxTracker.xcodeproj/project.pbxproj | 10 +- ...enGpxTracker-Watch (Complication).xcscheme | 42 +- ...enGpxTracker-Watch (Notification).xcscheme | 42 +- .../xcschemes/OpenGpxTracker-Watch.xcscheme | 42 +- Podfile | 4 +- Podfile.lock | 12 +- Pods/CoreGPX/Classes/Converters.swift | 1 + Pods/CoreGPX/Classes/GPXCompression.swift | 374 ++++++ Pods/CoreGPX/Classes/GPXExtensions.swift | 4 +- .../Classes/GPXExtensionsElement.swift | 14 + Pods/CoreGPX/Classes/GPXMetadata.swift | 18 +- Pods/CoreGPX/Classes/GPXParser.swift | 66 +- Pods/CoreGPX/Classes/GPXRoot.swift | 4 +- Pods/CoreGPX/Classes/GPXRoute.swift | 2 +- Pods/CoreGPX/Classes/GPXWaypoint.swift | 3 +- Pods/CoreGPX/README.md | 43 +- Pods/Manifest.lock | 12 +- .../MapCache/Classes/CachedTileOverlay.swift | 5 +- .../Classes/CachedTileOverlayRenderer.swift | 6 +- .../Classes/DiskCache/DiskCache.swift | 28 +- Pods/MapCache/MapCache/Classes/Log.swift | 2 +- Pods/MapCache/MapCache/Classes/MapCache.swift | 2 +- .../MapCache/Classes/TileCoords.swift | 10 +- .../MapCache/Classes/TileCoordsRegion.swift | 2 +- .../MapCache/MapCache/Classes/TileRange.swift | 2 +- .../MapCache/Classes/ZoomableTile.swift | 12 +- Pods/MapCache/README.md | 9 +- Pods/Pods.xcodeproj/project.pbxproj | 1086 +++++++++-------- .../CoreGPX-iOS/CoreGPX-iOS-Info.plist | 2 +- .../CoreGPX-watchOS-Info.plist | 2 +- .../MapCache/MapCache-Info.plist | 2 +- 31 files changed, 1131 insertions(+), 732 deletions(-) create mode 100644 Pods/CoreGPX/Classes/GPXCompression.swift diff --git a/OpenGpxTracker.xcodeproj/project.pbxproj b/OpenGpxTracker.xcodeproj/project.pbxproj index f33d4034..cb8a5cb9 100644 --- a/OpenGpxTracker.xcodeproj/project.pbxproj +++ b/OpenGpxTracker.xcodeproj/project.pbxproj @@ -151,11 +151,11 @@ 0175AC0523F01519003323C3 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; 0175AC0723F01523003323C3 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; }; 120DE70F22B274910055C4CB /* GPXSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPXSession.swift; sourceTree = ""; }; - 12A1A44324D561AC0057ED7A /* CoreDataHelper+FetchRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreDataHelper+FetchRequests.swift"; sourceTree = ""; }; 1262DD9624F9568F00B5C2EA /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Interface.strings; sourceTree = ""; }; 1262DD9724F9568F00B5C2EA /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; 1262DD9824F9568F00B5C2EA /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; 1262DD9924F9568F00B5C2EA /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + 12A1A44324D561AC0057ED7A /* CoreDataHelper+FetchRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreDataHelper+FetchRequests.swift"; sourceTree = ""; }; 12D4905424C448540065D995 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Interface.strings; sourceTree = ""; }; 12D4905524C448540065D995 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 12D4905624C448540065D995 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -1040,7 +1040,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1089,7 +1089,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -1108,7 +1108,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = OpenGpxTracker/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MARKETING_VERSION = 1.7.2; PRODUCT_BUNDLE_IDENTIFIER = org.merlos.OpenGpxTracker; @@ -1129,7 +1129,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = OpenGpxTracker/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MARKETING_VERSION = 1.7.2; PRODUCT_BUNDLE_IDENTIFIER = org.merlos.OpenGpxTracker; diff --git a/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Complication).xcscheme b/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Complication).xcscheme index 37b28a16..36cf2378 100644 --- a/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Complication).xcscheme +++ b/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Complication).xcscheme @@ -41,8 +41,6 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - - - - + - - - + - + - - - - - + diff --git a/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Notification).xcscheme b/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Notification).xcscheme index fccccf06..bfe56741 100644 --- a/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Notification).xcscheme +++ b/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch (Notification).xcscheme @@ -41,8 +41,6 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - - - - + - - - + - + - - - - - + diff --git a/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch.xcscheme b/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch.xcscheme index cb7fd305..5a100812 100644 --- a/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch.xcscheme +++ b/OpenGpxTracker.xcodeproj/xcshareddata/xcschemes/OpenGpxTracker-Watch.xcscheme @@ -41,8 +41,6 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - - - - + - - - + @@ -99,10 +84,8 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - + - - - - - + diff --git a/Podfile b/Podfile index 4da0510c..1b1d1019 100644 --- a/Podfile +++ b/Podfile @@ -5,9 +5,9 @@ def shared_pods end target 'OpenGpxTracker' do - platform :ios, '8.0' + platform :ios, '9.0' shared_pods - pod 'MapCache', '~> 0.8.0' + pod 'MapCache', '~> 0.9.0' #pod 'MapCache', git: 'https://github.com/merlos/MapCache.git' :branch => 'master' end diff --git a/Podfile.lock b/Podfile.lock index 88aae30c..2e71e647 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,10 +1,10 @@ PODS: - - CoreGPX (0.7.4) - - MapCache (0.8.0) + - CoreGPX (0.8.1) + - MapCache (0.9.0) DEPENDENCIES: - CoreGPX - - MapCache (~> 0.8.0) + - MapCache (~> 0.9.0) SPEC REPOS: https://github.com/cocoapods/specs.git: @@ -12,9 +12,9 @@ SPEC REPOS: - MapCache SPEC CHECKSUMS: - CoreGPX: 9927a0158614c4baed08ecdb772fdc24efd92e49 - MapCache: dce6387196fb94e58f8ac3ae7b8ca6bda15f15ae + CoreGPX: 2d1deecae3c99674bb1165935c350f9c0e54e5ab + MapCache: b0a9f5f9a0ed7cbac45443fea0e7e03a97bf0c66 -PODFILE CHECKSUM: c49315bb353e7304cd79b1e2ecb18a9a923e10b3 +PODFILE CHECKSUM: c61e9630b0b0516aedcfdcf6798dbfb7fc6c0eef COCOAPODS: 1.7.5 diff --git a/Pods/CoreGPX/Classes/Converters.swift b/Pods/CoreGPX/Classes/Converters.swift index f26abb5a..2f21cf0e 100644 --- a/Pods/CoreGPX/Classes/Converters.swift +++ b/Pods/CoreGPX/Classes/Converters.swift @@ -110,5 +110,6 @@ internal final class Convert { return yearFormatter.string(from: validYear) } + } diff --git a/Pods/CoreGPX/Classes/GPXCompression.swift b/Pods/CoreGPX/Classes/GPXCompression.swift new file mode 100644 index 00000000..dc1b115d --- /dev/null +++ b/Pods/CoreGPX/Classes/GPXCompression.swift @@ -0,0 +1,374 @@ +// +// GPXParser+Lossy.swift +// Pods +// +// Created by Vincent Neo on 25/10/19. +// + +import Foundation + +/// Simple class for some basic lossy compression. +public class GPXCompression { + + /// Use this function to compression `GPXRoot`. + /// + /// Type of compression can be chose here. + public static func compress(gpx: GPXRoot, by type: lossyTypes, affecting types: [lossyOptions]) -> GPXRoot { + switch type { + + case .randomRemoval: return lossyRandom(gpx, types: types, percent: type.value()) + case .stripNearbyData: return stripNearbyData(gpx, types: types, distanceRadius: type.value()) + case .stripDuplicates: return stripDuplicates(gpx, types: types) + + } + } + + /// Currently supported types of compression. + public enum lossyTypes { + + /// Removal of duplicated points. + case stripDuplicates + /// Removal of points with nearby co ordinates, subject to distance radius provided. + case stripNearbyData(distanceRadius: Double) + /// Removal of points in a random manner, with a percentage of removal. + case randomRemoval(percentage: Double) + + /// Internal function to get a value, should it be supported by the type. + func value() -> Double { + switch self { + case .stripNearbyData(distanceRadius: let rad): return rad + case .randomRemoval(percentage: let percent): return percent + default: fatalError("GPXParserLossyTypes: type of id \(self.rawValue) has no value to get") + } + } + } + + /// Selectable scope of removal of points. + public enum lossyOptions { + /// Remove Track Points + case trackpoint + /// Remove Waypoints + case waypoint + /// Remove Route Points + case routepoint + } + + /// Internal function to call for when removal of duplicates is needed. + /// + /// - Parameters: + /// - gpx: GPX data in an instance. + /// - types: Chosen point types, scope of lossy removals. + /// + static func stripDuplicates(_ gpx: GPXRoot, types: [lossyOptions]) -> GPXRoot { + let gpx = gpx + + var lastWaypoints = [GPXWaypoint]() + var lastTrackpoints = [GPXTrackPoint]() + var lastRoutepoints = [GPXRoutePoint]() + + if types.contains(.waypoint) { + for wpt in gpx.waypoints { + if wpt.compareCoordinates(with: lastWaypoints.last) { + lastWaypoints.append(wpt) + continue + } + else { + if lastWaypoints.isEmpty { + lastWaypoints.append(wpt) + continue + } + for (index,dupWpt) in lastWaypoints.enumerated() { + if index == lastWaypoints.endIndex - 1 { + lastWaypoints = [GPXWaypoint]() + lastWaypoints.append(wpt) + } + else if let i = gpx.waypoints.firstIndex(of: dupWpt) { + gpx.waypoints.remove(at: i) + } + } + + } + } + + lastWaypoints = [GPXWaypoint]() + } + + if types.contains(.trackpoint) { + for track in gpx.tracks { + for segment in track.tracksegments { + for trkpt in segment.trackpoints { + if trkpt.compareCoordinates(with: lastTrackpoints.last) { + lastTrackpoints.append(trkpt) + continue + } + else { + if lastTrackpoints.isEmpty { + lastTrackpoints.append(trkpt) + continue + } + for (index,dupTrkpt) in lastTrackpoints.enumerated() { + if index == lastTrackpoints.endIndex - 1 { + lastTrackpoints = [GPXTrackPoint]() + lastTrackpoints.append(trkpt) + } + else if let i = segment.trackpoints.firstIndex(of: dupTrkpt) { + segment.trackpoints.remove(at: i) + } + } + + } + } + lastTrackpoints = [GPXTrackPoint]() + } + } + } + + + if types.contains(.routepoint) { + for route in gpx.routes { + for rtept in route.routepoints { + if rtept.compareCoordinates(with: lastRoutepoints.last) { + lastRoutepoints.append(rtept) + continue + } + else { + if lastRoutepoints.isEmpty { + lastRoutepoints.append(rtept) + continue + } + for (index,dupRtept) in lastRoutepoints.enumerated() { + if index == lastRoutepoints.endIndex - 1 { + lastRoutepoints = [GPXRoutePoint]() + lastRoutepoints.append(rtept) + } + else if let i = route.routepoints.firstIndex(of: dupRtept) { + route.routepoints.remove(at: i) + } + } + + } + } + lastRoutepoints = [GPXRoutePoint]() + } + } + + return gpx + } + + /// Internal function to call for when removal of nearby points is needed. + /// + /// - Parameters: + /// - gpx: GPX data in an instance. + /// - types: Chosen point types, scope of lossy removals. + /// - distanceRadius: Radius to be affected. In unit of metres (m) + /// + static func stripNearbyData(_ gpx: GPXRoot, types: [lossyOptions], distanceRadius: Double = 100) -> GPXRoot { + let gpx = gpx + var lastPointCoordinates: GPXWaypoint? + + if types.contains(.waypoint) { + for wpt in gpx.waypoints { + if let distance = GPXCompressionCalculate.getDistance(from: lastPointCoordinates, and: wpt) { + if distance < distanceRadius { + if let i = gpx.waypoints.firstIndex(of: wpt) { + gpx.waypoints.remove(at: i) + } + lastPointCoordinates = nil + continue + } + } + lastPointCoordinates = wpt + } + lastPointCoordinates = nil + } + + if types.contains(.trackpoint) { + for track in gpx.tracks { + for segment in track.tracksegments { + for trkpt in segment.trackpoints { + if let distance = GPXCompressionCalculate.getDistance(from: lastPointCoordinates, and: trkpt) { + if distance < distanceRadius { + if let i = segment.trackpoints.firstIndex(of: trkpt) { + segment.trackpoints.remove(at: i) + } + lastPointCoordinates = nil + continue + } + } + lastPointCoordinates = trkpt + } + lastPointCoordinates = nil + } + } + } + + + if types.contains(.routepoint) { + for route in gpx.routes { + for rtept in route.routepoints { + if let distance = GPXCompressionCalculate.getDistance(from: lastPointCoordinates, and: rtept) { + if distance < distanceRadius { + if let i = route.routepoints.firstIndex(of: rtept) { + route.routepoints.remove(at: i) + } + lastPointCoordinates = nil + continue + } + } + lastPointCoordinates = rtept + } + lastPointCoordinates = nil + } + } + + return gpx + } + + /// Internal function to call for when removal of points randomly is needed. + /// + /// - Parameters: + /// - gpx: GPX data in an instance. + /// - types: Chosen point types, scope of lossy removals. + /// - percent: Pecentage to be accepted to be removed. Expressed in decimal. (20% --> 0.2) + /// + static func lossyRandom(_ gpx: GPXRoot, types: [lossyOptions], percent: Double = 0.2) -> GPXRoot { + + let gpx = gpx + let wptCount = gpx.waypoints.count + + if types.contains(.waypoint) { + if wptCount != 0 { + let removalAmount = Int(percent * Double(wptCount)) + for i in 0...removalAmount { + let randomInt = Int.random(in: 0...wptCount - (i+1)) + gpx.waypoints.remove(at: randomInt) + } + } + } + + if types.contains(.trackpoint) { + for track in gpx.tracks { + for segment in track.tracksegments { + let trkptCount = segment.trackpoints.count + if trkptCount != 0 { + let removalAmount = Int(percent * Double(trkptCount)) + for i in 0...removalAmount { + let randomInt = Int.random(in: 0...trkptCount - (i+1)) + segment.trackpoints.remove(at: randomInt) + } + } + } + } + } + + + if types.contains(.routepoint) { + for route in gpx.routes { + let rteCount = route.routepoints.count + if rteCount != 0 { + let removalAmount = Int(percent * Double(rteCount)) + for i in 0...removalAmount { + let randomInt = Int.random(in: 0...rteCount - (i+1)) + route.routepoints.remove(at: randomInt) + } + } + } + } + + return gpx + + } + +} + +/// Raw Representable for Lossy types enum +extension GPXCompression.lossyTypes: RawRepresentable { + /// Represented as an integer + public typealias RawValue = Int + + /// Initializes raw + public init?(rawValue: Int, value: Double?) { + switch rawValue { + case 0: + self = .stripDuplicates // init will still run even if value has something. + case 1: + guard let value = value else { fatalError("\(rawValue): Invalid value.") } + self = .stripNearbyData(distanceRadius: value) + case 2: + guard let value = value else { fatalError("\(rawValue): Invalid value.") } + self = .randomRemoval(percentage: value) + default: + fatalError("Invalid rawValue.") + } + } + + /// Default Initializer. Not recommended for use. + public init?(rawValue: Int) { + if rawValue == 0 { + self = .stripDuplicates + } + else { + fatalError("GPXCompression.lossyTypes: This initalizer is NOT supported for this associated type. Please use init(rawValue:value:) instead.") + } + } + + /// Raw Value + public var rawValue: Int { + switch self { + case .stripDuplicates: return 0 + case .stripNearbyData: return 1 + case .randomRemoval: return 2 + } + } + +} + + +/// Extension for distance between points calculation, without `CoreLocation` APIs. +class GPXCompressionCalculate { + + /// Calculates distance between two coordinate points, returns in metres (m). + /// + /// Code from https://github.com/raywenderlich/swift-algorithm-club/tree/master/HaversineDistance + /// Licensed under MIT license + static func haversineDistance(la1: Double, lo1: Double, la2: Double, lo2: Double, radius: Double = 6367444.7) -> Double { + + let haversin = { (angle: Double) -> Double in + return (1 - cos(angle))/2 + } + + let ahaversin = { (angle: Double) -> Double in + return 2*asin(sqrt(angle)) + } + + // Converts from degrees to radians + let dToR = { (angle: Double) -> Double in + return (angle / 360) * 2 * .pi + } + + let lat1 = dToR(la1) + let lon1 = dToR(lo1) + let lat2 = dToR(la2) + let lon2 = dToR(lo2) + + return radius * ahaversin(haversin(lat2 - lat1) + cos(lat1) * cos(lat2) * haversin(lon2 - lon1)) + } + + /// Gets distance from any GPX point type + static func getDistance(from first: pt?, and second: pt?) -> Double? { + guard let lat1 = first?.latitude, let lon1 = first?.longitude, let lat2 = second?.latitude, let lon2 = second?.longitude else { return nil } + + return haversineDistance(la1: lat1, lo1: lon1, la2: lat2, lo2: lon2) + } + +} + +/// Extension to allow for easy coordinates comparison. +extension GPXWaypoint { + /// Private function for coordinates comparsions + fileprivate func compareCoordinates(with pointType: pt?) -> Bool { + guard let pointType = pointType else { return false } + return (self.latitude == pointType.latitude && self.longitude == pointType.longitude) ? true : false + } +} + diff --git a/Pods/CoreGPX/Classes/GPXExtensions.swift b/Pods/CoreGPX/Classes/GPXExtensions.swift index 2bd973ba..7d4c6387 100644 --- a/Pods/CoreGPX/Classes/GPXExtensions.swift +++ b/Pods/CoreGPX/Classes/GPXExtensions.swift @@ -33,9 +33,7 @@ public final class GPXExtensions: GPXElement, Codable { init(raw: GPXRawElement) { super.init() for child in raw.children { - let tmp = GPXExtensionsElement(name: child.name) - tmp.text = child.text - tmp.attributes = child.attributes + let tmp = GPXExtensionsElement(raw: child) children.append(tmp) } diff --git a/Pods/CoreGPX/Classes/GPXExtensionsElement.swift b/Pods/CoreGPX/Classes/GPXExtensionsElement.swift index 62af5a07..5a414adf 100644 --- a/Pods/CoreGPX/Classes/GPXExtensionsElement.swift +++ b/Pods/CoreGPX/Classes/GPXExtensionsElement.swift @@ -38,6 +38,20 @@ open class GPXExtensionsElement: GPXElement, Codable { } } + /// For initializing with a raw element. Parser use only. + /// + /// - Parameters: + /// - raw: parser's raw element + init(raw: GPXRawElement) { + self.name = raw.name + self.text = raw.text + self.attributes = raw.attributes + for child in raw.children { + let tmp = GPXExtensionsElement(raw: child) + self.children.append(tmp) + } + } + /// Initialize with a tagName. public init(name: String) { self.name = name diff --git a/Pods/CoreGPX/Classes/GPXMetadata.swift b/Pods/CoreGPX/Classes/GPXMetadata.swift index 027c50d4..5be41df6 100644 --- a/Pods/CoreGPX/Classes/GPXMetadata.swift +++ b/Pods/CoreGPX/Classes/GPXMetadata.swift @@ -44,7 +44,7 @@ public final class GPXMetadata: GPXElement, Codable { public var time: Date? /// Keyword of the GPX file. - public var keyword: String? + public var keywords: String? /// Boundaries of coordinates of the GPX file. public var bounds: GPXBounds? @@ -66,18 +66,18 @@ public final class GPXMetadata: GPXElement, Codable { /// - Parameters: /// - raw: Raw element expected from parser init(raw: GPXRawElement) { - super.init() + //super.init() for child in raw.children { - let text = child.text + //let text = child.text switch child.name { - case "name": self.name = text - case "desc": self.desc = text + case "name": self.name = child.text + case "desc": self.desc = child.text case "author": self.author = GPXAuthor(raw: child) case "copyright": self.copyright = GPXCopyright(raw: child) case "link": self.link = GPXLink(raw: child) - case "time": self.time = GPXDateParser.parse(date: text) - case "keywords": self.keyword = text + case "time": self.time = GPXDateParser.parse(date: child.text) + case "keywords": self.keywords = child.text case "bounds": self.bounds = GPXBounds(raw: child) case "extensions": self.extensions = GPXExtensions(raw: child) default: continue @@ -111,8 +111,8 @@ public final class GPXMetadata: GPXElement, Codable { self.link?.gpx(gpx, indentationLevel: indentationLevel) } - self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel, defaultValue: "0") - self.addProperty(forValue: keyword, gpx: gpx, tagName: "keyword", indentationLevel: indentationLevel) + self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel) + self.addProperty(forValue: keywords, gpx: gpx, tagName: "keywords", indentationLevel: indentationLevel) if bounds != nil { self.bounds?.gpx(gpx, indentationLevel: indentationLevel) diff --git a/Pods/CoreGPX/Classes/GPXParser.swift b/Pods/CoreGPX/Classes/GPXParser.swift index 38345f88..ae6b4730 100644 --- a/Pods/CoreGPX/Classes/GPXParser.swift +++ b/Pods/CoreGPX/Classes/GPXParser.swift @@ -93,7 +93,7 @@ public final class GPXParser: NSObject { /// public convenience init?(withRawString string: String?) { if let string = string { - if let data = string.data(using: .utf8) { + if let data = string.data(using: .utf8) { // refactor self.init(withData: data) } else { return nil } @@ -159,6 +159,10 @@ public final class GPXParser: NSObject { return root } + /// Unavailable after CoreGPX 0.8, spelling error. Will be removed soon. + @available(*, unavailable, message: "Please use fallibleParsedData(forceContinue:) instead") + public func failibleParsedData(forceContinue: Bool) throws -> GPXRoot? { return nil } + /// /// Starts parsing, returns parsed `GPXRoot` when done. /// @@ -167,15 +171,21 @@ public final class GPXParser: NSObject { /// /// - Throws: `GPXError` errors if an incident has occurred while midway or after parsing the GPX file. /// - public func failibleParsedData(forceContinue: Bool) throws -> GPXRoot? { + public func fallibleParsedData(forceContinue: Bool) throws -> GPXRoot? { self.isErrorCheckEnabled = true self.shouldContinueAfterFirstError = forceContinue self.parser.parse() // parse when requested - guard let firstTag = stack.first else { throw GPXError.parser.fileIsNotXMLBased } - guard let rawGPX = firstTag.children.first else { throw GPXError.parser.fileIsEmpty } + guard let firstTag = stack.first else { + throw GPXError.parser.fileIsNotXMLBased + } + guard let rawGPX = firstTag.children.first else { + throw GPXError.parser.fileIsEmpty + } - guard parserError == nil else { throw GPXError.parser.issueAt(line: errorAtLine, error: parserError!) } + guard parserError == nil else { + throw GPXError.parser.issueAt(line: errorAtLine, error: parserError!) + } let root = GPXRoot(raw: rawGPX) // to be returned; includes attributes. guard root.version == "1.1" else { throw GPXError.parser.unsupportedVersion } @@ -216,7 +226,6 @@ public final class GPXParser: NSObject { } - /// /// XML Parser Delegate Implementation /// @@ -280,3 +289,48 @@ extension GPXParser: XMLParserDelegate { } } } + +extension GPXParser { + /// Parse GPX file, while lossy compressing it straight away, post-parsing. + /// + /// Great for basic direct compression needs. + public func lossyParsing(type: GPXCompression.lossyTypes, affecting types: [GPXCompression.lossyOptions]) -> GPXRoot? { + self.parser.parse() + + guard let firstTag = stack.first else { return nil } + guard let rawGPX = firstTag.children.first else { return nil } + + let root = GPXRoot(raw: rawGPX) // to be returned; includes attributes. + + for child in rawGPX.children { + let name = child.name + + switch name { + case "metadata": + let metadata = GPXMetadata(raw: child) + root.metadata = metadata + case "wpt": + let waypoint = GPXWaypoint(raw: child) + root.add(waypoint: waypoint) + case "rte": + let route = GPXRoute(raw: child) + root.add(route: route) + case "trk": + let track = GPXTrack(raw: child) + root.add(track: track) + case "extensions": + let extensions = GPXExtensions(raw: child) + root.extensions = extensions + default: continue + } + + } + + switch type { + case .stripDuplicates: return GPXCompression.stripDuplicates(root, types: types) + case .stripNearbyData: return GPXCompression.stripNearbyData(root, types: types, distanceRadius: type.value()) + case .randomRemoval: return GPXCompression.lossyRandom(root, types: types, percent: type.value()) + } + } + +} diff --git a/Pods/CoreGPX/Classes/GPXRoot.swift b/Pods/CoreGPX/Classes/GPXRoot.swift index 1f21c721..f1f2c88e 100644 --- a/Pods/CoreGPX/Classes/GPXRoot.swift +++ b/Pods/CoreGPX/Classes/GPXRoot.swift @@ -44,11 +44,11 @@ public final class GPXRoot: GPXElement, Codable { // MARK: GPX v1.1 Namespaces /// Link to the GPX v1.1 schema - private let schema = "http://www.topografix.com/GPX/1/1" + private var schema = "http://www.topografix.com/GPX/1/1" /// Link to the schema locations. If extended, the extended schema should be added. private var schemaLocation = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" /// Link to XML schema instance - private let xsi = "http://www.w3.org/2001/XMLSchema-instance" + private var xsi = "http://www.w3.org/2001/XMLSchema-instance" /// For if GPX file is extended, and contains extra attributes on gpx main tag. private var extensionAttributes: [String : String]? diff --git a/Pods/CoreGPX/Classes/GPXRoute.swift b/Pods/CoreGPX/Classes/GPXRoute.swift index f3c19578..0d4b4cdc 100644 --- a/Pods/CoreGPX/Classes/GPXRoute.swift +++ b/Pods/CoreGPX/Classes/GPXRoute.swift @@ -69,7 +69,7 @@ public final class GPXRoute: GPXElement, Codable { for child in raw.children { switch child.name { case "link": self.link = GPXLink() - case "rtept": self.routepoints = [GPXRoutePoint]() + case "rtept": self.routepoints.append(GPXRoutePoint(raw: child)) case "name": self.name = child.text case "cmt": self.comment = child.text case "desc": self.desc = child.text diff --git a/Pods/CoreGPX/Classes/GPXWaypoint.swift b/Pods/CoreGPX/Classes/GPXWaypoint.swift index 2fdd4582..a4caa3f0 100644 --- a/Pods/CoreGPX/Classes/GPXWaypoint.swift +++ b/Pods/CoreGPX/Classes/GPXWaypoint.swift @@ -241,6 +241,7 @@ public class GPXWaypoint: GPXElement, Codable { case "cmt": self.comment = child.text case "desc": self.desc = child.text case "src": self.source = child.text + case "link": self.link = GPXLink(raw: child) case "sym": self.symbol = child.text case "type": self.type = child.text case "fix": self.fix = GPXFix(rawValue: child.text ?? "none") @@ -304,7 +305,7 @@ public class GPXWaypoint: GPXElement, Codable { self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) self.addProperty(forValue: comment, gpx: gpx, tagName: "cmt", indentationLevel: indentationLevel) self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - self.addProperty(forValue: source, gpx: gpx, tagName: "source", indentationLevel: indentationLevel) + self.addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) if self.link != nil { self.link?.gpx(gpx, indentationLevel: indentationLevel) diff --git a/Pods/CoreGPX/README.md b/Pods/CoreGPX/README.md index dc56e3bc..f2787d90 100644 --- a/Pods/CoreGPX/README.md +++ b/Pods/CoreGPX/README.md @@ -5,17 +5,34 @@ Parse and generate GPX files easily on iOS, watchOS & macOS. +
+ + + + + + + + + + + + + + + +
+ + + + + + + + +

-[![CI Status](https://travis-ci.com/vincentneo/CoreGPX.svg?branch=master)](https://travis-ci.com/vincentneo/CoreGPX) -[![Swift Version](https://img.shields.io/badge/Swift-5.0-orange.svg)](https://swift.org/blog/swift-5-released/) -[![GPX Version](https://img.shields.io/badge/gpx-1.1-yellow.svg)](https://www.topografix.com/gpx/1/1/) -[![License](http://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) -[![Platform](https://img.shields.io/cocoapods/p/CoreGPX.svg?style=flat)](https://cocoapods.org/pods/CoreGPX) -[![Version](https://img.shields.io/cocoapods/v/CoreGPX.svg?style=flat)](https://cocoapods.org/pods/CoreGPX) -[![Carthage compatible](https://img.shields.io/badge/Carthage-✔-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-✔-brightgreen.svg)](https://github.com/apple/swift-package-manager) - ## What is CoreGPX? CoreGPX is a port of iOS-GPX-Framework to Swift language. @@ -29,6 +46,7 @@ As it makes use of `XMLParser` for parsing GPX files, CoreGPX is fully dependent - [x] Support for iOS, macOS & watchOS - [x] **(new)** Supports `Codable` in essential classes - [x] **(new)** Enhanced full support for `GPXExtensions` for both parsing and creating. +- [x] **(new)** Lossy GPX compression. Check out [GPXCompressor](https://github.com/vincentneo/GPXCompressor) for an implementation of this new feature. ## Documentation @@ -79,7 +97,7 @@ guard let gpx = GPXParser(withURL: inputURL)?.parsedData() else { return // do t // waypoints, tracks, tracksegements, trackpoints are all stored as Array depends on the amount stored in the GPX file. for waypoint in gpx.waypoints { // for loop example, every waypoint is written print(waypoint.latitude) // prints every waypoint's latitude, etc: 1.3521, as a Double object - print(waypoint.longitude) // prints every waypoint's latitude, etc: 103.8198, as a Double object + print(waypoint.longitude) // prints every waypoint's longitude, etc: 103.8198, as a Double object print(waypoint.time) // prints every waypoint's date, as a Date object print(waypoint.name) // prints every waypoint's name, as a String } @@ -187,5 +205,10 @@ To run the example project, simply clone the repo, and try it out straight away! Contributions to this project will be more than welcomed. Feel free to add a pull request or open an issue. If you require a feature that has yet to be available, do open an issue, describing why and what the feature could bring and how it would help you! +## Like the project? Check out these too! +- [iOS-Open-GPX-Tracker](https://github.com/merlos/iOS-Open-GPX-Tracker), an awesome open-sourced GPS tracker for iOS and watchOS. +- [Avenue GPX Viewer](https://github.com/vincentneo/Avenue-GPX-Viewer), a GPX file viewer, written for macOS 10.12 and above. +- [LocaleComplete](https://github.com/vincentneo/LocaleComplete), a small library to make `Locale` identifier hunting more easy and straightforward. + ## License CoreGPX is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 88aae30c..2e71e647 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,10 +1,10 @@ PODS: - - CoreGPX (0.7.4) - - MapCache (0.8.0) + - CoreGPX (0.8.1) + - MapCache (0.9.0) DEPENDENCIES: - CoreGPX - - MapCache (~> 0.8.0) + - MapCache (~> 0.9.0) SPEC REPOS: https://github.com/cocoapods/specs.git: @@ -12,9 +12,9 @@ SPEC REPOS: - MapCache SPEC CHECKSUMS: - CoreGPX: 9927a0158614c4baed08ecdb772fdc24efd92e49 - MapCache: dce6387196fb94e58f8ac3ae7b8ca6bda15f15ae + CoreGPX: 2d1deecae3c99674bb1165935c350f9c0e54e5ab + MapCache: b0a9f5f9a0ed7cbac45443fea0e7e03a97bf0c66 -PODFILE CHECKSUM: c49315bb353e7304cd79b1e2ecb18a9a923e10b3 +PODFILE CHECKSUM: c61e9630b0b0516aedcfdcf6798dbfb7fc6c0eef COCOAPODS: 1.7.5 diff --git a/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift b/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift index 87ff5312..86954514 100644 --- a/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift +++ b/Pods/MapCache/MapCache/Classes/CachedTileOverlay.swift @@ -15,7 +15,7 @@ import MapKit /// /// - SeeAlso: `MkMapView+MapCache` /// -public class CachedTileOverlay : MKTileOverlay { +open class CachedTileOverlay : MKTileOverlay { /// A class that implements the `MapCacheProtocol` let mapCache : MapCacheProtocol @@ -76,7 +76,6 @@ public class CachedTileOverlay : MKTileOverlay { let tileSize = mapCache.config.tileSize var z = scale.toZoomLevel(tileSize: tileSize) - // Represents the number of tiles the current tile is going to be divided var overZoom = 1 let tileSetMaxZ = mapCache.config.maximumZ if (z > tileSetMaxZ) { @@ -105,7 +104,7 @@ public class CachedTileOverlay : MKTileOverlay { guard rect.intersects(tileRect) else { continue } let path = MKTileOverlayPath(x: x, y: y, z: z, contentScaleFactor: scale) - let tile = ZoomableTile(maximumZPath: path, rect: tileRect, overZoom: Zoom(overZoom)) + let tile = ZoomableTile(maximumZPath: path, rect: tileRect, overZoom: overZoom) tiles.append(tile) } } diff --git a/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift b/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift index 6c0481e2..be11c793 100644 --- a/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift +++ b/Pods/MapCache/MapCache/Classes/CachedTileOverlayRenderer.swift @@ -17,11 +17,11 @@ import MapKit /// /// This renderer takes the maximumZ tile and extracts the portion that would correspond to the requested level. /// -class CachedTileOverlayRenderer: MKTileOverlayRenderer { +open class CachedTileOverlayRenderer: MKTileOverlayRenderer { /// Indicates if the renderer is ready to draw. It´s always true /// - SeeAlso: [MKOverlayRenderer](https://developer.apple.com/documentation/mapkit/mkoverlayrenderer) - override func canDraw(_ mapRect: MKMapRect, zoomScale: MKZoomScale) -> Bool { + public override func canDraw(_ mapRect: MKMapRect, zoomScale: MKZoomScale) -> Bool { // very important to call super.canDraw first, some sort of side effect happening which allows this to work (???). let _ = super.canDraw(mapRect, zoomScale: zoomScale) return true @@ -31,7 +31,7 @@ class CachedTileOverlayRenderer: MKTileOverlayRenderer { /// - Parameters: /// - mapRect: the map rect where the tiles need to be drawn /// - zoomScale: current zoom in the map - override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) { + public override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) { // use default rendering if the type of overlay is not CachedTileOverlay guard let cachedOverlay = overlay as? CachedTileOverlay else { diff --git a/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift b/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift index 10b333af..0f31a1f3 100644 --- a/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift +++ b/Pods/MapCache/MapCache/Classes/DiskCache/DiskCache.swift @@ -80,7 +80,7 @@ open class DiskCache { do { try FileManager.default.createDirectory(at: self.folderURL, withIntermediateDirectories: true, attributes: nil) } catch { - Log.error(message: "Failed to create directory \(folderURL.absoluteString)", error: error) + Log.error(message: "DiskCache::init --- Failed to create directory \(folderURL.absoluteString)", error: error) } self.capacity = capacity cacheQueue.async(execute: { @@ -107,7 +107,7 @@ open class DiskCache { /// Sets the data for the key synchronously. open func setDataSync(_ data: Data, forKey key: String) { let filePath = path(forKey: key) - + Log.debug(message: "DiskCache::setDataSync --- filePath: \(filePath) data count: \(data.count) key: \(key) diskBlocks:\(Double(data.count) / 4096.0)") //If the file exists get the current file diskSize. let fileURL = URL(fileURLWithPath: filePath) do { @@ -117,7 +117,7 @@ open class DiskCache { do { try data.write(to: URL(fileURLWithPath: filePath), options: Data.WritingOptions.atomicWrite) } catch { - Log.error(message: "Failed to write key \(key)", error: error) + Log.error(message: "DiskCache::setDataSync --- Failed to write key: \(key) filepath: \(filePath)", error: error) } //Now add to the diskSize the file size var diskBlocks = Double(data.count) / 4096.0 @@ -166,15 +166,15 @@ open class DiskCache { let filePath = self.folderURL.appendingPathComponent(filename).path do { try fileManager.removeItem(atPath: filePath) - print(" ------------- Removed path \(filename)") + Log.debug(message: "DiskCache::removeAllData --- Removed path \(filename)") } catch { - Log.error(message: "Failed to remove path \(filePath)", error: error) + Log.error(message: "DiskCache::removeAllData --- Failed to remove path \(filePath)", error: error) } } self.diskSize = self.calculateDiskSize() - print("++++++++++++++++ Size at the end \(self.diskSize)") + Log.debug(message: "DiskCache::removeAllData --- Size at the end \(self.diskSize)") } catch { - Log.error(message: "Failed to list directory", error: error) + Log.error(message: "DiskCache::removeAllData --- Failed to list directory", error: error) } if let completion = completion { DispatchQueue.main.async { @@ -193,7 +193,7 @@ open class DiskCache { do { try FileManager.default.removeItem(at: self.folderURL) } catch { - Log.error(message: "ERROR removing DiskCache folder", error: error) + Log.error(message: "Diskcache::removeCache --- Error removing DiskCache folder", error: error) } } @@ -206,7 +206,7 @@ open class DiskCache { if let data = getData() { self.setDataSync(data, forKey: key) } else { - Log.error(message: "Failed to get data for key \(key)") + Log.error(message: "DiskCache::updateAccessDate --- Failed to get data for key \(key)") } } }) @@ -220,7 +220,7 @@ open class DiskCache { currentSize = try fileManager.allocatedDiskSizeForDirectory(at: folderURL) } catch { - Log.error(message: "Failed to get diskSize of directory", error: error) + Log.error(message: "DiskCache::calculateDiskSize --- Failed to get diskSize of directory", error: error) } return currentSize } @@ -249,7 +249,7 @@ open class DiskCache { try fileManager.setAttributes([FileAttributeKey.modificationDate : now], ofItemAtPath: path) return true } catch { - Log.error(message: "Failed to update access date", error: error) + Log.error(message: "DiskCache::updateDiskAccessDate --- Failed to update access date", error: error) return false } } @@ -264,9 +264,9 @@ open class DiskCache { substract(diskSize: fileSize) } catch { if isNoSuchFileError(error) { - Log.error(message: "Failed to remove file. File not found", error: error) + Log.error(message: "DiskCache::removeFile --- Failed to remove file. File not found", error: error) } else { - Log.error(message: "Failed to remove file. Size or other error", error: error) + Log.error(message: "DiskCache::removeFile --- Failed to remove file. Size or other error", error: error) } } } @@ -279,7 +279,7 @@ open class DiskCache { if (self.diskSize >= diskSize) { self.diskSize -= diskSize } else { - Log.error(message: "Disk cache diskSize (\(self.diskSize)) is smaller than diskSize to substract (\(diskSize))") + Log.error(message: "DiskCache::diskSize --- (\(self.diskSize)) is smaller than diskSize to substract (\(diskSize))") self.diskSize = 0 } } diff --git a/Pods/MapCache/MapCache/Classes/Log.swift b/Pods/MapCache/MapCache/Classes/Log.swift index fe952a9d..8d6395f1 100644 --- a/Pods/MapCache/MapCache/Classes/Log.swift +++ b/Pods/MapCache/MapCache/Classes/Log.swift @@ -23,7 +23,7 @@ import Foundation /// ``` /// /// -struct Log { +public struct Log { /// The tag [MapCache] fileprivate static let tag = "[MapCache]" diff --git a/Pods/MapCache/MapCache/Classes/MapCache.swift b/Pods/MapCache/MapCache/Classes/MapCache.swift index 94e921b6..46419ca5 100644 --- a/Pods/MapCache/MapCache/Classes/MapCache.swift +++ b/Pods/MapCache/MapCache/Classes/MapCache.swift @@ -13,7 +13,7 @@ import MapKit /// This is the main implementation of the MapCacheProtocol, the actual cache /// -public class MapCache : MapCacheProtocol { +open class MapCache : MapCacheProtocol { /// /// Cofiguration that will be used to set up the behavior of the `MapCache` instance /// diff --git a/Pods/MapCache/MapCache/Classes/TileCoords.swift b/Pods/MapCache/MapCache/Classes/TileCoords.swift index d8f02762..95d691ff 100644 --- a/Pods/MapCache/MapCache/Classes/TileCoords.swift +++ b/Pods/MapCache/MapCache/Classes/TileCoords.swift @@ -18,13 +18,13 @@ public typealias Zoom = UInt8 public typealias TileNumber = UInt64 /// Errors for Zoom. -enum ZoomError: Error { +public enum ZoomError: Error { /// Zoom largest value is 19. case largerThan19 } /// Errors for a latitude. -enum LatitudeError: Error { +public enum LatitudeError: Error { /// Overflow if latitud is smaller than the minimum. case overflowMin /// Overflow if latitud is greater than the maximum. @@ -32,7 +32,7 @@ enum LatitudeError: Error { } /// Errors for a longitude. -enum LongitudeError: Error { +public enum LongitudeError: Error { /// Overflow if latitud is smaller than the minimum. case overflowMin /// Overflow if latitud is greater than the maximum. @@ -40,7 +40,7 @@ enum LongitudeError: Error { } /// Errors for a tile -enum TileError: Error { +public enum TileError: Error { /// Overflow in the tile case overflow } @@ -76,7 +76,7 @@ enum TileError: Error { /// All the wisdom of this class comes from: /// https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames /// -public class TileCoords { +open class TileCoords { /// Max value of latitude that can be retrieved with tiles (-85.0511 degrees) static let maxLatitude : Double = 85.0511 diff --git a/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift b/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift index 9e305a44..a980dc4b 100644 --- a/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift +++ b/Pods/MapCache/MapCache/Classes/TileCoordsRegion.swift @@ -35,7 +35,7 @@ import Foundation /// +---------------------++---------------------++---------------------+ /// /// -public class TileCoordsRegion { +open class TileCoordsRegion { /// Top left tile/coordinate. public var topLeft : TileCoords diff --git a/Pods/MapCache/MapCache/Classes/TileRange.swift b/Pods/MapCache/MapCache/Classes/TileRange.swift index c06f17aa..ba9a0ed8 100644 --- a/Pods/MapCache/MapCache/Classes/TileRange.swift +++ b/Pods/MapCache/MapCache/Classes/TileRange.swift @@ -8,7 +8,7 @@ import Foundation /// Errors for tile range -enum TileRangeError: Error { +public enum TileRangeError: Error { /// Error to be thrown in case of an issue during creation. case TileRangeCreation } diff --git a/Pods/MapCache/MapCache/Classes/ZoomableTile.swift b/Pods/MapCache/MapCache/Classes/ZoomableTile.swift index 4560d328..85691147 100644 --- a/Pods/MapCache/MapCache/Classes/ZoomableTile.swift +++ b/Pods/MapCache/MapCache/Classes/ZoomableTile.swift @@ -11,7 +11,7 @@ import MapKit /// /// Specifies a single tile and area of the tile that should upscaled. /// -struct ZoomableTile { +public struct ZoomableTile { /// Path for the tile with `maximumZ` supported by the tile server set in the config. /// This is the path with the best resolution tile from wich this zoomable tile can be interpolated. @@ -21,8 +21,12 @@ struct ZoomableTile { /// Rectangle area ocupied by this tile let rect: MKMapRect - /// Delta from given tile z to desired tile z. - /// Example: maximum zoom supported by the server is 20 and the desired tile is in zoom level 24, the delta is 4. - let overZoom: Zoom + /// Scale over the tile of the maximumZ path. + /// It is a multiple of 2 (2, 4, 8). + /// For a zoom larger than maximumZ represents the number of tiles the original tile is divided in + /// one axis. For example, overZoom=4 means that in each axis the tile is divided in 4 as well as + /// in the Y axis. So, the original tile at maximumZ is divided in 16 subtiles. + /// The `rect`tells us, among those tiles, which one is this tile. + let overZoom: Int } diff --git a/Pods/MapCache/README.md b/Pods/MapCache/README.md index a2774bb5..f90c5b32 100644 --- a/Pods/MapCache/README.md +++ b/Pods/MapCache/README.md @@ -14,13 +14,14 @@ The missing part of [MapKit](https://developer.apple.com/documentation/mapkit): Current features: * Automatically save tiles in a disk cache as user browses the map. -* You can to set cache capacity. Once the cache is full it will use a LRU (Least Recently Used) algorithm. +* Generation of interpolated tiles beyond maximum server zoom level (`{z}`) +* Cache capacity. Once the cache is full it will use a LRU (Least Recently Used) algorithm. * Get Current cache size * Clear existing cache * Download a full region of the map (experimental) +* Available [reference documentation](http://www.merlos.org/MapCache) What is coming: - * Improve documentation * Smart predownloading/caching: anticipate tiles that may be needed during network idle * Background cache updates downloads @@ -106,6 +107,8 @@ mapCache.calculateDiskSize() You can take a look at the [**Example/ folder**](https://github.com/merlos/MapCache/tree/master/Example/MapCache) to see a complete implementation. +A [Reference documentation](http://www.merlos.org/MapCache) is also available. + ## MapCache configuration Config map cache is pretty straight forward, typically you will need to set only `urlTemplate` and probably the `subdomains`. @@ -230,7 +233,7 @@ If you need further information you can take a look at ## License - MIT -Copyright (c) 2019-2020 Juan M. Merlos [@merlos](http://twitter.com/merlos), and contributors. +Copyright (c) 2019-2020 Juan M. Merlos [@merlos](http://twitter.com/merlos) and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 11445573..dfa48784 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -8,97 +8,99 @@ /* Begin PBXBuildFile section */ 0051F071C41EE79A1E0A27EE20E5B085 /* Pods-OpenGpxTracker-Watch Extension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ACC647A22F623093983DA656039BCC39 /* Pods-OpenGpxTracker-Watch Extension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 009062F9877D6BC0B5EBB94EE26181A6 /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */; }; - 0375EE2E92C662E84645B1B7B045E531 /* TileRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D67FB075DEA05080400263F50BEF253C /* TileRangeIterator.swift */; }; - 041CD9B69E76FB24E8F8DA7E4DF83256 /* CachedTileOverlayRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B2AFE1856369898D29D7DD5B9A1068A /* CachedTileOverlayRenderer.swift */; }; - 0A17EF26C41586A52FD0F5962E32E3BB /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */; }; - 0C772E8D6AE87CFF3980634D4CB2D8F2 /* ZoomRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65B4BAD4E12A8C423C1F521177B2BB6C /* ZoomRange.swift */; }; + 0375EE2E92C662E84645B1B7B045E531 /* TileRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154ED3149B0984FE2EB138CFC1C3F28C /* TileRangeIterator.swift */; }; + 041CD9B69E76FB24E8F8DA7E4DF83256 /* CachedTileOverlayRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E84238FA76D38D5F1E617CC39180ECF5 /* CachedTileOverlayRenderer.swift */; }; + 099C6D69BC1EF5F0B6A4B46D820F6A9D /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 566D0C27E6A668994B9E20DD35F378C5 /* GPXAuthor.swift */; }; + 0A913D53740CA1F21A2A4BA1B3F6EAFD /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54BE54D9EDFED0B797012F40A9464424 /* GPXRoutePoint.swift */; }; + 0C772E8D6AE87CFF3980634D4CB2D8F2 /* ZoomRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = C55C39EA4B61E066D762F8E07DA3D741 /* ZoomRange.swift */; }; 0D17527D7F4F848A264ECEBFB281A53A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */; }; - 107030F1982ABB361FFE86CB55AFDC16 /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */; }; - 12D17C49D1D78C45AA269B3AAF18D81E /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */; }; 1563F52C4589BEAE34FDFA4FD8AD4558 /* Pods-OpenGpxTracker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F48E60050E3150BF104D2316FA1C144 /* Pods-OpenGpxTracker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E5DFEFB3DC77CC15F41E0FECA3F3A31 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */; }; - 25B6302DB6939000B5EF749B59265B1D /* MapCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A2EB3E111AAF694C172E44D777068D8 /* MapCache-dummy.m */; }; - 26A27A1B3AFE785AFEEBF7647A3AA253 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89F414C094DE05C12057B20E10C5CE9E /* Log.swift */; }; - 2B5A89E0874574FF51352ACA145FCA5A /* MapCacheProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEEAAE6861DF69429716546DCB5DD19 /* MapCacheProtocol.swift */; }; - 2C56C05D43748A5652780B10AEE55652 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */; }; - 2D30C313F53F61A3DD4D71D8D9DE5D34 /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */; }; - 3006DA8C4ACEC8B1D7919414BBCC3C7B /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */; }; - 312D9BC80C5E8D0195025E21B13EC222 /* RegionDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C221067826D0447A87CFE92995927F2 /* RegionDownloader.swift */; }; - 35A73DC235D024AE79DE76F9A18DDD09 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */; }; - 412B5E2A93B344EE32D57B8CDCAB736E /* MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC9B244E86B1B9B7C3A82C92B680331 /* MapCache.swift */; }; - 420608CA619361F85C87352B59F99AD9 /* CoreGPX-watchOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C2C91E379F32D690954020D76CCE86B8 /* CoreGPX-watchOS-dummy.m */; }; + 1D35F909F90E1465EFD24429A05A6CE8 /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CBAAB942818A667798C1059BC333B32 /* DateTimeParsers.swift */; }; + 1E8E6A316A70E09AA0AE068C4052FA79 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E028D2276249FC5342A3BB05D6546FC /* GPXRoot.swift */; }; + 25B6302DB6939000B5EF749B59265B1D /* MapCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA3D3652A828B610A5D18D9D73058380 /* MapCache-dummy.m */; }; + 262D20D5AAA59F77AF61EDC84409E123 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1D3A3B7E808D57179A05038F9E8D1F /* GPXBounds.swift */; }; + 26A27A1B3AFE785AFEEBF7647A3AA253 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21AD1A21B75BAD52C8B40E0C68D569C5 /* Log.swift */; }; + 26F3D8E9EB1A11ABD5069EA272BF65BB /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895E962A76A43048D02B48C2B0ED813D /* GPXEmail.swift */; }; + 27FE38F0F44FBBA1286CBE21FF533D70 /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAED7BCE309E79C5A05754B7AB4B8C76 /* NSMutableString+XML.swift */; }; + 291D8D068B57BA580A372D8F1BEECA31 /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12B10B9C021B4C1EB5521F603045F40 /* GPXTrackSegment.swift */; }; + 29FF8240E736EF4B83F25CE89F5C83A4 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3830E14B708D7AB0D9B63F130D3042 /* GPXParser.swift */; }; + 2B5A89E0874574FF51352ACA145FCA5A /* MapCacheProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52176D270DE1B6AAFDAFD7E5EC31F1E2 /* MapCacheProtocol.swift */; }; + 2B95E69240AE1C4B707285B98D04C3F1 /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D02BF342B812F086CC1387B1FDC70A7 /* GPXWaypoint.swift */; }; + 2E6A361920A4E45D7BC804CAAF60629F /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B19B5E5391E1BD10154389744CFAD2 /* Converters.swift */; }; + 312D9BC80C5E8D0195025E21B13EC222 /* RegionDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656AE4CBE70DF5F5A5D56BCCA46895CE /* RegionDownloader.swift */; }; + 334C107F77D02EAE3FAEE75027642846 /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504034719DD0DB19256286F51BEB8EF1 /* GPXPointSegment.swift */; }; + 366641B6A8116DD407905F69FDFD0E30 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2A16E657FEAD4C56AA2F65A01F3F94C /* GPXError.swift */; }; + 412B5E2A93B344EE32D57B8CDCAB736E /* MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5935D9E3846F82CFF3B7E4BE8818BF /* MapCache.swift */; }; 42D0BAB0F4CE1722E881484B1BE3160B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; - 43013E97314F046F1375397503261FAF /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */; }; - 43E08817051E3364B6F2CC24C928F54F /* LoadTileMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC064B24DAF80027DC3257EC4EBB97D9 /* LoadTileMode.swift */; }; - 46226773B5C468E2F7F1375A904FBB06 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */; }; - 49DF2D1EF0E1859867D4867B27D5458F /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */; }; - 4D9CB99D76F28673C665ED494AEE13A9 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */; }; - 5153651B6BE1F467AA82E8FEABE3A127 /* CoreGPX-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0B41BF1EF4026DDA7AFE957BA641A0 /* CoreGPX-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5172547C32B319C8E182BE6A3FA94072 /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */; }; - 51F907CB337FB84E6979FF884B56610A /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */; }; - 5376F8C3B3547ECDBE3667EDF3BA5219 /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */; }; - 58FAE43FA4577895A9B7FDE6C268D5F0 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */; }; - 5AA7C37FDCDCBBFB5AECBCB3805F2875 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80821163141F0F8117650C1345828B5 /* GPXError.swift */; }; - 5E3244DCD8570F8B4E79F15703FCE72A /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */; }; - 5EDAAEEA92F9FBC307987C4532579C72 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */; }; - 618B6936A8979FA637CC195B73BFA571 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */; }; - 62FEDFC036FFB09D0439E8E5DBD74DD1 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */; }; - 63762975220A63D72236FF64F84E28E4 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */; }; - 64EB038F5F947A8ED5406BA15DD049FE /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */; }; - 654BF22B5735845268FB11A2F2ACB354 /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80821163141F0F8117650C1345828B5 /* GPXError.swift */; }; - 695DE091483BE3D820B51FA13012F775 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */; }; - 6B0E6136E1A46C685E8A7EC9B433A8FB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; - 6DF3C0198357F132325BAE47D50002C0 /* ZoomableTile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 468421C6F7FCD08F0B79F3FEF9604F8B /* ZoomableTile.swift */; }; - 6F634D1BD2438165DDF570613D5469A5 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */; }; - 70EE5EF537DD26C3211215D5615A3932 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */; }; - 741FC84507C11779BA12C56C9C21D80D /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */; }; - 77485EFA0FAF7EBBF5085756212C0FB2 /* MapCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CA7937AC1BC42AE7FAB402479DF51B6F /* MapCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7BE03A30129E4746B0CB56A40EE5642D /* MKTileOverlayPath+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1DF50AD03036FAABFBBC7F4EFF6A31C /* MKTileOverlayPath+MapCache.swift */; }; - 7D29673703BC46418F274CBC5C14A60D /* CoreGPX-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE232748F7B2BA73CE1A3F8B1E74FEE /* CoreGPX-iOS-dummy.m */; }; - 836519803F630D9F093EB968CE6AF589 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */; }; - 871385C4364090FF4EE7222150301D19 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */; }; - 8C302606B27B3F212B51A2A85CDEA8A2 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */; }; - 8C9AE2FC1392CC93678F534D20C705E0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */; }; - 8EAA95CC8C16FE5BE72426E94D45232A /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */; }; - 8F1B8DEAC05D0D3E5D72AD8C22071A00 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */; }; - 8F23CA2CA147503050CFC903BDF497EB /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */; }; - 8FA7EB9DBA0BB5F070061E9B2031701B /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */; }; - 941D993668AA41C37AF7319394107BB1 /* TileCoords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59247885B54F8930AD4F496A77591067 /* TileCoords.swift */; }; - 943F1CCA42130FF576D7E97D0C9BA39C /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */; }; - 97F1DAA08287D0EC866D97A8C4710614 /* String+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7358F0911BADCC9FDA1557086429677B /* String+DiskCache.swift */; }; - 9A3A289384D1E07371494FF3C2AA5D80 /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */; }; - 9B2DF887EAD080B7BD1B4F83339FE4EC /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */; }; - 9C830BA8C8637026C5E9AE501B0C5FCE /* MKMapView+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C8D2D5CC8DAE5FD408E1623ECDBFEC /* MKMapView+MapCache.swift */; }; - 9D4D8710743732371A6CD22F15FF0E11 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */; }; - 9FA12E3DBD8602DF0AE18CA2FBC2748C /* ZoomRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F396FA1CBD4144C467134B8541119C7 /* ZoomRangeIterator.swift */; }; - A0B60561FA2530E2C419FF2FE2959326 /* MapCacheConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D8423EBC93D6201AB2E2C875E229289 /* MapCacheConfig.swift */; }; - A506775F260622154170ABCEF83100D8 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */; }; - A66EF2DC60C754AA0122E88914B9F046 /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */; }; + 43E08817051E3364B6F2CC24C928F54F /* LoadTileMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = E56A1CEEF85232C90C0F18EAF8B29839 /* LoadTileMode.swift */; }; + 48549F12FAE4767F7A80B7BED4F95627 /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E028D2276249FC5342A3BB05D6546FC /* GPXRoot.swift */; }; + 48E4B2E6B34EF597BE4D5765E2DC4D20 /* GPXCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9752D22471E373BBE3470DEE4D98471 /* GPXCompression.swift */; }; + 49E98DC1863D8A221168317252B0F7A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */; }; + 4C61307CE33BB9456D8A930B2BE17544 /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA2D992E86C41ADDB38401631E10B50 /* GPXRoute.swift */; }; + 4D450D3E6ACEC24C83211B1803A45014 /* CoreGPX-watchOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 81436FE513DA5D8328E118C902128A15 /* CoreGPX-watchOS-dummy.m */; }; + 4D765B603EA6B4F813C4BBB4610F4FC4 /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1D3A3B7E808D57179A05038F9E8D1F /* GPXBounds.swift */; }; + 5CAA71A601AA0977B9A5E7F5358E6C00 /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D02BF342B812F086CC1387B1FDC70A7 /* GPXWaypoint.swift */; }; + 614C683D2065A67DCEE0ABECFFD326E9 /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544BACF6CCFC3C17BC6947AD55B3AC64 /* GPXTrack.swift */; }; + 61712DB9A3C9B0404788DEF0CDFEC6C2 /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12B10B9C021B4C1EB5521F603045F40 /* GPXTrackSegment.swift */; }; + 63ECD307D351F4CFD8B9C27E6568E134 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD32E9E8926FC69AA35D1176CBFE1FDA /* GPXCopyright.swift */; }; + 675F5E76BE806CD8B872C3E72467F023 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCE7804879FF576FB59EA80862DE424 /* GPXPerson.swift */; }; + 683A76B9A6E730F8C15ED3B96A8686C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; + 6DF3C0198357F132325BAE47D50002C0 /* ZoomableTile.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A246CDAB00E5290D82DEF92D7A074A /* ZoomableTile.swift */; }; + 70F8A650FA8E5E76DCBB2867D2AD0C29 /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD32E9E8926FC69AA35D1176CBFE1FDA /* GPXCopyright.swift */; }; + 7385A7A9C539517DFB0F12F2B3547E75 /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B89588C9327DFE6E42D9E2F82C45FC6 /* GPXFix.swift */; }; + 745E764D87694218C63E532135E952A5 /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC033F1A5449E815618D30B3044C1 /* GPXExtensionsElement.swift */; }; + 77485EFA0FAF7EBBF5085756212C0FB2 /* MapCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B567A8A54987BC3EB5028EC526C1E9B4 /* MapCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7BE03A30129E4746B0CB56A40EE5642D /* MKTileOverlayPath+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17AE21B935B0C18135FB65A28B0E6F0 /* MKTileOverlayPath+MapCache.swift */; }; + 8250B4D215F98E7CA8131942F41DA497 /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAED7BCE309E79C5A05754B7AB4B8C76 /* NSMutableString+XML.swift */; }; + 8B2EB93B33A61F340D5D0F38198887E7 /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA2D992E86C41ADDB38401631E10B50 /* GPXRoute.swift */; }; + 8EC3E13BC610182C4053E2606068DCBB /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1785855E5B1D1FF82C6CADC1B80B3E77 /* GPXLink.swift */; }; + 8F8461C8DB0F8DCBDF0BF57DF945F17E /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D4AC1371C46754E56049DF693B72672 /* GPXExtensions.swift */; }; + 93199F0F4FB898944E90FBE2D646A8B8 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B19B5E5391E1BD10154389744CFAD2 /* Converters.swift */; }; + 941D993668AA41C37AF7319394107BB1 /* TileCoords.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15BE207E7C96F40EB3ED42C2CD66D95 /* TileCoords.swift */; }; + 95389DE0EFA4E02CC683ECF5231D3107 /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CBAAB942818A667798C1059BC333B32 /* DateTimeParsers.swift */; }; + 97F1DAA08287D0EC866D97A8C4710614 /* String+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC145B978BE4553A552DC277D19B411F /* String+DiskCache.swift */; }; + 9A11B3B82D0AA316137499D8F6B052AE /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895E962A76A43048D02B48C2B0ED813D /* GPXEmail.swift */; }; + 9A3B79DD4BF22A27FF054545D83F6C88 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11B683E079318FA1A7C86E827BBA383 /* GPXMetadata.swift */; }; + 9A81DC9244629C91DB13BB7C7997249C /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D4AC1371C46754E56049DF693B72672 /* GPXExtensions.swift */; }; + 9AE91998A71CA56A71216BBC5EBD313C /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC033F1A5449E815618D30B3044C1 /* GPXExtensionsElement.swift */; }; + 9C830BA8C8637026C5E9AE501B0C5FCE /* MKMapView+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E2900F3B2C831FD4A8BB5F53676F22 /* MKMapView+MapCache.swift */; }; + 9FA12E3DBD8602DF0AE18CA2FBC2748C /* ZoomRangeIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F1B3A4996B1511EDA30B804959F0ACB /* ZoomRangeIterator.swift */; }; + 9FDACF3C1FB1F0C36E5E46B93CB36A40 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3830E14B708D7AB0D9B63F130D3042 /* GPXParser.swift */; }; + A0B60561FA2530E2C419FF2FE2959326 /* MapCacheConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1344CBF808EADD276368349E7C07DCA2 /* MapCacheConfig.swift */; }; AF400669D1D3B159A0E17AADDCF4E2AF /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 777D6AC9AD5B1E309E7EFBE542592CAC /* MapKit.framework */; }; - B284CAB0650646942C09CCF50DCBB8DD /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */; }; - B48DE77C180BCC2AF32970D85D66C2CF /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */; }; - B60DE171E0ABE3D2A6C67381F19595B9 /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */; }; + B29A9883DA64ED9238F7974280D61B3C /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2A16E657FEAD4C56AA2F65A01F3F94C /* GPXError.swift */; }; + B6526A95C424F5A65C08CACC002D8A37 /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54BE54D9EDFED0B797012F40A9464424 /* GPXRoutePoint.swift */; }; + B815917FC803F08BFC9C4E49CFD91224 /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CFB3D3BE9CE03B5043F16459E756648 /* GPXRawElement.swift */; }; C0F242B2CB8ADA68816EAE9A2FAE4112 /* Pods-OpenGpxTracker-Watch Extension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 57A236C1233AC0E09BB8F4F947211E82 /* Pods-OpenGpxTracker-Watch Extension-dummy.m */; }; - C15E6244EB32EE278FD8CC7AAE5E973D /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */; }; - C302B8A05364F3D5FA39822535CB1C20 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848B05EAE3F3BAAD88AFC7740E0A6C2C /* MD5.swift */; }; - C3CE80F691E604441201151C1542FCBE /* FileManager+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAF6090F534DF134AA7073BD40491CB /* FileManager+DiskCache.swift */; }; - CA02089B8130465A2308045DF6EDC2C7 /* CoreGPX-watchOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 15EED6EB217C84A054B784BB28CF700B /* CoreGPX-watchOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CC0CA1CE5F5219D7B9404F4307E650C3 /* CachedTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D929E30D122B203391F76E79F3D451 /* CachedTileOverlay.swift */; }; - D60203A041A730BE3DED9777C9823738 /* TileRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2BA57BA400F6937E611771CCF94C05B /* TileRange.swift */; }; - DCCA8F1F66CAA83CD1D88D98B6342067 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */; }; - DD1173A899B9DB47C5EBAFAF41A98888 /* RegionDownloaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5639CE67FF2A8442B101B0C79C5D2C48 /* RegionDownloaderDelegate.swift */; }; - E0E99A03DBBF6D1BA71FED141CFD87D3 /* DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B476B9D1912FD83D07E2C4110C0F17 /* DiskCache.swift */; }; - E1AE1CA9CB6D2461737600154B826EC5 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */; }; - E1B69E0E1568D6B8DAE8A6E312BD0BB4 /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */; }; + C302B8A05364F3D5FA39822535CB1C20 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D4C15D5870D2D1E1952624FA7A5FFC /* MD5.swift */; }; + C3CE80F691E604441201151C1542FCBE /* FileManager+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 605D9B7062385ABC898908A71E491A80 /* FileManager+DiskCache.swift */; }; + C7E35C15B68E52C31ACCAAF2A95D3A70 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1785855E5B1D1FF82C6CADC1B80B3E77 /* GPXLink.swift */; }; + C84EA6ED9CA6ED96237F2F9CE67E3942 /* GPXCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9752D22471E373BBE3470DEE4D98471 /* GPXCompression.swift */; }; + CC0CA1CE5F5219D7B9404F4307E650C3 /* CachedTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BB6AEA747D1DE75521505DBAEC76CE /* CachedTileOverlay.swift */; }; + CFCF69C6A6F289DF7DF3840784B45840 /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CFB3D3BE9CE03B5043F16459E756648 /* GPXRawElement.swift */; }; + D46DD9634D6A3632A7056251B6AE22B9 /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB39F543E587B9E63FA6FBBEDA171550 /* GPXTrackPoint.swift */; }; + D60203A041A730BE3DED9777C9823738 /* TileRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82DF91FDBB9AB8718F05E7E005B9745 /* TileRange.swift */; }; + D7374E60D9D1E4EE7994DB7290E0A9BA /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544BACF6CCFC3C17BC6947AD55B3AC64 /* GPXTrack.swift */; }; + D886383583C44F6F1B41C570CCF29314 /* CoreGPX-watchOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7211F281DC4F6321FBEFBBB7CDFF4BD8 /* CoreGPX-watchOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DBBACAF78429235067AF07A1507C7878 /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB39F543E587B9E63FA6FBBEDA171550 /* GPXTrackPoint.swift */; }; + DD1173A899B9DB47C5EBAFAF41A98888 /* RegionDownloaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73933B2F99C61DD7EEB2A109F490A01A /* RegionDownloaderDelegate.swift */; }; + DF1A8E06C319DAD140782AE994B77BF4 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11B683E079318FA1A7C86E827BBA383 /* GPXMetadata.swift */; }; + E0E99A03DBBF6D1BA71FED141CFD87D3 /* DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2A686EF5D9F3F2C049B40FD469DC1D /* DiskCache.swift */; }; + E4DC9E1BAA8E22B38734C9A3FEA6D8A0 /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BF21D17B9C82C8091DCC416187F1948 /* GPXElement.swift */; }; E67A06D5C12D739DBDAF6DAA699D55AE /* Pods-OpenGpxTracker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BD5E8F43EC1C8559EF6193B14855AE7 /* Pods-OpenGpxTracker-dummy.m */; }; - E7D461768AF6AF3EE4AA2EFCD3E70AAA /* URL+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506D45752B948FC2F8D878A4C4DCE6E5 /* URL+DiskCache.swift */; }; - ED6A6EF4385FCC472AF596F16083DE7F /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */; }; - EEF09ED996B646FCCAC72AEA941FA2E7 /* TileCoordsRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47D8CDC2B842B73A94F6CF799F3146CB /* TileCoordsRegion.swift */; }; + E7D461768AF6AF3EE4AA2EFCD3E70AAA /* URL+DiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53089BDE1100B9A77D92FCD3822B5070 /* URL+DiskCache.swift */; }; + E7D51833ABCFA88043E1024B4710D4C4 /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531D6CF55FBB4F5D1872A00C3B671D25 /* GPXPoint.swift */; }; + E96095BC9712053C48D1A0A591F779FC /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531D6CF55FBB4F5D1872A00C3B671D25 /* GPXPoint.swift */; }; + EB1EA9E9C1527976254F7754F283DC37 /* CoreGPX-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E16DA5334D1A047912B6F84AFAEFA82 /* CoreGPX-iOS-dummy.m */; }; + EDD1E519720F0A6116A01DD5374AA728 /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BF21D17B9C82C8091DCC416187F1948 /* GPXElement.swift */; }; + EE13CCD92558CD76C26D1382426477AB /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCE7804879FF576FB59EA80862DE424 /* GPXPerson.swift */; }; + EEF09ED996B646FCCAC72AEA941FA2E7 /* TileCoordsRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD788F8D723ED316D2C55ED052C5F2FF /* TileCoordsRegion.swift */; }; + F0A6FED3E288C641B9CB85D6853C2CCE /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B89588C9327DFE6E42D9E2F82C45FC6 /* GPXFix.swift */; }; + F171B4327F4A4E4DF104E45DCE9107C9 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 566D0C27E6A668994B9E20DD35F378C5 /* GPXAuthor.swift */; }; F37E5D553251C1080C36A9C64ACA219C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */; }; - F8A381DDDA9147EBA1F5600BD815F0D6 /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */; }; - FB2D25D799CD4266890309FB2FE6D99C /* MKZoomScale+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E897F17A3A8D93DF567E358F1D21697E /* MKZoomScale+MapCache.swift */; }; - FD432C8D38CA0E67CD1193C04314EC42 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */; }; + F45DBF7A6DCFF011CE4B7B0AE27B4C50 /* CoreGPX-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC1A07BD1D40618CC03767813C2E66F /* CoreGPX-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FB2D25D799CD4266890309FB2FE6D99C /* MKZoomScale+MapCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F81199CB287DE3FD8210D190C9FB09 /* MKZoomScale+MapCache.swift */; }; + FF2104F6BEB994B634C292136B1C8CE0 /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504034719DD0DB19256286F51BEB8EF1 /* GPXPointSegment.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -126,101 +128,102 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Converters.swift; path = Classes/Converters.swift; sourceTree = ""; }; - 028480ADA0CFB69206E51736A19F9040 /* CoreGPX-watchOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "CoreGPX-watchOS-Info.plist"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; sourceTree = ""; }; 03A5943D5AA54E62D24DAD0B19639777 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CoreGPX-iOS.xcconfig"; sourceTree = ""; }; 078E5B78D31CEDCC266B51303D291BCB /* Pods-OpenGpxTracker-Watch Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker-Watch Extension.debug.xcconfig"; sourceTree = ""; }; - 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXParser.swift; path = Classes/GPXParser.swift; sourceTree = ""; }; + 0831DB8D40B672B070DB8034B3C83AD7 /* MapCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MapCache-Info.plist"; sourceTree = ""; }; 115747451E3769DDB80BB07379405375 /* MapCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MapCache.framework; path = MapCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 15EED6EB217C84A054B784BB28CF700B /* CoreGPX-watchOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-umbrella.h"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-umbrella.h"; sourceTree = ""; }; - 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrack.swift; path = Classes/GPXTrack.swift; sourceTree = ""; }; + 1344CBF808EADD276368349E7C07DCA2 /* MapCacheConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheConfig.swift; path = MapCache/Classes/MapCacheConfig.swift; sourceTree = ""; }; + 154ED3149B0984FE2EB138CFC1C3F28C /* TileRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRangeIterator.swift; path = MapCache/Classes/TileRangeIterator.swift; sourceTree = ""; }; + 1785855E5B1D1FF82C6CADC1B80B3E77 /* GPXLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXLink.swift; path = Classes/GPXLink.swift; sourceTree = ""; }; 1BD5E8F43EC1C8559EF6193B14855AE7 /* Pods-OpenGpxTracker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OpenGpxTracker-dummy.m"; sourceTree = ""; }; - 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXElement.swift; path = Classes/GPXElement.swift; sourceTree = ""; }; - 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXMetadata.swift; path = Classes/GPXMetadata.swift; sourceTree = ""; }; - 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoutePoint.swift; path = Classes/GPXRoutePoint.swift; sourceTree = ""; }; - 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXLink.swift; path = Classes/GPXLink.swift; sourceTree = ""; }; - 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPointSegment.swift; path = Classes/GPXPointSegment.swift; sourceTree = ""; }; - 32C8D2D5CC8DAE5FD408E1623ECDBFEC /* MKMapView+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKMapView+MapCache.swift"; path = "MapCache/Classes/MKMapView+MapCache.swift"; sourceTree = ""; }; - 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoot.swift; path = Classes/GPXRoot.swift; sourceTree = ""; }; - 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MapCache.xcconfig; sourceTree = ""; }; - 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoute.swift; path = Classes/GPXRoute.swift; sourceTree = ""; }; - 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensionsElement.swift; path = Classes/GPXExtensionsElement.swift; sourceTree = ""; }; + 1F1D3A3B7E808D57179A05038F9E8D1F /* GPXBounds.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXBounds.swift; path = Classes/GPXBounds.swift; sourceTree = ""; }; + 21AD1A21B75BAD52C8B40E0C68D569C5 /* Log.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Log.swift; path = MapCache/Classes/Log.swift; sourceTree = ""; }; + 27ECF853495901051FF15483EC0D662C /* CoreGPX-watchOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-prefix.pch"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; sourceTree = ""; }; + 2AA2D992E86C41ADDB38401631E10B50 /* GPXRoute.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoute.swift; path = Classes/GPXRoute.swift; sourceTree = ""; }; + 2ACDC033F1A5449E815618D30B3044C1 /* GPXExtensionsElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensionsElement.swift; path = Classes/GPXExtensionsElement.swift; sourceTree = ""; }; + 2C0292468CBC25F4DE60B480132FF6BE /* MapCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-prefix.pch"; sourceTree = ""; }; + 2E16DA5334D1A047912B6F84AFAEFA82 /* CoreGPX-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CoreGPX-iOS-dummy.m"; sourceTree = ""; }; + 2F1B3A4996B1511EDA30B804959F0ACB /* ZoomRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRangeIterator.swift; path = MapCache/Classes/ZoomRangeIterator.swift; sourceTree = ""; }; + 39D4C15D5870D2D1E1952624FA7A5FFC /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = MapCache/Classes/DiskCache/MD5.swift; sourceTree = ""; }; + 3CB929F831D26118E52A4F2A7F74A3C2 /* CoreGPX-iOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CoreGPX-iOS.xcconfig"; sourceTree = ""; }; 3F48E60050E3150BF104D2316FA1C144 /* Pods-OpenGpxTracker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OpenGpxTracker-umbrella.h"; sourceTree = ""; }; - 3FE232748F7B2BA73CE1A3F8B1E74FEE /* CoreGPX-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CoreGPX-iOS-dummy.m"; sourceTree = ""; }; - 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackSegment.swift; path = Classes/GPXTrackSegment.swift; sourceTree = ""; }; - 468421C6F7FCD08F0B79F3FEF9604F8B /* ZoomableTile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomableTile.swift; path = MapCache/Classes/ZoomableTile.swift; sourceTree = ""; }; - 47D8CDC2B842B73A94F6CF799F3146CB /* TileCoordsRegion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoordsRegion.swift; path = MapCache/Classes/TileCoordsRegion.swift; sourceTree = ""; }; - 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTimeParsers.swift; path = Classes/DateTimeParsers.swift; sourceTree = ""; }; - 4D8423EBC93D6201AB2E2C875E229289 /* MapCacheConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheConfig.swift; path = MapCache/Classes/MapCacheConfig.swift; sourceTree = ""; }; - 506D45752B948FC2F8D878A4C4DCE6E5 /* URL+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+DiskCache.swift"; path = "MapCache/Classes/DiskCache/URL+DiskCache.swift"; sourceTree = ""; }; + 414D59061970B808426ED261B63568F0 /* CoreGPX-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-prefix.pch"; sourceTree = ""; }; + 4E2A686EF5D9F3F2C049B40FD469DC1D /* DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskCache.swift; path = MapCache/Classes/DiskCache/DiskCache.swift; sourceTree = ""; }; + 504034719DD0DB19256286F51BEB8EF1 /* GPXPointSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPointSegment.swift; path = Classes/GPXPointSegment.swift; sourceTree = ""; }; 5186880E91A7B0727CD5B90A0ACD9B22 /* Pods-OpenGpxTracker-Watch Extension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-Watch Extension-acknowledgements.plist"; sourceTree = ""; }; - 5639CE67FF2A8442B101B0C79C5D2C48 /* RegionDownloaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloaderDelegate.swift; path = MapCache/Classes/RegionDownloaderDelegate.swift; sourceTree = ""; }; + 52176D270DE1B6AAFDAFD7E5EC31F1E2 /* MapCacheProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheProtocol.swift; path = MapCache/Classes/MapCacheProtocol.swift; sourceTree = ""; }; + 53089BDE1100B9A77D92FCD3822B5070 /* URL+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+DiskCache.swift"; path = "MapCache/Classes/DiskCache/URL+DiskCache.swift"; sourceTree = ""; }; + 531D6CF55FBB4F5D1872A00C3B671D25 /* GPXPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPoint.swift; path = Classes/GPXPoint.swift; sourceTree = ""; }; + 544BACF6CCFC3C17BC6947AD55B3AC64 /* GPXTrack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrack.swift; path = Classes/GPXTrack.swift; sourceTree = ""; }; + 54BE54D9EDFED0B797012F40A9464424 /* GPXRoutePoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoutePoint.swift; path = Classes/GPXRoutePoint.swift; sourceTree = ""; }; + 566D0C27E6A668994B9E20DD35F378C5 /* GPXAuthor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXAuthor.swift; path = Classes/GPXAuthor.swift; sourceTree = ""; }; 57A236C1233AC0E09BB8F4F947211E82 /* Pods-OpenGpxTracker-Watch Extension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OpenGpxTracker-Watch Extension-dummy.m"; sourceTree = ""; }; - 59247885B54F8930AD4F496A77591067 /* TileCoords.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoords.swift; path = MapCache/Classes/TileCoords.swift; sourceTree = ""; }; - 5A2EB3E111AAF694C172E44D777068D8 /* MapCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MapCache-dummy.m"; sourceTree = ""; }; - 5B5085D8B7976F2A72B7BFD97CBE25D2 /* MapCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-prefix.pch"; sourceTree = ""; }; - 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPerson.swift; path = Classes/GPXPerson.swift; sourceTree = ""; }; - 648D9012B748837AAE9FAF083A111C18 /* MapCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MapCache-Info.plist"; sourceTree = ""; }; - 65B4BAD4E12A8C423C1F521177B2BB6C /* ZoomRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRange.swift; path = MapCache/Classes/ZoomRange.swift; sourceTree = ""; }; - 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensions.swift; path = Classes/GPXExtensions.swift; sourceTree = ""; }; - 67B476B9D1912FD83D07E2C4110C0F17 /* DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiskCache.swift; path = MapCache/Classes/DiskCache/DiskCache.swift; sourceTree = ""; }; + 605D9B7062385ABC898908A71E491A80 /* FileManager+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+DiskCache.swift"; path = "MapCache/Classes/DiskCache/FileManager+DiskCache.swift"; sourceTree = ""; }; + 656AE4CBE70DF5F5A5D56BCCA46895CE /* RegionDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloader.swift; path = MapCache/Classes/RegionDownloader.swift; sourceTree = ""; }; 6DD862570929D701173800FC5B8781CF /* Pods-OpenGpxTracker-Watch Extension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-OpenGpxTracker-Watch Extension.modulemap"; sourceTree = ""; }; - 6E35B5FC97B0568CF89238C96D8567A6 /* MapCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MapCache.modulemap; sourceTree = ""; }; - 6F396FA1CBD4144C467134B8541119C7 /* ZoomRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRangeIterator.swift; path = MapCache/Classes/ZoomRangeIterator.swift; sourceTree = ""; }; - 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackPoint.swift; path = Classes/GPXTrackPoint.swift; sourceTree = ""; }; - 7358F0911BADCC9FDA1557086429677B /* String+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+DiskCache.swift"; path = "MapCache/Classes/DiskCache/String+DiskCache.swift"; sourceTree = ""; }; + 7211F281DC4F6321FBEFBBB7CDFF4BD8 /* CoreGPX-watchOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-umbrella.h"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-umbrella.h"; sourceTree = ""; }; + 73933B2F99C61DD7EEB2A109F490A01A /* RegionDownloaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloaderDelegate.swift; path = MapCache/Classes/RegionDownloaderDelegate.swift; sourceTree = ""; }; 73E097AB8D67061734EC7A63ABBF2E20 /* CoreGPX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CoreGPX.framework; path = "CoreGPX-watchOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXEmail.swift; path = Classes/GPXEmail.swift; sourceTree = ""; }; + 75BB6AEA747D1DE75521505DBAEC76CE /* CachedTileOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlay.swift; path = MapCache/Classes/CachedTileOverlay.swift; sourceTree = ""; }; 777D6AC9AD5B1E309E7EFBE542592CAC /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; - 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRawElement.swift; path = Classes/GPXRawElement.swift; sourceTree = ""; }; 7882EE95967EA16611254BD23321635B /* Pods-OpenGpxTracker-Watch Extension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-Watch Extension-Info.plist"; sourceTree = ""; }; 797EEC4171ED3C5633DA28C7D3F4502D /* Pods-OpenGpxTracker-Watch Extension-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-OpenGpxTracker-Watch Extension-frameworks.sh"; sourceTree = ""; }; - 7BAF6090F534DF134AA7073BD40491CB /* FileManager+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+DiskCache.swift"; path = "MapCache/Classes/DiskCache/FileManager+DiskCache.swift"; sourceTree = ""; }; - 7C3C3A0ABE34802BDF74DE131470E238 /* CoreGPX-watchOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CoreGPX-watchOS-prefix.pch"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; sourceTree = ""; }; - 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCopyright.swift; path = Classes/GPXCopyright.swift; sourceTree = ""; }; + 7BF21D17B9C82C8091DCC416187F1948 /* GPXElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXElement.swift; path = Classes/GPXElement.swift; sourceTree = ""; }; + 7F9DE7CD5599605CAD85629D964A5146 /* MapCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MapCache.modulemap; sourceTree = ""; }; + 81436FE513DA5D8328E118C902128A15 /* CoreGPX-watchOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CoreGPX-watchOS-dummy.m"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-dummy.m"; sourceTree = ""; }; 82F1E3501EE0EE229AFC92FE011CA6A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 848B05EAE3F3BAAD88AFC7740E0A6C2C /* MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MD5.swift; path = MapCache/Classes/DiskCache/MD5.swift; sourceTree = ""; }; - 89F414C094DE05C12057B20E10C5CE9E /* Log.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Log.swift; path = MapCache/Classes/Log.swift; sourceTree = ""; }; - 8B2AFE1856369898D29D7DD5B9A1068A /* CachedTileOverlayRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlayRenderer.swift; path = MapCache/Classes/CachedTileOverlayRenderer.swift; sourceTree = ""; }; - 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPoint.swift; path = Classes/GPXPoint.swift; sourceTree = ""; }; - 9C221067826D0447A87CFE92995927F2 /* RegionDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegionDownloader.swift; path = MapCache/Classes/RegionDownloader.swift; sourceTree = ""; }; + 83B19B5E5391E1BD10154389744CFAD2 /* Converters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Converters.swift; path = Classes/Converters.swift; sourceTree = ""; }; + 895E962A76A43048D02B48C2B0ED813D /* GPXEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXEmail.swift; path = Classes/GPXEmail.swift; sourceTree = ""; }; + 89E3F25A8DAF4D82790CD3AB73178379 /* CoreGPX-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CoreGPX-iOS-Info.plist"; sourceTree = ""; }; + 8B89588C9327DFE6E42D9E2F82C45FC6 /* GPXFix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXFix.swift; path = Classes/GPXFix.swift; sourceTree = ""; }; + 8CBAAB942818A667798C1059BC333B32 /* DateTimeParsers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTimeParsers.swift; path = Classes/DateTimeParsers.swift; sourceTree = ""; }; + 8CFB3D3BE9CE03B5043F16459E756648 /* GPXRawElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRawElement.swift; path = Classes/GPXRawElement.swift; sourceTree = ""; }; + 8D02BF342B812F086CC1387B1FDC70A7 /* GPXWaypoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXWaypoint.swift; path = Classes/GPXWaypoint.swift; sourceTree = ""; }; + 8D4AC1371C46754E56049DF693B72672 /* GPXExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensions.swift; path = Classes/GPXExtensions.swift; sourceTree = ""; }; + 9A553B6B70C4B1C9F85F9C329B0D027C /* CoreGPX-watchOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "CoreGPX-watchOS.modulemap"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; sourceTree = ""; }; + 9B3830E14B708D7AB0D9B63F130D3042 /* GPXParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXParser.swift; path = Classes/GPXParser.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXBounds.swift; path = Classes/GPXBounds.swift; sourceTree = ""; }; - 9EEEAAE6861DF69429716546DCB5DD19 /* MapCacheProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCacheProtocol.swift; path = MapCache/Classes/MapCacheProtocol.swift; sourceTree = ""; }; - A1DF50AD03036FAABFBBC7F4EFF6A31C /* MKTileOverlayPath+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKTileOverlayPath+MapCache.swift"; path = "MapCache/Classes/MKTileOverlayPath+MapCache.swift"; sourceTree = ""; }; + 9E028D2276249FC5342A3BB05D6546FC /* GPXRoot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoot.swift; path = Classes/GPXRoot.swift; sourceTree = ""; }; + 9FDD439BF400AAC13DAA95F3B38C07D3 /* MapCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MapCache.xcconfig; sourceTree = ""; }; + 9FECF647E1C43F48E457FE3B8F3A5A1C /* CoreGPX-watchOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "CoreGPX-watchOS-Info.plist"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; sourceTree = ""; }; + A15BE207E7C96F40EB3ED42C2CD66D95 /* TileCoords.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoords.swift; path = MapCache/Classes/TileCoords.swift; sourceTree = ""; }; A2E63597C890C9957E7BE7DC463D9F45 /* Pods-OpenGpxTracker-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-OpenGpxTracker-acknowledgements.markdown"; sourceTree = ""; }; A68164FEC7AC344ECCFCE91085E5426A /* Pods-OpenGpxTracker-Watch Extension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-OpenGpxTracker-Watch Extension-acknowledgements.markdown"; sourceTree = ""; }; - A80821163141F0F8117650C1345828B5 /* GPXError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXError.swift; path = Classes/GPXError.swift; sourceTree = ""; }; + A9752D22471E373BBE3470DEE4D98471 /* GPXCompression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCompression.swift; path = Classes/GPXCompression.swift; sourceTree = ""; }; + AAC5B303EB04086031DA30967E93F218 /* CoreGPX-watchOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "CoreGPX-watchOS.xcconfig"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.xcconfig"; sourceTree = ""; }; ACC647A22F623093983DA656039BCC39 /* Pods-OpenGpxTracker-Watch Extension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OpenGpxTracker-Watch Extension-umbrella.h"; sourceTree = ""; }; - AEC9B244E86B1B9B7C3A82C92B680331 /* MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCache.swift; path = MapCache/Classes/MapCache.swift; sourceTree = ""; }; - AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "CoreGPX-watchOS.xcconfig"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.xcconfig"; sourceTree = ""; }; + AD788F8D723ED316D2C55ED052C5F2FF /* TileCoordsRegion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileCoordsRegion.swift; path = MapCache/Classes/TileCoordsRegion.swift; sourceTree = ""; }; + B11B683E079318FA1A7C86E827BBA383 /* GPXMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXMetadata.swift; path = Classes/GPXMetadata.swift; sourceTree = ""; }; + B17AE21B935B0C18135FB65A28B0E6F0 /* MKTileOverlayPath+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKTileOverlayPath+MapCache.swift"; path = "MapCache/Classes/MKTileOverlayPath+MapCache.swift"; sourceTree = ""; }; B18FC1D6D85686B9480155EEDEC49DA1 /* Pods-OpenGpxTracker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker.debug.xcconfig"; sourceTree = ""; }; - B69D2F031C2DD6F9887624CF0347BD51 /* CoreGPX-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "CoreGPX-iOS.modulemap"; sourceTree = ""; }; - B927F65DA1019B281FB628C7320274F0 /* CoreGPX-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-prefix.pch"; sourceTree = ""; }; + B2A16E657FEAD4C56AA2F65A01F3F94C /* GPXError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXError.swift; path = Classes/GPXError.swift; sourceTree = ""; }; + B3B1608E7BDBB3D1B23C4EB45C364C32 /* CoreGPX-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "CoreGPX-iOS.modulemap"; sourceTree = ""; }; + B567A8A54987BC3EB5028EC526C1E9B4 /* MapCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-umbrella.h"; sourceTree = ""; }; BB28532C209E3063F9373DFB929A840D /* Pods_OpenGpxTracker.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_OpenGpxTracker.framework; path = "Pods-OpenGpxTracker.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - BC064B24DAF80027DC3257EC4EBB97D9 /* LoadTileMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadTileMode.swift; path = MapCache/Classes/LoadTileMode.swift; sourceTree = ""; }; - BF0B41BF1EF4026DDA7AFE957BA641A0 /* CoreGPX-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-umbrella.h"; sourceTree = ""; }; - C2C91E379F32D690954020D76CCE86B8 /* CoreGPX-watchOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CoreGPX-watchOS-dummy.m"; path = "../CoreGPX-watchOS/CoreGPX-watchOS-dummy.m"; sourceTree = ""; }; - C2F0B8F9C22D2E7D0D313C7AC102022F /* CoreGPX-watchOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "CoreGPX-watchOS.modulemap"; path = "../CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; sourceTree = ""; }; - C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSMutableString+XML.swift"; path = "Classes/NSMutableString+XML.swift"; sourceTree = ""; }; + BB39F543E587B9E63FA6FBBEDA171550 /* GPXTrackPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackPoint.swift; path = Classes/GPXTrackPoint.swift; sourceTree = ""; }; + BCC1A07BD1D40618CC03767813C2E66F /* CoreGPX-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-iOS-umbrella.h"; sourceTree = ""; }; + C55C39EA4B61E066D762F8E07DA3D741 /* ZoomRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomRange.swift; path = MapCache/Classes/ZoomRange.swift; sourceTree = ""; }; C5C1D4A56AD0F3360E927F474B255D47 /* Pods-OpenGpxTracker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker.release.xcconfig"; sourceTree = ""; }; - C9D929E30D122B203391F76E79F3D451 /* CachedTileOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlay.swift; path = MapCache/Classes/CachedTileOverlay.swift; sourceTree = ""; }; - CA7937AC1BC42AE7FAB402479DF51B6F /* MapCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MapCache-umbrella.h"; sourceTree = ""; }; + CA3D3652A828B610A5D18D9D73058380 /* MapCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MapCache-dummy.m"; sourceTree = ""; }; + CD32E9E8926FC69AA35D1176CBFE1FDA /* GPXCopyright.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCopyright.swift; path = Classes/GPXCopyright.swift; sourceTree = ""; }; + CDCE7804879FF576FB59EA80862DE424 /* GPXPerson.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPerson.swift; path = Classes/GPXPerson.swift; sourceTree = ""; }; CFF13F6F7F8932222CD5F2B41321A72F /* Pods-OpenGpxTracker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-OpenGpxTracker.modulemap"; sourceTree = ""; }; D1F6F978401AA9203C0068794566FB46 /* Pods-OpenGpxTracker-Watch Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OpenGpxTracker-Watch Extension.release.xcconfig"; sourceTree = ""; }; - D2BA57BA400F6937E611771CCF94C05B /* TileRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRange.swift; path = MapCache/Classes/TileRange.swift; sourceTree = ""; }; - D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXFix.swift; path = Classes/GPXFix.swift; sourceTree = ""; }; D5AB2CCD36447D3D914BCD88DF72C30B /* Pods-OpenGpxTracker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-Info.plist"; sourceTree = ""; }; - D67FB075DEA05080400263F50BEF253C /* TileRangeIterator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRangeIterator.swift; path = MapCache/Classes/TileRangeIterator.swift; sourceTree = ""; }; + D82DF91FDBB9AB8718F05E7E005B9745 /* TileRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TileRange.swift; path = MapCache/Classes/TileRange.swift; sourceTree = ""; }; + DAED7BCE309E79C5A05754B7AB4B8C76 /* NSMutableString+XML.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSMutableString+XML.swift"; path = "Classes/NSMutableString+XML.swift"; sourceTree = ""; }; + DE5935D9E3846F82CFF3B7E4BE8818BF /* MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapCache.swift; path = MapCache/Classes/MapCache.swift; sourceTree = ""; }; E2743C4C98C8F0EEEB54228B67543388 /* Pods-OpenGpxTracker-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OpenGpxTracker-acknowledgements.plist"; sourceTree = ""; }; + E56A1CEEF85232C90C0F18EAF8B29839 /* LoadTileMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadTileMode.swift; path = MapCache/Classes/LoadTileMode.swift; sourceTree = ""; }; E5A52280BF76FE36D8C9028535627888 /* Pods-OpenGpxTracker-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-OpenGpxTracker-frameworks.sh"; sourceTree = ""; }; - E7AF5A757CA353CB80FF808CD858DB06 /* CoreGPX-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CoreGPX-iOS-Info.plist"; sourceTree = ""; }; - E897F17A3A8D93DF567E358F1D21697E /* MKZoomScale+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKZoomScale+MapCache.swift"; path = "MapCache/Classes/MKZoomScale+MapCache.swift"; sourceTree = ""; }; + E84238FA76D38D5F1E617CC39180ECF5 /* CachedTileOverlayRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedTileOverlayRenderer.swift; path = MapCache/Classes/CachedTileOverlayRenderer.swift; sourceTree = ""; }; E9C30547DF968C73398DDA33A4BBDFB3 /* CoreGPX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CoreGPX.framework; path = "CoreGPX-iOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXAuthor.swift; path = Classes/GPXAuthor.swift; sourceTree = ""; }; + F0E2900F3B2C831FD4A8BB5F53676F22 /* MKMapView+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKMapView+MapCache.swift"; path = "MapCache/Classes/MKMapView+MapCache.swift"; sourceTree = ""; }; F0FF0F6580378BD21A07C3AFAA1FFFA0 /* Pods_OpenGpxTracker_Watch_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_OpenGpxTracker_Watch_Extension.framework; path = "Pods-OpenGpxTracker-Watch Extension.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXWaypoint.swift; path = Classes/GPXWaypoint.swift; sourceTree = ""; }; + F12B10B9C021B4C1EB5521F603045F40 /* GPXTrackSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackSegment.swift; path = Classes/GPXTrackSegment.swift; sourceTree = ""; }; + F3A246CDAB00E5290D82DEF92D7A074A /* ZoomableTile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ZoomableTile.swift; path = MapCache/Classes/ZoomableTile.swift; sourceTree = ""; }; + F3F81199CB287DE3FD8210D190C9FB09 /* MKZoomScale+MapCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MKZoomScale+MapCache.swift"; path = "MapCache/Classes/MKZoomScale+MapCache.swift"; sourceTree = ""; }; + FC145B978BE4553A552DC277D19B411F /* String+DiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+DiskCache.swift"; path = "MapCache/Classes/DiskCache/String+DiskCache.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -232,36 +235,36 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 247E06C9D80C1F48A842B223A4C64B22 /* Frameworks */ = { + 1FD841B0289056364E0C07587208F856 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0D17527D7F4F848A264ECEBFB281A53A /* Foundation.framework in Frameworks */, + 49E98DC1863D8A221168317252B0F7A3 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8CC81CC3D830FF4BB0C98F0CDD1EB074 /* Frameworks */ = { + 2175E110B6C829CE3CEE0B995EE800B4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6B0E6136E1A46C685E8A7EC9B433A8FB /* Foundation.framework in Frameworks */, + 683A76B9A6E730F8C15ED3B96A8686C2 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A7CFDE07CFAC9DF29E57AA54350FA102 /* Frameworks */ = { + 247E06C9D80C1F48A842B223A4C64B22 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F37E5D553251C1080C36A9C64ACA219C /* Foundation.framework in Frameworks */, - AF400669D1D3B159A0E17AADDCF4E2AF /* MapKit.framework in Frameworks */, + 0D17527D7F4F848A264ECEBFB281A53A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BDA085649C514E029142C0F51CE26E44 /* Frameworks */ = { + A7CFDE07CFAC9DF29E57AA54350FA102 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8C9AE2FC1392CC93678F534D20C705E0 /* Foundation.framework in Frameworks */, + F37E5D553251C1080C36A9C64ACA219C /* Foundation.framework in Frameworks */, + AF400669D1D3B159A0E17AADDCF4E2AF /* MapKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -277,6 +280,42 @@ name = Frameworks; sourceTree = ""; }; + 0C9D8D009FA31B254C2C9E210636CBB3 /* CoreGPX */ = { + isa = PBXGroup; + children = ( + 83B19B5E5391E1BD10154389744CFAD2 /* Converters.swift */, + 8CBAAB942818A667798C1059BC333B32 /* DateTimeParsers.swift */, + 566D0C27E6A668994B9E20DD35F378C5 /* GPXAuthor.swift */, + 1F1D3A3B7E808D57179A05038F9E8D1F /* GPXBounds.swift */, + A9752D22471E373BBE3470DEE4D98471 /* GPXCompression.swift */, + CD32E9E8926FC69AA35D1176CBFE1FDA /* GPXCopyright.swift */, + 7BF21D17B9C82C8091DCC416187F1948 /* GPXElement.swift */, + 895E962A76A43048D02B48C2B0ED813D /* GPXEmail.swift */, + B2A16E657FEAD4C56AA2F65A01F3F94C /* GPXError.swift */, + 8D4AC1371C46754E56049DF693B72672 /* GPXExtensions.swift */, + 2ACDC033F1A5449E815618D30B3044C1 /* GPXExtensionsElement.swift */, + 8B89588C9327DFE6E42D9E2F82C45FC6 /* GPXFix.swift */, + 1785855E5B1D1FF82C6CADC1B80B3E77 /* GPXLink.swift */, + B11B683E079318FA1A7C86E827BBA383 /* GPXMetadata.swift */, + 9B3830E14B708D7AB0D9B63F130D3042 /* GPXParser.swift */, + CDCE7804879FF576FB59EA80862DE424 /* GPXPerson.swift */, + 531D6CF55FBB4F5D1872A00C3B671D25 /* GPXPoint.swift */, + 504034719DD0DB19256286F51BEB8EF1 /* GPXPointSegment.swift */, + 8CFB3D3BE9CE03B5043F16459E756648 /* GPXRawElement.swift */, + 9E028D2276249FC5342A3BB05D6546FC /* GPXRoot.swift */, + 2AA2D992E86C41ADDB38401631E10B50 /* GPXRoute.swift */, + 54BE54D9EDFED0B797012F40A9464424 /* GPXRoutePoint.swift */, + 544BACF6CCFC3C17BC6947AD55B3AC64 /* GPXTrack.swift */, + BB39F543E587B9E63FA6FBBEDA171550 /* GPXTrackPoint.swift */, + F12B10B9C021B4C1EB5521F603045F40 /* GPXTrackSegment.swift */, + 8D02BF342B812F086CC1387B1FDC70A7 /* GPXWaypoint.swift */, + DAED7BCE309E79C5A05754B7AB4B8C76 /* NSMutableString+XML.swift */, + F53EBAF130E4E1DFFF0535E479D717D8 /* Support Files */, + ); + name = CoreGPX; + path = CoreGPX; + sourceTree = ""; + }; 10BAB8A7894F634629C3D5D731E26E72 /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -307,18 +346,37 @@ name = iOS; sourceTree = ""; }; - 4FF1A62C1F86DD95501EA84A61457BA0 /* Support Files */ = { + 65BCEC35BEC44B422ACC4D7D0FF88759 /* MapCache */ = { isa = PBXGroup; children = ( - 6E35B5FC97B0568CF89238C96D8567A6 /* MapCache.modulemap */, - 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */, - 5A2EB3E111AAF694C172E44D777068D8 /* MapCache-dummy.m */, - 648D9012B748837AAE9FAF083A111C18 /* MapCache-Info.plist */, - 5B5085D8B7976F2A72B7BFD97CBE25D2 /* MapCache-prefix.pch */, - CA7937AC1BC42AE7FAB402479DF51B6F /* MapCache-umbrella.h */, + 75BB6AEA747D1DE75521505DBAEC76CE /* CachedTileOverlay.swift */, + E84238FA76D38D5F1E617CC39180ECF5 /* CachedTileOverlayRenderer.swift */, + 4E2A686EF5D9F3F2C049B40FD469DC1D /* DiskCache.swift */, + 605D9B7062385ABC898908A71E491A80 /* FileManager+DiskCache.swift */, + E56A1CEEF85232C90C0F18EAF8B29839 /* LoadTileMode.swift */, + 21AD1A21B75BAD52C8B40E0C68D569C5 /* Log.swift */, + DE5935D9E3846F82CFF3B7E4BE8818BF /* MapCache.swift */, + 1344CBF808EADD276368349E7C07DCA2 /* MapCacheConfig.swift */, + 52176D270DE1B6AAFDAFD7E5EC31F1E2 /* MapCacheProtocol.swift */, + 39D4C15D5870D2D1E1952624FA7A5FFC /* MD5.swift */, + F0E2900F3B2C831FD4A8BB5F53676F22 /* MKMapView+MapCache.swift */, + B17AE21B935B0C18135FB65A28B0E6F0 /* MKTileOverlayPath+MapCache.swift */, + F3F81199CB287DE3FD8210D190C9FB09 /* MKZoomScale+MapCache.swift */, + 656AE4CBE70DF5F5A5D56BCCA46895CE /* RegionDownloader.swift */, + 73933B2F99C61DD7EEB2A109F490A01A /* RegionDownloaderDelegate.swift */, + FC145B978BE4553A552DC277D19B411F /* String+DiskCache.swift */, + A15BE207E7C96F40EB3ED42C2CD66D95 /* TileCoords.swift */, + AD788F8D723ED316D2C55ED052C5F2FF /* TileCoordsRegion.swift */, + D82DF91FDBB9AB8718F05E7E005B9745 /* TileRange.swift */, + 154ED3149B0984FE2EB138CFC1C3F28C /* TileRangeIterator.swift */, + 53089BDE1100B9A77D92FCD3822B5070 /* URL+DiskCache.swift */, + F3A246CDAB00E5290D82DEF92D7A074A /* ZoomableTile.swift */, + C55C39EA4B61E066D762F8E07DA3D741 /* ZoomRange.swift */, + 2F1B3A4996B1511EDA30B804959F0ACB /* ZoomRangeIterator.swift */, + 6D4DEB928D4D78EC13456FF3AB1A95D6 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/MapCache"; + name = MapCache; + path = MapCache; sourceTree = ""; }; 69AD0D65D9C064ADA517276C9233866F /* Pods-OpenGpxTracker-Watch Extension */ = { @@ -338,109 +396,35 @@ path = "Target Support Files/Pods-OpenGpxTracker-Watch Extension"; sourceTree = ""; }; - 99610597C5CA682DD838583D2757816D /* CoreGPX */ = { + 6D4DEB928D4D78EC13456FF3AB1A95D6 /* Support Files */ = { isa = PBXGroup; children = ( - 01EB9467CF164D3B42B542027383FCF6 /* Converters.swift */, - 49F244763577F7FA16D8B77372D51418 /* DateTimeParsers.swift */, - EE0DB8D22275478C9DD70130DE01012E /* GPXAuthor.swift */, - 9E2676D245D189BBC85BCD209DD63045 /* GPXBounds.swift */, - 8030BF79D8771C4B30A662B4C2B93825 /* GPXCopyright.swift */, - 1D2859CA5063334FFF3D37BEBB0EE346 /* GPXElement.swift */, - 74A789DC1DDB3466F86E5A918F7B38C2 /* GPXEmail.swift */, - A80821163141F0F8117650C1345828B5 /* GPXError.swift */, - 66A0B518635D9233BD500C9CB965A2F2 /* GPXExtensions.swift */, - 39D60510EAAF0E7D9AED89C951809BB9 /* GPXExtensionsElement.swift */, - D43379D22591E5FA8A2220C6BB903E83 /* GPXFix.swift */, - 27E0D35DD2FF1006DA5917D73274FDCA /* GPXLink.swift */, - 21F36F49445E3D85C46ECC62E39205D5 /* GPXMetadata.swift */, - 10F11C45AF621866D80F4EF0094CDBCC /* GPXParser.swift */, - 608CEAB01E96FCE2362A646041E6F049 /* GPXPerson.swift */, - 9539BBC924BF9DDF72C371676DC2AD20 /* GPXPoint.swift */, - 2B441BE6DDDE6C80EEAAE7A006B9C92D /* GPXPointSegment.swift */, - 7833D81490B08F2FDFEB11DFB684C4E4 /* GPXRawElement.swift */, - 376C2D5DC8715719030BEDA099AE2AEF /* GPXRoot.swift */, - 38D791400359C22616EE3ED0E8391D06 /* GPXRoute.swift */, - 22A8A4078DAC17CEDD55FF7D3FFCFFD8 /* GPXRoutePoint.swift */, - 15F2F1876AF08675C6FA5DA9DD035872 /* GPXTrack.swift */, - 6FAE7E9914B27AB44E0038CDCC391E94 /* GPXTrackPoint.swift */, - 45865C56BED4E2C4DC1E7BAD42D9EDA8 /* GPXTrackSegment.swift */, - FBC71D22F1080328436423F272AB35A8 /* GPXWaypoint.swift */, - C4A21CC00AEE2DE715F688B555DCBB44 /* NSMutableString+XML.swift */, - A15C81CC7BC7F8259B1159211955821F /* Support Files */, - ); - name = CoreGPX; - path = CoreGPX; - sourceTree = ""; - }; - A15C81CC7BC7F8259B1159211955821F /* Support Files */ = { - isa = PBXGroup; - children = ( - B69D2F031C2DD6F9887624CF0347BD51 /* CoreGPX-iOS.modulemap */, - 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */, - 3FE232748F7B2BA73CE1A3F8B1E74FEE /* CoreGPX-iOS-dummy.m */, - E7AF5A757CA353CB80FF808CD858DB06 /* CoreGPX-iOS-Info.plist */, - B927F65DA1019B281FB628C7320274F0 /* CoreGPX-iOS-prefix.pch */, - BF0B41BF1EF4026DDA7AFE957BA641A0 /* CoreGPX-iOS-umbrella.h */, - C2F0B8F9C22D2E7D0D313C7AC102022F /* CoreGPX-watchOS.modulemap */, - AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */, - C2C91E379F32D690954020D76CCE86B8 /* CoreGPX-watchOS-dummy.m */, - 028480ADA0CFB69206E51736A19F9040 /* CoreGPX-watchOS-Info.plist */, - 7C3C3A0ABE34802BDF74DE131470E238 /* CoreGPX-watchOS-prefix.pch */, - 15EED6EB217C84A054B784BB28CF700B /* CoreGPX-watchOS-umbrella.h */, + 7F9DE7CD5599605CAD85629D964A5146 /* MapCache.modulemap */, + 9FDD439BF400AAC13DAA95F3B38C07D3 /* MapCache.xcconfig */, + CA3D3652A828B610A5D18D9D73058380 /* MapCache-dummy.m */, + 0831DB8D40B672B070DB8034B3C83AD7 /* MapCache-Info.plist */, + 2C0292468CBC25F4DE60B480132FF6BE /* MapCache-prefix.pch */, + B567A8A54987BC3EB5028EC526C1E9B4 /* MapCache-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/CoreGPX-iOS"; + path = "../Target Support Files/MapCache"; sourceTree = ""; }; - AFFB3AD9C2AE50CFE9C67E4869730C79 /* Pods */ = { + 958143A361BC2D6B0392E7109CBE4F82 /* Pods */ = { isa = PBXGroup; children = ( - 99610597C5CA682DD838583D2757816D /* CoreGPX */, - CB8EF991DE62863D8CF24A496AB755B9 /* MapCache */, + 0C9D8D009FA31B254C2C9E210636CBB3 /* CoreGPX */, + 65BCEC35BEC44B422ACC4D7D0FF88759 /* MapCache */, ); name = Pods; sourceTree = ""; }; - CB8EF991DE62863D8CF24A496AB755B9 /* MapCache */ = { - isa = PBXGroup; - children = ( - C9D929E30D122B203391F76E79F3D451 /* CachedTileOverlay.swift */, - 8B2AFE1856369898D29D7DD5B9A1068A /* CachedTileOverlayRenderer.swift */, - 67B476B9D1912FD83D07E2C4110C0F17 /* DiskCache.swift */, - 7BAF6090F534DF134AA7073BD40491CB /* FileManager+DiskCache.swift */, - BC064B24DAF80027DC3257EC4EBB97D9 /* LoadTileMode.swift */, - 89F414C094DE05C12057B20E10C5CE9E /* Log.swift */, - AEC9B244E86B1B9B7C3A82C92B680331 /* MapCache.swift */, - 4D8423EBC93D6201AB2E2C875E229289 /* MapCacheConfig.swift */, - 9EEEAAE6861DF69429716546DCB5DD19 /* MapCacheProtocol.swift */, - 848B05EAE3F3BAAD88AFC7740E0A6C2C /* MD5.swift */, - 32C8D2D5CC8DAE5FD408E1623ECDBFEC /* MKMapView+MapCache.swift */, - A1DF50AD03036FAABFBBC7F4EFF6A31C /* MKTileOverlayPath+MapCache.swift */, - E897F17A3A8D93DF567E358F1D21697E /* MKZoomScale+MapCache.swift */, - 9C221067826D0447A87CFE92995927F2 /* RegionDownloader.swift */, - 5639CE67FF2A8442B101B0C79C5D2C48 /* RegionDownloaderDelegate.swift */, - 7358F0911BADCC9FDA1557086429677B /* String+DiskCache.swift */, - 59247885B54F8930AD4F496A77591067 /* TileCoords.swift */, - 47D8CDC2B842B73A94F6CF799F3146CB /* TileCoordsRegion.swift */, - D2BA57BA400F6937E611771CCF94C05B /* TileRange.swift */, - D67FB075DEA05080400263F50BEF253C /* TileRangeIterator.swift */, - 506D45752B948FC2F8D878A4C4DCE6E5 /* URL+DiskCache.swift */, - 468421C6F7FCD08F0B79F3FEF9604F8B /* ZoomableTile.swift */, - 65B4BAD4E12A8C423C1F521177B2BB6C /* ZoomRange.swift */, - 6F396FA1CBD4144C467134B8541119C7 /* ZoomRangeIterator.swift */, - 4FF1A62C1F86DD95501EA84A61457BA0 /* Support Files */, - ); - name = MapCache; - path = MapCache; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 002FC2840F803E54F3467DE9608342BB /* Frameworks */, - AFFB3AD9C2AE50CFE9C67E4869730C79 /* Pods */, + 958143A361BC2D6B0392E7109CBE4F82 /* Pods */, 1BB3EDF6BEBFEFDD929CFBA635912B7A /* Products */, 10BAB8A7894F634629C3D5D731E26E72 /* Targets Support Files */, ); @@ -454,6 +438,26 @@ name = watchOS; sourceTree = ""; }; + F53EBAF130E4E1DFFF0535E479D717D8 /* Support Files */ = { + isa = PBXGroup; + children = ( + B3B1608E7BDBB3D1B23C4EB45C364C32 /* CoreGPX-iOS.modulemap */, + 3CB929F831D26118E52A4F2A7F74A3C2 /* CoreGPX-iOS.xcconfig */, + 2E16DA5334D1A047912B6F84AFAEFA82 /* CoreGPX-iOS-dummy.m */, + 89E3F25A8DAF4D82790CD3AB73178379 /* CoreGPX-iOS-Info.plist */, + 414D59061970B808426ED261B63568F0 /* CoreGPX-iOS-prefix.pch */, + BCC1A07BD1D40618CC03767813C2E66F /* CoreGPX-iOS-umbrella.h */, + 9A553B6B70C4B1C9F85F9C329B0D027C /* CoreGPX-watchOS.modulemap */, + AAC5B303EB04086031DA30967E93F218 /* CoreGPX-watchOS.xcconfig */, + 81436FE513DA5D8328E118C902128A15 /* CoreGPX-watchOS-dummy.m */, + 9FECF647E1C43F48E457FE3B8F3A5A1C /* CoreGPX-watchOS-Info.plist */, + 27ECF853495901051FF15483EC0D662C /* CoreGPX-watchOS-prefix.pch */, + 7211F281DC4F6321FBEFBBB7CDFF4BD8 /* CoreGPX-watchOS-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/CoreGPX-iOS"; + sourceTree = ""; + }; F7FF33953E2DCD1125050F2F5F7DF931 /* Pods-OpenGpxTracker */ = { isa = PBXGroup; children = ( @@ -482,27 +486,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54B3AC7F569025F4BEE5F3D8A8D19011 /* Headers */ = { + 461F500894259B89FDEF5E6E20EE1310 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 77485EFA0FAF7EBBF5085756212C0FB2 /* MapCache-umbrella.h in Headers */, + F45DBF7A6DCFF011CE4B7B0AE27B4C50 /* CoreGPX-iOS-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 697E67F39CB0F22E7FA471C415C7D093 /* Headers */ = { + 54B3AC7F569025F4BEE5F3D8A8D19011 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CA02089B8130465A2308045DF6EDC2C7 /* CoreGPX-watchOS-umbrella.h in Headers */, + 77485EFA0FAF7EBBF5085756212C0FB2 /* MapCache-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8DA0AD9E139168A052E9634BEEDFAD53 /* Headers */ = { + 663DCA53254EDF4B3ED3347F84E9A71D /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5153651B6BE1F467AA82E8FEABE3A127 /* CoreGPX-iOS-umbrella.h in Headers */, + D886383583C44F6F1B41C570CCF29314 /* CoreGPX-watchOS-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -538,12 +542,12 @@ }; 3F3F1AB09D6852392F8574A567B748F3 /* CoreGPX-iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = D8DBEF03B614FE93F448C1D11BA4BACA /* Build configuration list for PBXNativeTarget "CoreGPX-iOS" */; + buildConfigurationList = F8FC92E9CD954C9775941C6152EC97CC /* Build configuration list for PBXNativeTarget "CoreGPX-iOS" */; buildPhases = ( - 8DA0AD9E139168A052E9634BEEDFAD53 /* Headers */, - 853DFBD5D4C1D4F3DEF3D0E52D5691FD /* Sources */, - 8CC81CC3D830FF4BB0C98F0CDD1EB074 /* Frameworks */, - 2EBBF632A0D46030A90994BA1DFD4B0B /* Resources */, + 461F500894259B89FDEF5E6E20EE1310 /* Headers */, + 3E464638D296D99B272605527D306B46 /* Sources */, + 2175E110B6C829CE3CEE0B995EE800B4 /* Frameworks */, + 3D48260C2055A748622858E5CB2FE226 /* Resources */, ); buildRules = ( ); @@ -556,12 +560,12 @@ }; 52F3F24B8D3936CDB41CBC3C1FED4E8C /* CoreGPX-watchOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 39560447CBEB5D9D66275F72AD7EDF85 /* Build configuration list for PBXNativeTarget "CoreGPX-watchOS" */; + buildConfigurationList = D550DFCF11634DAA8AF20457BCFC68CC /* Build configuration list for PBXNativeTarget "CoreGPX-watchOS" */; buildPhases = ( - 697E67F39CB0F22E7FA471C415C7D093 /* Headers */, - D108EC2C81B7704F22B538D242E8F3FC /* Sources */, - BDA085649C514E029142C0F51CE26E44 /* Frameworks */, - 0D343B2C681D1A8C92036440F6B56AB9 /* Resources */, + 663DCA53254EDF4B3ED3347F84E9A71D /* Headers */, + 2C36105E486BBD79D5DAC01BCB9AD42A /* Sources */, + 1FD841B0289056364E0C07587208F856 /* Frameworks */, + E4E842F9C252F380B92F4555CF8BE07F /* Resources */, ); buildRules = ( ); @@ -641,35 +645,35 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 0D343B2C681D1A8C92036440F6B56AB9 /* Resources */ = { + 3D48260C2055A748622858E5CB2FE226 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 2EBBF632A0D46030A90994BA1DFD4B0B /* Resources */ = { + 5A39DA49F15B54AD3CFA24C03D3B9D01 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 5A39DA49F15B54AD3CFA24C03D3B9D01 /* Resources */ = { + 7859B077B485C1D383F6DDE749F7D2C3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 7859B077B485C1D383F6DDE749F7D2C3 /* Resources */ = { + A6A0A732FFF414684D20BC4382F2D608 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - A6A0A732FFF414684D20BC4382F2D608 /* Resources */ = { + E4E842F9C252F380B92F4555CF8BE07F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -719,79 +723,81 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 853DFBD5D4C1D4F3DEF3D0E52D5691FD /* Sources */ = { + 2C36105E486BBD79D5DAC01BCB9AD42A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9D4D8710743732371A6CD22F15FF0E11 /* Converters.swift in Sources */, - 7D29673703BC46418F274CBC5C14A60D /* CoreGPX-iOS-dummy.m in Sources */, - 5E3244DCD8570F8B4E79F15703FCE72A /* DateTimeParsers.swift in Sources */, - 8C302606B27B3F212B51A2A85CDEA8A2 /* GPXAuthor.swift in Sources */, - 6F634D1BD2438165DDF570613D5469A5 /* GPXBounds.swift in Sources */, - A506775F260622154170ABCEF83100D8 /* GPXCopyright.swift in Sources */, - 107030F1982ABB361FFE86CB55AFDC16 /* GPXElement.swift in Sources */, - 2D30C313F53F61A3DD4D71D8D9DE5D34 /* GPXEmail.swift in Sources */, - 654BF22B5735845268FB11A2F2ACB354 /* GPXError.swift in Sources */, - F8A381DDDA9147EBA1F5600BD815F0D6 /* GPXExtensions.swift in Sources */, - 943F1CCA42130FF576D7E97D0C9BA39C /* GPXExtensionsElement.swift in Sources */, - 8F1B8DEAC05D0D3E5D72AD8C22071A00 /* GPXFix.swift in Sources */, - 35A73DC235D024AE79DE76F9A18DDD09 /* GPXLink.swift in Sources */, - DCCA8F1F66CAA83CD1D88D98B6342067 /* GPXMetadata.swift in Sources */, - 70EE5EF537DD26C3211215D5615A3932 /* GPXParser.swift in Sources */, - E1AE1CA9CB6D2461737600154B826EC5 /* GPXPerson.swift in Sources */, - 871385C4364090FF4EE7222150301D19 /* GPXPoint.swift in Sources */, - B48DE77C180BCC2AF32970D85D66C2CF /* GPXPointSegment.swift in Sources */, - 8EAA95CC8C16FE5BE72426E94D45232A /* GPXRawElement.swift in Sources */, - 63762975220A63D72236FF64F84E28E4 /* GPXRoot.swift in Sources */, - 0A17EF26C41586A52FD0F5962E32E3BB /* GPXRoute.swift in Sources */, - 5172547C32B319C8E182BE6A3FA94072 /* GPXRoutePoint.swift in Sources */, - 43013E97314F046F1375397503261FAF /* GPXTrack.swift in Sources */, - B60DE171E0ABE3D2A6C67381F19595B9 /* GPXTrackPoint.swift in Sources */, - 64EB038F5F947A8ED5406BA15DD049FE /* GPXTrackSegment.swift in Sources */, - 8FA7EB9DBA0BB5F070061E9B2031701B /* GPXWaypoint.swift in Sources */, - 741FC84507C11779BA12C56C9C21D80D /* NSMutableString+XML.swift in Sources */, + 93199F0F4FB898944E90FBE2D646A8B8 /* Converters.swift in Sources */, + 4D450D3E6ACEC24C83211B1803A45014 /* CoreGPX-watchOS-dummy.m in Sources */, + 1D35F909F90E1465EFD24429A05A6CE8 /* DateTimeParsers.swift in Sources */, + F171B4327F4A4E4DF104E45DCE9107C9 /* GPXAuthor.swift in Sources */, + 4D765B603EA6B4F813C4BBB4610F4FC4 /* GPXBounds.swift in Sources */, + 48E4B2E6B34EF597BE4D5765E2DC4D20 /* GPXCompression.swift in Sources */, + 70F8A650FA8E5E76DCBB2867D2AD0C29 /* GPXCopyright.swift in Sources */, + E4DC9E1BAA8E22B38734C9A3FEA6D8A0 /* GPXElement.swift in Sources */, + 26F3D8E9EB1A11ABD5069EA272BF65BB /* GPXEmail.swift in Sources */, + 366641B6A8116DD407905F69FDFD0E30 /* GPXError.swift in Sources */, + 9A81DC9244629C91DB13BB7C7997249C /* GPXExtensions.swift in Sources */, + 9AE91998A71CA56A71216BBC5EBD313C /* GPXExtensionsElement.swift in Sources */, + 7385A7A9C539517DFB0F12F2B3547E75 /* GPXFix.swift in Sources */, + 8EC3E13BC610182C4053E2606068DCBB /* GPXLink.swift in Sources */, + 9A3B79DD4BF22A27FF054545D83F6C88 /* GPXMetadata.swift in Sources */, + 9FDACF3C1FB1F0C36E5E46B93CB36A40 /* GPXParser.swift in Sources */, + 675F5E76BE806CD8B872C3E72467F023 /* GPXPerson.swift in Sources */, + E96095BC9712053C48D1A0A591F779FC /* GPXPoint.swift in Sources */, + FF2104F6BEB994B634C292136B1C8CE0 /* GPXPointSegment.swift in Sources */, + B815917FC803F08BFC9C4E49CFD91224 /* GPXRawElement.swift in Sources */, + 1E8E6A316A70E09AA0AE068C4052FA79 /* GPXRoot.swift in Sources */, + 4C61307CE33BB9456D8A930B2BE17544 /* GPXRoute.swift in Sources */, + B6526A95C424F5A65C08CACC002D8A37 /* GPXRoutePoint.swift in Sources */, + 614C683D2065A67DCEE0ABECFFD326E9 /* GPXTrack.swift in Sources */, + DBBACAF78429235067AF07A1507C7878 /* GPXTrackPoint.swift in Sources */, + 291D8D068B57BA580A372D8F1BEECA31 /* GPXTrackSegment.swift in Sources */, + 5CAA71A601AA0977B9A5E7F5358E6C00 /* GPXWaypoint.swift in Sources */, + 27FE38F0F44FBBA1286CBE21FF533D70 /* NSMutableString+XML.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 859E47F5C0F9F304D6582ADFD451F335 /* Sources */ = { + 3E464638D296D99B272605527D306B46 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E67A06D5C12D739DBDAF6DAA699D55AE /* Pods-OpenGpxTracker-dummy.m in Sources */, + 2E6A361920A4E45D7BC804CAAF60629F /* Converters.swift in Sources */, + EB1EA9E9C1527976254F7754F283DC37 /* CoreGPX-iOS-dummy.m in Sources */, + 95389DE0EFA4E02CC683ECF5231D3107 /* DateTimeParsers.swift in Sources */, + 099C6D69BC1EF5F0B6A4B46D820F6A9D /* GPXAuthor.swift in Sources */, + 262D20D5AAA59F77AF61EDC84409E123 /* GPXBounds.swift in Sources */, + C84EA6ED9CA6ED96237F2F9CE67E3942 /* GPXCompression.swift in Sources */, + 63ECD307D351F4CFD8B9C27E6568E134 /* GPXCopyright.swift in Sources */, + EDD1E519720F0A6116A01DD5374AA728 /* GPXElement.swift in Sources */, + 9A11B3B82D0AA316137499D8F6B052AE /* GPXEmail.swift in Sources */, + B29A9883DA64ED9238F7974280D61B3C /* GPXError.swift in Sources */, + 8F8461C8DB0F8DCBDF0BF57DF945F17E /* GPXExtensions.swift in Sources */, + 745E764D87694218C63E532135E952A5 /* GPXExtensionsElement.swift in Sources */, + F0A6FED3E288C641B9CB85D6853C2CCE /* GPXFix.swift in Sources */, + C7E35C15B68E52C31ACCAAF2A95D3A70 /* GPXLink.swift in Sources */, + DF1A8E06C319DAD140782AE994B77BF4 /* GPXMetadata.swift in Sources */, + 29FF8240E736EF4B83F25CE89F5C83A4 /* GPXParser.swift in Sources */, + EE13CCD92558CD76C26D1382426477AB /* GPXPerson.swift in Sources */, + E7D51833ABCFA88043E1024B4710D4C4 /* GPXPoint.swift in Sources */, + 334C107F77D02EAE3FAEE75027642846 /* GPXPointSegment.swift in Sources */, + CFCF69C6A6F289DF7DF3840784B45840 /* GPXRawElement.swift in Sources */, + 48549F12FAE4767F7A80B7BED4F95627 /* GPXRoot.swift in Sources */, + 8B2EB93B33A61F340D5D0F38198887E7 /* GPXRoute.swift in Sources */, + 0A913D53740CA1F21A2A4BA1B3F6EAFD /* GPXRoutePoint.swift in Sources */, + D7374E60D9D1E4EE7994DB7290E0A9BA /* GPXTrack.swift in Sources */, + D46DD9634D6A3632A7056251B6AE22B9 /* GPXTrackPoint.swift in Sources */, + 61712DB9A3C9B0404788DEF0CDFEC6C2 /* GPXTrackSegment.swift in Sources */, + 2B95E69240AE1C4B707285B98D04C3F1 /* GPXWaypoint.swift in Sources */, + 8250B4D215F98E7CA8131942F41DA497 /* NSMutableString+XML.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - D108EC2C81B7704F22B538D242E8F3FC /* Sources */ = { + 859E47F5C0F9F304D6582ADFD451F335 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 695DE091483BE3D820B51FA13012F775 /* Converters.swift in Sources */, - 420608CA619361F85C87352B59F99AD9 /* CoreGPX-watchOS-dummy.m in Sources */, - C15E6244EB32EE278FD8CC7AAE5E973D /* DateTimeParsers.swift in Sources */, - 4D9CB99D76F28673C665ED494AEE13A9 /* GPXAuthor.swift in Sources */, - 62FEDFC036FFB09D0439E8E5DBD74DD1 /* GPXBounds.swift in Sources */, - 46226773B5C468E2F7F1375A904FBB06 /* GPXCopyright.swift in Sources */, - 12D17C49D1D78C45AA269B3AAF18D81E /* GPXElement.swift in Sources */, - A66EF2DC60C754AA0122E88914B9F046 /* GPXEmail.swift in Sources */, - 5AA7C37FDCDCBBFB5AECBCB3805F2875 /* GPXError.swift in Sources */, - 9B2DF887EAD080B7BD1B4F83339FE4EC /* GPXExtensions.swift in Sources */, - 5376F8C3B3547ECDBE3667EDF3BA5219 /* GPXExtensionsElement.swift in Sources */, - 5EDAAEEA92F9FBC307987C4532579C72 /* GPXFix.swift in Sources */, - FD432C8D38CA0E67CD1193C04314EC42 /* GPXLink.swift in Sources */, - 836519803F630D9F093EB968CE6AF589 /* GPXMetadata.swift in Sources */, - 58FAE43FA4577895A9B7FDE6C268D5F0 /* GPXParser.swift in Sources */, - 1E5DFEFB3DC77CC15F41E0FECA3F3A31 /* GPXPerson.swift in Sources */, - 618B6936A8979FA637CC195B73BFA571 /* GPXPoint.swift in Sources */, - 9A3A289384D1E07371494FF3C2AA5D80 /* GPXPointSegment.swift in Sources */, - 51F907CB337FB84E6979FF884B56610A /* GPXRawElement.swift in Sources */, - 2C56C05D43748A5652780B10AEE55652 /* GPXRoot.swift in Sources */, - E1B69E0E1568D6B8DAE8A6E312BD0BB4 /* GPXRoute.swift in Sources */, - B284CAB0650646942C09CCF50DCBB8DD /* GPXRoutePoint.swift in Sources */, - 3006DA8C4ACEC8B1D7919414BBCC3C7B /* GPXTrack.swift in Sources */, - 49DF2D1EF0E1859867D4867B27D5458F /* GPXTrackPoint.swift in Sources */, - ED6A6EF4385FCC472AF596F16083DE7F /* GPXTrackSegment.swift in Sources */, - 8F23CA2CA147503050CFC903BDF497EB /* GPXWaypoint.swift in Sources */, - 009062F9877D6BC0B5EBB94EE26181A6 /* NSMutableString+XML.swift in Sources */, + E67A06D5C12D739DBDAF6DAA699D55AE /* Pods-OpenGpxTracker-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -819,11 +825,75 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0C8491320AB8474491D754C6258AFB91 /* Release */ = { + 1F17B2419C36A87F6E5EF70377708D22 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C5C1D4A56AD0F3360E927F474B255D47 /* Pods-OpenGpxTracker.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 320D26DF6210C4ACB1E543675F632AE7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3CB929F831D26118E52A4F2A7F74A3C2 /* CoreGPX-iOS.xcconfig */; + buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -833,19 +903,18 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-iOS/CoreGPX-iOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CoreGPX-iOS/CoreGPX-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/CoreGPX-iOS/CoreGPX-iOS.modulemap"; + PRODUCT_MODULE_NAME = CoreGPX; + PRODUCT_NAME = CoreGPX; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -853,10 +922,11 @@ }; name = Release; }; - 1DE3C96890408587FED34BA3499F71D6 /* Release */ = { + 4B307D96EF761F5B4AA8943D3CCCB6C5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */; + baseConfigurationReference = AAC5B303EB04086031DA30967E93F218 /* CoreGPX-watchOS.xcconfig */; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -866,29 +936,29 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; - PRODUCT_MODULE_NAME = MapCache; - PRODUCT_NAME = MapCache; - SDKROOT = iphoneos; + MODULEMAP_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; + PRODUCT_MODULE_NAME = CoreGPX; + PRODUCT_NAME = CoreGPX; + SDKROOT = watchos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; + TARGETED_DEVICE_FAMILY = 4; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; - name = Release; + name = Debug; }; - 46DDC9C402FB5EF07B37591FAD616F0B /* Release */ = { + 6877882AFAECC941FE73DFD5568ABDCC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */; + baseConfigurationReference = D1F6F978401AA9203C0068794566FB46 /* Pods-OpenGpxTracker-Watch Extension.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -899,17 +969,18 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-OpenGpxTracker-Watch Extension/Pods-OpenGpxTracker-Watch Extension-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; - PRODUCT_MODULE_NAME = CoreGPX; - PRODUCT_NAME = CoreGPX; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-OpenGpxTracker-Watch Extension/Pods-OpenGpxTracker-Watch Extension.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = watchos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -918,70 +989,9 @@ }; name = Release; }; - 4C771D53BEC20A7F3A2447BF15FA5607 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Release; - }; - 645772151481CFCC65006B3AA0710D3A /* Debug */ = { + 7A3675420E0140BC625366BE7FF82C5E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 37A380F9B170E5F9661D88966853225E /* MapCache.xcconfig */; + baseConfigurationReference = 9FDD439BF400AAC13DAA95F3B38C07D3 /* MapCache.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -995,7 +1005,7 @@ GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; PRODUCT_MODULE_NAME = MapCache; @@ -1010,12 +1020,11 @@ }; name = Debug; }; - 6877882AFAECC941FE73DFD5568ABDCC /* Release */ = { + 8FD63CF70524561AE63E53416F7F9608 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D1F6F978401AA9203C0068794566FB46 /* Pods-OpenGpxTracker-Watch Extension.release.xcconfig */; + baseConfigurationReference = B18FC1D6D85686B9480155EEDEC49DA1 /* Pods-OpenGpxTracker.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1025,29 +1034,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-OpenGpxTracker-Watch Extension/Pods-OpenGpxTracker-Watch Extension-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-OpenGpxTracker-Watch Extension/Pods-OpenGpxTracker-Watch Extension.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = watchos; + SDKROOT = iphoneos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VALIDATE_PRODUCT = YES; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; }; - name = Release; + name = Debug; }; - 6D71E263965D2E7194C751DA24849F73 /* Release */ = { + 90DB8E77A5FC8190C757FC750D518F67 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */; + baseConfigurationReference = 3CB929F831D26118E52A4F2A7F74A3C2 /* CoreGPX-iOS.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1071,15 +1079,47 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + A218C66EC608FF012C1CBA1B48A66AE4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AAC5B303EB04086031DA30967E93F218 /* CoreGPX-watchOS.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; + PRODUCT_MODULE_NAME = CoreGPX; + PRODUCT_NAME = CoreGPX; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; - 9D99EA806A36FD6BE86E7BF9AFAFAD71 /* Debug */ = { + A270F17D20D2F04B1CBBFE437A4CC5DF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B18FC1D6D85686B9480155EEDEC49DA1 /* Pods-OpenGpxTracker.debug.xcconfig */; + baseConfigurationReference = C5C1D4A56AD0F3360E927F474B255D47 /* Pods-OpenGpxTracker.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; @@ -1093,7 +1133,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-OpenGpxTracker/Pods-OpenGpxTracker.modulemap"; @@ -1105,12 +1145,45 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - C2296CF33180F00C4710670250768305 /* Debug */ = { + C122085FA26E7D8DE61ADFA9EF3B5F67 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9FDD439BF400AAC13DAA95F3B38C07D3 /* MapCache.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MapCache/MapCache-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MapCache/MapCache-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/MapCache/MapCache.modulemap"; + PRODUCT_MODULE_NAME = MapCache; + PRODUCT_NAME = MapCache; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + C1761F904DD31460F3748ABDFA938DCD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1143,16 +1216,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1161,51 +1231,18 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; - name = Debug; - }; - DC8F050C9E455164E5F902002F788040 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AFD139B158708C2750522FED3B148F21 /* CoreGPX-watchOS.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS.modulemap"; - PRODUCT_MODULE_NAME = CoreGPX; - PRODUCT_NAME = CoreGPX; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Debug; + name = Release; }; EAD130C9D771F99D383327284A703476 /* Debug */ = { isa = XCBuildConfiguration; @@ -1241,90 +1278,59 @@ }; name = Debug; }; - EFF75F42316CA032945DBC62DD10C102 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 06A79376F0AA016837B5F3D833389638 /* CoreGPX-iOS.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CoreGPX-iOS/CoreGPX-iOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CoreGPX-iOS/CoreGPX-iOS-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CoreGPX-iOS/CoreGPX-iOS.modulemap"; - PRODUCT_MODULE_NAME = CoreGPX; - PRODUCT_NAME = CoreGPX; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 272115438C930133EF435FEDE8D36127 /* Build configuration list for PBXNativeTarget "MapCache" */ = { isa = XCConfigurationList; buildConfigurations = ( - 645772151481CFCC65006B3AA0710D3A /* Debug */, - 1DE3C96890408587FED34BA3499F71D6 /* Release */, + 7A3675420E0140BC625366BE7FF82C5E /* Debug */, + C122085FA26E7D8DE61ADFA9EF3B5F67 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 39560447CBEB5D9D66275F72AD7EDF85 /* Build configuration list for PBXNativeTarget "CoreGPX-watchOS" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - DC8F050C9E455164E5F902002F788040 /* Debug */, - 46DDC9C402FB5EF07B37591FAD616F0B /* Release */, + 1F17B2419C36A87F6E5EF70377708D22 /* Debug */, + C1761F904DD31460F3748ABDFA938DCD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + 72818F67D78CD126EAB114D4F65509AD /* Build configuration list for PBXNativeTarget "Pods-OpenGpxTracker" */ = { isa = XCConfigurationList; buildConfigurations = ( - C2296CF33180F00C4710670250768305 /* Debug */, - 4C771D53BEC20A7F3A2447BF15FA5607 /* Release */, + 8FD63CF70524561AE63E53416F7F9608 /* Debug */, + A270F17D20D2F04B1CBBFE437A4CC5DF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 72818F67D78CD126EAB114D4F65509AD /* Build configuration list for PBXNativeTarget "Pods-OpenGpxTracker" */ = { + D550DFCF11634DAA8AF20457BCFC68CC /* Build configuration list for PBXNativeTarget "CoreGPX-watchOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9D99EA806A36FD6BE86E7BF9AFAFAD71 /* Debug */, - 0C8491320AB8474491D754C6258AFB91 /* Release */, + 4B307D96EF761F5B4AA8943D3CCCB6C5 /* Debug */, + A218C66EC608FF012C1CBA1B48A66AE4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D8DBEF03B614FE93F448C1D11BA4BACA /* Build configuration list for PBXNativeTarget "CoreGPX-iOS" */ = { + E43B652E9FCB8DDD056A5F036D7711CD /* Build configuration list for PBXNativeTarget "Pods-OpenGpxTracker-Watch Extension" */ = { isa = XCConfigurationList; buildConfigurations = ( - EFF75F42316CA032945DBC62DD10C102 /* Debug */, - 6D71E263965D2E7194C751DA24849F73 /* Release */, + EAD130C9D771F99D383327284A703476 /* Debug */, + 6877882AFAECC941FE73DFD5568ABDCC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E43B652E9FCB8DDD056A5F036D7711CD /* Build configuration list for PBXNativeTarget "Pods-OpenGpxTracker-Watch Extension" */ = { + F8FC92E9CD954C9775941C6152EC97CC /* Build configuration list for PBXNativeTarget "CoreGPX-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - EAD130C9D771F99D383327284A703476 /* Debug */, - 6877882AFAECC941FE73DFD5568ABDCC /* Release */, + 90DB8E77A5FC8190C757FC750D518F67 /* Debug */, + 320D26DF6210C4ACB1E543675F632AE7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/CoreGPX-iOS/CoreGPX-iOS-Info.plist b/Pods/Target Support Files/CoreGPX-iOS/CoreGPX-iOS-Info.plist index 94cd6124..4d746af4 100644 --- a/Pods/Target Support Files/CoreGPX-iOS/CoreGPX-iOS-Info.plist +++ b/Pods/Target Support Files/CoreGPX-iOS/CoreGPX-iOS-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.7.4 + 0.8.1 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist b/Pods/Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist index 94cd6124..4d746af4 100644 --- a/Pods/Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist +++ b/Pods/Target Support Files/CoreGPX-watchOS/CoreGPX-watchOS-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.7.4 + 0.8.1 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/MapCache/MapCache-Info.plist b/Pods/Target Support Files/MapCache/MapCache-Info.plist index 2cf03a7f..b07fa9b4 100644 --- a/Pods/Target Support Files/MapCache/MapCache-Info.plist +++ b/Pods/Target Support Files/MapCache/MapCache-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.8.0 + 0.9.0 CFBundleSignature ???? CFBundleVersion