瀏覽代碼

Integrating GoogleDataTransport in Crashlytics to Report Crashes (#4989)

Jason Hu 6 年之前
父節點
當前提交
194439fdfb
共有 69 個文件被更改,包括 3808 次插入149 次删除
  1. 2 2
      Crashlytics/Crashlytics/Components/FIRCLSContext.m
  2. 2 1
      Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h
  3. 39 4
      Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m
  4. 3 0
      Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h
  5. 168 85
      Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.m
  6. 12 1
      Crashlytics/Crashlytics/FIRCrashlytics.m
  7. 4 1
      Crashlytics/Crashlytics/Models/FIRCLSFileManager.h
  8. 23 7
      Crashlytics/Crashlytics/Models/FIRCLSFileManager.m
  9. 4 0
      Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h
  10. 14 3
      Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m
  11. 5 0
      Crashlytics/Crashlytics/Models/FIRCLSSettings.h
  12. 9 0
      Crashlytics/Crashlytics/Models/FIRCLSSettings.m
  13. 24 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h
  14. 30 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m
  15. 37 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h
  16. 25 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m
  17. 23 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h
  18. 29 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m
  19. 24 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h
  20. 30 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.m
  21. 35 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h
  22. 240 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m
  23. 44 0
      Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h
  24. 1 1
      Crashlytics/Crashlytics/Operations/Reports/FIRCLSPackageReportOperation.m
  25. 26 0
      Crashlytics/ProtoSupport/Protos/crashlytics.options
  26. 57 0
      Crashlytics/ProtoSupport/Protos/crashlytics.proto
  27. 56 0
      Crashlytics/ProtoSupport/generate_crashlytics_protos.sh
  28. 221 0
      Crashlytics/ProtoSupport/nanopb_objc_generator.py
  29. 323 0
      Crashlytics/ProtoSupport/proto_generator.py
  30. 76 0
      Crashlytics/Protogen/nanopb/crashlytics.nanopb.c
  31. 109 0
      Crashlytics/Protogen/nanopb/crashlytics.nanopb.h
  32. 14 0
      Crashlytics/README.md
  33. 453 0
      Crashlytics/UnitTests/Data/bare_min_crash/binary_images.clsrecord
  34. 12 0
      Crashlytics/UnitTests/Data/bare_min_crash/internal_incremental_kv.clsrecord
  35. 4 0
      Crashlytics/UnitTests/Data/bare_min_crash/metadata.clsrecord
  36. 330 0
      Crashlytics/UnitTests/Data/bare_min_crash/sdk.log
  37. 1 0
      Crashlytics/UnitTests/Data/bare_min_crash/signal.clsrecord
  38. 0 0
      Crashlytics/UnitTests/Data/binary_images_missing_base_entry.clsrecord
  39. 1 0
      Crashlytics/UnitTests/Data/corrupt_metadata/metadata.clsrecord
  40. 318 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/binary_images.clsrecord
  41. 3 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/errors_a.clsrecord
  42. 1 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/errors_b.clsrecord
  43. 1 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/exception.clsrecord
  44. 12 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/internal_incremental_kv.clsrecord
  45. 6 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/log_a.clsrecord
  46. 1 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/mach_exception.clsrecord
  47. 4 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/metadata.clsrecord
  48. 343 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/sdk.log
  49. 1 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/signal.clsrecord
  50. 1 0
      Crashlytics/UnitTests/Data/ios_all_files_crash/user_incremental_kv.clsrecord
  51. 4 0
      Crashlytics/UnitTests/Data/valid_metadata/metadata.clsrecord
  52. 1 1
      Crashlytics/UnitTests/FIRCLSFileManagerTests.m
  53. 202 0
      Crashlytics/UnitTests/FIRCLSReportAdapterTests.m
  54. 14 11
      Crashlytics/UnitTests/FIRCLSReportManagerTests.m
  55. 177 18
      Crashlytics/UnitTests/FIRCLSReportUploaderTests.m
  56. 58 0
      Crashlytics/UnitTests/FIRCLSSettingsTests.m
  57. 12 0
      Crashlytics/UnitTests/Mocks/FIRCLSMockFileManager.h
  58. 21 0
      Crashlytics/UnitTests/Mocks/FIRCLSMockFileManager.m
  59. 2 0
      Crashlytics/UnitTests/Mocks/FIRCLSMockNetworkClient.h
  60. 2 0
      Crashlytics/UnitTests/Mocks/FIRCLSMockNetworkClient.m
  61. 2 3
      Crashlytics/UnitTests/Mocks/FIRCLSMockReportManager.h
  62. 5 8
      Crashlytics/UnitTests/Mocks/FIRCLSMockReportManager.m
  63. 1 0
      Crashlytics/UnitTests/Mocks/FIRCLSMockSettings.h
  64. 1 0
      Crashlytics/UnitTests/Mocks/FIRCLSMockSettings.m
  65. 33 0
      Crashlytics/UnitTests/Mocks/FIRMockGDTCoreTransport.h
  66. 35 0
      Crashlytics/UnitTests/Mocks/FIRMockGDTCoreTransport.m
  67. 22 0
      Crashlytics/generate_project.sh
  68. 13 3
      FirebaseCrashlytics.podspec
  69. 2 0
      scripts/check_whitespace.sh

+ 2 - 2
Crashlytics/Crashlytics/Components/FIRCLSContext.m

@@ -92,9 +92,9 @@ bool FIRCLSContextInitialize(const FIRCLSContextInitData* initData) {
     _firclsContext.readonly->logging.logStorage.restrictBySize = true;
     _firclsContext.readonly->logging.logStorage.entryCount = NULL;
     _firclsContext.readonly->logging.logStorage.aPath =
-        FIRCLSContextAppendToRoot(rootPath, @"log_a.clsrecord");
+        FIRCLSContextAppendToRoot(rootPath, FIRCLSReportLogAFile);
     _firclsContext.readonly->logging.logStorage.bPath =
-        FIRCLSContextAppendToRoot(rootPath, @"log_b.clsrecord");
+        FIRCLSContextAppendToRoot(rootPath, FIRCLSReportLogBFile);
     _firclsContext.readonly->logging.customExceptionStorage.aPath =
         FIRCLSContextAppendToRoot(rootPath, FIRCLSReportCustomExceptionAFile);
     _firclsContext.readonly->logging.customExceptionStorage.bPath =

+ 2 - 1
Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.h

@@ -25,6 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
 @class FIRCLSFileManager;
 @class FIRCLSInternalReport;
 @class FIRCLSSettings;
+@class GDTCORTransport;
 @class FIRInstallations;
 @protocol FIRAnalyticsInterop;
 
@@ -35,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
                           analytics:(nullable id<FIRAnalyticsInterop>)analytics
                         googleAppID:(NSString *)googleAppID
                         dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter
-    NS_DESIGNATED_INITIALIZER;
+                    googleTransport:(GDTCORTransport *)googleTransport NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 + (instancetype)new NS_UNAVAILABLE;
 

+ 39 - 4
Crashlytics/Crashlytics/Controllers/FIRCLSReportManager.m

@@ -12,6 +12,24 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+//
+// The report manager has the ability to send to two different endpoints.
+//
+// The old legacy flow for a report goes through the following states/folders:
+// 1. active - .clsrecords optimized for crash time persistence
+// 2. processing - .clsrecords with attempted symbolication
+// 3. prepared-legacy - .multipartmime of compressed .clsrecords
+//
+// The new flow for a report goes through the following states/folders:
+// 1. active - .clsrecords optimized for crash time persistence
+// 2. processing - .clsrecords with attempted symbolication
+// 3. prepared - .clsrecords moved from processing with no changes
+//
+// The code was designed so the report processing workflows are not dramatically different from one
+// another. The design will help avoid having a lot of conditional code blocks throughout the
+// codebase.
+//
+
 #include <stdatomic.h>
 
 #if __has_include(<FBLPromises/FBLPromises.h>)
@@ -156,6 +174,8 @@ typedef NSNumber FIRCLSWrappedBool;
 // Runs the operations that fetch settings and call onboarding endpoints
 @property(nonatomic, strong) FIRCLSSettingsOnboardingManager *settingsAndOnboardingManager;
 
+@property(nonatomic, strong) GDTCORTransport *googleTransport;
+
 @end
 
 @implementation FIRCLSReportManager
@@ -167,7 +187,8 @@ static void (^reportSentCallback)(void);
                       installations:(FIRInstallations *)installations
                           analytics:(id<FIRAnalyticsInterop>)analytics
                         googleAppID:(NSString *)googleAppID
-                        dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter {
+                        dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter
+                    googleTransport:(GDTCORTransport *)googleTransport {
   self = [super init];
   if (!self) {
     return nil;
@@ -178,6 +199,8 @@ static void (^reportSentCallback)(void);
   _googleAppID = [googleAppID copy];
   _dataArbiter = dataArbiter;
 
+  _googleTransport = googleTransport;
+
   NSString *sdkBundleID = FIRCLSApplicationGetSDKBundleID();
 
   _operationQueue = [NSOperationQueue new];
@@ -220,8 +243,14 @@ static void (^reportSentCallback)(void);
  */
 - (int)unsentReportsCountWithPreexisting:(NSArray<NSString *> *)paths {
   int count = [self countSubmittableAndDeleteUnsubmittableReportPaths:paths];
+
   count += _fileManager.processingPathContents.count;
-  count += _fileManager.preparedPathContents.count;
+
+  if (self.settings.shouldUseNewReportEndpoint) {
+    count += _fileManager.preparedPathContents.count;
+  } else {
+    count += _fileManager.legacyPreparedPathContents.count;
+  }
   return count;
 }
 
@@ -649,7 +678,11 @@ static void (^reportSentCallback)(void);
 
 - (void)removeContentsInOtherReportingDirectories {
   [self removeExistingReportPaths:self.fileManager.processingPathContents];
-  [self removeExistingReportPaths:self.fileManager.preparedPathContents];
+  if (self.settings.shouldUseNewReportEndpoint) {
+    [self removeExistingReportPaths:self.fileManager.preparedPathContents];
+  } else {
+    [self removeExistingReportPaths:self.fileManager.legacyPreparedPathContents];
+  }
 }
 
 - (void)handleContentsInOtherReportingDirectoriesWithToken:(FIRCLSDataCollectionToken *)token {
@@ -673,7 +706,9 @@ static void (^reportSentCallback)(void);
 }
 
 - (void)handleExistingFilesInPreparedWithToken:(FIRCLSDataCollectionToken *)token {
-  NSArray *preparedPaths = _fileManager.preparedPathContents;
+  NSArray *preparedPaths = self.settings.shouldUseNewReportEndpoint
+                               ? _fileManager.preparedPathContents
+                               : _fileManager.legacyPreparedPathContents;
 
   // Give our network client a chance to reconnect here, if needed. This attempts to avoid
   // trying to re-submit a prepared file that is already in flight.

+ 3 - 0
Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.h

@@ -14,6 +14,8 @@
 
 #import <Foundation/Foundation.h>
 
+#import <GoogleDataTransport/GDTCORTransport.h>
+
 @class FIRCLSDataCollectionToken;
 @class FIRCLSInternalReport;
 @class FIRCLSSettings;
@@ -73,5 +75,6 @@
 
 - (NSString *)googleAppID;
 - (FIRCLSSettings *)settings;
+- (GDTCORTransport *)googleTransport;
 
 @end

+ 168 - 85
Crashlytics/Crashlytics/Controllers/FIRCLSReportUploader.m

@@ -25,6 +25,7 @@
 #import "FIRCLSNetworkClient.h"
 #import "FIRCLSPackageReportOperation.h"
 #import "FIRCLSProcessReportOperation.h"
+#import "FIRCLSReportAdapter.h"
 #import "FIRCLSReportUploader_Private.h"
 #import "FIRCLSSettings.h"
 #import "FIRCLSSymbolResolver.h"
@@ -35,6 +36,9 @@
 #import "FIRCLSMultipartMimeStreamEncoder.h"
 #import "FIRCLSURLBuilder.h"
 
+#import <GoogleDataTransport/GDTCOREvent.h>
+#import <GoogleDataTransport/GDTCORTransport.h>
+
 @interface FIRCLSReportUploader () {
   id<FIRAnalyticsInterop> _analytics;
 }
@@ -63,67 +67,6 @@
   return self;
 }
 
-#pragma mark - Properties
-
-- (NSURL *)reportURL {
-  FIRCLSURLBuilder *url = [FIRCLSURLBuilder URLWithBase:FIRCLSReportsEndpoint];
-
-  [url appendComponent:@"/sdk-api/v1/platforms/"];
-  [url appendComponent:FIRCLSApplicationGetPlatform()];
-  [url appendComponent:@"/apps/"];
-  [url appendComponent:self.dataSource.settings.fetchedBundleID];
-  [url appendComponent:@"/reports"];
-
-  return [url URL];
-}
-
-- (NSString *)localeIdentifier {
-  return [[NSLocale currentLocale] localeIdentifier];
-}
-
-#pragma mark - URL Requests
-- (NSMutableURLRequest *)mutableRequestWithURL:(NSURL *)url timeout:(NSTimeInterval)timeout {
-  NSMutableURLRequest *request =
-      [NSMutableURLRequest requestWithURL:url
-                              cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
-                          timeoutInterval:timeout];
-
-  NSString *localeId = [self localeIdentifier];
-
-  [request setValue:@CLS_SDK_GENERATOR_NAME forHTTPHeaderField:FIRCLSNetworkUserAgent];
-  [request setValue:FIRCLSNetworkApplicationJson forHTTPHeaderField:FIRCLSNetworkAccept];
-  [request setValue:FIRCLSNetworkUTF8 forHTTPHeaderField:FIRCLSNetworkAcceptCharset];
-  [request setValue:localeId forHTTPHeaderField:FIRCLSNetworkAcceptLanguage];
-  [request setValue:localeId forHTTPHeaderField:FIRCLSNetworkContentLanguage];
-  [request setValue:FIRCLSDeveloperToken forHTTPHeaderField:FIRCLSNetworkCrashlyticsDeveloperToken];
-  [request setValue:FIRCLSApplicationGetSDKBundleID()
-      forHTTPHeaderField:FIRCLSNetworkCrashlyticsAPIClientId];
-  [request setValue:@CLS_SDK_DISPLAY_VERSION
-      forHTTPHeaderField:FIRCLSNetworkCrashlyticsAPIClientDisplayVersion];
-  [request setValue:[[self dataSource] googleAppID]
-      forHTTPHeaderField:FIRCLSNetworkCrashlyticsGoogleAppId];
-
-  return request;
-}
-
-- (BOOL)fillInRequest:(NSMutableURLRequest *)request forMultipartMimeDataAtPath:(NSString *)path {
-  NSString *boundary = [[path lastPathComponent] stringByDeletingPathExtension];
-
-  [request setValue:[FIRCLSMultipartMimeStreamEncoder
-                        contentTypeHTTPHeaderValueWithBoundary:boundary]
-      forHTTPHeaderField:@"Content-Type"];
-
-  NSNumber *fileSize = [[self fileManager] fileSizeAtPath:path];
-  if (fileSize == nil) {
-    FIRCLSErrorLog(@"Could not determine size of multipart mime file");
-    return NO;
-  }
-
-  [request setValue:[fileSize stringValue] forHTTPHeaderField:@"Content-Length"];
-
-  return YES;
-}
-
 #pragma mark - Packaging and Submission
 - (BOOL)prepareAndSubmitReport:(FIRCLSInternalReport *)report
            dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken
@@ -136,8 +79,7 @@
     return NO;
   }
 
-  NSString *reportOrgID = self.dataSource.settings.orgID;
-  if (!reportOrgID) {
+  if (!self.dataSource.settings.orgID) {
     FIRCLSDebugLog(@"Skipping report with id '%@' this run of the app because Organization ID was "
                    @"nil. Report will upload once settings are download successfully",
                    report.identifier);
@@ -147,7 +89,7 @@
   FIRCLSApplicationActivity(
       FIRCLSApplicationActivityDefault, @"Crashlytics Crash Report Processing", ^{
         if (shouldProcess) {
-          if (![self.fileManager moveItemAtPath:[report path]
+          if (![self.fileManager moveItemAtPath:report.path
                                     toDirectory:self.fileManager.processingPath]) {
             FIRCLSErrorLog(@"Unable to move report for processing");
             return;
@@ -165,26 +107,42 @@
           [processOperation start];
         }
 
-        FIRCLSPackageReportOperation *packageOperation =
-            [[FIRCLSPackageReportOperation alloc] initWithReport:report
-                                                     fileManager:self.fileManager
-                                                        settings:self.dataSource.settings];
+        NSString *packagedPath;
 
-        [packageOperation start];
-
-        NSString *packagedPath = [packageOperation finalPath];
-        if (!packagedPath) {
-          FIRCLSErrorLog(@"Unable to package report");
-          return;
-        }
+        FIRCLSDebugLog(@"Preparing the report for the new endpoint: %d",
+                       self.dataSource.settings.shouldUseNewReportEndpoint);
 
-        // Save the crashed on date for potential scion event sending.
-        NSTimeInterval crashedOnDate = report.crashedOnDate.timeIntervalSince1970;
-        // We only want to forward crash events to scion, storing this for later use.
+        // With the new report endpoint, the report is deleted once it is written to GDT
+        // Check if the report has a crash file before the report is moved or deleted
         BOOL isCrash = report.isCrash;
 
-        if (![[self fileManager] removeItemAtPath:[report path]]) {
-          FIRCLSErrorLog(@"Unable to remove a processing item");
+        if (self.dataSource.settings.shouldUseNewReportEndpoint) {
+          // For the new endpoint, just move the .clsrecords from "processing" -> "prepared"
+          if (![self.fileManager moveItemAtPath:report.path
+                                    toDirectory:self.fileManager.preparedPath]) {
+            FIRCLSErrorLog(@"Unable to move report to prepared");
+            return;
+          }
+
+          packagedPath = [self.fileManager.preparedPath
+              stringByAppendingPathComponent:report.path.lastPathComponent];
+        } else {
+          // For the legacy endpoint, continue generate the multipartmime file in "prepared-legacy"
+          FIRCLSPackageReportOperation *packageOperation =
+              [[FIRCLSPackageReportOperation alloc] initWithReport:report
+                                                       fileManager:self.fileManager
+                                                          settings:self.dataSource.settings];
+
+          [packageOperation start];
+          packagedPath = packageOperation.finalPath;
+          if (!packagedPath) {
+            FIRCLSErrorLog(@"Unable to package report");
+            return;
+          }
+
+          if (![self.fileManager removeItemAtPath:report.path]) {
+            FIRCLSErrorLog(@"Unable to remove a processing item");
+          }
         }
 
         NSLog(@"[Firebase/Crashlytics] Packaged report with id '%@' for submission",
@@ -194,9 +152,11 @@
                                dataCollectionToken:dataCollectionToken
                                           asUrgent:urgent];
 
-        // If the upload was successful and the report contained a crash forward it to scion.
+        // If the upload was successful and the report contained a crash forward it to Google
+        // Analytics.
         if (success && isCrash) {
-          [FIRCLSFCRAnalytics logCrashWithTimeStamp:crashedOnDate toAnalytics:self->_analytics];
+          [FIRCLSFCRAnalytics logCrashWithTimeStamp:report.crashedOnDate.timeIntervalSince1970
+                                        toAnalytics:self->_analytics];
         }
       });
 
@@ -243,9 +203,71 @@
                           asUrgent:(BOOL)urgent {
   FIRCLSDeveloperLog("Crashlytics:Crash:Reports", @"Submitting report%@",
                      urgent ? @" as urgent" : @"");
-  return [self submitPackageMultipartMimeAtPath:path
-                            dataCollectionToken:dataCollectionToken
-                                  synchronously:urgent];
+
+  // Check with the legacy path as the new path will always be contained in the legacy path
+  BOOL isNewPreparedPath = ![path containsString:self.fileManager.legacyPreparedPath];
+
+  if (isNewPreparedPath && self.dataSource.settings.shouldUseNewReportEndpoint) {
+    if (![dataCollectionToken isValid]) {
+      FIRCLSErrorLog(@"A report upload was requested with an invalid data collection token.");
+      return NO;
+    }
+
+    FIRCLSReportAdapter *adapter =
+        [[FIRCLSReportAdapter alloc] initWithPath:path
+                                      googleAppId:self.dataSource.googleAppID
+                                            orgId:self.dataSource.settings.orgID];
+
+    GDTCOREvent *event = [self.dataSource.googleTransport eventForTransport];
+    event.dataObject = adapter;
+    event.qosTier = GDTCOREventQoSFast;  // Bypass batching, send immediately
+
+    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
+
+    __block BOOL success = YES;
+
+    [self.dataSource.googleTransport
+        sendDataEvent:event
+           onComplete:^(BOOL wasWritten, NSError *error) {
+             if (!wasWritten) {
+               FIRCLSDeveloperLog("Crashlytics:Crash:Reports",
+                                  @"Failed to send crash report due to gdt write failure.");
+               success = NO;
+               return;
+             }
+
+             if (error) {
+               FIRCLSDeveloperLog("Crashlytics:Crash:Reports",
+                                  @"Failed to send crash report due to gdt error: %@",
+                                  error.localizedDescription);
+               success = NO;
+               return;
+             }
+
+             FIRCLSDeveloperLog("Crashlytics:Crash:Reports",
+                                @"Completed report submission with id: %@", path.lastPathComponent);
+
+             if (urgent) {
+               dispatch_semaphore_signal(semaphore);
+             }
+
+             [self cleanUpSubmittedReportAtPath:path];
+           }];
+
+    if (urgent) {
+      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+    }
+
+    return success;
+
+  } else if (!isNewPreparedPath && !self.dataSource.settings.shouldUseNewReportEndpoint) {
+    return [self submitPackageMultipartMimeAtPath:path
+                              dataCollectionToken:dataCollectionToken
+                                    synchronously:urgent];
+  }
+
+  // Unsupported state
+  return NO;
 }
 
 - (BOOL)cleanUpSubmittedReportAtPath:(NSString *)path {
@@ -271,4 +293,65 @@
                                           error:error];
 }
 
+#pragma mark - Properties (TODO: Can delete once the experiment is over)
+
+- (NSURL *)reportURL {
+  FIRCLSURLBuilder *url = [FIRCLSURLBuilder URLWithBase:FIRCLSReportsEndpoint];
+
+  [url appendComponent:@"/sdk-api/v1/platforms/"];
+  [url appendComponent:FIRCLSApplicationGetPlatform()];
+  [url appendComponent:@"/apps/"];
+  [url appendComponent:self.dataSource.settings.fetchedBundleID];
+  [url appendComponent:@"/reports"];
+
+  return [url URL];
+}
+
+- (NSString *)localeIdentifier {
+  return [[NSLocale currentLocale] localeIdentifier];
+}
+
+#pragma mark - URL Requests
+- (NSMutableURLRequest *)mutableRequestWithURL:(NSURL *)url timeout:(NSTimeInterval)timeout {
+  NSMutableURLRequest *request =
+      [NSMutableURLRequest requestWithURL:url
+                              cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
+                          timeoutInterval:timeout];
+
+  NSString *localeId = [self localeIdentifier];
+
+  [request setValue:@CLS_SDK_GENERATOR_NAME forHTTPHeaderField:FIRCLSNetworkUserAgent];
+  [request setValue:FIRCLSNetworkApplicationJson forHTTPHeaderField:FIRCLSNetworkAccept];
+  [request setValue:FIRCLSNetworkUTF8 forHTTPHeaderField:FIRCLSNetworkAcceptCharset];
+  [request setValue:localeId forHTTPHeaderField:FIRCLSNetworkAcceptLanguage];
+  [request setValue:localeId forHTTPHeaderField:FIRCLSNetworkContentLanguage];
+  [request setValue:FIRCLSDeveloperToken forHTTPHeaderField:FIRCLSNetworkCrashlyticsDeveloperToken];
+  [request setValue:FIRCLSApplicationGetSDKBundleID()
+      forHTTPHeaderField:FIRCLSNetworkCrashlyticsAPIClientId];
+  [request setValue:@CLS_SDK_DISPLAY_VERSION
+      forHTTPHeaderField:FIRCLSNetworkCrashlyticsAPIClientDisplayVersion];
+  [request setValue:[[self dataSource] googleAppID]
+      forHTTPHeaderField:FIRCLSNetworkCrashlyticsGoogleAppId];
+
+  return request;
+}
+
+- (BOOL)fillInRequest:(NSMutableURLRequest *)request forMultipartMimeDataAtPath:(NSString *)path {
+  NSString *boundary = [[path lastPathComponent] stringByDeletingPathExtension];
+
+  [request setValue:[FIRCLSMultipartMimeStreamEncoder
+                        contentTypeHTTPHeaderValueWithBoundary:boundary]
+      forHTTPHeaderField:@"Content-Type"];
+
+  NSNumber *fileSize = [[self fileManager] fileSizeAtPath:path];
+  if (fileSize == nil) {
+    FIRCLSErrorLog(@"Could not determine size of multipart mime file");
+    return NO;
+  }
+
+  [request setValue:[fileSize stringValue] forHTTPHeaderField:@"Content-Length"];
+
+  return YES;
+}
+
 @end

+ 12 - 1
Crashlytics/Crashlytics/FIRCrashlytics.m

@@ -48,6 +48,9 @@
 #import <FirebaseCore/FIROptionsInternal.h>
 #import <FirebaseInstallations/FirebaseInstallations.h>
 
+#import <GoogleDataTransport/GDTCORTargets.h>
+#import <GoogleDataTransport/GDTCORTransport.h>
+
 #if TARGET_OS_IPHONE
 #import <UIKit/UIKit.h>
 #endif
@@ -59,6 +62,8 @@ dispatch_queue_t _firclsExceptionQueue;
 
 static atomic_bool _hasInitializedInstance;
 
+NSString *const FIRCLSGoogleTransportMappingID = @"1206";
+
 /// Empty protocol to register with FirebaseCore's component system.
 @protocol FIRCrashlyticsInstanceProvider <NSObject>
 @end
@@ -70,6 +75,7 @@ static atomic_bool _hasInitializedInstance;
 @property(nonatomic) FIRCLSDataCollectionArbiter *dataArbiter;
 @property(nonatomic) FIRCLSFileManager *fileManager;
 @property(nonatomic) FIRCLSReportManager *reportManager;
+@property(nonatomic) GDTCORTransport *googleTransport;
 
 @end
 
@@ -97,6 +103,10 @@ static atomic_bool _hasInitializedInstance;
     FIRCLSDeveloperLog("Crashlytics", @"Running on %@, %@ (%@)", FIRCLSHostModelInfo(),
                        FIRCLSHostOSDisplayVersion(), FIRCLSHostOSBuildVersion());
 
+    _googleTransport = [[GDTCORTransport alloc] initWithMappingID:FIRCLSGoogleTransportMappingID
+                                                     transformers:nil
+                                                           target:kGDTCORTargetCSH];
+
     _fileManager = [[FIRCLSFileManager alloc] init];
     _googleAppID = app.options.googleAppID;
     _dataArbiter = [[FIRCLSDataCollectionArbiter alloc] initWithApp:app withAppInfo:appInfo];
@@ -104,7 +114,8 @@ static atomic_bool _hasInitializedInstance;
                                                         installations:installations
                                                             analytics:analytics
                                                           googleAppID:_googleAppID
-                                                          dataArbiter:_dataArbiter];
+                                                          dataArbiter:_dataArbiter
+                                                      googleTransport:_googleTransport];
 
     // Process did crash during previous execution
     NSString *crashedMarkerFileName = [NSString stringWithUTF8String:FIRCLSCrashedMarkerFileName];

+ 4 - 1
Crashlytics/Crashlytics/Models/FIRCLSFileManager.h

@@ -43,7 +43,9 @@
 @property(nonatomic, readonly) NSString *processingPath;
 @property(nonatomic, readonly) NSString *pendingPath;
 @property(nonatomic, readonly) NSString *preparedPath;
+@property(nonatomic, readonly) NSString *legacyPreparedPath;
 @property(nonatomic, readonly) NSArray *activePathContents;
+@property(nonatomic, readonly) NSArray *legacyPreparedPathContents;
 @property(nonatomic, readonly) NSArray *preparedPathContents;
 @property(nonatomic, readonly) NSArray *processingPathContents;
 
@@ -72,11 +74,12 @@
 - (void)enumerateFilesInPreparedDirectoryUsingBlock:(void (^)(NSString *path,
                                                               NSString *extension))block;
 
-- (BOOL)moveProcessingContentsToPrepared;
 - (BOOL)movePendingToProcessing;
 
 - (BOOL)removeContentsOfProcessingPath;
 - (BOOL)removeContentsOfPendingPath;
 - (BOOL)removeContentsOfAllPaths;
 
+- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
+
 @end

+ 23 - 7
Crashlytics/Crashlytics/Models/FIRCLSFileManager.m

@@ -19,7 +19,7 @@
 #import "FIRCLSLogger.h"
 
 NSString *const FIRCLSCacheDirectoryName = @"com.crashlytics.data";
-NSString *const FIRCLSCacheVersion = @"v4";
+NSString *const FIRCLSCacheVersion = @"v5";
 
 @interface FIRCLSFileManager () {
   NSString *_rootPath;
@@ -223,6 +223,10 @@ NSString *const FIRCLSCacheVersion = @"v4";
   return [[self structurePath] stringByAppendingPathComponent:@"processing"];
 }
 
+- (NSString *)legacyPreparedPath {
+  return [[self structurePath] stringByAppendingPathComponent:@"prepared-legacy"];
+}
+
 - (NSString *)preparedPath {
   return [[self structurePath] stringByAppendingPathComponent:@"prepared"];
 }
@@ -231,6 +235,10 @@ NSString *const FIRCLSCacheVersion = @"v4";
   return [self contentsOfDirectory:[self activePath]];
 }
 
+- (NSArray *)legacyPreparedPathContents {
+  return [self contentsOfDirectory:[self legacyPreparedPath]];
+}
+
 - (NSArray *)preparedPathContents {
   return [self contentsOfDirectory:[self preparedPath]];
 }
@@ -249,6 +257,10 @@ NSString *const FIRCLSCacheVersion = @"v4";
     return NO;
   }
 
+  if (![self createDirectoryAtPath:[self legacyPreparedPath]]) {
+    return NO;
+  }
+
   if (![self createDirectoryAtPath:[self preparedPath]]) {
     return NO;
   }
@@ -285,11 +297,7 @@ NSString *const FIRCLSCacheVersion = @"v4";
 
 - (void)enumerateFilesInPreparedDirectoryUsingBlock:(void (^)(NSString *path,
                                                               NSString *extension))block {
-  [self enumerateFilesInDirectory:[self preparedPath] usingBlock:block];
-}
-
-- (BOOL)moveProcessingContentsToPrepared {
-  return [self moveItemsFromDirectory:[self processingPath] toDirectory:[self preparedPath]];
+  [self enumerateFilesInDirectory:[self legacyPreparedPath] usingBlock:block];
 }
 
 - (BOOL)movePendingToProcessing {
@@ -309,11 +317,19 @@ NSString *const FIRCLSCacheVersion = @"v4";
   BOOL contentsOfPendingPathRemoved = [self removeContentsOfPendingPath];
   BOOL contentsOfDirectoryAtPreparedPathRemoved =
       [self removeContentsOfDirectoryAtPath:self.preparedPath];
+  BOOL contentsOfDirectoryAtLegacyPreparedPathRemoved =
+      [self removeContentsOfDirectoryAtPath:self.legacyPreparedPath];
   BOOL contentsOfDirectoryAtActivePathRemoved =
       [self removeContentsOfDirectoryAtPath:self.activePath];
   BOOL success = contentsOfProcessingPathRemoved && contentsOfPendingPathRemoved &&
-                 contentsOfDirectoryAtPreparedPathRemoved && contentsOfDirectoryAtActivePathRemoved;
+                 contentsOfDirectoryAtPreparedPathRemoved &&
+                 contentsOfDirectoryAtActivePathRemoved &&
+                 contentsOfDirectoryAtLegacyPreparedPathRemoved;
   return success;
 }
 
+- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error {
+  return [self.underlyingFileManager moveItemAtPath:srcPath toPath:dstPath error:error];
+}
+
 @end

+ 4 - 0
Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h

@@ -26,6 +26,8 @@ extern NSString *const FIRCLSReportMachExceptionFile;
 #endif
 extern NSString *const FIRCLSReportErrorAFile;
 extern NSString *const FIRCLSReportErrorBFile;
+extern NSString *const FIRCLSReportLogAFile;
+extern NSString *const FIRCLSReportLogBFile;
 extern NSString *const FIRCLSReportMetadataFile;
 extern NSString *const FIRCLSReportInternalIncrementalKVFile;
 extern NSString *const FIRCLSReportInternalCompactedKVFile;
@@ -43,6 +45,8 @@ extern NSString *const FIRCLSReportUserCompactedKVFile;
 - (instancetype)init NS_UNAVAILABLE;
 + (instancetype)new NS_UNAVAILABLE;
 
++ (NSArray *)crashFileNames;
+
 @property(nonatomic, copy, readonly) NSString *directoryName;
 @property(nonatomic, copy) NSString *path;
 @property(nonatomic, assign, readonly) BOOL needsToBeSubmitted;

+ 14 - 3
Crashlytics/Crashlytics/Models/FIRCLSInternalReport.m

@@ -12,6 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+// TODO: Remove this class after the uploading of reports via GoogleDataTransport is no longer an
+// experiment
+
 #import "FIRCLSInternalReport.h"
 
 #import "FIRCLSFile.h"
@@ -29,6 +32,8 @@ NSString *const FIRCLSReportMachExceptionFile = @"mach_exception.clsrecord";
 NSString *const FIRCLSReportMetadataFile = @"metadata.clsrecord";
 NSString *const FIRCLSReportErrorAFile = @"errors_a.clsrecord";
 NSString *const FIRCLSReportErrorBFile = @"errors_b.clsrecord";
+NSString *const FIRCLSReportLogAFile = @"log_a.clsrecord";
+NSString *const FIRCLSReportLogBFile = @"log_b.clsrecord";
 NSString *const FIRCLSReportInternalIncrementalKVFile = @"internal_incremental_kv.clsrecord";
 NSString *const FIRCLSReportInternalCompactedKVFile = @"internal_compacted_kv.clsrecord";
 NSString *const FIRCLSReportUserIncrementalKVFile = @"user_incremental_kv.clsrecord";
@@ -112,7 +117,13 @@ NSString *const FIRCLSReportUserCompactedKVFile = @"user_compacted_kv.clsrecord"
   return [self checkExistenceOfAtLeastOnceFileInArray:reportFiles];
 }
 
-- (NSArray *)crashFilenames {
+// These are purposefully in order of precedence. If duplicate data exists
+// in any crash file, the exception file's contents take precedence over the
+// rest, for example
+//
+// Do not change the order of this.
+//
++ (NSArray *)crashFileNames {
   static NSArray *files;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
@@ -128,7 +139,7 @@ NSString *const FIRCLSReportUserCompactedKVFile = @"user_compacted_kv.clsrecord"
 }
 
 - (BOOL)isCrash {
-  NSArray *crashFiles = [self crashFilenames];
+  NSArray *crashFiles = [FIRCLSInternalReport crashFileNames];
   return [self checkExistenceOfAtLeastOnceFileInArray:crashFiles];
 }
 
@@ -147,7 +158,7 @@ NSString *const FIRCLSReportUserCompactedKVFile = @"user_compacted_kv.clsrecord"
 }
 
 - (void)enumerateSymbolicatableFilesInContent:(void (^)(NSString *path))block {
-  for (NSString *fileName in [self crashFilenames]) {
+  for (NSString *fileName in [FIRCLSInternalReport crashFileNames]) {
     NSString *path = [self pathForContentFile:fileName];
 
     block(path);

+ 5 - 0
Crashlytics/Crashlytics/Models/FIRCLSSettings.h

@@ -102,6 +102,11 @@ NS_ASSUME_NONNULL_BEGIN
  */
 @property(nonatomic, readonly) BOOL customExceptionsEnabled;
 
+/**
+ * Determine if the SDK should use the new endpoint for uploading reports
+ */
+@property(nonatomic, readonly) BOOL shouldUseNewReportEndpoint;
+
 /**
  * Returns the maximum number of custom exception events that will be
  * recorded in a session.

+ 9 - 0
Crashlytics/Crashlytics/Models/FIRCLSSettings.m

@@ -290,6 +290,15 @@ NSString *const BuildInstanceID = @"build_instance_id";
   return YES;
 }
 
+- (BOOL)shouldUseNewReportEndpoint {
+  NSNumber *value = [self appSettings][@"report_upload_variant"];
+
+  // 0 - Unknown
+  // 1 - Legacy
+  // 2 - New
+  return value.intValue == 2;
+}
+
 #pragma mark - Optional Limit Overrides
 
 - (uint32_t)errorLogBufferSize {

+ 24 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.h

@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordBase.h"
+
+@interface FIRCLSRecordApplication : FIRCLSRecordBase
+
+@property(nonatomic, copy) NSString *build_version;
+@property(nonatomic, copy) NSString *display_version;
+
+@end

+ 30 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordApplication.m

@@ -0,0 +1,30 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordApplication.h"
+
+@implementation FIRCLSRecordApplication
+
+- (instancetype)initWithDict:(NSDictionary *)dict {
+  self = [super initWithDict:dict];
+  if (self) {
+    _display_version = dict[@"display_version"];
+    _build_version = dict[@"build_version"];
+  }
+  return self;
+}
+
+@end

+ 37 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+/**
+ * This is the base class to represent the data in the persisted crash (.clsrecord) files.
+ * The properties these subclasses are nullable on purpose. If there is an issue reading values
+ * from the crash files, continue as if those fields are optional so a report can still be uploaded.
+ * That way the issue can potentially be monitored through the backend.
+ **/
+@interface FIRCLSRecordBase : NSObject
+
+/**
+ * Mark the default initializer as unavailable so  the subclasses do not have to add the same line
+ **/
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * All subclasses should define an initializer taking in a dictionary
+ **/
+- (instancetype)initWithDict:(NSDictionary *)dict;
+
+@end

+ 25 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordBase.m

@@ -0,0 +1,25 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordBase.h"
+
+@implementation FIRCLSRecordBase
+
+- (instancetype)initWithDict:(NSDictionary *)dict {
+  return [super init];
+}
+
+@end

+ 23 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.h

@@ -0,0 +1,23 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordBase.h"
+
+@interface FIRCLSRecordHost : FIRCLSRecordBase
+
+@property(nonatomic, copy) NSString *platform;
+
+@end

+ 29 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordHost.m

@@ -0,0 +1,29 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordHost.h"
+
+@implementation FIRCLSRecordHost
+
+- (instancetype)initWithDict:(NSDictionary *)dict {
+  self = [super initWithDict:dict];
+  if (self) {
+    _platform = dict[@"platform"];
+  }
+  return self;
+}
+
+@end

+ 24 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.h

@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordBase.h"
+
+@interface FIRCLSRecordIdentity : FIRCLSRecordBase
+
+@property(nonatomic, copy) NSString *build_version;
+@property(nonatomic, copy) NSString *install_id;
+
+@end

+ 30 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSRecordIdentity.m

@@ -0,0 +1,30 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSRecordIdentity.h"
+
+@implementation FIRCLSRecordIdentity
+
+- (instancetype)initWithDict:(NSDictionary *)dict {
+  self = [super initWithDict:dict];
+  if (self) {
+    _build_version = dict[@"build_version"];
+    _install_id = dict[@"install_id"];
+  }
+  return self;
+}
+
+@end

+ 35 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.h

@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+#include "crashlytics.nanopb.h"
+
+#import <GoogleDataTransport/GDTCOREventDataObject.h>
+
+/// This class is responsible for reading the persisted crash reports from disk and converting them
+/// the information into the nanopb model to be used with GoogleDataTransport
+@interface FIRCLSReportAdapter : NSObject <GDTCOREventDataObject>
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/// Initializer
+/// @param folderPath Path where the persisted crash files reside
+- (instancetype)initWithPath:(NSString *)folderPath
+                 googleAppId:(NSString *)googleAppID
+                       orgId:(NSString *)orgID;
+
+@end

+ 240 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter.m

@@ -0,0 +1,240 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSReportAdapter.h"
+#import "FIRCLSReportAdapter_Private.h"
+
+#import "FIRCLSInternalReport.h"
+#import "FIRCLSLogger.h"
+
+#import "FIRCLSUserLogging.h"
+
+#import <nanopb/pb.h>
+#import <nanopb/pb_decode.h>
+#import <nanopb/pb_encode.h>
+
+@implementation FIRCLSReportAdapter
+
+- (instancetype)initWithPath:(NSString *)folderPath
+                 googleAppId:(NSString *)googleAppID
+                       orgId:(NSString *)orgID {
+  self = [super init];
+  if (self) {
+    _folderPath = folderPath;
+    _googleAppID = googleAppID;
+    _orgID = orgID;
+
+    [self loadMetaDataFile];
+
+    _report = [self protoReport];
+  }
+  return self;
+}
+
+- (void)dealloc {
+  pb_release(google_crashlytics_Report_fields, &_report);
+}
+
+//
+// MARK: Load from persisted crash files
+//
+
+/// Reads from metadata.clsrecord
+- (void)loadMetaDataFile {
+  NSString *path = [self.folderPath stringByAppendingPathComponent:FIRCLSReportMetadataFile];
+  NSDictionary *dict = [FIRCLSReportAdapter combinedDictionariesFromFilePath:path];
+
+  self.identity = [[FIRCLSRecordIdentity alloc] initWithDict:dict[@"identity"]];
+  self.host = [[FIRCLSRecordHost alloc] initWithDict:dict[@"host"]];
+  self.application = [[FIRCLSRecordApplication alloc] initWithDict:dict[@"application"]];
+}
+
+/// Return the persisted crash file as a combined dictionary that way lookups can occur with a key
+/// (to avoid ordering dependency)
+/// @param filePath Persisted crash file path
++ (NSDictionary *)combinedDictionariesFromFilePath:(NSString *)filePath {
+  NSMutableDictionary *joinedDict = [[NSMutableDictionary alloc] init];
+  for (NSDictionary *dict in [self dictionariesFromEachLineOfFile:filePath]) {
+    [joinedDict addEntriesFromDictionary:dict];
+  }
+  return joinedDict;
+}
+
+/// The persisted crash files contains JSON on separate lines. Read each line and return the JSON
+/// data as a dictionary.
+/// @param filePath Persisted crash file path
++ (NSArray<NSDictionary *> *)dictionariesFromEachLineOfFile:(NSString *)filePath {
+  NSString *content = [[NSString alloc] initWithContentsOfFile:filePath
+                                                      encoding:NSUTF8StringEncoding
+                                                         error:nil];
+  NSArray *lines =
+      [content componentsSeparatedByCharactersInSet:NSCharacterSet.newlineCharacterSet];
+
+  NSMutableArray<NSDictionary *> *array = [[NSMutableArray<NSDictionary *> alloc] init];
+
+  int lineNum = 0;
+  for (NSString *line in lines) {
+    lineNum++;
+
+    if (line.length == 0) {
+      // Likely newline at the end of the file
+      continue;
+    }
+
+    NSError *error;
+    NSDictionary *dict =
+        [NSJSONSerialization JSONObjectWithData:[line dataUsingEncoding:NSUTF8StringEncoding]
+                                        options:0
+                                          error:&error];
+
+    if (error) {
+      FIRCLSErrorLog(@"Failed to read JSON from file (%@) line (%d) with error: %@", filePath,
+                     lineNum, error);
+    } else {
+      [array addObject:dict];
+    }
+  }
+
+  return array;
+}
+
+//
+// MARK: GDTCOREventDataObject
+//
+
+- (NSData *)transportBytes {
+  pb_ostream_t sizestream = PB_OSTREAM_SIZING;
+
+  // Encode 1 time to determine the size.
+  if (!pb_encode(&sizestream, google_crashlytics_Report_fields, &_report)) {
+    FIRCLSErrorLog(@"Error in nanopb encoding for size: %s", PB_GET_ERROR(&sizestream));
+  }
+
+  // Encode a 2nd time to actually get the bytes from it.
+  size_t bufferSize = sizestream.bytes_written;
+  CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize);
+  CFDataSetLength(dataRef, bufferSize);
+  pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize);
+  if (!pb_encode(&ostream, google_crashlytics_Report_fields, &_report)) {
+    FIRCLSErrorLog(@"Error in nanopb encoding for bytes: %s", PB_GET_ERROR(&ostream));
+  }
+
+  return CFBridgingRelease(dataRef);
+}
+
+//
+// MARK: NanoPB conversions
+//
+
+- (google_crashlytics_Report)protoReport {
+  google_crashlytics_Report report = google_crashlytics_Report_init_default;
+  report.sdk_version = FIRCLSEncodeString(self.identity.build_version);
+  report.gmp_app_id = FIRCLSEncodeString(self.googleAppID);
+  report.platform = [self protoPlatformFromString:self.host.platform];
+  report.installation_uuid = FIRCLSEncodeString(self.identity.install_id);
+  report.build_version = FIRCLSEncodeString(self.application.build_version);
+  report.display_version = FIRCLSEncodeString(self.application.display_version);
+  report.apple_payload = [self protoFilesPayload];
+  return report;
+}
+
+- (google_crashlytics_FilesPayload)protoFilesPayload {
+  google_crashlytics_FilesPayload apple_payload = google_crashlytics_FilesPayload_init_default;
+
+  NSArray<NSString *> *clsRecords = [self clsRecordFilePaths];
+  google_crashlytics_FilesPayload_File *files =
+      malloc(sizeof(google_crashlytics_FilesPayload_File) * clsRecords.count);
+
+  for (NSUInteger i = 0; i < clsRecords.count; i++) {
+    google_crashlytics_FilesPayload_File file = google_crashlytics_FilesPayload_File_init_default;
+    file.filename = FIRCLSEncodeString(clsRecords[i].lastPathComponent);
+
+    NSError *error;
+    file.contents = FIRCLSEncodeData([NSData dataWithContentsOfFile:clsRecords[i]
+                                                            options:0
+                                                              error:&error]);
+    if (error) {
+      FIRCLSErrorLog(@"Failed to read from %@ with error: %@", clsRecords[i], error);
+    }
+
+    files[i] = file;
+  }
+
+  apple_payload.files = files;
+  apple_payload.files_count = (pb_size_t)clsRecords.count;
+  apple_payload.org_id = FIRCLSEncodeString(self.orgID);
+
+  return apple_payload;
+}
+
+- (NSArray<NSString *> *)clsRecordFilePaths {
+  NSMutableArray<NSString *> *clsRecords = [[NSMutableArray<NSString *> alloc] init];
+
+  NSError *error;
+  NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.folderPath
+                                                                       error:&error];
+
+  if (error) {
+    FIRCLSErrorLog(@"Failed to find .clsrecords from %@ with error: %@", self.folderPath, error);
+    return clsRecords;
+  }
+
+  [files enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
+    NSString *filename = (NSString *)obj;
+    if ([filename.pathExtension.lowercaseString isEqualToString:@"clsrecord"]) {
+      [clsRecords addObject:[self.folderPath stringByAppendingPathComponent:filename]];
+    }
+  }];
+
+  return [clsRecords sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
+}
+
+- (google_crashlytics_Platforms)protoPlatformFromString:(NSString *)str {
+  NSString *platform = str.lowercaseString;
+
+  if ([platform isEqualToString:@"ios"]) {
+    return google_crashlytics_Platforms_IOS;
+  } else if ([platform isEqualToString:@"mac"]) {
+    return google_crashlytics_Platforms_MAC_OS_X;
+  } else if ([platform isEqualToString:@"tvos"]) {
+    return google_crashlytics_Platforms_TVOS;
+  } else {
+    return google_crashlytics_Platforms_UNKNOWN_PLATFORM;
+  }
+}
+
+/** Mallocs a pb_bytes_array and copies the given NSString's bytes into the bytes array.
+ * @note Memory needs to be free manually, through pb_free or pb_release.
+ * @param string The string to encode as pb_bytes.
+ */
+pb_bytes_array_t *FIRCLSEncodeString(NSString *string) {
+  NSString *stringToEncode = string ? string : @"";
+  NSData *stringBytes = [stringToEncode dataUsingEncoding:NSUTF8StringEncoding];
+  return FIRCLSEncodeData(stringBytes);
+}
+
+/** Mallocs a pb_bytes_array and copies the given NSData bytes into the bytes array.
+ * @note Memory needs to be free manually, through pb_free or pb_release.
+ * @param data The data to copy into the new bytes array.
+ */
+pb_bytes_array_t *FIRCLSEncodeData(NSData *data) {
+  pb_bytes_array_t *pbBytes = malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(data.length));
+  memcpy(pbBytes->bytes, [data bytes], data.length);
+  pbBytes->size = (pb_size_t)data.length;
+  return pbBytes;
+}
+
+@end

+ 44 - 0
Crashlytics/Crashlytics/Models/Record/FIRCLSReportAdapter_Private.h

@@ -0,0 +1,44 @@
+/*
+ * Copyright 2020 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRCLSReportAdapter.h"
+
+#import "FIRCLSRecordApplication.h"
+#import "FIRCLSRecordHost.h"
+#import "FIRCLSRecordIdentity.h"
+
+pb_bytes_array_t *FIRCLSEncodeString(NSString *string);
+pb_bytes_array_t *FIRCLSEncodeData(NSData *data);
+
+@interface FIRCLSReportAdapter ()
+
+@property(nonatomic, readonly) BOOL hasCrashed;
+
+@property(nonatomic, strong) NSString *folderPath;
+@property(nonatomic, strong) NSString *googleAppID;
+@property(nonatomic, strong) NSString *orgID;
+
+// From metadata.clsrecord
+@property(nonatomic, strong) FIRCLSRecordIdentity *identity;
+@property(nonatomic, strong) FIRCLSRecordHost *host;
+@property(nonatomic, strong) FIRCLSRecordApplication *application;
+
+@property(nonatomic) google_crashlytics_Report report;
+
+- (google_crashlytics_Report)protoReport;
+- (NSArray<NSString *> *)clsRecordFilePaths;
+
+@end

+ 1 - 1
Crashlytics/Crashlytics/Operations/Reports/FIRCLSPackageReportOperation.m

@@ -97,7 +97,7 @@
 }
 
 - (NSString *)destinationDirectory {
-  return [self.fileManager preparedPath];
+  return [self.fileManager legacyPreparedPath];
 }
 
 - (NSString *)packagedPathWithName:(NSString *)name {

+ 26 - 0
Crashlytics/ProtoSupport/Protos/crashlytics.options

@@ -0,0 +1,26 @@
+# Copyright 2020 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Options for crashlytics.proto
+
+google_crashlytics.Report.sdk_version type:FT_POINTER
+google_crashlytics.Report.gmp_app_id type:FT_POINTER
+google_crashlytics.Report.installation_uuid type:FT_POINTER
+google_crashlytics.Report.build_version type:FT_POINTER
+google_crashlytics.Report.display_version type:FT_POINTER
+google_crashlytics.FilesPayload.File.filename type:FT_POINTER
+google_crashlytics.FilesPayload.File.contents type:FT_POINTER
+google_crashlytics.FilesPayload.files type:FT_POINTER
+google_crashlytics.FilesPayload.org_id type:FT_POINTER

+ 57 - 0
Crashlytics/ProtoSupport/Protos/crashlytics.proto

@@ -0,0 +1,57 @@
+// Copyright 2020 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google_crashlytics;
+
+enum Platforms {
+  UNKNOWN_PLATFORM = 0;
+  IOS = 1;
+  TVOS = 2;
+  MAC_OS_X = 5;
+}
+
+message Report {
+  // SDK version that generated this session
+  string sdk_version = 1;
+
+  // GMP App ID
+  string gmp_app_id = 3;
+
+  // General device type which generated the Event
+  Platforms platform = 4;
+
+  // Unique device generated guid for application install.
+  string installation_uuid = 5;
+
+  // App build version.
+  string build_version = 6;
+
+  // Developer-supplied application version.
+  string display_version = 7;
+
+  FilesPayload apple_payload = 10;
+}
+
+// Session data represented as a set of log and metadata files.
+message FilesPayload {
+  message File {
+    string filename = 1;
+    bytes contents = 2;
+  }
+
+  repeated File files = 1;
+  string org_id = 2;
+}

+ 56 - 0
Crashlytics/ProtoSupport/generate_crashlytics_protos.sh

@@ -0,0 +1,56 @@
+#!/bin/bash
+
+# Copyright 2020 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Example usage:
+# ./build_protos <path to nanopb>
+
+# Dependencies: git, protobuf, python-protobuf, pyinstaller
+
+readonly DIR="$( git rev-parse --show-toplevel )"
+
+# Current release of nanopb being used  to build the CCT protos
+readonly NANOPB_VERSION="0.3.9.3"
+readonly NANOPB_TEMPDIR="${DIR}/Crashlytics/nanopb_temp"
+
+readonly LIBRARY_DIR="${DIR}/Crashlytics/Crashlytics/"
+readonly PROTO_DIR="${DIR}/Crashlytics/ProtoSupport/Protos/"
+readonly PROTOGEN_DIR="${DIR}/Crashlytics/Protogen/"
+
+rm -rf "${NANOPB_TEMPDIR}"
+
+echo "Downloading nanopb..."
+git clone --branch "${NANOPB_VERSION}" https://github.com/nanopb/nanopb.git "${NANOPB_TEMPDIR}"
+
+echo "Building nanopb..."
+pushd "${NANOPB_TEMPDIR}"
+./tools/make_mac_package.sh
+GIT_DESCRIPTION=`git describe --always`-macosx-x86
+NANOPB_BIN_DIR="dist/${GIT_DESCRIPTION}"
+popd
+
+echo "Removing existing CCT protos..."
+rm -rf "${PROTOGEN_DIR}/*"
+
+echo "Generating CCT protos..."
+python "${DIR}/Crashlytics/ProtoSupport/proto_generator.py" \
+  --nanopb \
+  --protos_dir="${PROTO_DIR}" \
+  --pythonpath="${NANOPB_TEMPDIR}/${NANOPB_BIN_DIR}/generator" \
+  --output_dir="${PROTOGEN_DIR}" \
+  --include="${PROTO_DIR}"
+
+rm -rf "${NANOPB_TEMPDIR}"

+ 221 - 0
Crashlytics/ProtoSupport/nanopb_objc_generator.py

@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+
+# Copyright 2020 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Generates and massages protocol buffer outputs.
+"""
+
+from __future__ import print_function
+
+import sys
+
+import io
+import nanopb_generator as nanopb
+import os
+import os.path
+import shlex
+
+from google.protobuf.descriptor_pb2 import FieldDescriptorProto
+
+# The plugin_pb2 package loads descriptors on import, but doesn't defend
+# against multiple imports. Reuse the plugin package as loaded by the
+# nanopb_generator.
+plugin_pb2 = nanopb.plugin_pb2
+nanopb_pb2 = nanopb.nanopb_pb2
+
+
+def main():
+  # Parse request
+  data = io.open(sys.stdin.fileno(), 'rb').read()
+  request = plugin_pb2.CodeGeneratorRequest.FromString(data)
+
+  # Preprocess inputs, changing types and nanopb defaults
+  options = nanopb_parse_options(request)
+  use_anonymous_oneof(request)
+  use_bytes_for_strings(request)
+
+  # Generate code
+  parsed_files = nanopb_parse_files(request, options)
+  results = nanopb_generate(request, options, parsed_files)
+  response = nanopb_write(results)
+
+  # Write to stdout
+  io.open(sys.stdout.fileno(), 'wb').write(response.SerializeToString())
+
+
+def use_anonymous_oneof(request):
+  """Use anonymous unions for oneofs if they're the only one in a message.
+
+  Equivalent to setting this option on messages where it applies:
+
+    option (nanopb).anonymous_oneof = true;
+
+  Args:
+    request: A CodeGeneratorRequest from protoc. The descriptors are modified
+      in place.
+  """
+  for _, message_type in iterate_messages(request):
+    if len(message_type.oneof_decl) == 1:
+      ext = message_type.options.Extensions[nanopb_pb2.nanopb_msgopt]
+      ext.anonymous_oneof = True
+
+
+def use_bytes_for_strings(request):
+  """Always use the bytes type instead of string.
+
+  By default, nanopb renders proto strings as having the C type char* and does
+  not include a separate size field, getting the length of the string via
+  strlen(). Unfortunately this prevents using strings with embedded nulls,
+  which is something the wire format supports.
+
+  Fortunately, string and bytes proto fields are identical on the wire and
+  nanopb's bytes representation does have an explicit length, so this function
+  changes the types of all string fields to bytes. The generated code will now
+  contain pb_bytes_array_t.
+
+  There's no nanopb or proto option to control this behavior. The equivalent
+  would be to hand edit all the .proto files :-(.
+
+  Args:
+    request: A CodeGeneratorRequest from protoc. The descriptors are modified
+      in place.
+  """
+  for names, message_type in iterate_messages(request):
+    for field in message_type.field:
+      if field.type == FieldDescriptorProto.TYPE_STRING:
+        field.type = FieldDescriptorProto.TYPE_BYTES
+
+
+def iterate_messages(request):
+  """Iterates over all messages in all files in the request.
+
+  Args:
+    request: A CodeGeneratorRequest passed by protoc.
+
+  Yields:
+    names: a nanopb.Names object giving a qualified name for the message
+    message_type: a DescriptorProto for the message.
+  """
+  for fdesc in request.proto_file:
+    for names, message_type in nanopb.iterate_messages(fdesc):
+      yield names, message_type
+
+
+def nanopb_parse_options(request):
+  """Parses nanopb_generator command-line options from the given request.
+
+  Args:
+    request: A CodeGeneratorRequest passed by protoc.
+
+  Returns:
+    Nanopb's options object, obtained via optparser.
+  """
+  # Parse options the same as nanopb_generator.main_plugin() does.
+  args = shlex.split(request.parameter)
+  options, _ = nanopb.optparser.parse_args(args)
+
+  # Force certain options
+  options.extension = '.nanopb'
+  options.verbose = True
+  
+  # Replicate options setup from nanopb_generator.main_plugin.
+  nanopb.Globals.verbose_options = options.verbose
+
+  # Google's protoc does not currently indicate the full path of proto files.
+  # Instead always add the main file path to the search dirs, that works for
+  # the common case.
+  options.options_path.append(os.path.dirname(request.file_to_generate[0]))
+  return options
+
+
+def nanopb_parse_files(request, options):
+  """Parses the files in the given request into nanopb ProtoFile objects.
+
+  Args:
+    request: A CodeGeneratorRequest, as passed by protoc.
+    options: The command-line options from nanopb_parse_options.
+
+  Returns:
+    A dictionary of filename to nanopb.ProtoFile objects, each one representing
+    the parsed form of a FileDescriptor in the request.
+  """
+  # Process any include files first, in order to have them
+  # available as dependencies
+  parsed_files = {}
+  for fdesc in request.proto_file:
+    parsed_files[fdesc.name] = nanopb.parse_file(fdesc.name, fdesc, options)
+
+  return parsed_files
+
+
+def nanopb_generate(request, options, parsed_files):
+  """Generates C sources from the given parsed files.
+
+  Args:
+    request: A CodeGeneratorRequest, as passed by protoc.
+    options: The command-line options from nanopb_parse_options.
+    parsed_files: A dictionary of filename to nanopb.ProtoFile, as returned by
+      nanopb_parse_files().
+
+  Returns:
+    A list of nanopb output dictionaries, each one representing the code
+    generation result for each file to generate. The output dictionaries have
+    the following form:
+
+        {
+          'headername': Name of header file, ending in .h,
+          'headerdata': Contents of the header file,
+          'sourcename': Name of the source code file, ending in .c,
+          'sourcedata': Contents of the source code file
+        }
+  """
+  output = []
+
+  for filename in request.file_to_generate:
+    for fdesc in request.proto_file:
+      if fdesc.name == filename:
+        results = nanopb.process_file(filename, fdesc, options, parsed_files)
+        output.append(results)
+
+  return output
+
+
+def nanopb_write(results):
+  """Translates nanopb output dictionaries to a CodeGeneratorResponse.
+
+  Args:
+    results: A list of generated source dictionaries, as returned by
+      nanopb_generate().
+
+  Returns:
+    A CodeGeneratorResponse describing the result of the code generation
+    process to protoc.
+  """
+  response = plugin_pb2.CodeGeneratorResponse()
+
+  for result in results:
+    f = response.file.add()
+    f.name = result['headername']
+    f.content = result['headerdata']
+
+    f = response.file.add()
+    f.name = result['sourcename']
+    f.content = result['sourcedata']
+
+  return response
+
+
+if __name__ == '__main__':
+  main()

+ 323 - 0
Crashlytics/ProtoSupport/proto_generator.py

@@ -0,0 +1,323 @@
+#! /usr/bin/env python
+
+# Copyright 2020 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Generates and massages protocol buffer outputs.
+
+Example usage:
+
+python Crashlytics/ProtoSupport/build_protos.py \
+  --nanopb \
+  --protos_dir=Crashlytics/Classes/Protos/ \
+  --pythonpath=~/Downloads/nanopb-0.3.9.2-macosx-x86/generator/ \
+  --output_dir=Crashlytics/Protogen/
+"""
+
+from __future__ import print_function
+
+import sys
+
+import argparse
+import os
+import os.path
+import re
+import subprocess
+
+OBJC_GENERATOR='nanopb_objc_generator.py'
+
+COPYRIGHT_NOTICE = '''
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+'''.lstrip()
+
+
+def main():
+  parser = argparse.ArgumentParser(
+      description='Generates proto messages.')
+  parser.add_argument(
+      '--nanopb', action='store_true',
+      help='Generates nanopb messages.')
+  parser.add_argument(
+      '--objc', action='store_true',
+      help='Generates Objective-C messages.')
+  parser.add_argument(
+      '--protos_dir',
+      help='Source directory containing .proto files.')
+  parser.add_argument(
+      '--output_dir', '-d',
+      help='Directory to write files; subdirectories will be created.')
+  parser.add_argument(
+      '--protoc', default='protoc',
+      help='Location of the protoc executable')
+  parser.add_argument(
+      '--pythonpath',
+      help='Location of the protoc python library.')
+  parser.add_argument(
+      '--include', '-I', action='append', default=[],
+      help='Adds INCLUDE to the proto path.')
+
+
+  args = parser.parse_args()
+  if args.nanopb is None and args.objc is None:
+    parser.print_help()
+    sys.exit(1)
+
+  if args.protos_dir is None:
+    root_dir = os.path.abspath(os.path.dirname(__file__))
+    args.protos_dir = os.path.join(root_dir, 'protos')
+
+  if args.output_dir is None:
+    root_dir = os.path.abspath(os.path.dirname(__file__))
+    args.output_dir = os.path.join(root_dir, 'protogen-please-supply-an-outputdir')
+
+  all_proto_files = collect_files(args.protos_dir, '.proto')
+  if args.nanopb:
+    NanopbGenerator(args, all_proto_files).run()
+
+  proto_files = remove_well_known_protos(all_proto_files)
+
+  if args.objc:
+    ObjcProtobufGenerator(args, proto_files).run()
+
+
+class NanopbGenerator(object):
+  """Builds and runs the nanopb plugin to protoc."""
+
+  def __init__(self, args, proto_files):
+    self.args = args
+    self.proto_files = proto_files
+
+  def run(self):
+    """Performs the action of the generator."""
+
+    nanopb_out = os.path.join(self.args.output_dir, 'nanopb')
+    mkdir(nanopb_out)
+
+    self.__run_generator(nanopb_out)
+
+    sources = collect_files(nanopb_out, '.nanopb.h', '.nanopb.c')
+    post_process_files(
+        sources,
+        add_copyright,
+        nanopb_remove_extern_c,
+        nanopb_rename_delete,
+        nanopb_use_module_import
+    )
+
+  def __run_generator(self, out_dir):
+    """Invokes protoc using the nanopb plugin."""
+    cmd = protoc_command(self.args)
+
+    gen = os.path.join(os.path.dirname(__file__), OBJC_GENERATOR)
+    cmd.append('--plugin=protoc-gen-nanopb=%s' % gen)
+
+    nanopb_flags = [
+        '--extension=.nanopb',
+        '--source-extension=.c',
+        '--no-timestamp'
+    ]
+    nanopb_flags.extend(['-I%s' % path for path in self.args.include])
+    cmd.append('--nanopb_out=%s:%s' % (' '.join(nanopb_flags), out_dir))
+
+    cmd.extend(self.proto_files)
+    run_protoc(self.args, cmd)
+
+
+def protoc_command(args):
+  """Composes the initial protoc command-line including its include path."""
+  cmd = [args.protoc]
+  if args.include is not None:
+    cmd.extend(['-I=%s' % path for path in args.include])
+  return cmd
+
+
+def run_protoc(args, cmd):
+  """Actually runs the given protoc command.
+
+  Args:
+    args: The command-line args (including pythonpath)
+    cmd: The command to run expressed as a list of strings
+  """
+
+  kwargs = {}
+  if args.pythonpath:
+    env = os.environ.copy()
+    old_path = env.get('PYTHONPATH')
+    env['PYTHONPATH'] = os.path.expanduser(args.pythonpath)
+    if old_path is not None:
+      env['PYTHONPATH'] += os.pathsep + old_path
+    kwargs['env'] = env
+
+  try:
+    print(subprocess.check_output(cmd, stderr=subprocess.STDOUT, **kwargs))
+  except subprocess.CalledProcessError as error:
+    print('command failed: ', ' '.join(cmd), '\nerror: ', error.output)
+
+
+def remove_well_known_protos(filenames):
+  """Remove "well-known" protos for objc.
+
+  On those platforms we get these for free as a part of the protobuf runtime.
+  We only need them for nanopb.
+
+  Args:
+    filenames: A list of filenames, each naming a .proto file.
+
+  Returns:
+    The filenames with members of google/protobuf removed.
+  """
+
+  return [f for f in filenames if 'protos/google/protobuf/' not in f]
+
+
+def post_process_files(filenames, *processors):
+  for filename in filenames:
+    lines = []
+    with open(filename, 'r') as fd:
+      lines = fd.readlines()
+
+    for processor in processors:
+      lines = processor(lines)
+
+    write_file(filename, lines)
+
+
+def write_file(filename, lines):
+  mkdir(os.path.dirname(filename))
+  with open(filename, 'w') as fd:
+    fd.write(''.join(lines))
+
+
+def add_copyright(lines):
+  """Adds a copyright notice to the lines."""
+  result = [COPYRIGHT_NOTICE, '\n']
+  result.extend(lines)
+  return result
+
+
+def nanopb_remove_extern_c(lines):
+  """Removes extern "C" directives from nanopb code.
+
+  Args:
+    lines: A nanobp-generated source file, split into lines.
+  Returns:
+    A list of strings, similar to the input but modified to remove extern "C".
+  """
+  result = []
+  state = 'initial'
+  for line in lines:
+    if state == 'initial':
+      if '#ifdef __cplusplus' in line:
+        state = 'in-ifdef'
+        continue
+
+      result.append(line)
+
+    elif state == 'in-ifdef':
+      if '#endif' in line:
+        state = 'initial'
+
+  return result
+
+
+def nanopb_rename_delete(lines):
+  """Renames a delete symbol to delete_.
+
+  If a proto uses a field named 'delete', nanopb happily uses that in the
+  message definition. Works fine for C; not so much for C++.
+
+  Args:
+    lines: The lines to fix.
+
+  Returns:
+    The lines, fixed.
+  """
+  delete_keyword = re.compile(r'\bdelete\b')
+  return [delete_keyword.sub('delete_', line) for line in lines]
+
+
+def nanopb_use_module_import(lines):
+  """Changes #include <pb.h> to include <nanopb/pb.h>""" # Don't let Copybara alter these lines.
+  return [line.replace('#include <pb.h>', '{}include <nanopb/pb.h>'.format("#")) for line in lines]
+
+
+def strip_trailing_whitespace(lines):
+  """Removes trailing whitespace from the given lines."""
+  return [line.rstrip() + '\n' for line in lines]
+
+
+def objc_flatten_imports(lines):
+  """Flattens the import statements for compatibility with CocoaPods."""
+
+  long_import = re.compile(r'#import ".*/')
+  return [long_import.sub('#import "', line) for line in lines]
+
+
+def objc_strip_extension_registry(lines):
+  """Removes extensionRegistry methods from the classes."""
+  skip = False
+  result = []
+  for line in lines:
+    if '+ (GPBExtensionRegistry*)extensionRegistry {' in line:
+      skip = True
+    if not skip:
+      result.append(line)
+    elif line == '}\n':
+      skip = False
+
+  return result
+
+
+def collect_files(root_dir, *extensions):
+  """Finds files with the given extensions in the root_dir.
+
+  Args:
+    root_dir: The directory from which to start traversing.
+    *extensions: Filename extensions (including the leading dot) to find.
+
+  Returns:
+    A list of filenames, all starting with root_dir, that have one of the given
+    extensions.
+  """
+  result = []
+  for root, _, files in os.walk(root_dir):
+    for basename in files:
+      for ext in extensions:
+        if basename.endswith(ext):
+          filename = os.path.join(root, basename)
+          result.append(filename)
+  return result
+
+
+def mkdir(dirname):
+  if not os.path.isdir(dirname):
+    os.makedirs(dirname)
+
+
+if __name__ == '__main__':
+  main()

+ 76 - 0
Crashlytics/Protogen/nanopb/crashlytics.nanopb.c

@@ -0,0 +1,76 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.3.9.3 */
+
+#include "crashlytics.nanopb.h"
+
+/* @@protoc_insertion_point(includes) */
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+
+
+const pb_field_t google_crashlytics_Report_fields[8] = {
+    PB_FIELD(  1, BYTES   , SINGULAR, POINTER , FIRST, google_crashlytics_Report, sdk_version, sdk_version, 0),
+    PB_FIELD(  3, BYTES   , SINGULAR, POINTER , OTHER, google_crashlytics_Report, gmp_app_id, sdk_version, 0),
+    PB_FIELD(  4, UENUM   , SINGULAR, STATIC  , OTHER, google_crashlytics_Report, platform, gmp_app_id, 0),
+    PB_FIELD(  5, BYTES   , SINGULAR, POINTER , OTHER, google_crashlytics_Report, installation_uuid, platform, 0),
+    PB_FIELD(  6, BYTES   , SINGULAR, POINTER , OTHER, google_crashlytics_Report, build_version, installation_uuid, 0),
+    PB_FIELD(  7, BYTES   , SINGULAR, POINTER , OTHER, google_crashlytics_Report, display_version, build_version, 0),
+    PB_FIELD( 10, MESSAGE , SINGULAR, STATIC  , OTHER, google_crashlytics_Report, apple_payload, display_version, &google_crashlytics_FilesPayload_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t google_crashlytics_FilesPayload_fields[3] = {
+    PB_FIELD(  1, MESSAGE , REPEATED, POINTER , FIRST, google_crashlytics_FilesPayload, files, files, &google_crashlytics_FilesPayload_File_fields),
+    PB_FIELD(  2, BYTES   , SINGULAR, POINTER , OTHER, google_crashlytics_FilesPayload, org_id, files, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t google_crashlytics_FilesPayload_File_fields[3] = {
+    PB_FIELD(  1, BYTES   , SINGULAR, POINTER , FIRST, google_crashlytics_FilesPayload_File, filename, filename, 0),
+    PB_FIELD(  2, BYTES   , SINGULAR, POINTER , OTHER, google_crashlytics_FilesPayload_File, contents, filename, 0),
+    PB_LAST_FIELD
+};
+
+
+
+/* Check that field information fits in pb_field_t */
+#if !defined(PB_FIELD_32BIT)
+/* If you get an error here, it means that you need to define PB_FIELD_32BIT
+ * compile-time option. You can do that in pb.h or on compiler command line.
+ * The reason you need to do this is that some of your messages contain tag
+ * numbers or field sizes that are larger than what can fit in 8 or 16 bit
+ * field descriptors.
+ */
+PB_STATIC_ASSERT((pb_membersize(google_crashlytics_Report, apple_payload) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_google_crashlytics_Report_google_crashlytics_FilesPayload_google_crashlytics_FilesPayload_File)
+#endif
+
+#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
+/* If you get an error here, it means that you need to define PB_FIELD_16BIT
+ * compile-time option. You can do that in pb.h or on compiler command line.
+ * The reason you need to do this is that some of your messages contain tag
+ * numbers or field sizes that are larger than what can fit in the default
+ * 8 bit descriptors.
+ */
+PB_STATIC_ASSERT((pb_membersize(google_crashlytics_Report, apple_payload) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_google_crashlytics_Report_google_crashlytics_FilesPayload_google_crashlytics_FilesPayload_File)
+#endif
+
+
+/* @@protoc_insertion_point(eof) */

+ 109 - 0
Crashlytics/Protogen/nanopb/crashlytics.nanopb.h

@@ -0,0 +1,109 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.3.9.3 */
+
+#ifndef PB_GOOGLE_CRASHLYTICS_CRASHLYTICS_NANOPB_H_INCLUDED
+#define PB_GOOGLE_CRASHLYTICS_CRASHLYTICS_NANOPB_H_INCLUDED
+#include <nanopb/pb.h>
+
+/* @@protoc_insertion_point(includes) */
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+
+/* Enum definitions */
+typedef enum _google_crashlytics_Platforms {
+    google_crashlytics_Platforms_UNKNOWN_PLATFORM = 0,
+    google_crashlytics_Platforms_IOS = 1,
+    google_crashlytics_Platforms_TVOS = 2,
+    google_crashlytics_Platforms_MAC_OS_X = 5
+} google_crashlytics_Platforms;
+#define _google_crashlytics_Platforms_MIN google_crashlytics_Platforms_UNKNOWN_PLATFORM
+#define _google_crashlytics_Platforms_MAX google_crashlytics_Platforms_MAC_OS_X
+#define _google_crashlytics_Platforms_ARRAYSIZE ((google_crashlytics_Platforms)(google_crashlytics_Platforms_MAC_OS_X+1))
+
+/* Struct definitions */
+typedef struct _google_crashlytics_FilesPayload {
+    pb_size_t files_count;
+    struct _google_crashlytics_FilesPayload_File *files;
+    pb_bytes_array_t *org_id;
+/* @@protoc_insertion_point(struct:google_crashlytics_FilesPayload) */
+} google_crashlytics_FilesPayload;
+
+typedef struct _google_crashlytics_FilesPayload_File {
+    pb_bytes_array_t *filename;
+    pb_bytes_array_t *contents;
+/* @@protoc_insertion_point(struct:google_crashlytics_FilesPayload_File) */
+} google_crashlytics_FilesPayload_File;
+
+typedef struct _google_crashlytics_Report {
+    pb_bytes_array_t *sdk_version;
+    pb_bytes_array_t *gmp_app_id;
+    google_crashlytics_Platforms platform;
+    pb_bytes_array_t *installation_uuid;
+    pb_bytes_array_t *build_version;
+    pb_bytes_array_t *display_version;
+    google_crashlytics_FilesPayload apple_payload;
+/* @@protoc_insertion_point(struct:google_crashlytics_Report) */
+} google_crashlytics_Report;
+
+/* Default values for struct fields */
+
+/* Initializer values for message structs */
+#define google_crashlytics_Report_init_default   {NULL, NULL, _google_crashlytics_Platforms_MIN, NULL, NULL, NULL, google_crashlytics_FilesPayload_init_default}
+#define google_crashlytics_FilesPayload_init_default {0, NULL, NULL}
+#define google_crashlytics_FilesPayload_File_init_default {NULL, NULL}
+#define google_crashlytics_Report_init_zero      {NULL, NULL, _google_crashlytics_Platforms_MIN, NULL, NULL, NULL, google_crashlytics_FilesPayload_init_zero}
+#define google_crashlytics_FilesPayload_init_zero {0, NULL, NULL}
+#define google_crashlytics_FilesPayload_File_init_zero {NULL, NULL}
+
+/* Field tags (for use in manual encoding/decoding) */
+#define google_crashlytics_FilesPayload_files_tag 1
+#define google_crashlytics_FilesPayload_org_id_tag 2
+#define google_crashlytics_FilesPayload_File_filename_tag 1
+#define google_crashlytics_FilesPayload_File_contents_tag 2
+#define google_crashlytics_Report_sdk_version_tag 1
+#define google_crashlytics_Report_gmp_app_id_tag 3
+#define google_crashlytics_Report_platform_tag   4
+#define google_crashlytics_Report_installation_uuid_tag 5
+#define google_crashlytics_Report_build_version_tag 6
+#define google_crashlytics_Report_display_version_tag 7
+#define google_crashlytics_Report_apple_payload_tag 10
+
+/* Struct field encoding specification for nanopb */
+extern const pb_field_t google_crashlytics_Report_fields[8];
+extern const pb_field_t google_crashlytics_FilesPayload_fields[3];
+extern const pb_field_t google_crashlytics_FilesPayload_File_fields[3];
+
+/* Maximum encoded size of messages (where known) */
+/* google_crashlytics_Report_size depends on runtime parameters */
+/* google_crashlytics_FilesPayload_size depends on runtime parameters */
+/* google_crashlytics_FilesPayload_File_size depends on runtime parameters */
+
+/* Message IDs (where set with "msgid" option) */
+#ifdef PB_MSGID
+
+#define CRASHLYTICS_MESSAGES \
+
+
+#endif
+
+/* @@protoc_insertion_point(eof) */
+
+#endif

+ 14 - 0
Crashlytics/README.md

@@ -22,6 +22,20 @@ OR these two commands can be combined with
 You're now in an Xcode workspace generate for building, debugging and
 testing the FirebaseCrashlytics CocoaPod.
 
+### Updating crash report proto
+
+If the crash report proto needs to be updated, follow these instructions -
+- Prerequisite installations:
+    - `gem (update|install) cocoapods cocoapods-generate`
+    - `brew install protobuf nanopb-generator`
+    - `easy_install protobuf python`
+- Update `ProtoSupport/Protos/crashlytics.proto` with the new changes
+- Depending on the type of fields added/removed, also update `ProtoSupport/Protos/crashlytics.options`.
+ `CALLBACK` type fields in crashlytics.nanopb.c needs to be changed to `POINTER`
+ (through the options file). Known field types that require an entry in crashlytics.options are
+ `strings`, `repeated` and `bytes`.
+- Run `generate_project.sh` to update the nanopb .c/.h files.
+
 ### Running Unit Tests
 
 Open the generated workspace, choose the FirebaseCrashlytics-Unit-unit scheme and press Command-u.

+ 453 - 0
Crashlytics/UnitTests/Data/bare_min_crash/binary_images.clsrecord

@@ -0,0 +1,453 @@
+{"load":{"path":"/private/var/containers/Bundle/Application/5FA91ED7-C181-4487-920C-C78FEECFEB42/Crashlytics-iOS-App.app/Crashlytics-iOS-App","uuid":"afd4b090589533159fa2b371a2787a2b","base":4309893120,"size":1556480}}
+{"load":{"path":"/usr/lib/libc++.1.dylib","uuid":"fff3d40d85a0308eac32908bca1188d0","base":7201263616,"size":372736}}
+{"load":{"path":"/usr/lib/libz.1.dylib","uuid":"cf99bb9237a434b4b2394e3856427cd6","base":8101662720,"size":73728}}
+{"load":{"path":"/System/Library/Frameworks/Foundation.framework/Foundation","uuid":"7a7a96af79e43db1890442e61cae8999","base":7205990400,"size":2932736}}
+{"load":{"path":"/System/Library/Frameworks/Security.framework/Security","uuid":"98dbc2a227aa3095a418269882fd49c0","base":7218032640,"size":1314816}}
+{"load":{"path":"/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration","uuid":"9e1b636801ac32da9dabce33f20ce872","base":7205568512,"size":421888}}
+{"load":{"path":"/System/Library/Frameworks/UIKit.framework/UIKit","uuid":"96df300bc0b432658133434fe94c795d","base":7912435712,"size":4096}}
+{"load":{"path":"/usr/lib/libobjc.A.dylib","uuid":"2c18c54e6c84310c851ff9602890d908","base":7200092160,"size":200704}}
+{"load":{"path":"/usr/lib/libSystem.B.dylib","uuid":"773c3a5bb56e304984cfe35816be0791","base":8089583616,"size":8192}}
+{"load":{"path":"/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation","uuid":"dc2c95c6b95439e886a25e0af8801e87","base":7201906688,"size":3661824}}
+{"load":{"path":"/usr/lib/swift/libswiftCore.dylib","uuid":"95929e13207b33dc8fb760fffde1c5b0","base":7427956736,"size":3719168}}
+{"load":{"path":"/usr/lib/swift/libswiftDispatch.dylib","uuid":"8f1dc3dc35e53e2fab9c3953ed180687","base":8103059456,"size":118784}}
+{"load":{"path":"/usr/lib/swift/libswiftFoundation.dylib","uuid":"143119a6e4d43c5da0ac1549b806af29","base":8103178240,"size":1638400}}
+{"load":{"path":"/usr/lib/swift/libswiftObjectiveC.dylib","uuid":"191aa4a656243297b5f9d95acad71537","base":8105553920,"size":28672}}
+{"load":{"path":"/usr/lib/swift/libswiftUIKit.dylib","uuid":"ab306530547934f0a69064ada385978c","base":8105889792,"size":86016}}
+{"load":{"path":"/usr/lib/libc++abi.dylib","uuid":"b60e71f7dd75323c8831b1ca4d42e3cb","base":7200739328,"size":81920}}
+{"load":{"path":"/usr/lib/libcompression.dylib","uuid":"adf3fe98bea632d59c9313e109621095","base":8091463680,"size":98304}}
+{"load":{"path":"/System/Library/Frameworks/CFNetwork.framework/CFNetwork","uuid":"e94fb3fd49b5399497b4f12c844cbe7e","base":7256088576,"size":3543040}}
+{"load":{"path":"/usr/lib/libarchive.2.dylib","uuid":"446b5d27268d39aabc3050908c749d8c","base":7745597440,"size":462848}}
+{"load":{"path":"/usr/lib/libicucore.A.dylib","uuid":"8081f1ff2cca3276a3c0acaf2f9943df","base":7220727808,"size":2494464}}
+{"load":{"path":"/usr/lib/libxml2.2.dylib","uuid":"09efa77806b83c38b6392a34be03791c","base":7477936128,"size":962560}}
+{"load":{"path":"/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit","uuid":"667b9f46ecd936bfa2d3caedcb32a283","base":7219347456,"size":684032}}
+{"load":{"path":"/usr/lib/libCRFSuite.dylib","uuid":"15ee962961303d46964ecd419e64345a","base":7208923136,"size":208896}}
+{"load":{"path":"/usr/lib/liblangid.dylib","uuid":"52181791212639f09917bf721f063966","base":7456186368,"size":8192}}
+{"load":{"path":"/usr/lib/libsqlite3.dylib","uuid":"1670cf23e637381abf5faebd116d31ee","base":7232704512,"size":1601536}}
+{"load":{"path":"/usr/lib/libcoretls.dylib","uuid":"cd17611b39043652897fee5b2ea1fb21","base":7551918080,"size":94208}}
+{"load":{"path":"/usr/lib/libcoretls_cfhelpers.dylib","uuid":"05fb230a923b33e080efebc218e88d95","base":8091561984,"size":8192}}
+{"load":{"path":"/usr/lib/libMobileGestalt.dylib","uuid":"0cd87d8d90db3de6b7dc85346b64132c","base":7220031488,"size":229376}}
+{"load":{"path":"/usr/lib/libbsm.0.dylib","uuid":"521d3c6f861c3989b2f40eb13d2dd33f","base":8091262976,"size":69632}}
+{"load":{"path":"/usr/lib/libnetwork.dylib","uuid":"6ecb169749ec30cb980f63831f8412ad","base":7239254016,"size":5091328}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DocumentManager.framework/DocumentManager","uuid":"9a8115eff3ac3da7848ef4ad7665945d","base":7399665664,"size":192512}}
+{"load":{"path":"/System/Library/Frameworks/FileProvider.framework/FileProvider","uuid":"11f085a9c6b0364e801352afc807dcc8","base":7542333440,"size":1105920}}
+{"load":{"path":"/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore","uuid":"aafefebec17233468972810eb8f2f2c6","base":7260561408,"size":17977344}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ShareSheet.framework/ShareSheet","uuid":"9bc883eda26338e1b1bfac87f237ea28","base":7397675008,"size":622592}}
+{"load":{"path":"/usr/lib/system/libcache.dylib","uuid":"c67a14f00f763214b024b62734061cfc","base":8106188800,"size":24576}}
+{"load":{"path":"/usr/lib/system/libcommonCrypto.dylib","uuid":"8f6a8b7d90b63bb49ef51686cf390474","base":8106213376,"size":69632}}
+{"load":{"path":"/usr/lib/system/libcompiler_rt.dylib","uuid":"455721aa62ea32338783af085ea5b027","base":8106283008,"size":16384}}
+{"load":{"path":"/usr/lib/system/libcopyfile.dylib","uuid":"84d0f64d3bf137dab97d8d923269030e","base":7749341184,"size":36864}}
+{"load":{"path":"/usr/lib/system/libcorecrypto.dylib","uuid":"9d52b5f81c483635ad32214f878e3e29","base":7200292864,"size":446464}}
+{"load":{"path":"/usr/lib/system/libdispatch.dylib","uuid":"0c7a69cdf2ee3426bfd8742c903d3d07","base":7199633408,"size":249856}}
+{"load":{"path":"/usr/lib/system/libdyld.dylib","uuid":"9d12204719b736a2a89227401f9e0e6c","base":7201013760,"size":212992}}
+{"load":{"path":"/usr/lib/system/liblaunch.dylib","uuid":"5545bb57da133c178a4e893f67f3bbdb","base":8107180032,"size":4096}}
+{"load":{"path":"/usr/lib/system/libmacho.dylib","uuid":"7f0b22c0167433c2a4d9224c3c2746da","base":8107184128,"size":24576}}
+{"load":{"path":"/usr/lib/system/libremovefile.dylib","uuid":"78ba982e4ac339a081d6770ac532094d","base":8107208704,"size":8192}}
+{"load":{"path":"/usr/lib/system/libsystem_asl.dylib","uuid":"8720eceb36db35b1b69d89c13bd6464f","base":7279509504,"size":94208}}
+{"load":{"path":"/usr/lib/system/libsystem_blocks.dylib","uuid":"0fb3b7d281de30979e83b408b48e8b0e","base":7199109120,"size":4096}}
+{"load":{"path":"/usr/lib/system/libsystem_c.dylib","uuid":"8b9c0d18aeba3e24a95f2ec54f9fb4ef","base":7199113216,"size":520192}}
+{"load":{"path":"/usr/lib/system/libsystem_configuration.dylib","uuid":"ac925c4261b7348da2ba46577384d5db","base":7453675520,"size":20480}}
+{"load":{"path":"/usr/lib/system/libsystem_containermanager.dylib","uuid":"b96c896edc9f394c81f8dfbc1091e47b","base":7309975552,"size":40960}}
+{"load":{"path":"/usr/lib/system/libsystem_coreservices.dylib","uuid":"3204f9091c1233fab5466a9223b06851","base":7747092480,"size":8192}}
+{"load":{"path":"/usr/lib/system/libsystem_darwin.dylib","uuid":"e2c1c480b2ec3bbea3fa4c70e4056c64","base":7201226752,"size":36864}}
+{"load":{"path":"/usr/lib/system/libsystem_dnssd.dylib","uuid":"e8549e75a1463486b7cd35ac881d2f4b","base":7542272000,"size":32768}}
+{"load":{"path":"/usr/lib/system/libsystem_featureflags.dylib","uuid":"3fdc940f51b03e06a4ca0a806e24a565","base":8107216896,"size":8192}}
+{"load":{"path":"/usr/lib/system/libsystem_info.dylib","uuid":"c2e15922d993340aaa5da454a57dfb76","base":7201636352,"size":270336}}
+{"load":{"path":"/usr/lib/system/libsystem_m.dylib","uuid":"e924f838a34b3a8d8c1b6d198ded17c1","base":8107225088,"size":188416}}
+{"load":{"path":"/usr/lib/system/libsystem_malloc.dylib","uuid":"479f1b0225ee32ce8c0afaf20cd9e0c6","base":7199883264,"size":135168}}
+{"load":{"path":"/usr/lib/system/libsystem_networkextension.dylib","uuid":"07dd981a43d432e4a75f0edf005264e3","base":7286972416,"size":61440}}
+{"load":{"path":"/usr/lib/system/libsystem_notify.dylib","uuid":"c5024cb0e4843b2482250cf4d9f2c074","base":7234514944,"size":40960}}
+{"load":{"path":"/usr/lib/system/libsystem_sandbox.dylib","uuid":"92820689c0b63e909927898e40e8492e","base":7539056640,"size":12288}}
+{"load":{"path":"/usr/lib/system/libsystem_kernel.dylib","uuid":"ae36dce0999d39909eed01106f17dc90","base":7200821248,"size":192512}}
+{"load":{"path":"/usr/lib/system/libsystem_platform.dylib","uuid":"b07cc9f89c9f38b0bb974a77bf6a5db4","base":7200018432,"size":28672}}
+{"load":{"path":"/usr/lib/system/libsystem_pthread.dylib","uuid":"637416f6a7a3339b96ed9ebc80d38988","base":7200047104,"size":45056}}
+{"load":{"path":"/usr/lib/system/libsystem_symptoms.dylib","uuid":"f76c087a16863e20b189be0ee42175dc","base":7291072512,"size":32768}}
+{"load":{"path":"/usr/lib/system/libsystem_trace.dylib","uuid":"1177e8a367aa3c8cb5605bcc40419d54","base":7198801920,"size":94208}}
+{"load":{"path":"/usr/lib/system/libunwind.dylib","uuid":"19ddabc7002c33ab90c5cb020d7c4572","base":8107413504,"size":24576}}
+{"load":{"path":"/usr/lib/system/libxpc.dylib","uuid":"e2894301267b3872a3cd0aaf659353a9","base":7198896128,"size":212992}}
+{"load":{"path":"/System/Library/Frameworks/Combine.framework/Combine","uuid":"dd73247011e23ca59195094e2730a538","base":7900835840,"size":1101824}}
+{"load":{"path":"/usr/lib/swift/libswiftDarwin.dylib","uuid":"4aa7b72c3631348bb7b33eab92f974a0","base":8103018496,"size":40960}}
+{"load":{"path":"/usr/lib/swift/libswiftCoreFoundation.dylib","uuid":"a924a98f5a703d54a65e022e9193680a","base":8102567936,"size":20480}}
+{"load":{"path":"/usr/lib/swift/libswiftCoreGraphics.dylib","uuid":"d42608b44ea433a89c512d1de4dbbf74","base":8102588416,"size":61440}}
+{"load":{"path":"/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics","uuid":"ec19539856b13b91b6996b20fde8cb80","base":7319068672,"size":5718016}}
+{"load":{"path":"/usr/lib/swift/libswiftCoreImage.dylib","uuid":"b2c4b2df88bb3681b7e4c2a2f8e812c1","base":8102649856,"size":20480}}
+{"load":{"path":"/usr/lib/swift/libswiftMetal.dylib","uuid":"b1281d74f9da32b1bcb166d1abde0daa","base":8105046016,"size":32768}}
+{"load":{"path":"/usr/lib/swift/libswiftQuartzCore.dylib","uuid":"960ebdd535113dda80afa290bfd433a2","base":8105619456,"size":24576}}
+{"load":{"path":"/usr/lib/liblzma.5.dylib","uuid":"0121b6fe5e813f688d09dd5a4068605a","base":8093282304,"size":102400}}
+{"load":{"path":"/usr/lib/libapple_nghttp2.dylib","uuid":"ee3a83b9547b312eae767dfa8158b6d6","base":8090677248,"size":90112}}
+{"load":{"path":"/usr/lib/libbz2.1.0.dylib","uuid":"151a0a3a7b6338ee8cddfe5cca976cc6","base":8091332608,"size":53248}}
+{"load":{"path":"/usr/lib/libiconv.2.dylib","uuid":"585d7b1ecfde3dbd8cfb65745e2e7ac8","base":8092151808,"size":995328}}
+{"load":{"path":"/usr/lib/libenergytrace.dylib","uuid":"d04472667569321f996d7e7bb9115053","base":7248834560,"size":4096}}
+{"load":{"path":"/usr/lib/libpcap.A.dylib","uuid":"c319e503a88e3fb2ae7ff4b449b568e2","base":7882420224,"size":241664}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileIcons.framework/MobileIcons","uuid":"e8b1677059c43251888e6178c36f70ef","base":7636787200,"size":65536}}
+{"load":{"path":"/System/Library/Frameworks/QuartzCore.framework/QuartzCore","uuid":"4da865ca7f363d7f952e05a9e5ed505d","base":7314784256,"size":2457600}}
+{"load":{"path":"/System/Library/Frameworks/CoreServices.framework/CoreServices","uuid":"9298be2d0bd93660bddcf43d32ea3872","base":7209132032,"size":1589248}}
+{"load":{"path":"/System/Library/Frameworks/Network.framework/Network","uuid":"1219db6932e9365aa50a7ff994f4fe4e","base":7289540608,"size":1150976}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DocumentManagerCore.framework/DocumentManagerCore","uuid":"76354137b4ad3a2db4c614d4a918f5d8","base":7951634432,"size":118784}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit","uuid":"f4803530aa9e3ba9855c260f6e3ac1af","base":7427780608,"size":176128}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ProtocolBuffer.framework/ProtocolBuffer","uuid":"129d63f1fbcb30e18ec3bed0f9f21589","base":7248629760,"size":94208}}
+{"load":{"path":"/System/Library/Frameworks/Accounts.framework/Accounts","uuid":"8760adcf0b723e0c8098e561851ca835","base":7255662592,"size":356352}}
+{"load":{"path":"/System/Library/PrivateFrameworks/GenerationalStorage.framework/GenerationalStorage","uuid":"769d226045e03f4b847a6bd82d747e48","base":7875497984,"size":126976}}
+{"load":{"path":"/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices","uuid":"cf705b73e23d3f44ac1f80c686536cef","base":7907573760,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CrashReporterSupport.framework/CrashReporterSupport","uuid":"218df76812bf3b50985d0b892be69ce2","base":7452520448,"size":65536}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SymptomDiagnosticReporter.framework/SymptomDiagnosticReporter","uuid":"6e2ceb18b3c238909c7224059cc73ef3","base":7550341120,"size":36864}}
+{"load":{"path":"/System/Library/PrivateFrameworks/UserManagement.framework/UserManagement","uuid":"6b21d05273aa35bf9aebbd45b36c8c87","base":7245639680,"size":139264}}
+{"load":{"path":"/System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation","uuid":"8badfa0df51739f9ac82cecdb0a4ac66","base":7259631616,"size":929792}}
+{"load":{"path":"/System/Library/Frameworks/PushKit.framework/PushKit","uuid":"4a78830211d53250aa6ca483801f76ad","base":7542304768,"size":28672}}
+{"load":{"path":"/System/Library/PrivateFrameworks/XCTTargetBootstrap.framework/XCTTargetBootstrap","uuid":"7be167b6515e32f0849de3cc36d2a4e9","base":7409688576,"size":16384}}
+{"load":{"path":"/System/Library/Frameworks/IOSurface.framework/IOSurface","uuid":"a16823eb17723ae7b9cd5669882ff3bb","base":7365586944,"size":73728}}
+{"load":{"path":"/System/Library/Frameworks/OpenGLES.framework/OpenGLES","uuid":"94b3d65e12d233a6be1dff206fdb9770","base":7650807808,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/WebKitLegacy.framework/WebKitLegacy","uuid":"7958a1d222d93765bb4fa9e950d3a92e","base":7407349760,"size":1376256}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AggregateDictionary.framework/AggregateDictionary","uuid":"3fe399052aec3a05a8b161d8a2297524","base":7279484928,"size":24576}}
+{"load":{"path":"/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore","uuid":"c487262f3edb302ab3153576e2d08b43","base":7456194560,"size":14659584}}
+{"load":{"path":"/System/Library/PrivateFrameworks/RunningBoardServices.framework/RunningBoardServices","uuid":"9f651b0077a73117a2eda47d407045da","base":7248838656,"size":233472}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SAObjects.framework/SAObjects","uuid":"09f857ae919f3698a8f375150a5e4920","base":7571185664,"size":512000}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PowerLog.framework/PowerLog","uuid":"e38c8d42d0883dad874a93d61f25ac88","base":7365500928,"size":86016}}
+{"load":{"path":"/System/Library/PrivateFrameworks/HangTracer.framework/HangTracer","uuid":"8cd94d2dcc9a3a869ccfaa65c6677d23","base":7455694848,"size":61440}}
+{"load":{"path":"/usr/lib/liblockdown.dylib","uuid":"4ea2f33daedf369094e2cd6ce79a5e3e","base":8093233152,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileKeyBag.framework/MobileKeyBag","uuid":"a9ba69467e52322c80d1eb9510833006","base":7234306048,"size":208896}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SignpostMetrics.framework/SignpostMetrics","uuid":"06fd3e7756263027b617d51af79fd87c","base":8044670976,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/StudyLog.framework/StudyLog","uuid":"4ff082f0011f3289a1e45e67989414de","base":7601758208,"size":32768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreMaterial.framework/CoreMaterial","uuid":"8c5d46a66d3f3a27977ef9ac8605a0d0","base":7477825536,"size":110592}}
+{"load":{"path":"/usr/lib/libapp_launch_measurement.dylib","uuid":"e9e6d9c0433635088072c4025e7d9fe9","base":7450525696,"size":12288}}
+{"load":{"path":"/System/Library/Frameworks/LinkPresentation.framework/LinkPresentation","uuid":"e9806606689131c88570426a27c1e9a3","base":7452663808,"size":786432}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreSVG.framework/CoreSVG","uuid":"975d3d7d05ea39b3a3f0746c8feff2b6","base":7526998016,"size":147456}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Accelerate","uuid":"daa9c13c7fdb38a2b5a4e6f3df7659d6","base":7896666112,"size":4096}}
+{"load":{"path":"/System/Library/Frameworks/CoreImage.framework/CoreImage","uuid":"3e5cfeadb2583798bf4b1a2423970190","base":7228428288,"size":2985984}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreAnalytics.framework/CoreAnalytics","uuid":"9a1858e559963c299cc192367406f027","base":7287033856,"size":135168}}
+{"load":{"path":"/System/Library/Frameworks/CoreText.framework/CoreText","uuid":"6f9c00cf003b30d4aa51df5f3d3192aa","base":7216357376,"size":1675264}}
+{"load":{"path":"/System/Library/Frameworks/ImageIO.framework/ImageIO","uuid":"b301e385830f311ebce0e786df524e8e","base":7211126784,"size":5218304}}
+{"load":{"path":"/System/Library/Frameworks/UserNotifications.framework/UserNotifications","uuid":"cffabd1a9c043e179af4ef72f20227e3","base":7326081024,"size":200704}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport","uuid":"eed8464e61c1385abb34a937feda945f","base":7239000064,"size":253952}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AssertionServices.framework/AssertionServices","uuid":"92e1717258813893bdc292409ee6ec7c","base":7278538752,"size":61440}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BackBoardServices.framework/BackBoardServices","uuid":"e485693989fe3af1b52f0a73a4f372c0","base":7314436096,"size":348160}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BaseBoard.framework/BaseBoard","uuid":"6dea964e3a97384f81b8d5a3be499760","base":7249072128,"size":495616}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreUI.framework/CoreUI","uuid":"f5600e8a391739438a16ecaca280efc5","base":7422971904,"size":761856}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FrontBoardServices.framework/FrontBoardServices","uuid":"370f1f18e8a936b5b0eb9735a02ce2de","base":7289049088,"size":491520}}
+{"load":{"path":"/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices","uuid":"35a16dda337d378fadb4b70c8a46bb74","base":7373041664,"size":36864}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileAsset.framework/MobileAsset","uuid":"4a80dea66d10317da3eee57759fa61a5","base":7376683008,"size":106496}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PhysicsKit.framework/PhysicsKit","uuid":"d07db9feda3e385cb9465cf3b37f1dae","base":7864836096,"size":294912}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ProofReader.framework/ProofReader","uuid":"3045032abf5831d48c16141d126543da","base":7639048192,"size":831488}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PrototypeTools.framework/PrototypeTools","uuid":"3e66f9d5dc4c39e9a15c85b0a019e45c","base":7435792384,"size":102400}}
+{"load":{"path":"/System/Library/PrivateFrameworks/TextInput.framework/TextInput","uuid":"4bd92dd0b07d3df8a30e8e916bd2e6ef","base":7408726016,"size":438272}}
+{"load":{"path":"/System/Library/PrivateFrameworks/UIKitServices.framework/UIKitServices","uuid":"7ca41cb46fd03e96a3d9dfbe74305ad7","base":7314366464,"size":69632}}
+{"load":{"path":"/usr/lib/libAccessibility.dylib","uuid":"02691cb3d3723935be9f2eca79233d00","base":7364845568,"size":102400}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreUtils.framework/CoreUtils","uuid":"3cf1c31488173637a72f8ba3bfe83a53","base":7307603968,"size":1454080}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IconServices.framework/IconServices","uuid":"69a79f0246f7318e9f84432ae2583776","base":7574319104,"size":155648}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib","uuid":"134fc516ef1e3a9d9a070562ef2edd0d","base":7376887808,"size":1372160}}
+{"load":{"path":"/System/Library/Frameworks/Metal.framework/Metal","uuid":"13e30f11be8f3c7489816f5c6cd252fd","base":7541411840,"size":651264}}
+{"load":{"path":"/usr/lib/libcharset.1.dylib","uuid":"2ff687dceebb322a928c71c254eadd20","base":8091385856,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/IOSurfaceAccelerator","uuid":"bc2cae1654eb3bd9aa4f0c8cc50588b7","base":7550377984,"size":12288}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ASEProcessing.framework/ASEProcessing","uuid":"813d4875d3123d2083f7f54e67406654","base":7918366720,"size":20480}}
+{"load":{"path":"/usr/lib/libtailspin.dylib","uuid":"01cde70cb0ad3b9c86de40ef2d35e99e","base":7635312640,"size":114688}}
+{"load":{"path":"/System/Library/PrivateFrameworks/libEDR.framework/libEDR","uuid":"35b978e85ed83cb9902df7fc6ec4942a","base":7797837824,"size":90112}}
+{"load":{"path":"/System/Library/Frameworks/CoreVideo.framework/CoreVideo","uuid":"8425dd4299353b3ea645ce6b2506f1b1","base":7423885312,"size":225280}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer","uuid":"6d3be74710283533afed3b93ebfa73e0","base":7474176000,"size":40960}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/MetalPerformanceShaders","uuid":"ee7830af0c0e34718b0d49b2b47068ea","base":7907520512,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation","uuid":"943199a1a35e350891acb25ac74f13ce","base":7541211136,"size":200704}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreServicesStore.framework/CoreServicesStore","uuid":"24e44ad3986f340fbe32c6e3642628a6","base":7245463552,"size":176128}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ManagedConfiguration.framework/ManagedConfiguration","uuid":"01d6e90e5d173ab9bb56afbbad078ca7","base":7244345344,"size":1118208}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleAccount.framework/AppleAccount","uuid":"44c8ad8bd0e1386ca4f8f5558eb86e07","base":7310016512,"size":520192}}
+{"load":{"path":"/System/Library/Frameworks/CoreData.framework/CoreData","uuid":"35eaef65b0fe3387a6f1953ba6c6b221","base":7280115712,"size":3358720}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ChunkingLibrary.framework/ChunkingLibrary","uuid":"9592da8776323f5db15d9e951caccd38","base":7757402112,"size":327680}}
+{"load":{"path":"/System/Library/PrivateFrameworks/OSAnalytics.framework/OSAnalytics","uuid":"8bb68f3961f03e188a1e77d7b1e444ce","base":7541026816,"size":184320}}
+{"load":{"path":"/System/Library/Frameworks/OpenGLES.framework/libGFXShared.dylib","uuid":"fb4460e8ba8c3d8baac7de055809a90d","base":7652335616,"size":40960}}
+{"load":{"path":"/System/Library/PrivateFrameworks/WebCore.framework/WebCore","uuid":"ca426a2f548134acaf0a08332c0a84e0","base":7334318080,"size":30527488}}
+{"load":{"path":"/System/Library/PrivateFrameworks/APFS.framework/APFS","uuid":"abc2cd67ae1f3a94b3a77dbb9410d2fe","base":7917768704,"size":598016}}
+{"load":{"path":"/usr/lib/libperfcheck.dylib","uuid":"08b6f2b01ad733d8850ed9f74a850daa","base":7810859008,"size":61440}}
+{"load":{"path":"/System/Library/PrivateFrameworks/URLFormatting.framework/URLFormatting","uuid":"af4657972d9a3148be598ac4f48ae688","base":7785480192,"size":32768}}
+{"load":{"path":"/System/Library/Frameworks/Contacts.framework/Contacts","uuid":"48f4fe0bc42d317496b32040b12c1c9e","base":7324786688,"size":1294336}}
+{"load":{"path":"/System/Library/Frameworks/CoreLocation.framework/CoreLocation","uuid":"823cfd7bdba33fe4a2c58859d96555c5","base":7255138304,"size":471040}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleMediaServices.framework/AppleMediaServices","uuid":"cc9185fff85233d88fa2ba27d0484a5d","base":7414648832,"size":3244032}}
+{"load":{"path":"/System/Library/Frameworks/AVFoundation.framework/AVFoundation","uuid":"bae1d0dcb9063af29651a0f35779be54","base":7374028800,"size":2093056}}
+{"load":{"path":"/System/Library/Frameworks/AVKit.framework/AVKit","uuid":"c1e8588176e33ae38d5e4336933ddc6e","base":7449452544,"size":872448}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Celestial.framework/Celestial","uuid":"a65707c2082632bcbea8425b59a76944","base":7436898304,"size":2957312}}
+{"load":{"path":"/System/Library/Frameworks/CloudKit.framework/CloudKit","uuid":"3055305cd1a331e19ce67c367cfa3b6a","base":7287169024,"size":1552384}}
+{"load":{"path":"/System/Library/Frameworks/CoreMedia.framework/CoreMedia","uuid":"89ad72de99123e85b361ad7cd6d823f0","base":7313309696,"size":1056768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MediaRemote.framework/MediaRemote","uuid":"df203d075d313ad2a2b2a2c510b2559b","base":7523614720,"size":2035712}}
+{"load":{"path":"/System/Library/Frameworks/QuickLookThumbnailing.framework/QuickLookThumbnailing","uuid":"2d6a0b4e77343145a118b08fd76fc877","base":7907893248,"size":233472}}
+{"load":{"path":"/System/Library/PrivateFrameworks/TCC.framework/TCC","uuid":"97e67d9c4a10360c9f412456dcbdc97e","base":7307190272,"size":36864}}
+{"load":{"path":"/System/Library/Frameworks/WebKit.framework/WebKit","uuid":"d74e8e63b96338449ca08a3a0f5fae4c","base":7327895552,"size":6422528}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/vImage","uuid":"aa8f48dda782376f8cfded6032f80502","base":7388000256,"size":2678784}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/vecLib","uuid":"e898be21a999319ba485548bb4859e6b","base":7900463104,"size":4096}}
+{"load":{"path":"/usr/lib/libFosl_dynamic.dylib","uuid":"2ec3d3e588573001ba8c8eac0c468af9","base":8086425600,"size":1855488}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ColorSync.framework/ColorSync","uuid":"62b6e344294735a18231a30bc9ed11d3","base":7317241856,"size":1826816}}
+{"load":{"path":"/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox","uuid":"746b696a17a5345588763dfa3787b26c","base":7543824384,"size":774144}}
+{"load":{"path":"/System/Library/PrivateFrameworks/GraphVisualizer.framework/GraphVisualizer","uuid":"823f8952925c349cb70927c695feacb2","base":7981182976,"size":53248}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FaceCore.framework/FaceCore","uuid":"d60a07b0691d36e6bd692fdf0f7f7d6b","base":7961591808,"size":4276224}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleSauce.framework/AppleSauce","uuid":"f0cb99f323a73d03a139c49cf6c41ab1","base":7930556416,"size":147456}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FontServices.framework/libGSFontCache.dylib","uuid":"72f67cdc64c33973a2d9ab831c570fd4","base":7966740480,"size":81920}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FontServices.framework/libGSFont.dylib","uuid":"c96a3942f2ca31ab8dce9438045c53ab","base":7376789504,"size":57344}}
+{"load":{"path":"/System/Library/PrivateFrameworks/OTSVG.framework/OTSVG","uuid":"1766611019083e14909da771581fb644","base":8008462336,"size":266240}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FontServices.framework/FontServices","uuid":"46c4ddbaeaa4332a898aaeaa89f7e1f9","base":7376846848,"size":40960}}
+{"load":{"path":"/usr/lib/libate.dylib","uuid":"116c6d4c61f137c8839f8da4d2dbf65a","base":7552368640,"size":606208}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleJPEG.framework/AppleJPEG","uuid":"99fc08d523b83f5dacbfc347f7189d41","base":7930073088,"size":274432}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BoardServices.framework/BoardServices","uuid":"beb1470764c9331495f5e60681f32d92","base":7286038528,"size":180224}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CorePhoneNumbers.framework/CorePhoneNumbers","uuid":"cd45ada05fdf36bf92e824d7e078d759","base":7525650432,"size":36864}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PersistentConnection.framework/PersistentConnection","uuid":"40955322e8d031749dd09c4dad3d73d1","base":7522455552,"size":184320}}
+{"load":{"path":"/System/Library/PrivateFrameworks/TextureIO.framework/TextureIO","uuid":"960b646f43c73db2bcdd1b68e4b11981","base":8054153216,"size":675840}}
+{"load":{"path":"/System/Library/PrivateFrameworks/InternationalSupport.framework/InternationalSupport","uuid":"2207de040b58322980dcd9a00c09440e","base":7997358080,"size":28672}}
+{"load":{"path":"/System/Library/PrivateFrameworks/StreamingZip.framework/StreamingZip","uuid":"3e4530a0128c3b9ba889d99ad4aba0d5","base":7670415360,"size":253952}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Lexicon.framework/Lexicon","uuid":"98e8e301e91833da9d507b19399a334b","base":7232413696,"size":290816}}
+{"load":{"path":"/System/Library/PrivateFrameworks/LanguageModeling.framework/LanguageModeling","uuid":"48322aa016cd3caaae9bd581976e0cd0","base":7231414272,"size":999424}}
+{"load":{"path":"/System/Library/PrivateFrameworks/LinguisticData.framework/LinguisticData","uuid":"6bf342b353083f7e93df51ccd826784e","base":7543521280,"size":20480}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ConstantClasses.framework/ConstantClasses","uuid":"96b656dd09a03e82b9c2917ab36a3fdd","base":7216345088,"size":12288}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AXCoreUtilities.framework/AXCoreUtilities","uuid":"d2740e1c60fe3260a9de67012c8bdea4","base":7364947968,"size":49152}}
+{"load":{"path":"/System/Library/Frameworks/MediaAccessibility.framework/MediaAccessibility","uuid":"6d0dbf955da63c2eab9be1c152917141","base":7542087680,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi","uuid":"5a17dab6bf123c54a0cf18f0dd97acd7","base":7376355328,"size":327680}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FontServices.framework/libhvf.dylib","uuid":"f16dbf931f4d3c8db212eb868d202eb9","base":7967240192,"size":53248}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IOAccelerator.framework/IOAccelerator","uuid":"d769cff975e430d2a7db4ea4612ff862","base":7542063104,"size":24576}}
+{"load":{"path":"/System/Library/Frameworks/OpenGLES.framework/libCoreFSCache.dylib","uuid":"4fa56656d0703730b8b7be685d14cef7","base":7907627008,"size":28672}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SignpostCollection.framework/SignpostCollection","uuid":"93e7acda3960357c8c12c311e8cfd898","base":7777746944,"size":40960}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ktrace.framework/ktrace","uuid":"c6321da021713236b36ce359e6f6b2e3","base":8076828672,"size":303104}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SampleAnalysis.framework/SampleAnalysis","uuid":"4b593dd91f29363486585e72ac9b2486","base":7887331328,"size":581632}}
+{"load":{"path":"/System/Library/PrivateFrameworks/kperfdata.framework/kperfdata","uuid":"3f2e5197a8e93f13bbd1e51b0f0044d6","base":8076791808,"size":36864}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreSymbolication.framework/CoreSymbolication","uuid":"f0eec0342d5a33fb98357efca5afc5f1","base":7640350720,"size":548864}}
+{"load":{"path":"/usr/lib/libdscsym.dylib","uuid":"dcd811f774223b3995f0618733aff23e","base":8091860992,"size":40960}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreBrightness.framework/CoreBrightness","uuid":"4b5a024ddea13d2393a605e0ff4bdf7f","base":7597268992,"size":880640}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSCore.framework/MPSCore","uuid":"c02479200b9a3611b29fb68184d8b60f","base":7904632832,"size":208896}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSImage.framework/MPSImage","uuid":"815d123c891430528b28b9cbb1735b76","base":7904841728,"size":499712}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNeuralNetwork.framework/MPSNeuralNetwork","uuid":"3e2e0cfca6853dbabf688e234a7fdc86","base":7905570816,"size":1662976}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSMatrix.framework/MPSMatrix","uuid":"f30b6410a53932ff8d397f2f8351eb49","base":7905341440,"size":143360}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSRayIntersector.framework/MPSRayIntersector","uuid":"bdc1bfca25403cf4a6505b09095c502f","base":7907233792,"size":286720}}
+{"load":{"path":"/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNDArray.framework/MPSNDArray","uuid":"b3c4364cfadf3d5180e3c9d6b794bd4f","base":7905484800,"size":86016}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileSystemServices.framework/MobileSystemServices","uuid":"f66b520c3d50375f98f0091d36161f5b","base":7813169152,"size":28672}}
+{"load":{"path":"/usr/lib/libmis.dylib","uuid":"96350964eef03fcba5ec4766879e0681","base":7747170304,"size":77824}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Netrb.framework/Netrb","uuid":"e736b3216345356ea8bcdc5a4cc09857","base":7701934080,"size":28672}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DataMigration.framework/DataMigration","uuid":"a73a8e89759d35cba88fbadc443a884c","base":7572447232,"size":57344}}
+{"load":{"path":"/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony","uuid":"7b0b55a59dc733fab88e0c20a1f781f1","base":7278600192,"size":884736}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DeviceIdentity.framework/DeviceIdentity","uuid":"0889ebc4bb343b00b0de4fd6947beea8","base":7949942784,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices","uuid":"99531da589fd32ec8788899443a3c764","base":7288721408,"size":327680}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SetupAssistant.framework/SetupAssistant","uuid":"db3c0cdfc4f43630ab150c62635f1acf","base":7426740224,"size":245760}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleIDSSOAuthentication.framework/AppleIDSSOAuthentication","uuid":"f55271ec49aa356e923e6c17c85ec3af","base":7753621504,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AccountSettings.framework/AccountSettings","uuid":"8b81f1d5a26730a28032279362c233d3","base":7920136192,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ApplePushService.framework/ApplePushService","uuid":"328793b3825a387cbf3ebb42999ac370","base":7310536704,"size":114688}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AuthKit.framework/AuthKit","uuid":"0537fa42b3f63bcca8ceb49af7b816aa","base":7402369024,"size":499712}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Symbolication.framework/Symbolication","uuid":"eaf904a010683b1b87478c480cb82c8d","base":7755026432,"size":520192}}
+{"load":{"path":"/System/Library/PrivateFrameworks/OSAServicesClient.framework/OSAServicesClient","uuid":"7934932006823fc397cf49fabbd7f923","base":7702175744,"size":12288}}
+{"load":{"path":"/System/Library/Frameworks/OpenGLES.framework/libGLImage.dylib","uuid":"849fb0b1dd9b34b49e0e68680423c43c","base":7830929408,"size":249856}}
+{"load":{"path":"/System/Library/Frameworks/CoreAudio.framework/CoreAudio","uuid":"3f986cb2a41f3bf78245e3d097083f80","base":7223934976,"size":4493312}}
+{"load":{"path":"/System/Library/PrivateFrameworks/WebCore.framework/Frameworks/libwebrtc.dylib","uuid":"7afdf5c54b4037be8f73c4d0e9ba1b05","base":8069885952,"size":5230592}}
+{"load":{"path":"/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox","uuid":"8b3c3977613a35cd9e099c8d6ad2d5c2","base":7390679040,"size":2289664}}
+{"load":{"path":"/usr/lib/libutil.dylib","uuid":"eaa22438f5ea3da8a1aab237bb730fb8","base":8101462016,"size":16384}}
+{"load":{"path":"/System/Library/PrivateFrameworks/perfdata.framework/perfdata","uuid":"fbb03adeac8c3021b29016aea484e4c7","base":8077230080,"size":53248}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AddressBookLegacy.framework/AddressBookLegacy","uuid":"4c8135626d87370da6112470f1a6e2d1","base":7451893760,"size":626688}}
+{"load":{"path":"/usr/lib/libCTGreenTeaLogger.dylib","uuid":"8cbc0d475be530e188f1c51e7d73100d","base":7312887808,"size":8192}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CellularPlanManager.framework/CellularPlanManager","uuid":"2df1c5e75924353aaf33dbac62fb2031","base":7238873088,"size":126976}}
+{"load":{"path":"/System/Library/Frameworks/ClassKit.framework/ClassKit","uuid":"c49bc10ecf7a31068198f799ecbf15a6","base":7580430336,"size":331776}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreSuggestions.framework/CoreSuggestions","uuid":"c477a614a411316584a2c9e1be49740e","base":7527424000,"size":630784}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PhoneNumbers.framework/PhoneNumbers","uuid":"ed456ac4bd903b78b1a47422d92f7340","base":8015536128,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/vCard.framework/vCard","uuid":"8a9f9a01a2703c7cb17abd91cc0c1119","base":7886852096,"size":184320}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ContactsFoundation.framework/ContactsFoundation","uuid":"7f5d4eea47773b1bbadc29d7884a2873","base":7364997120,"size":503808}}
+{"load":{"path":"/System/Library/PrivateFrameworks/GeoServices.framework/GeoServices","uuid":"11521e66ab173ead938efa40b6134e46","base":7291105280,"size":16084992}}
+{"load":{"path":"/System/Library/PrivateFrameworks/LocationSupport.framework/LocationSupport","uuid":"72ccaa1df5673dd69db2fbb902140de5","base":7326281728,"size":147456}}
+{"load":{"path":"/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth","uuid":"3a9d0d5841b23be6a5ad8e77aefd147e","base":7538835456,"size":221184}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AccountsDaemon.framework/AccountsDaemon","uuid":"3f8a85867cc63d2dbaa332341d5e46ca","base":7753015296,"size":606208}}
+{"load":{"path":"/usr/lib/libresolv.9.dylib","uuid":"81591f0ef3523d07a424e046be532237","base":8101089280,"size":102400}}
+{"load":{"path":"/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication","uuid":"8e091e31375c35c6997377e77017f695","base":7621214208,"size":86016}}
+{"load":{"path":"/System/Library/Frameworks/AVFoundation.framework/Frameworks/AVFAudio.framework/AVFAudio","uuid":"a9217a70e269333db8c50b19e2fb365c","base":7419916288,"size":970752}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MediaExperience.framework/MediaExperience","uuid":"53a8c9f892be3b1c92f59abc109425c7","base":7435894784,"size":1003520}}
+{"load":{"path":"/System/Library/Frameworks/MediaToolbox.framework/MediaToolbox","uuid":"be59c72809d7384a9f934aadd48c111a","base":7365660672,"size":7380992}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Quagga.framework/Quagga","uuid":"eae325508ce13ea8966251ea1968b80c","base":7794098176,"size":507904}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Pegasus.framework/Pegasus","uuid":"ce0d0eb51ab63147b8219b86106c088e","base":7450324992,"size":200704}}
+{"load":{"path":"/System/Library/Frameworks/CoreMotion.framework/CoreMotion","uuid":"1f0fe3143bc83a458a18611ff553c5da","base":7418056704,"size":1859584}}
+{"load":{"path":"/System/Library/PrivateFrameworks/C2.framework/C2","uuid":"0cf16449e8ab35548a2abca64f0149d7","base":7746060288,"size":204800}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ProtectedCloudStorage.framework/ProtectedCloudStorage","uuid":"650a9321018c3dc69333c60a6e7a50ef","base":7649456128,"size":376832}}
+{"load":{"path":"/System/Library/PrivateFrameworks/WatchdogClient.framework/WatchdogClient","uuid":"effb2efa64fb3059b6638ea86a4fb428","base":7579484160,"size":8192}}
+{"load":{"path":"/System/Library/PrivateFrameworks/RemoteTextInput.framework/RemoteTextInput","uuid":"cb5c2682d65a369cb57d33fa45d39e7b","base":7849836544,"size":69632}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MediaServices.framework/MediaServices","uuid":"99e8d14f5f7e3633888108b1b9d59abe","base":7517564928,"size":225280}}
+{"load":{"path":"/usr/lib/libprequelite.dylib","uuid":"ebd5dd109e02312c96b7681e6adca8a4","base":7579492352,"size":73728}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CorePDF.framework/CorePDF","uuid":"8aa9c332a88e3ac4a1a3c07e09d00c29","base":7409704960,"size":749568}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CorePrediction.framework/CorePrediction","uuid":"5b9d739f30ed3633ad93f4b521445be9","base":7865131008,"size":339968}}
+{"load":{"path":"/System/Library/Frameworks/PDFKit.framework/PDFKit","uuid":"602b3922eaca3cc5946f7b729bc42e12","base":7398379520,"size":753664}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SafariSafeBrowsing.framework/SafariSafeBrowsing","uuid":"b9d076fc432a31e2829491b24003e57e","base":7870189568,"size":299008}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libvMisc.dylib","uuid":"05334e5d9b6f39d0a1216130d7b84f97","base":7900094464,"size":368640}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libvDSP.dylib","uuid":"9f1b4e370a99382a8d89b5af0ea6415b","base":7886168064,"size":684032}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libBLAS.dylib","uuid":"93845678947e367dab50fe5aba3658e0","base":7622889472,"size":897024}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libLAPACK.dylib","uuid":"987217b663813be989eb40f1df2d4ff1","base":7896674304,"size":3399680}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libLinearAlgebra.dylib","uuid":"32b55a7bef82324aa31d6a4c6e82e057","base":7850684416,"size":86016}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libSparseBLAS.dylib","uuid":"6ef8dc44dfc93a05bcbe1a198af28b5b","base":7835639808,"size":73728}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libQuadrature.dylib","uuid":"488e274068b73ddfaa9ea39baf59f3f8","base":7900073984,"size":20480}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libBNNS.dylib","uuid":"116a7bc6fe8438508a399d4148a14157","base":7599861760,"size":1896448}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libSparse.dylib","uuid":"797932fbc17f372bbd2cb9bc2d55cac1","base":7210721280,"size":405504}}
+{"load":{"path":"/usr/lib/libncurses.5.4.dylib","uuid":"411fcdf6338b3c0ea7d63098c56db18c","base":8097087488,"size":200704}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CommonUtilities.framework/CommonUtilities","uuid":"97dc2a6830c6367ba376049aa37a0263","base":7248723968,"size":110592}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreEmoji.framework/CoreEmoji","uuid":"3432d5e489283d21947a96119c3e2de8","base":7579729920,"size":69632}}
+{"load":{"path":"/usr/lib/libcmph.dylib","uuid":"d84d45b2dfd5376eb73883a39a553cf9","base":8091389952,"size":73728}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CaptiveNetwork.framework/CaptiveNetwork","uuid":"476ff0ebdfad369091402e62746699f8","base":7621468160,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/EAP8021X.framework/EAP8021X","uuid":"c9407b41d59c3343bf8a18cd5e363062","base":7701975040,"size":200704}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SignpostSupport.framework/SignpostSupport","uuid":"095c8f61cca43acfaf940b0cae3d1a81","base":7774941184,"size":262144}}
+{"load":{"path":"/System/Library/PrivateFrameworks/LoggingSupport.framework/LoggingSupport","uuid":"6d91a02d77f5366693ae5e1ece278654","base":7647973376,"size":299008}}
+{"load":{"path":"/System/Library/PrivateFrameworks/kperf.framework/kperf","uuid":"e0fd1f30deab30e2a9115796ae230551","base":7880445952,"size":24576}}
+{"load":{"path":"/usr/lib/libIOReport.dylib","uuid":"e826276b294f386ba6499ea24f4fc9a7","base":7598149632,"size":32768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CPMS.framework/CPMS","uuid":"448027b7060638f78685e9ba02f12079","base":7581208576,"size":53248}}
+{"load":{"path":"/usr/lib/libcupolicy.dylib","uuid":"3e82ed8fc58c3ca8ac7949427f56e922","base":8091570176,"size":28672}}
+{"load":{"path":"/usr/lib/libTelephonyUtilDynamic.dylib","uuid":"833d266872bf30e289655265351155dd","base":7470854144,"size":577536}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IdleTimerServices.framework/IdleTimerServices","uuid":"d815c22c53ae36db9013f683fc336df6","base":7640899584,"size":28672}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreFollowUp.framework/CoreFollowUp","uuid":"229b93a314b93e49a938da9ac5222793","base":7551791104,"size":90112}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SetupAssistantSupport.framework/SetupAssistantSupport","uuid":"076b12e0c3283973b83b50faac9a0eff","base":8044494848,"size":53248}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileBackup.framework/MobileBackup","uuid":"e70600fe2ca130a6870ba358dc541f09","base":7582769152,"size":319488}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreTime.framework/CoreTime","uuid":"16e5a4ebcdfd3cfbbdcca5b45a2104b6","base":7583821824,"size":32768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IntlPreferences.framework/IntlPreferences","uuid":"ec36a852bc8c3692b345c97bd6e99c80","base":7593418752,"size":106496}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleIDAuthSupport.framework/AppleIDAuthSupport","uuid":"767165649aad35d1be07a3e17836fb16","base":7930028032,"size":45056}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MallocStackLogging.framework/MallocStackLogging","uuid":"d64d8dcf62673842b2b961f6ebc86aec","base":7527378944,"size":45056}}
+{"load":{"path":"/System/Library/Frameworks/OpenGLES.framework/libCVMSPluginSupport.dylib","uuid":"34adfd8e959a30a699308bbcb6a68b97","base":7907618816,"size":8192}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AudioToolboxCore.framework/AudioToolboxCore","uuid":"304ca2eb510835fea129a34a508460c4","base":7424110592,"size":2338816}}
+{"load":{"path":"/System/Library/PrivateFrameworks/caulk.framework/caulk","uuid":"241108a1274533088bfee659dd6730dc","base":7812841472,"size":69632}}
+{"load":{"path":"/usr/lib/libAudioStatistics.dylib","uuid":"6b4e849f634939ccaca655176fe01098","base":7810920448,"size":49152}}
+{"load":{"path":"/usr/lib/libAudioToolboxUtility.dylib","uuid":"7ffd108a616a3c1198848493484b633d","base":7392968704,"size":221184}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DataAccessExpress.framework/DataAccessExpress","uuid":"ec7e8ce10a9d38869a5daca5e2e6bb78","base":7551123456,"size":196608}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CloudDocs.framework/CloudDocs","uuid":"604ea7d3f96b38e483d2d285c95f5123","base":7279603712,"size":512000}}
+{"load":{"path":"/System/Library/Frameworks/CoreSpotlight.framework/CoreSpotlight","uuid":"da23ed5d5b7c3e688825fcb8a1a319cc","base":7451480064,"size":413696}}
+{"load":{"path":"/System/Library/Frameworks/Intents.framework/Intents","uuid":"3e961b6587ad3a64af9e1a3700a745f4","base":7402868736,"size":4395008}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ProactiveEventTracker.framework/ProactiveEventTracker","uuid":"9a778bbcee333e9d83eabb095db13f00","base":7527256064,"size":122880}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ProactiveSupport.framework/ProactiveSupport","uuid":"f9a02e6b23163ac292a162118afd10e9","base":7432998912,"size":401408}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SearchFoundation.framework/SearchFoundation","uuid":"e2dd5f62149c3d02b602b0ebd69a6acb","base":7378583552,"size":1323008}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DataDetectorsNaturalLanguage.framework/DataDetectorsNaturalLanguage","uuid":"8ab89a73eca73b2285510de5cb0782b0","base":7836299264,"size":245760}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DataDetectorsCore.framework/DataDetectorsCore","uuid":"968860c84ea936b99f48c59bbb0335d4","base":7515910144,"size":225280}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreLocationProtobuf.framework/CoreLocationProtobuf","uuid":"ae6d4309b7d930b2b3b7eedfb88536d3","base":7793057792,"size":294912}}
+{"load":{"path":"/System/Library/PrivateFrameworks/NanoPreferencesSync.framework/NanoPreferencesSync","uuid":"ca244dbaa32e33db919b5c0af21c9248","base":8110915584,"size":57344}}
+{"load":{"path":"/System/Library/Frameworks/GSS.framework/GSS","uuid":"10c1886968cb34ba8325929687a1d70c","base":7904366592,"size":188416}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IDS.framework/IDS","uuid":"335b4e0fb0c237898ea7fc998e5d5f4d","base":7310651392,"size":987136}}
+{"load":{"path":"/System/Library/PrivateFrameworks/WirelessDiagnostics.framework/WirelessDiagnostics","uuid":"8fc0efe64190310a983f0c5fb6193ec2","base":7223394304,"size":294912}}
+{"load":{"path":"/System/Library/PrivateFrameworks/OAuth.framework/OAuth","uuid":"a03fe232d94739eda8f94a6aaa4f486c","base":7734116352,"size":12288}}
+{"load":{"path":"/System/Library/Frameworks/LocalAuthentication.framework/Support/SharedUtils.framework/SharedUtils","uuid":"4b19c22d14f83923aa7e010297fc74b7","base":7652376576,"size":221184}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreAUC.framework/CoreAUC","uuid":"9468bc25e6943dfd9423f61c852d84f8","base":7853568000,"size":61440}}
+{"load":{"path":"/System/Library/Frameworks/CoreHaptics.framework/CoreHaptics","uuid":"97e7305b832e38188a551f54e1fe4bad","base":7638740992,"size":307200}}
+{"load":{"path":"/System/Library/PrivateFrameworks/NetworkStatistics.framework/NetworkStatistics","uuid":"b4143b227aac3a7583cfd39e14aed702","base":7697174528,"size":102400}}
+{"load":{"path":"/System/Library/Frameworks/NetworkExtension.framework/NetworkExtension","uuid":"4b59ff48c0fb3788b91cfed840ff2930","base":7513653248,"size":2256896}}
+{"load":{"path":"/usr/lib/libheimdal-asn1.dylib","uuid":"1792150aa9f9387c9d3c012d7942d9c5","base":8092127232,"size":24576}}
+{"load":{"path":"/System/Library/PrivateFrameworks/NanoRegistry.framework/NanoRegistry","uuid":"161c4b8135c13f5d805fd1155e49fef1","base":8110469120,"size":446464}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreOptimization.framework/CoreOptimization","uuid":"7a01f6f33e8333679c22f69495e7ea4d","base":7948771328,"size":16384}}
+{"load":{"path":"/System/Library/PrivateFrameworks/RevealCore.framework/RevealCore","uuid":"f5159444bdde3846a157aab561c393d5","base":8042799104,"size":20480}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CTCarrierSpace.framework/CTCarrierSpace","uuid":"c5d9724109dd3554a50a5a6bda992347","base":7623786496,"size":61440}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Bom.framework/Bom","uuid":"11fce97348f439439e7c35bcd663d649","base":7932817408,"size":200704}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Rapport.framework/Rapport","uuid":"ec9dcb56769a312c9cb3551a797dc5b4","base":7540568064,"size":458752}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileDeviceLink.framework/MobileDeviceLink","uuid":"6a6292db7a2f3e308ad97185d2fee6b3","base":8005529600,"size":81920}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppConduit.framework/AppConduit","uuid":"15e48773d3623be0aa19b9c43cc811cf","base":7593287680,"size":131072}}
+{"load":{"path":"/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib","uuid":"2303188bf70a32078227ae92ef2dc9ca","base":7907655680,"size":24576}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileSpotlightIndex.framework/MobileSpotlightIndex","uuid":"24d7554765f9374b8f015e479265dd01","base":7786651648,"size":2306048}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MetadataUtilities.framework/MetadataUtilities","uuid":"de1eeb33ff423aedbb7fdd3907423ae8","base":7503048704,"size":303104}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IntentsFoundation.framework/IntentsFoundation","uuid":"29094ecb940b3e49bc76d8981c709690","base":7887912960,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/InternationalTextSearch.framework/InternationalTextSearch","uuid":"05229f5b79a93bb29db74ff61354b99a","base":7686709248,"size":12288}}
+{"load":{"path":"/System/Library/Frameworks/EventKit.framework/EventKit","uuid":"e2a24a26fc8735fa9b35ed358bcb25d5","base":7516540928,"size":1024000}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ResponseKit.framework/ResponseKit","uuid":"0fb7f7f7d27a37fb813025bb39a5e337","base":7636852736,"size":1056768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreNLP.framework/CoreNLP","uuid":"c91cefc790493a66b021c09bb62d8034","base":7455756288,"size":430080}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleFSCompression.framework/AppleFSCompression","uuid":"be2976a9098936bdaeeb595cf029cf9b","base":7929942016,"size":61440}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Heimdal.framework/Heimdal","uuid":"ed41231c23a23bd4ae52ff6d26ef4284","base":7991259136,"size":462848}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CommonAuth.framework/CommonAuth","uuid":"ee06de91c40d3a3a8abaaf90d5a4f387","base":7944331264,"size":32768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Marco.framework/Marco","uuid":"1bff78277f363f4195e5f33d8aefa22d","base":8000286720,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IMFoundation.framework/IMFoundation","uuid":"506939c097453d359a2fe6bcbb2b06d8","base":7307227136,"size":376832}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IDSFoundation.framework/IDSFoundation","uuid":"0ed663fbdf353be69dac32c646232225","base":7311638528,"size":1249280}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Engram.framework/Engram","uuid":"c3236b7fb2e43b8aa1e434213a4304c6","base":7835713536,"size":86016}}
+{"load":{"path":"/usr/lib/libAWDSupportFramework.dylib","uuid":"22a732b4f1363ccf9a240da77e6ecc28","base":8081264640,"size":3182592}}
+{"load":{"path":"/usr/lib/libAWDSupport.dylib","uuid":"8ebe6715cabe301f966a732931ea6d89","base":7223689216,"size":245760}}
+{"load":{"path":"/usr/lib/libprotobuf-lite.dylib","uuid":"afe26eb886903b9d8b40f2eb669569f3","base":7220649984,"size":77824}}
+{"load":{"path":"/usr/lib/libprotobuf.dylib","uuid":"84356760fd593baf9331b1564b037b82","base":7220260864,"size":389120}}
+{"load":{"path":"/usr/lib/libnetworkextension.dylib","uuid":"2a685141e3d83a11a99863a93f534f0e","base":8097288192,"size":86016}}
+{"load":{"path":"/System/Library/Frameworks/NaturalLanguage.framework/NaturalLanguage","uuid":"c41cc139fee9362c9cc23bdec6744f6b","base":7746265088,"size":217088}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CalendarDaemon.framework/CalendarDaemon","uuid":"f26d7a3557773fa190bbe5cd907e42b4","base":7522639872,"size":344064}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CalendarDatabase.framework/CalendarDatabase","uuid":"777b53980e103eeb93d52ddff2ccf2ac","base":7522983936,"size":630784}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CalendarFoundation.framework/CalendarFoundation","uuid":"063a50b7d176373196ba5ddf6cae167f","base":7516135424,"size":405504}}
+{"load":{"path":"/System/Library/PrivateFrameworks/iCalendar.framework/iCalendar","uuid":"bdf022eee345337c99e9704d4bcc27b8","base":7850070016,"size":200704}}
+{"load":{"path":"/System/Library/PrivateFrameworks/NLP.framework/NLP","uuid":"48080f0657193195a19e8695b3706eb6","base":7237931008,"size":942080}}
+{"load":{"path":"/usr/lib/libChineseTokenizer.dylib","uuid":"19ee02458a9930bfbd6a7b498cd26008","base":8086228992,"size":45056}}
+{"load":{"path":"/usr/lib/libmecab.dylib","uuid":"8c3f2375f78239dfb775560a59ac81bf","base":7703957504,"size":737280}}
+{"load":{"path":"/usr/lib/libgermantok.dylib","uuid":"23d00f88b91735a2bb8fe76ad5418e75","base":7703937024,"size":20480}}
+{"load":{"path":"/usr/lib/libThaiTokenizer.dylib","uuid":"27faaf2b799c3a298b7af5a2acf847eb","base":8089624576,"size":8192}}
+{"load":{"path":"/usr/lib/libtidy.A.dylib","uuid":"e62eef4f17e43a4b8ee9c354a3233c0c","base":8101228544,"size":204800}}
+{"load":{"path":"/System/Library/Frameworks/CoreML.framework/CoreML","uuid":"ef0b2716cf4c3cac951bf41bc896ae52","base":7245778944,"size":2850816}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Montreal.framework/Montreal","uuid":"f946b0df71d33c548887bd95cd59b533","base":7236587520,"size":1343488}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BackgroundTaskAgent.framework/BackgroundTaskAgent","uuid":"5262dc14b6b5363c9751576865856ab4","base":7543513088,"size":8192}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PersonaKit.framework/PersonaKit","uuid":"c511fe3b420331b289457da490a18510","base":7876038656,"size":49152}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreDAV.framework/CoreDAV","uuid":"8b69582689fb39beaa6c1a1e51677b07","base":7839793152,"size":524288}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DuetActivityScheduler.framework/DuetActivityScheduler","uuid":"41a4be55c4643536baac7d99a4a55898","base":7525752832,"size":163840}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Espresso.framework/Espresso","uuid":"5f68481ad8b232188840d17d81a99547","base":7952543744,"size":6082560}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreDuet.framework/CoreDuet","uuid":"babcef413a0538e180cb77001abe9ae0","base":7234555904,"size":2031616}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreDuetContext.framework/CoreDuetContext","uuid":"bde5e1666a8a34fead8bad7aa9b1d53f","base":7426449408,"size":290816}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleNeuralEngine.framework/AppleNeuralEngine","uuid":"5ba1eb56f0b4337f9e1977fb4c80b997","base":7930458112,"size":73728}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ANECompiler.framework/ANECompiler","uuid":"95342f9eac13373fa6652cba48b5d31d","base":7916347392,"size":1314816}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreDuetDebugLogging.framework/CoreDuetDebugLogging","uuid":"e3ad9cd8f47b3ef28a3d834a9dfd6e37","base":7763136512,"size":12288}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreDuetDaemonProtocol.framework/CoreDuetDaemonProtocol","uuid":"cb6182dd85823f918d437db9dcb92c12","base":7711055872,"size":61440}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ANEServices.framework/ANEServices","uuid":"bd9d66e96d7c371f94e92f9b386e5b50","base":7917662208,"size":73728}}
+{"load":{"path":"/usr/lib/libsandbox.1.dylib","uuid":"dffc0e1f146836e3a9a9174fdd212c0e","base":8101191680,"size":12288}}
+{"load":{"path":"/usr/lib/libMatch.1.dylib","uuid":"c9ccfaf084f63190a72e570c7e74fabd","base":8088780800,"size":32768}}
+{"load":{"path":"/usr/lib/libusrtcp.dylib","uuid":"d7b20ed002a1353cacdd504ea06bedf4","base":7290691584,"size":380928}}
+{"load":{"path":"/usr/lib/libboringssl.dylib","uuid":"b6f68c38f67a37da8252c84ef1c98e43","base":7286218752,"size":753664}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppSSOCore.framework/AppSSOCore","uuid":"6dbf585d9d4e3c8db56e1ebd27f2dd0b","base":8144809984,"size":86016}}
+{"load":{"path":"/usr/lib/libobjc-trampolines.dylib","uuid":"a782ecde318c3379b33e7d204926c9c9","base":4314726400,"size":49152}}
+{"load":{"path":"/System/Library/AccessibilityBundles/AccessibilitySettingsLoader.bundle/AccessibilitySettingsLoader","uuid":"4254c71b37313427bf578f91aaaed98a","base":8109166592,"size":77824}}
+{"load":{"path":"/System/Library/PrivateFrameworks/HearingUtilities.framework/HearingUtilities","uuid":"951c9478199837cb997dd03c044a253a","base":7636271104,"size":516096}}
+{"load":{"path":"/usr/lib/libAXSafeCategoryBundle.dylib","uuid":"2f42052fb97232d98f2b45e017d1245c","base":7378571264,"size":12288}}
+{"load":{"path":"/System/Library/Frameworks/SoundAnalysis.framework/SoundAnalysis","uuid":"3f719150c88738cb9383dc7513501e5f","base":7911370752,"size":1056768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/TelephonyUtilities.framework/TelephonyUtilities","uuid":"09b26840a5153c609cdedc831bf0ef30","base":7426985984,"size":794624}}
+{"load":{"path":"/System/Library/PrivateFrameworks/RTTUtilities.framework/RTTUtilities","uuid":"f53f55ddac8e3d8a8d0d925e2c3acc15","base":7621025792,"size":155648}}
+{"load":{"path":"/System/Library/PrivateFrameworks/HearingCore.framework/HearingCore","uuid":"c89a7eacacd33d04b9f1cc71d6a339a5","base":7621181440,"size":32768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CommunicationsFilter.framework/CommunicationsFilter","uuid":"63170ee0d92833038a8805c4b108205a","base":7621300224,"size":20480}}
+{"load":{"path":"/System/Library/PrivateFrameworks/IncomingCallFilter.framework/IncomingCallFilter","uuid":"74f0cdea19833a58ad773cefcde01605","base":7697039360,"size":24576}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AXRuntime.framework/AXRuntime","uuid":"905dc921afe63398a0cfac3372c35897","base":7378259968,"size":311296}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CallHistory.framework/CallHistory","uuid":"7f1e9eca4aa13c45b72bfce908794582","base":7633227776,"size":327680}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AVConference.framework/AVConference","uuid":"781615886eef3199ac0ce54b0037ef0a","base":7692492800,"size":4546560}}
+{"load":{"path":"/System/Library/PrivateFrameworks/WirelessCoexManager.framework/WirelessCoexManager","uuid":"50731df5d62530deb1cc4f846e370734","base":8075960320,"size":77824}}
+{"load":{"path":"/System/Library/PrivateFrameworks/VideoProcessing.framework/VideoProcessing","uuid":"4b9d57dabfd439818f65a5673a801684","base":7807782912,"size":3076096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Symptoms.framework/Frameworks/SymptomPresentationFeed.framework/SymptomPresentationFeed","uuid":"c6cb5f6f124939f28b4c3d6b3eeb619d","base":7527145472,"size":110592}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/ICE.framework/ICE","uuid":"71364a4e4a18399aa1895f5ebf4d4148","base":7918489600,"size":421888}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/LegacyHandle.framework/LegacyHandle","uuid":"0c4ca0629be13a87901afa7395da45af","base":7918911488,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/SimpleKeyExchange.framework/SimpleKeyExchange","uuid":"e9dbd7eb807f35308418e25f084c1d68","base":7918915584,"size":28672}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/snatmap.framework/snatmap","uuid":"028ce0b81216345aa25ca2fb1f6d4d24","base":7918944256,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/ViceroyTrace.framework/ViceroyTrace","uuid":"25e2b56fe8b93e9482be141a5659052b","base":7815016448,"size":245760}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FTServices.framework/FTServices","uuid":"cb48a8cd36b33387ad9c46a91306ea16","base":7570104320,"size":327680}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AppleCVA.framework/AppleCVA","uuid":"63fad9eac362389abd6d51ee1a416ce6","base":7927681024,"size":1794048}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AutoLoop.framework/AutoLoop","uuid":"6037ed23075e3cc98475420144188fed","base":7932014592,"size":348160}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreAppleCVA.framework/CoreAppleCVA","uuid":"4bfc0de0e2553cc5864b028bb06225f6","base":7946125312,"size":983040}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices","uuid":"b5776c4b5f653965b2245f15e41c486e","base":7550390272,"size":733184}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices","uuid":"075b26b661d03d29b1516b52069649a5","base":7381114880,"size":6885376}}
+{"load":{"path":"/System/Library/Frameworks/Photos.framework/Photos","uuid":"7c38c43acb9b3f728d0ae4ef9d003f90","base":7395512320,"size":2162688}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PhotosFormats.framework/PhotosFormats","uuid":"4967749c8ba13d50a094a64458b16779","base":7652597760,"size":323584}}
+{"load":{"path":"/System/Library/Frameworks/Vision.framework/Vision","uuid":"c604ff11adca3a2cad5d7a2d039375d7","base":7283474432,"size":2281472}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Symptoms.framework/Frameworks/SymptomAnalytics.framework/SymptomAnalytics","uuid":"6d8f8a15f92b31b79cf1f88c0f2187ab","base":7503003648,"size":45056}}
+{"load":{"path":"/usr/lib/libAWDProtobufFacetimeiMessage.dylib","uuid":"770d8cfffc203bdba5fc9739e575ab85","base":8080740352,"size":4096}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FTAWD.framework/FTAWD","uuid":"2bf094aa76783858a2727b3dbf55dcfc","base":7711117312,"size":135168}}
+{"load":{"path":"/System/Library/PrivateFrameworks/InertiaCam.framework/InertiaCam","uuid":"10274f94465030c7bfacbfc82734041e","base":7996628992,"size":434176}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DistributedEvaluation.framework/DistributedEvaluation","uuid":"4fa7b626c1353a96aaad2ee3712b363c","base":7585943552,"size":176128}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Preferences.framework/Preferences","uuid":"3748c2dac51b3873b4b5b7e62f27843a","base":7379906560,"size":1208320}}
+{"load":{"path":"/System/Library/PrivateFrameworks/RTCReporting.framework/RTCReporting","uuid":"34d689e0594f3131a0e95b06e4e92686","base":7581261824,"size":36864}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MediaConversionService.framework/MediaConversionService","uuid":"02236575bc533597834469da3e0e645f","base":7894175744,"size":143360}}
+{"load":{"path":"/System/Library/PrivateFrameworks/DCIMServices.framework/DCIMServices","uuid":"5b39235fa48b3f93b518f51728078080","base":7747608576,"size":57344}}
+{"load":{"path":"/System/Library/PrivateFrameworks/ToneLibrary.framework/ToneLibrary","uuid":"cd2eaa5e9d083e8ab2522a22cfb99987","base":7589900288,"size":356352}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MediaStream.framework/MediaStream","uuid":"2192a1f0a3a63161949eb2c8367f7d06","base":7894319104,"size":126976}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PhotoFoundation.framework/PhotoFoundation","uuid":"80a565ddfcb436fb9e5979e8ddbefff3","base":7285755904,"size":282624}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CloudPhotoLibrary.framework/CloudPhotoLibrary","uuid":"6d7e2258735e3c768105d12915ec5017","base":7747665920,"size":1429504}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CacheDelete.framework/CacheDelete","uuid":"fe5a3037180f3296a227af040e050806","base":7417892864,"size":163840}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CloudPhotoServices.framework/CloudPhotoServices","uuid":"44827c84a43a3ac4b629167e919bf097","base":7850385408,"size":40960}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreMediaStream.framework/CoreMediaStream","uuid":"62d263809b0438eea3b5a01ca8254062","base":7894446080,"size":1056768}}
+{"load":{"path":"/System/Library/PrivateFrameworks/PhotosImagingFoundation.framework/PhotosImagingFoundation","uuid":"d8993c4651f037a7a54f7a3586a95bf4","base":7893938176,"size":237568}}
+{"load":{"path":"/System/Library/Frameworks/ImageCaptureCore.framework/ImageCaptureCore","uuid":"3e0c371cfedf398eb63c183fabf14142","base":7309787136,"size":188416}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MMCS.framework/MMCS","uuid":"e87ddbe94f2d3a3c8f2412a63b88f40a","base":7785594880,"size":692224}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Futhark.framework/Futhark","uuid":"a9d8c7dc21823abfb71945cb47ff23cb","base":7967428608,"size":86016}}
+{"load":{"path":"/System/Library/PrivateFrameworks/TextRecognition.framework/TextRecognition","uuid":"f70cac6cc90d3146b2b6c9e013b00f98","base":8052965376,"size":1187840}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreParsec.framework/CoreParsec","uuid":"4ad5def0785b36dfab77d26134c68a9a","base":7632359424,"size":868352}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SettingsFoundation.framework/SettingsFoundation","uuid":"88e8248538203e6c8f72efbd49b779ef","base":7753670656,"size":81920}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager","uuid":"2027bc7f509b3b9c812cd17f9f1fb1eb","base":7538778112,"size":57344}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileBluetooth.framework/MobileBluetooth","uuid":"54099d82862a309099ca820e4e0d084a","base":7452585984,"size":77824}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BiometricKit.framework/BiometricKit","uuid":"f69fdd9815cc32d1b64e1d81d36be971","base":7522185216,"size":270336}}
+{"load":{"path":"/System/Library/PrivateFrameworks/FSEvents.framework/FSEvents","uuid":"5b158faba27f3a85961d10e020e21131","base":7839690752,"size":36864}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AssetCacheServices.framework/AssetCacheServices","uuid":"bf68da8120d03698b7c84548aec95546","base":7686844416,"size":122880}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AccessibilityUtilities.framework/AccessibilityUtilities","uuid":"7483f88cc3cd38cca19195fde6df19dc","base":7373078528,"size":950272}}
+{"load":{"path":"/System/Library/Frameworks/CoreMIDI.framework/CoreMIDI","uuid":"4cc731960104310a8d720ef7f7b8e750","base":7902011392,"size":331776}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AccessibilitySharedSupport.framework/AccessibilitySharedSupport","uuid":"a7299b02974a3c7ab6967294c2acfe39","base":7919480832,"size":274432}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AXMediaUtilities.framework/AXMediaUtilities","uuid":"b2a10260fe3939a795c53d9a1dc552f9","base":7409164288,"size":524288}}
+{"load":{"path":"/System/Library/PrivateFrameworks/TextToSpeech.framework/TextToSpeech","uuid":"ac75d29024c03da69cce45462df44c4c","base":7814893568,"size":106496}}
+{"load":{"path":"/System/Library/PrivateFrameworks/AssistantServices.framework/AssistantServices","uuid":"a034d18510aa3910a42a844a5590c18a","base":7431675904,"size":1323008}}
+{"load":{"path":"/usr/lib/libAXSpeechManager.dylib","uuid":"0fa5fe6ef3af37738200e8180fc2adf4","base":7797358592,"size":61440}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SiriInstrumentation.framework/SiriInstrumentation","uuid":"84a1f834add0360b9f2ac0435014b597","base":8044863488,"size":167936}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Sharing.framework/Sharing","uuid":"eccc88bef8b639d49b19e7fa09c0110f","base":7326429184,"size":1466368}}
+{"load":{"path":"/System/Library/PrivateFrameworks/VoiceServices.framework/VoiceServices","uuid":"a9d0387c91e03f1f85cfdcf6f9fc712a","base":7706341376,"size":249856}}
+{"load":{"path":"/System/Library/PrivateFrameworks/MobileActivation.framework/MobileActivation","uuid":"e94000bc00d13297816a979264d1c235","base":7636209664,"size":40960}}
+{"load":{"path":"/System/Library/PrivateFrameworks/SiriTTS.framework/SiriTTS","uuid":"dd7c78de46223697afddf684489c7819","base":7249567744,"size":5570560}}
+{"load":{"path":"/usr/lib/libedit.3.dylib","uuid":"9b81c5a882923e74aaa84c522c55923b","base":8091901952,"size":122880}}
+{"load":{"path":"/System/Library/AccessibilityBundles/GAXClient.bundle/GAXClient","uuid":"192642088c443b4f9e41440e977387ec","base":4315004928,"size":81920}}
+{"load":{"path":"/System/Library/PrivateFrameworks/Accessibility.framework/Frameworks/AccessibilityUIUtilities.framework/AccessibilityUIUtilities","uuid":"64eb98310f053e44bf76e38c0e88849f","base":7410454528,"size":249856}}
+{"load":{"path":"/System/Library/PrivateFrameworks/OnBoardingKit.framework/OnBoardingKit","uuid":"7d7c486a497d35d28e4789d9d33a0fc0","base":7376121856,"size":233472}}
+{"load":{"path":"/System/Library/PrivateFrameworks/BaseBoardUI.framework/BaseBoardUI","uuid":"012f30149cfb3625b2cf61f64232dfe1","base":7398297600,"size":81920}}
+{"load":{"path":"/System/Library/PrivateFrameworks/CoreServicesInternal.framework/CoreServicesInternal","uuid":"9f1ec5aa2de6365faae639ecc04cb409","base":7223222272,"size":172032}}
+{"load":{"path":"/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Libraries/libCGInterfaces.dylib","uuid":"63eb0bffc6893a3aa16869902db2524e","base":7407263744,"size":86016}}

+ 12 - 0
Crashlytics/UnitTests/Data/bare_min_crash/internal_incremental_kv.clsrecord

@@ -0,0 +1,12 @@
+{"kv":{"key":"636f6d2e63726173686c79746963732e696e2d6261636b67726f756e64","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e75692d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6b69742d73746172742d74696d65","value":"342e303538363235"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e66697273742d72756e2d6c6f6f702d74696d65","value":"32362e3737323735"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"35"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e757365722d6964","value":"746573742d757365722d46343232373036452d443533392d344244452d424635412d454634353834324641463337"}}

+ 4 - 0
Crashlytics/UnitTests/Data/bare_min_crash/metadata.clsrecord

@@ -0,0 +1,4 @@
+{"identity":{"generator":"Crashlytics iOS SDK/firelog-v1","display_version":"firelog-v1","build_version":"firelog-v1","started_at":1582667152,"session_id":"c3ed531276094bcebf51a5ffd455044a","install_id":"B9D7D868-2EF0-47B8-A31E-EE4D8C57CD6E","beta_token":null,"absolute_log_timestamps":true}}
+{"host":{"model":"iPhone11,8","machine":"N841AP","os_build_version":"17D50","os_display_version":"13.3.1","platform":"ios","locale":"en_US"}}
+{"application":{"bundle_id":"com.google.crashlytics.app.ios-host","custom_bundle_id":null,"build_version":"1","display_version":"1.0","extension_id":null}}
+{"executable":{"architecture":"arm64","uuid":"afd4b090589533159fa2b371a2787a2b","base":4309893120,"size":1556480,"encrypted":false,"minimum_sdk_version":"9.0.0","built_sdk_version":"13.2.0"}}

+ 330 - 0
Crashlytics/UnitTests/Data/bare_min_crash/sdk.log

@@ -0,0 +1,330 @@
+WARN  [FIRCLSMachExceptionRegister:310] original 0x0 0x104e 0x0 0x0
+WARN  [FIRCLSTerminateHandler:291] C++ terminate handler invoked
+WARN  [FIRCLSTerminateHandler:302] restoring pre-existing handler
+WARN  [FIRCLSTerminateHandler:319] no active exception
+WARN  [FIRCLSTerminateHandler:324] invoking pre-existing handler
+WARN  [FIRCLSSignalHandler:288] Signal: 6
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 0 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad362efb at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad362efb
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2828b7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad212a73 at 0x1ad19c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad32a3c7 at 0x1ad329000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 444)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad32a4bf at 0x1ad329000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 444)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2912c3 at 0x1ad28b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 688)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100eb2fab at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 6792)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad337633 at 0x1ad329000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 444)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad3375cf at 0x1ad329000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 444)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindDwarfFrame:384] Trying to read dwarf data with offset %lx
+WARN  [FIRCLSDwarfInstructionsEnumerate:597] Running instructions from 0x1ad33cf6d to 0x1ad33cf70
+WARN  [FIRCLSDwarfParseAndExecute_def_cfa:341] DW_CFA_def_cfa %llu, %lld
+WARN  [FIRCLSDwarfInstructionsEnumerate:597] Running instructions from 0x1ad33cf91 to 0x1ad33cf9c
+WARN  [FIRCLSDwarfParseAndExecute_advance_loc:507] DW_CFA_advance_loc 8
+WARN  [FIRCLSDwarfParseAndExecute_def_cfa_offset:370] DW_CFA_def_cfa_offset %lld
+WARN  [FIRCLSDwarfParseAndExecute_offset:490] DW_CFA_offset 30, %lld
+WARN  [FIRCLSDwarfParseAndExecute_offset:490] DW_CFA_offset 29, %lld
+WARN  [FIRCLSDwarfParseAndExecute_offset:490] DW_CFA_offset 19, %lld
+WARN  [FIRCLSDwarfParseAndExecute_offset:490] DW_CFA_offset 20, %lld
+WARN  [FIRCLSDwarfGetSavedRegister:817] Getting register 1
+WARN  [FIRCLSDwarfGetSavedRegister:817] Getting register 1
+WARN  [FIRCLSDwarfGetSavedRegister:817] Getting register 1
+WARN  [FIRCLSDwarfGetSavedRegister:817] Getting register 1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad3371ef at 0x1ad329000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 444)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100e42873 at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1060)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28cc63 at 0x1ad28b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 688)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100e40eff at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1060)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100e439eb at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1060)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b184dee7 at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 168280)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b184da1f at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 168280)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b184e107 at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 168280)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b1682fcb at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 147800)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b16725ef at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 147800)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b16a397f at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 147800)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4f3523 at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4ee1c3 at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4ee773 at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4edf3f at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b777e533 at 0x1b777b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b167957f at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 147800)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100e8aceb at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 2696)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad36ce17 at 0x1ad36c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 72)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad36ce17
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 1 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad363ab3 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad363ab3
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28371b at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899e7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899e7
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 2 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad363ab3 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad363ab3
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28371b at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899e7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899e7
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 3 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad363ab3 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad363ab3
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28371b at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899e7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899e7
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 4 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad340c03 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad340c03
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad34001f at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4f3963 at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4ee7fb at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad4edf3f at 0x1ad446000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 8932)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad83333f at 0x1ad82b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 3612)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad833217 at 0x1ad82b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 3612)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1b1714e9b at 0x1b0c36000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 155992)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad831fa3 at 0x1ad82b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 3612)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad96da73 at 0x1ad82b000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 18856)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28183f at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899f3 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899f3
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 5 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899df at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+WARN  [FIRCLSUnwindWithFramePointer:61] Error: failed to read memory at address 0x0
+ERROR [FIRCLSCompactUnwindLookupAndCompute:368] Failed to compute registers
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 6 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad363ab3 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad363ab3
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28371b at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899e7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899e7
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 7 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad363ab3 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad363ab3
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28371b at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899e7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899e7
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 8 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad363ab3 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad363ab3
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28371b at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899e7 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899e7
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 9 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad340c03 at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad340c03
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad34001f at 0x1ad33d000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100ebfd73 at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 6792)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x100ebfca3 at 0x100e3c000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 6792)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad28183f at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x1ad2899f3 at 0x1ad280000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x1ad2899f3
+WARN  [FIRCLSUnwindNextFrameUsingAllStrategies:204] FP is zero, aborting unwind
+INFO  [FIRCLSProcessRecordAllThreads:496] completed recording all thread data
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:789] attempting to read crash info string
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+WARN  [FIRCLSCreateCrashedMarkerFile:30] Created the crashed marker file

文件差異過大導致無法顯示
+ 1 - 0
Crashlytics/UnitTests/Data/bare_min_crash/signal.clsrecord


+ 0 - 0
Crashlytics/UnitTests/binary_images_missing_base_entry.clsrecord → Crashlytics/UnitTests/Data/binary_images_missing_base_entry.clsrecord


+ 1 - 0
Crashlytics/UnitTests/Data/corrupt_metadata/metadata.clsrecord

@@ -0,0 +1 @@
+{"identity":{"generator":"Crashlytics iOS SDK/4.0.0-beta.1","display_version":"4.0.0-beta.1[CORRUPT],"size":1392640,"encrypted":false,"minimum_sdk_version":"9.0.0","built_sdk_version":"13.2.0"}}

+ 318 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/binary_images.clsrecord

@@ -0,0 +1,318 @@
+{"load":{"path":"/Users/samedson/Library/Developer/CoreSimulator/Devices/4470615D-0123-4AFA-8F77-6E047E2B77EB/data/Containers/Bundle/Application/B9828674-962B-4540-A038-985819F7B8EB/release test 4.0.0-beta.1.app/release test 4.0.0-beta.1","uuid":"d5e7ada9003c32b1aaf11e8a3362c29f","base":4517593088,"size":1470464}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libc++.1.dylib","uuid":"abd018591db83d82a908186a7f602acd","base":140734537617408,"size":339968}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libsqlite3.dylib","uuid":"7e7220eb5ca239458a01daebae71da17","base":140734557356032,"size":1699840}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libz.1.dylib","uuid":"7d7500a4a1573aa9a2b366610c381082","base":140734560747520,"size":77824}}
+{"load":{"path":"/Users/samedson/Library/Developer/CoreSimulator/Devices/4470615D-0123-4AFA-8F77-6E047E2B77EB/data/Containers/Bundle/Application/B9828674-962B-4540-A038-985819F7B8EB/release test 4.0.0-beta.1.app/Frameworks/FBLPromises.framework/FBLPromises","bundle_id":"org.cocoapods.FBLPromises","build_version":"1","display_version":"1.2.8","uuid":"ef7a172290e63fd29a4bd8cd56db54fd","base":4521078784,"size":102400}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework/Foundation","bundle_id":"com.apple.Foundation","build_version":"1674.102","display_version":"6.9","uuid":"56e478002ccb3b7db94bccf5f13d6bcf","base":140733821190144,"size":2916352}}
+{"load":{"path":"/Users/samedson/Library/Developer/CoreSimulator/Devices/4470615D-0123-4AFA-8F77-6E047E2B77EB/data/Containers/Bundle/Application/B9828674-962B-4540-A038-985819F7B8EB/release test 4.0.0-beta.1.app/Frameworks/GoogleUtilities.framework/GoogleUtilities","bundle_id":"org.cocoapods.GoogleUtilities","build_version":"1","display_version":"6.5.1","uuid":"1611a1f713063fe88b72c193d8fa68ff","base":4521316352,"size":143360}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Security.framework/Security","bundle_id":"com.apple.Security","build_version":"59306.60.56","display_version":"10.0","uuid":"d2e7ab4430c632e994a543aeb734c1f5","base":140733926633472,"size":1204224}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/StoreKit.framework/StoreKit","bundle_id":"com.apple.StoreKit","build_version":"1","display_version":"1.0","uuid":"e3f8d941677239f79b2bb83d3c0630e6","base":140733930819584,"size":217088}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration","bundle_id":"com.apple.SystemConfiguration","build_version":"1.19","display_version":"1.19","uuid":"e2c13ce7c3de3bb4b9fa3af670a7d992","base":140733939421184,"size":389120}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/UIKit.framework/UIKit","bundle_id":"com.apple.UIKit","build_version":"61000","display_version":"1.0","uuid":"d465844bf8ae36afb49470cbe6b586f6","base":140733939818496,"size":4096}}
+{"load":{"path":"/Users/samedson/Library/Developer/CoreSimulator/Devices/4470615D-0123-4AFA-8F77-6E047E2B77EB/data/Containers/Bundle/Application/B9828674-962B-4540-A038-985819F7B8EB/release test 4.0.0-beta.1.app/Frameworks/nanopb.framework/nanopb","bundle_id":"org.cocoapods.nanopb","build_version":"1","display_version":"0.3.9011","uuid":"26f03d7e81f3372d8b055ca77930bfe5","base":4521631744,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libobjc.A.dylib","uuid":"3ec683f636ef33e18b98c95e12ba38d2","base":140734556495872,"size":180224}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libSystem.B.dylib","uuid":"7881ad7f524c3cfa959502ed549166aa","base":140734534602752,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation","bundle_id":"com.apple.CoreFoundation","build_version":"1674.102","display_version":"6.9","uuid":"f8debf83d3b931bbb523a04282035cb4","base":140733792337920,"size":3899392}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libc++abi.dylib","uuid":"3574f105577b376ab812d44dc7f4356f","base":140734537957376,"size":81920}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libcache.dylib","uuid":"7c954eb22e3b36a49efdd006adb19168","base":140734569558016,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libcommonCrypto.dylib","uuid":"7f1c22d792c339c8872c68f303d5314d","base":140734569582592,"size":49152}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libcompiler_rt.dylib","uuid":"053adcc8c0333184985d4b4137cbd922","base":140734569631744,"size":32768}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libcopyfile.dylib","uuid":"6473bc490a103545b0443b1cc40193dc","base":140734569664512,"size":40960}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libcorecrypto.dylib","uuid":"dbcae57655703019b634909bf5cdb91d","base":140734569705472,"size":622592}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libdispatch.dylib","uuid":"ee616c9840ba3d1a8750e917d70f051a","base":140734571466752,"size":266240}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libdyld.dylib","uuid":"788be6ce290d3b25997007c16ef8699f","base":140734571732992,"size":204800}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/liblaunch.dylib","uuid":"848b8581e7093528b03640c8d8d06c3b","base":140734571937792,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libmacho.dylib","uuid":"00c14c1e774d3fa09c9cb82cc8e50a9b","base":140734571941888,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libremovefile.dylib","uuid":"e334fb87c062373eb027857c3d8ba440","base":140734571966464,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_asl.dylib","uuid":"b0b4b7352a2a30c38a4a98c413cde871","base":140734571974656,"size":94208}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_blocks.dylib","uuid":"146907bbc11b3514a9f0f2ef62f959f9","base":140734572068864,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_c.dylib","uuid":"492601edb9c83becb637f53fb24c9a06","base":140734572072960,"size":536576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_configuration.dylib","uuid":"358eace8d962341f811c972492118e4f","base":140734572609536,"size":16384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_containermanager.dylib","uuid":"0f94adc879dc3bc8b0c4df0d2321da90","base":140734572625920,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_coreservices.dylib","uuid":"cb400131c4aa35f7b8e9d964b57849d5","base":140734572654592,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_darwin.dylib","uuid":"3ccc070c97463a68bcccfd50cbf8117d","base":140734572662784,"size":32768}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_dnssd.dylib","uuid":"3b2f7e49f57532928cfe15191a9fd122","base":140734572695552,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_featureflags.dylib","uuid":"818da765e90332d79bf9b03c37c0b9e0","base":140734572724224,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_info.dylib","uuid":"848c555a09c434cb9468e6d22691af78","base":140734572732416,"size":274432}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_m.dylib","uuid":"aa06e8525d1d3eae81d6ac838833a3d4","base":140734573191168,"size":286720}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_malloc.dylib","uuid":"28f6cb444a213fd483dbc30df29405b9","base":140734573477888,"size":155648}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_notify.dylib","uuid":"4e9e47624c0037abab4bcc1f0eb093e5","base":140734573633536,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sandbox.dylib","uuid":"14bd363ffb333f6c9da5d26a35cead02","base":140734573756416,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sim_kernel.dylib","uuid":"9da067434e6633b4877479ae26bb2ebf","base":140734573768704,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sim_platform.dylib","uuid":"7a778cd4fc673693b0e75adee2f76e48","base":140734573780992,"size":16384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sim_pthread.dylib","uuid":"7ce748dcdcda352292a787f786547231","base":140734573801472,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_trace.dylib","uuid":"5537ba4d53043b8aaf86892a5ad6f01e","base":140734573809664,"size":90112}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libunwind.dylib","uuid":"f7a97d5545b73566ac877a71dc8f621a","base":140734573899776,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libxpc.dylib","uuid":"f4467130d9da3791a4d0f41c91f1cfea","base":140734573924352,"size":208896}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sim_pthread_host.dylib","uuid":"fd7c15d486123bd5ae89af6b126c3a93","base":140734573805568,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sim_platform_host.dylib","uuid":"b3453a885959317e805b34515a2a839b","base":140734573797376,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_sim_kernel_host.dylib","uuid":"ef218bd84d9537f893581b488831cf11","base":140734573776896,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_kernel.dylib","uuid":"90f8650fd3a938b3bb8cb5d3686393bc","base":140734573006848,"size":184320}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_platform.dylib","uuid":"ac9560a9cce83158bcc88ff47929397a","base":140734573670400,"size":40960}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_pthread.dylib","uuid":"9d14694ff3fe385d9b236a87844d5cbf","base":140734573711360,"size":45056}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices","bundle_id":"com.apple.MobileCoreServices","build_version":"1069.14","display_version":"1069.14","uuid":"7110b66b12423092910fc5523ba02cc2","base":140733868449792,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libcompression.dylib","uuid":"10339f04e97939a98865bea50a6dbc02","base":140734538117120,"size":98304}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CFNetwork.framework/CFNetwork","bundle_id":"com.apple.CFNetwork","build_version":"1121.2.1","display_version":"1121.2.1","uuid":"7b0e8de51ab734c0aa4e0e913242738b","base":140733778038784,"size":3452928}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libarchive.2.dylib","uuid":"619da697a6983c94a3e9b962f5adffd8","base":140734535024640,"size":471040}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libicucore.A.dylib","uuid":"ce9af2e5c369336eb2700b70a5c321ce","base":140734542589952,"size":2437120}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libxml2.2.dylib","uuid":"83b3bece972032fd93605dfe7fe1560d","base":140734559637504,"size":929792}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit","bundle_id":"com.apple.framework.IOKit","display_version":"2.0.2","uuid":"f51eed75b2fe389bab09487e555fe999","base":140733829234688,"size":528384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libCRFSuite.dylib","uuid":"d86b0421e9f639b59362f6be178236cd","base":140734514839552,"size":196608}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/liblangid.dylib","uuid":"7ef0b33a7641318ab445a69d0c08a7c1","base":140734545027072,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreServices.framework/CoreServices","bundle_id":"com.apple.CoreServices","build_version":"839","display_version":"839","uuid":"1d768da5c6c33b27afea491581c1c386","base":140733811773440,"size":1560576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation","bundle_id":"com.apple.MobileInstallation","build_version":"1.0","display_version":"2.0","uuid":"8ea209614f2b33b0a8914352073e75e0","base":140734209122304,"size":229376}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreServicesStore.framework/CoreServicesStore","bundle_id":"com.apple.CSStore","build_version":"1069.14","display_version":"1069.14","uuid":"3fbbdedd53cc3caa8d88febbab4f8755","base":140734061588480,"size":176128}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libbsm.0.dylib","uuid":"ef366d53535938dc86faf9e0ba161dbe","base":140734537494528,"size":69632}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libMobileGestalt.dylib","uuid":"2845fbd940353ff9b414d0b586cb9e13","base":140734533931008,"size":135168}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MobileSystemServices.framework/MobileSystemServices","bundle_id":"com.apple.MobileSystemServices","build_version":"1","display_version":"1.0","uuid":"59862d812d9a324db446d32e9e291329","base":140734212288512,"size":16384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libbz2.1.0.dylib","uuid":"5de2081bc17434629ab5a86fb018ad9b","base":140734537564160,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SecurityFoundation.framework/SecurityFoundation","bundle_id":"com.apple.SecurityFoundation","build_version":"1","display_version":"1.0","uuid":"fe06fa6610e33063af61705c46467ba4","base":140734326681600,"size":94208}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ProtocolBuffer.framework/ProtocolBuffer","bundle_id":"com.apple.ProtocolBuffer","build_version":"274.30.7.15.1","display_version":"1","uuid":"0f9560d5bea739b4924b7653c334f183","base":140734306660352,"size":90112}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libcoretls.dylib","uuid":"a2bf4b57cbf3339d8ff219f5b8c8bc72","base":140734540959744,"size":90112}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libcoretls_cfhelpers.dylib","uuid":"90e1955cda3739febb9a43352bbb94ed","base":140734541049856,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libnetwork.dylib","uuid":"e32443f83f7a3f1fb3a160c9d0ee571a","base":140734552285184,"size":4063232}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libapple_nghttp2.dylib","uuid":"aef0e8ec814b3960a687cc7a6f68f526","base":140734534930432,"size":94208}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/liblzma.5.dylib","uuid":"dbdfdf52c2bd3b8f8838e49549129969","base":140734545035264,"size":102400}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libiconv.2.dylib","uuid":"0b8f2b27beca3bd9ac083b4c60b05a08","base":140734541602816,"size":987136}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libcharset.1.dylib","uuid":"1cc32e3210b53c949dfedd5eed58f7ca","base":140734538039296,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DocumentManager.framework/DocumentManager","bundle_id":"com.apple.DocumentManager","build_version":"171.3.3","display_version":"1.0","uuid":"18284c8faea93e7f8be5f8bf50a52585","base":140734075527168,"size":192512}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/FileProvider.framework/FileProvider","bundle_id":"com.apple.FileProvider","build_version":"265","display_version":"265","uuid":"a7a0635db43e393990df03f2e9af8add","base":140733820055552,"size":1060864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore","bundle_id":"com.apple.UIKitCore","build_version":"61000","display_version":"1.0","uuid":"53440f05d9a4333eb86ff1cce38c1543","base":140734390710272,"size":18665472}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ShareSheet.framework/ShareSheet","bundle_id":"com.apple.ShareSheet","build_version":"1506.7","display_version":"1506.7","uuid":"97a5068de9523bd3bc4f24b3edefbb75","base":140734328733696,"size":610304}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MobileIcons.framework/MobileIcons","bundle_id":"com.apple.mobileicons.framework","build_version":"372.0","display_version":"1.0","uuid":"f28d64199bfd349889b54f7212f70e96","base":140734209069056,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/QuartzCore.framework/QuartzCore","bundle_id":"com.apple.QuartzCore","build_version":"815.25","display_version":"1.11","uuid":"72139c10620835438dbd83af0f65b8b3","base":140733914669056,"size":2322432}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Network.framework/Network","bundle_id":"com.apple.Network","build_version":"1","display_version":"1.0","uuid":"0d8132dcb9a33ddd89db3e981fc84107","base":140733884346368,"size":544768}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DocumentManagerCore.framework/DocumentManagerCore","bundle_id":"com.apple.DocumentManagerCore","build_version":"171.3.3","display_version":"1.0","uuid":"5503f2af94693304a47bd3908484ebb3","base":140734075719680,"size":114688}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics","bundle_id":"com.apple.CoreGraphics","build_version":"1348.15","display_version":"2.0","uuid":"e765bc69cfd73f3eac3b88d1a20250df","base":140733796237312,"size":6545408}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit","bundle_id":"com.apple.pluginkit.framework","build_version":"1","display_version":"1.0","uuid":"4d93df4484463eb19b779a5b09609f79","base":140734302941184,"size":172032}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreImage.framework/CoreImage","bundle_id":"com.apple.CoreImage","build_version":"920.8","display_version":"13.0.0","uuid":"2a9ae8f7001d3ff2a328c073803079e8","base":140733802803200,"size":3256320}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreUI.framework/CoreUI","bundle_id":"com.apple.CoreUI","build_version":"608.3","display_version":"1.0","uuid":"561556e92a903970b7833206178b2dbc","base":140734067458048,"size":778240}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/ImageIO.framework/ImageIO","bundle_id":"com.apple.ImageIO.framework","build_version":"1972.15","display_version":"3.3.0","uuid":"3193777e5be63bbd890c45c25552a363","base":140733830008832,"size":5345280}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AggregateDictionary.framework/AggregateDictionary","bundle_id":"com.apple.AggregateDictionary","build_version":"1","display_version":"1.0","uuid":"76840fe7d70a3d689e7d71ad24f6af76","base":140733980647424,"size":20480}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libFosl_dynamic.dylib","uuid":"a814135658c43348985ad2287a86f07f","base":140734515081216,"size":1802240}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ColorSync.framework/ColorSync","bundle_id":"com.apple.ColorSync","build_version":"3394.3","display_version":"4.13.0","uuid":"09a43779a5bd3884a51d5e7db6accaa4","base":140734028394496,"size":1814528}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreMedia.framework/CoreMedia","bundle_id":"com.apple.CoreMedia","build_version":"2520.9.1.4","display_version":"1.0","uuid":"e570759a33b33d068344b01624c87a17","base":140733809795072,"size":741376}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox","bundle_id":"com.apple.VideoToolbox","build_version":"2520.9.1.4","display_version":"1.0","uuid":"99402c183b2f34ac91a775da2a10d58d","base":140733940535296,"size":3080192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/GraphVisualizer.framework/GraphVisualizer","bundle_id":"com.apple.GraphVisualizer","build_version":"210.1","display_version":"1.0","uuid":"96a208fca6bf31408784990b01ec3b69","base":140734137819136,"size":61440}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreText.framework/CoreText","bundle_id":"com.apple.CoreText","build_version":"643.1.2.2","display_version":"643.1.2.2","uuid":"47446c6fd9aa3dbdb87c489aa3947b77","base":140733814587392,"size":1753088}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Metal.framework/Metal","bundle_id":"com.apple.Metal","build_version":"213.2.3","display_version":"213.2.3","uuid":"c4a8c5e69888358e88cb5bef148de847","base":140733865127936,"size":577536}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/MetalPerformanceShaders","bundle_id":"com.apple.MetalPerformanceShaders.MetalPerformanceShaders","build_version":"1","display_version":"1.0","uuid":"900fbc40f56b38acb101631c50c8d9e0","base":140733868396544,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/IOSurface.framework/IOSurface","bundle_id":"com.apple.IOSurface","build_version":"269.9","display_version":"269.9","uuid":"71db3714adc637a6ae263ae3e4b0c5b7","base":140733829763072,"size":49152}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/OpenGLES","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"8db8d7b42f5631db84dbf07978ca2335","base":140733901905920,"size":49152}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Accelerate","bundle_id":"com.apple.Accelerate","build_version":"Accelerate 1.11","display_version":"1.11","uuid":"652ac1d085f93ca88ccd4f31f749a791","base":140733743034368,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreVideo.framework/CoreVideo","bundle_id":"com.apple.CoreVideo","build_version":"334.0","display_version":"1.8","uuid":"1c158c89aa3630578573c08dddff7956","base":140733816340480,"size":192512}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FaceCore.framework/FaceCore","bundle_id":"com.apple.vision.FaceCore","build_version":"3.1.12","display_version":"3.1.12","uuid":"ba5cfa4c56f733f8a934e681a7caf7ca","base":140734096642048,"size":4288512}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libncurses.5.4.dylib","uuid":"257fc3bfc22034c5a63cff21bdf18065","base":140734552088576,"size":196608}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SimulatorClient.framework/SimulatorClient","bundle_id":"com.apple.iphonesimulator.SimulatorClient","build_version":"1","display_version":"1.0","uuid":"83dc2e9b7ba83164944226d4cf17284d","base":140734333390848,"size":16384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreAudio.framework/CoreAudio","bundle_id":"com.apple.audio.CoreAudio","build_version":"5.0","display_version":"5.0","uuid":"6fcafed144a535b99d7919fcf5953458","base":140733787926528,"size":634880}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/vImage","bundle_id":"com.apple.vImage","display_version":"8.1","uuid":"903eed7367363256aee694363eccb199","base":140733743132672,"size":9097216}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/vecLib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"aeb3aa0835103c2bb679bf3bdf4347a5","base":140733763641344,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libvMisc.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"c62f23f95303304c8df6e16f4588c640","base":140733762273280,"size":1368064}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libvDSP.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"c7135432e3a93824a372a1239e5977b2","base":140733760696320,"size":1576960}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libBLAS.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"addb8b8416993cbca1db633c72242485","base":140733752229888,"size":1679360}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libLAPACK.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"8c2e8257279e34688fb449e8a940e840","base":140733756149760,"size":3891200}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libLinearAlgebra.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"edc5ddc16b2f3ec5b915e8c65cf04ac0","base":140733760040960,"size":90112}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libSparseBLAS.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"0f0bcb17681a30cc8e585cf9177e6db4","base":140733760618496,"size":77824}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libQuadrature.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"67aca77494713c13ba44314ef958140e","base":140733760131072,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libBNNS.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"26f018853fc038aa9824c75ac58160ad","base":140733753909248,"size":2236416}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/libSparse.dylib","bundle_id":"com.apple.Accelerate.vecLib","build_version":"vecLib 3.11","display_version":"3.11","uuid":"52cd108b77433b7ba576b79312afa449","base":140733760155648,"size":462848}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices","bundle_id":"com.apple.GraphicsServices","build_version":"1.0","display_version":"1.0","uuid":"6204fb5c4fe83c7f9a5b5a3f17c06b69","base":140734137880576,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FontServices.framework/libGSFont.dylib","bundle_id":"com.apple.FontServices","build_version":"1","display_version":"1.0","uuid":"1399163e02a73115bb89e449b91a92ca","base":140734104203264,"size":61440}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FontServices.framework/FontServices","bundle_id":"com.apple.FontServices","build_version":"1","display_version":"1.0","uuid":"842bb6fa9bff33aabfb4ca868c3a50f1","base":140734102786048,"size":40960}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FontServices.framework/libGSFontCache.dylib","bundle_id":"com.apple.FontServices","build_version":"1","display_version":"1.0","uuid":"387f9009316c35e5945741a0c2c384e3","base":140734104264704,"size":81920}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport","bundle_id":"com.apple.AppSupport","build_version":"29","display_version":"1.0.0","uuid":"011ba616e62a3bb693eb68c9d45118eb","base":140733983858688,"size":245760}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libAccessibility.dylib","uuid":"606efe8decec3014b9b2e3d988a189b5","base":140734514348032,"size":94208}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/OTSVG.framework/OTSVG","bundle_id":"com.apple.OTSVG","display_version":"1.0","uuid":"a7715887022e37928af248ef67921f9c","base":140734264131584,"size":290816}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib","bundle_id":"com.apple.FontServices","build_version":"1","display_version":"1.0","uuid":"18df4f49b9f93ee68fda328728c069bf","base":140734102827008,"size":1376256}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ConstantClasses.framework/ConstantClasses","bundle_id":"com.apple.ConstantClasses","build_version":"1","display_version":"1.0","uuid":"be32460c8001333e99050654a812d81c","base":140734032904192,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AXCoreUtilities.framework/AXCoreUtilities","bundle_id":"com.apple.accessibility.AXCoreUtilities","build_version":"1","display_version":"1.0","uuid":"71d5890b59be388b99fbe25cbd4c5be4","base":140733968736256,"size":45056}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MediaAccessibility.framework/MediaAccessibility","bundle_id":"com.apple.MediaAccessibility","build_version":"125","display_version":"1.0","uuid":"c7266878a75e3d5d85263de3f990d1d7","base":140733855326208,"size":45056}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libate.dylib","uuid":"e4c6ccc8f6c7383e86b882d47f1572c7","base":140734535495680,"size":1196032}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppleJPEG.framework/AppleJPEG","bundle_id":"com.apple.AppleJPEG","build_version":"1","display_version":"1.0","uuid":"830bdd43cee031b09936a1d840b6e516","base":140733985742848,"size":299008}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FontServices.framework/libhvf.dylib","bundle_id":"com.apple.FontServices","build_version":"1","display_version":"1.0","uuid":"289144d0bf53363fbbad6f282973048f","base":140734104756224,"size":65536}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreFSCache.dylib","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"aaaa842aaef13b1f9306ac45a9c4faf8","base":140733901971456,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices","bundle_id":"com.apple.SpringBoardServices","build_version":"1.0","display_version":"1.0","uuid":"5a78de98b97938f7bbe43cafc6cc0797","base":140734351745024,"size":303104}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IdleTimerServices.framework/IdleTimerServices","bundle_id":"com.apple.ist.IdleTimerServices","build_version":"1","display_version":"1.0","uuid":"be61346e434c3510a84b28e2ece8df2b","base":140734182871040,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/BoardServices.framework/BoardServices","bundle_id":"com.apple.BoardServices","build_version":"464.1","display_version":"1.0","uuid":"ad519a94124f3ca8aafe8d6b0fb4666b","base":140733997756416,"size":184320}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/FrontBoardServices.framework/FrontBoardServices","bundle_id":"com.apple.FrontBoardServices","build_version":"626.4.1","display_version":"626.4.1","uuid":"b2b091f04b1a3ddf80ce42894baae3b9","base":140734105427968,"size":483328}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/BaseBoard.framework/BaseBoard","bundle_id":"com.apple.BaseBoard","build_version":"464.1","display_version":"464.1","uuid":"844f5fc643e539868e93cfb197e95724","base":140733996965888,"size":475136}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/BackBoardServices.framework/BackBoardServices","bundle_id":"com.apple.BackBoardServices","build_version":"1.0","display_version":"1.0","uuid":"57a6db27511e3148810dfad0c364a9c5","base":140733996482560,"size":331776}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/PersistentConnection.framework/PersistentConnection","bundle_id":"com.apple.persistentconnection","build_version":"1.0","display_version":"1.0","uuid":"3e660b95a25638d98b968612ffe5460c","base":140734278885376,"size":151552}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CommonUtilities.framework/CommonUtilities","bundle_id":"com.apple.commonutilities","build_version":"900","display_version":"8.0","uuid":"2328287b0e1f3cffa7203b8c1355b4e8","base":140734030245888,"size":90112}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony","bundle_id":"com.apple.CoreTelephony","build_version":"7296.1","display_version":"113","uuid":"c5e39ca4d6fb324ca96e1c8124d4b92e","base":140733813735424,"size":851968}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Bom.framework/Bom","bundle_id":"com.apple.bom","build_version":"219.2","display_version":"14.0","uuid":"08d829cccd80379ca7753fa56d1729c9","base":140733997940736,"size":204800}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libcupolicy.dylib","uuid":"3d69d8506bd530eeafdb892a8b7414ae","base":140734541058048,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libTelephonyUtilDynamic.dylib","uuid":"280b62041f6b3bb6ba60c3a10ae4ef2b","base":140734534610944,"size":299008}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AssertionServices.framework/AssertionServices","bundle_id":"com.apple.AssertionServices","build_version":"223.60.4","display_version":"1.0","uuid":"73403c7f82173c09832d851102d85381","base":140733987790848,"size":57344}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/RunningBoardServices.framework/RunningBoardServices","bundle_id":"com.apple.RunningBoardServices","build_version":"223.60.4","display_version":"1.0","uuid":"a661bb839fc330189e125e2543217cd7","base":140734314242048,"size":225280}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CorePhoneNumbers.framework/CorePhoneNumbers","bundle_id":"com.apple.CorePhoneNumbers","build_version":"1","display_version":"1.0","uuid":"7f0e104d00c33b4781b36cf86ff51fd8","base":140734054211584,"size":32768}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SimFramebufferClient.framework/SimFramebufferClient","bundle_id":"com.apple.CoreSimulator.SimFramebufferClient","build_version":"677","display_version":"677","uuid":"8d067de182233a2eab490288023584e7","base":140734333337600,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libGFXShared.dylib","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"d9e6e9094a783e52924d675fb8ca0a86","base":140733902032896,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libGLImage.dylib","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"eb8266c7769439dbb8cf514b6e5c33d0","base":140733902069760,"size":262144}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCVMSPluginSupport.dylib","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"f650b0f4041c39c28e6eb8f7f85cae97","base":140733901959168,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"0cfd2b6032f43129aaaf92fb82bd0e2d","base":140733901996032,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework//libLLVMContainer.dylib","bundle_id":"com.apple.opengles","build_version":"17.10.22","display_version":"17.10.22","uuid":"05e55070349c38b0b4288a71a4cf04c6","base":140733887492096,"size":13307904}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/caulk.framework/caulk","bundle_id":"com.apple.audio.caulk","display_version":"1.0","uuid":"3b1412e1e626313facdde066fc2e8c2d","base":140734478970880,"size":61440}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSCore.framework/MPSCore","bundle_id":"com.apple.MetalPerformanceShaders.MPSCore","build_version":"1","display_version":"1.0","uuid":"f002105b9a743722a6c2a96da8765242","base":140733865807872,"size":217088}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSImage.framework/MPSImage","bundle_id":"com.apple.MetalPerformanceShaders.MPSImage","build_version":"1","display_version":"1.0","uuid":"c23c15f1020435ceaf08a431745e574a","base":140733866024960,"size":536576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNeuralNetwork.framework/MPSNeuralNetwork","bundle_id":"com.apple.MetalPerformanceShaders.MPSNeuralNetwork","build_version":"1","display_version":"1.0","uuid":"ddc6c3fd515131bbac8d036ce39ea9ed","base":140733866786816,"size":1302528}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSMatrix.framework/MPSMatrix","bundle_id":"com.apple.MetalPerformanceShaders.MPSMatrix","build_version":"1","display_version":"1.0","uuid":"5c317071d5873890adeb805ae06f9f22","base":140733866561536,"size":143360}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSRayIntersector.framework/MPSRayIntersector","bundle_id":"com.apple.MetalPerformanceShaders.MPSRayIntersector","build_version":"1","display_version":"1.0","uuid":"37c62e7b337539c3b0b70cf3470ebc35","base":140733868089344,"size":307200}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNDArray.framework/MPSNDArray","bundle_id":"com.apple.MetalPerformanceShaders.MPSNDArray","build_version":"1","display_version":"1.0","uuid":"cdc53ec3e0c936a1a57b2e5ed27a50da","base":140733866704896,"size":81920}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/TextureIO.framework/TextureIO","bundle_id":"com.apple.TextureIO","build_version":"3.10.9","display_version":"3.10.9","uuid":"2a0709b0af403af38e1a2457b43a5c68","base":140734385664000,"size":827392}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreSVG.framework/CoreSVG","bundle_id":"com.apple.CoreSVG","build_version":"129","display_version":"1.0","uuid":"c4ff526fc8f531d6a85603b29e39dfc2","base":140734061273088,"size":139264}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/InternationalSupport.framework/InternationalSupport","bundle_id":"com.apple.InternationalSupport","build_version":"45","display_version":"1.0","uuid":"b7e195c61f1d38f2a0dea13abcdc7a84","base":140734184255488,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreUtils.framework/CoreUtils","bundle_id":"com.apple.CoreUtils","build_version":"610.18","display_version":"6.1","uuid":"62822f3c0a5c32e3b558d7ef5b1bdb6c","base":140734068236288,"size":1409024}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IconServices.framework/IconServices","bundle_id":"com.apple.IconServices","build_version":"437","display_version":"437","uuid":"1654b6f4d6b53ca38011d89bc5bc5026","base":140734182715392,"size":155648}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation","bundle_id":"com.apple.UIFoundation","build_version":"660","display_version":"1.0","uuid":"5e0812bbc08d3d4d9636c917577c4738","base":140734389723136,"size":987136}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/PushKit.framework/PushKit","bundle_id":"com.apple.PushKit","build_version":"1","display_version":"1.0","uuid":"fb3770ae900f3da4aeb2814e0b27204c","base":140733914640384,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/XCTTargetBootstrap.framework/XCTTargetBootstrap","bundle_id":"com.apple.dt.XCTTargetBootstrap","build_version":"15700","display_version":"1.0","uuid":"96d78a2333de389fb57b644f74f86a8b","base":140734478954496,"size":16384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/WebKitLegacy.framework/WebKitLegacy","bundle_id":"com.apple.WebKitLegacy","build_version":"8608.4.9.0.5","display_version":"8608","uuid":"3615668bf6733197a4746516c1a23301","base":140734469537792,"size":1388544}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore","bundle_id":"com.apple.JavaScriptCore","build_version":"8608.4.9.0.5","display_version":"8608","uuid":"303714db3a3f323a830a1e0153b7bb96","base":140733839753216,"size":12136448}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SAObjects.framework/SAObjects","bundle_id":"com.apple.SAObjects","build_version":"1","display_version":"1.0","uuid":"50b1814035d63f54bab0b833a7c5c9ea","base":140734314545152,"size":495616}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreMaterial.framework/CoreMaterial","bundle_id":"com.apple.CoreMaterial","build_version":"1","display_version":"1.0","uuid":"d78dd68f819137f2b2d91b81cfa518af","base":140734047784960,"size":114688}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libapp_launch_measurement.dylib","uuid":"8a2caa17df9b377795d3a299335adec2","base":140734534918144,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/LinkPresentation.framework/LinkPresentation","bundle_id":"com.apple.LinkPresentation","build_version":"119.15","display_version":"119","uuid":"baa2a5e92bc03d0391f187c992c680dd","base":140733851889664,"size":790528}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreAnalytics.framework/CoreAnalytics","bundle_id":"com.apple.analyticsd","build_version":"1","display_version":"1.0","uuid":"3da4cc45ec943ea28a705fa19c1c79f2","base":140734038241280,"size":122880}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/UserNotifications.framework/UserNotifications","bundle_id":"com.apple.UserNotifications","display_version":"1.0","uuid":"ce5137105e9f3ac4b0a4ce04bdc0c6ea","base":140733939822592,"size":192512}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MobileAsset.framework/MobileAsset","bundle_id":"com.apple.MobileAssets","build_version":"619.60.1","display_version":"1.0","uuid":"1b39c382c2ae3c41ac1261126f9f8feb","base":140734208806912,"size":98304}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/PhysicsKit.framework/PhysicsKit","bundle_id":"com.apple.PhysicsKit","build_version":"1","display_version":"1.0","uuid":"4394c170da1234b98135663d3f683a87","base":140734302208000,"size":315392}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ProofReader.framework/ProofReader","bundle_id":"com.apple.ProofReader","build_version":"492.1","display_version":"2.4","uuid":"6bae6b7cc07e36e0991920c481dc68bb","base":140734305517568,"size":835584}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/PrototypeTools.framework/PrototypeTools","bundle_id":"com.apple.PrototypeTools","build_version":"1","display_version":"1.0","uuid":"860bec8402ec34048586c305455e3d3e","base":140734306750464,"size":102400}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/TextInput.framework/TextInput","bundle_id":"com.apple.TextInput","build_version":"1.0","display_version":"1.0","uuid":"df95445873b33278afd77448e2170b54","base":140734381469696,"size":434176}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitServices.framework/UIKitServices","bundle_id":"com.apple.UIKitServices","build_version":"1","display_version":"1.0","uuid":"39a33a793c1b3f4497276c716d5b101e","base":140734409375744,"size":65536}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/WebCore.framework/WebCore","bundle_id":"com.apple.WebCore","build_version":"8608.4.9.0.5","display_version":"8608","uuid":"5609cc7f97153df8a87246998851b7f0","base":140734439194624,"size":29933568}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/WebCore.framework/Frameworks/libwebrtc.dylib","uuid":"58d6a4724c573c10be20a362309a7203","base":140734432854016,"size":6340608}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/URLFormatting.framework/URLFormatting","bundle_id":"com.apple.URLFormatting","build_version":"119.15","display_version":"119","uuid":"4354fb28afd033838e9607273be4ea67","base":140734409441280,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox","bundle_id":"com.apple.audio.toolbox.AudioToolbox","build_version":"1.8","display_version":"1.8","uuid":"8fc688650cab38d78adb8b62815ce396","base":140733769723904,"size":1171456}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AudioToolboxCore.framework/AudioToolboxCore","bundle_id":"com.apple.audio.AudioToolboxCore","display_version":"1.0","uuid":"bb9ec597d87a3bd58185c3b2166f7c21","base":140733991219200,"size":2260992}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/TCC.framework/TCC","bundle_id":"com.apple.TCC","build_version":"1","display_version":"1.0","uuid":"b1810b0b556b3d21813d0a14dc0048b4","base":140734367838208,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MediaExperience.framework/MediaExperience","bundle_id":"com.apple.MediaExperience","build_version":"1","display_version":"1.0","uuid":"3623ec77d1ea306c8051a2d302ba35c9","base":140734195929088,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libAudioStatistics.dylib","uuid":"da19eff1419e3371ba67a48a440e6e8a","base":140734514532352,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libAudioToolboxUtility.dylib","uuid":"9869b845ec0f3dd29075a2a91baadf91","base":140734514585600,"size":221184}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/perfdata.framework/perfdata","bundle_id":"com.apple.perfdata","build_version":"51.40.3","display_version":"1.0","uuid":"22785b9d9f1b3df497eec2a3c7a6f062","base":140734509854720,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libperfcheck.dylib","uuid":"54d38511ed35315bb63f1a07d857becb","base":140734556676096,"size":61440}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Contacts.framework/Contacts","bundle_id":"com.apple.contacts","build_version":"3457.4","display_version":"1.0","uuid":"a22f72aee1ce3a1eaec11c6ae0239d92","base":140733784866816,"size":1249280}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreLocation.framework/CoreLocation","bundle_id":"com.apple.corelocation","build_version":"2389.0.8","display_version":"2389.0.8","uuid":"7886a050056b368b8b2b9f955b0a8f28","base":140733806059520,"size":421888}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppleMediaServices.framework/AppleMediaServices","bundle_id":"com.apple.AppleMediaServices","build_version":"1","display_version":"1.0","uuid":"055cff26025b34858a9e587013c2a5ca","base":140733986099200,"size":1327104}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/AVFoundation.framework/AVFoundation","bundle_id":"com.apple.avfoundation","build_version":"1740.4","display_version":"2.0","uuid":"47ae4cb71a413bcc9bc3401b40fa816b","base":140733739347968,"size":1912832}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/AVKit.framework/AVKit","bundle_id":"com.apple.AVKit","build_version":"621.1.1","display_version":"1.0","uuid":"2593e55431e73bfda02f57ad08e74c9f","base":140733742149632,"size":884736}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Celestial.framework/Celestial","bundle_id":"com.apple.Celestial","build_version":"2520.9.1.4","display_version":"1.0","uuid":"c020a60bf5e53356b218a7f2740945ac","base":140734009311232,"size":155648}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CloudKit.framework/CloudKit","bundle_id":"com.apple.cloudkit.CloudKit","build_version":"860","display_version":"860","uuid":"2f74a8d364aa309986426e8d56f11de0","base":140733782310912,"size":1527808}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MediaRemote.framework/MediaRemote","bundle_id":"com.apple.MediaRemote","build_version":"1","display_version":"1.0","uuid":"dc53719fd29c36b5a3fe1e14f4c0c3fb","base":140734201552896,"size":1966080}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/QuickLookThumbnailing.framework/QuickLookThumbnailing","bundle_id":"com.apple.QuickLookThumbnailing","build_version":"1","display_version":"1.0","uuid":"70972d2729103480a2ad762b007fef1a","base":140733917708288,"size":225280}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/WebKit.framework/WebKit","bundle_id":"com.apple.WebKit","build_version":"8608.4.9.0.5","display_version":"8608","uuid":"d4061c850d0f31c6a933ea268a7072dc","base":140733947420672,"size":6225920}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AddressBookLegacy.framework/AddressBookLegacy","bundle_id":"com.apple.AddressBookLegacy","build_version":"30","display_version":"1.0","uuid":"c19a0b07a7ab3363a3593e72d1b36cf3","base":140733980037120,"size":610304}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ManagedConfiguration.framework/ManagedConfiguration","bundle_id":"com.apple.managedconfiguration","build_version":"1.0","display_version":"1.0","uuid":"b59bef6700f136aa8630f4851e159749","base":140734191697920,"size":1097728}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libCTGreenTeaLogger.dylib","uuid":"aa30ce9641ed3cfbb733ad16889bd214","base":140734515036160,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CellularPlanManager.framework/CellularPlanManager","bundle_id":"com.apple.CellularPlanManager","build_version":"7296.1","display_version":"1.0","uuid":"37c85ec5611030589efc04721dd2a30d","base":140734009466880,"size":114688}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/ClassKit.framework/ClassKit","bundle_id":"com.apple.ClassKit","build_version":"145.1.22","display_version":"1.2","uuid":"5fdeaecaf8ba3ed3ba9d2f62d02e330c","base":140733781987328,"size":323584}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreSuggestions.framework/CoreSuggestions","bundle_id":"com.apple.CoreSuggestions","build_version":"1052.21.1","display_version":"1.0","uuid":"42c752a6ba513c0cb5ca700a6235c775","base":140734062895104,"size":606208}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/PhoneNumbers.framework/PhoneNumbers","bundle_id":"com.apple.PhoneNumbers","build_version":"1","display_version":"1.0","uuid":"85e12091c6823dbd85f926f8fef92333","base":140734280687616,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreData.framework/CoreData","bundle_id":"com.apple.CoreData","build_version":"977","display_version":"120","uuid":"5401ca8db381331290d59c5e8abb1101","base":140733788856320,"size":3481600}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/vCard.framework/vCard","bundle_id":"com.apple.contacts.vCard","display_version":"1.0","uuid":"5afe07e009073546a6dbb808ab24435d","base":140734509907968,"size":172032}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ContactsFoundation.framework/ContactsFoundation","bundle_id":"com.apple.AddressBook.ContactsFoundation","display_version":"8.0","uuid":"aade93482b163b53b029002e9c55929d","base":140734033555456,"size":471040}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accounts.framework/Accounts","bundle_id":"com.apple.Accounts","build_version":"113","display_version":"113","uuid":"9b6aae7b59483c208d5ba3185e83f6a9","base":140733763645440,"size":344064}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DataAccessExpress.framework/DataAccessExpress","bundle_id":"com.apple.dataaccess.dataaccessexpress.framework","build_version":"1.0","display_version":"1.0","uuid":"1a80093867ce3aedaf2f48f97908c456","base":140734071668736,"size":188416}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DataMigration.framework/DataMigration","bundle_id":"com.apple.datamigration","build_version":"1.0","display_version":"1.0","uuid":"9777784bef763cfa804654663d008f43","base":140734072709120,"size":57344}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UserManagement.framework/UserManagement","bundle_id":"com.apple.UserManagement","build_version":"1","display_version":"1.0","uuid":"9fefd1fdc1db339cb4f779e5a4623766","base":140734415826944,"size":102400}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DataDetectorsCore.framework/DataDetectorsCore","bundle_id":"com.apple.datadetectorscore","build_version":"659","display_version":"8.0","uuid":"9ffad78b3b473b0eaa3acdd32a9a6a41","base":140734071898112,"size":217088}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreNLP.framework/CoreNLP","bundle_id":"com.apple.CoreNLP","build_version":"213","display_version":"1.0","uuid":"e76fd5b356f733b4b92b0299d2549aa6","base":140734048976896,"size":425984}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libmecab.dylib","uuid":"816c4699260a36f8b6034e8d5f5d8b2f","base":140734545231872,"size":761856}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libgermantok.dylib","uuid":"6d796dc24f75362a9a2bd4c6d94c9160","base":140734541557760,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libThaiTokenizer.dylib","uuid":"5a904dfd16603e54ba22dbe9399556c9","base":140734534909952,"size":8192}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libChineseTokenizer.dylib","uuid":"b465ff8f86e63bbabd09c1c691eb10a4","base":140734515044352,"size":36864}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/LanguageModeling.framework/LanguageModeling","bundle_id":"com.apple.LanguageModeling","build_version":"215.1","display_version":"1.0","uuid":"593b8189c40830cf9f32b9a9364a6070","base":140734187274240,"size":839680}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreEmoji.framework/CoreEmoji","bundle_id":"com.apple.CoreEmoji","build_version":"107","display_version":"1.0","uuid":"8e7e5569216c356cb0ae80091adfc9d9","base":140734042898432,"size":69632}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/LinguisticData.framework/LinguisticData","bundle_id":"com.apple.LinguisticData","build_version":"353.6","display_version":"1.0","uuid":"ef06fcbe6fbd38d7bfcf69dba4d655fc","base":140734188625920,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Lexicon.framework/Lexicon","bundle_id":"com.apple.Lexicon-framework","build_version":"72","display_version":"1.0","uuid":"199f10a3597634f9afacff6b67e5f483","base":140734188314624,"size":299008}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libcmph.dylib","uuid":"8f3f528e3876399aa385e6108dbd1923","base":140734538043392,"size":73728}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppleAccount.framework/AppleAccount","bundle_id":"com.apple.AppleAccount","build_version":"1.0","display_version":"1.0","uuid":"7447462caa113503ba7f8a04e0ef5abc","base":140733984264192,"size":1101824}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CloudDocs.framework/CloudDocs","bundle_id":"com.apple.CloudDocs","build_version":"689","display_version":"1.0","uuid":"89a460a547d6363784ece8a343e61fb7","base":140734015242240,"size":499712}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libprequelite.dylib","uuid":"d0f0a6d407eb3ae88e5093835abb8fd2","base":140734556737536,"size":73728}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/GenerationalStorage.framework/GenerationalStorage","bundle_id":"com.apple.GenerationalStorage","build_version":"313","display_version":"2.0","uuid":"651f2c7f921532289a2a77740af6f56f","base":140734121766912,"size":126976}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ChunkingLibrary.framework/ChunkingLibrary","bundle_id":"com.apple.ChunkingLibrary","build_version":"302","display_version":"302","uuid":"643bf0365f393d42a57aed3fe505eb79","base":140734013747200,"size":299008}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SetupAssistant.framework/SetupAssistant","bundle_id":"com.apple.SetupAssistant","build_version":"1","display_version":"1.0","uuid":"8fb927c70ae3384b8ef6cca35dcf7368","base":140734328365056,"size":176128}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppleIDSSOAuthentication.framework/AppleIDSSOAuthentication","bundle_id":"com.apple.AppleIDSSOAuthentication","build_version":"1","display_version":"1.0","uuid":"5b8a9e15aa6c33ae933b995d7d548788","base":140733985714176,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AccountSettings.framework/AccountSettings","bundle_id":"com.apple.AccountSettings","build_version":"1.0","display_version":"1.0","uuid":"3e60eaf4ee443f43af421cee7f58850b","base":140733971963904,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ApplePushService.framework/ApplePushService","bundle_id":"com.apple.aps.framework","build_version":"4.0","display_version":"4.0","uuid":"75ffad90f05b35289a6318dbca7c61f1","base":140733987483648,"size":110592}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AuthKit.framework/AuthKit","bundle_id":"com.apple.AuthKit","build_version":"1","display_version":"1.0","uuid":"bdd84fe3bf9c39768848f8280a4aa73f","base":140733993480192,"size":450560}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreTime.framework/CoreTime","bundle_id":"com.apple.CoreTime","build_version":"266","uuid":"35a96d7dcf9a374ab70700aa4d3c8541","base":140734067433472,"size":24576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IntlPreferences.framework/IntlPreferences","bundle_id":"com.apple.IntlPreferences","build_version":"301.5","display_version":"1.0","uuid":"647279c5c6883c9e8886c5a85ba0afa4","base":140734184296448,"size":106496}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication","bundle_id":"com.apple.LocalAuthentication","build_version":"693.62.1","display_version":"1.0","uuid":"cf5af00cf195370f9d2eec680598f6b3","base":140733852680192,"size":77824}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppleIDAuthSupport.framework/AppleIDAuthSupport","bundle_id":"com.apple.AppleIDAuthSupport","build_version":"1","display_version":"1.0","uuid":"178d67e1616f35a799ac03b364c4afbb","base":140733985669120,"size":45056}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/LocalAuthentication.framework/Support/SharedUtils.framework/SharedUtils","bundle_id":"com.apple.CoreAuthentication.SharedUtils","build_version":"693.62.1","display_version":"1.0","uuid":"114012079a003adba9b9f564c73dd1e7","base":140733852864512,"size":28672}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/NanoPreferencesSync.framework/NanoPreferencesSync","bundle_id":"com.apple.NanoPreferencesSync","build_version":"1","display_version":"1.0","uuid":"d160ef600058333886699c47a6cde37d","base":140734220566528,"size":53248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/NanoRegistry.framework/NanoRegistry","bundle_id":"com.apple.private.NanoRegistry","build_version":"1","display_version":"1.0","uuid":"2615ad0d4fbd3cdbb6a23a11b520e588","base":140734220619776,"size":434176}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppConduit.framework/AppConduit","bundle_id":"com.apple.AppConduit","build_version":"1","display_version":"1.0","uuid":"85c0183d05e336b3bd7d033c87a0debe","base":140733982666752,"size":122880}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppleSauce.framework/AppleSauce","bundle_id":"com.apple.applesauce","display_version":"1.0","uuid":"d39fce8626a633f0b9a37104afb9192c","base":140733987614720,"size":143360}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AccountsDaemon.framework/AccountsDaemon","bundle_id":"com.apple.accounts.AccountsDaemon","build_version":"113","display_version":"113","uuid":"a1e6c35935b23f29ba93f1e6bdaf1f98","base":140733972017152,"size":622592}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/GSS.framework/GSS","bundle_id":"com.apple.GSS","build_version":"2.0","display_version":"4.0","uuid":"37554744068d398f93202e2267c70e4c","base":140733824266240,"size":188416}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IDS.framework/IDS","bundle_id":"com.apple.ids","build_version":"1000","display_version":"10.0","uuid":"a7317911cb993ded93037f063aa19cac","base":140734174347264,"size":946176}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/WirelessDiagnostics.framework/WirelessDiagnostics","bundle_id":"com.apple.awd","build_version":"949","display_version":"1.0","uuid":"fb141165955e36dc812da69d9e6e5168","base":140734471442432,"size":278528}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/OAuth.framework/OAuth","bundle_id":"com.apple.OAuth","build_version":"25","display_version":"25","uuid":"16f35b8a89c73c3b99b6692bad8b1abc","base":140734263930880,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libheimdal-asn1.dylib","uuid":"5e489f24cf3633b4afcaf2092839b6c8","base":140734541582336,"size":20480}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Heimdal.framework/Heimdal","bundle_id":"com.apple.Heimdal","build_version":"2.0","display_version":"4.0","uuid":"8b4693bcef563d13ad371144e5d7210c","base":140734155628544,"size":454656}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libresolv.9.dylib","uuid":"856f0f5b8d8e340bba529abb76172ced","base":140734557253632,"size":102400}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CommonAuth.framework/CommonAuth","bundle_id":"com.apple.CommonAuth","build_version":"2.0","display_version":"4.0","uuid":"77deb4505dfd34afb69764c0f9ac38f7","base":140734030213120,"size":32768}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Marco.framework/Marco","bundle_id":"com.apple.marco","build_version":"1000","display_version":"10.0","uuid":"5c6e617d521e3f649eb25a47bfa9e894","base":140734195097600,"size":4096}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IMFoundation.framework/IMFoundation","bundle_id":"com.apple.imfoundation","build_version":"1000","display_version":"10.0","uuid":"f9541685faf03484becbd1c85d62d293","base":140734180548608,"size":315392}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IDSFoundation.framework/IDSFoundation","bundle_id":"com.apple.idsfoundation","build_version":"1000","display_version":"10.0","uuid":"9d6e988f22eb34a09f6cfd7e8ee3593c","base":140734175293440,"size":1187840}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Engram.framework/Engram","bundle_id":"com.apple.Engram","build_version":"1","display_version":"1.0","uuid":"71761922c2203e258e69cf9dcbf809a3","base":140734086537216,"size":81920}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libtidy.A.dylib","uuid":"afad409bcff135babf155db0a1873ed3","base":140734559055872,"size":200704}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth","bundle_id":"com.apple.CoreBluetooth","build_version":"1","display_version":"1.0","uuid":"1a66555691b6351e84c529433d58a8a5","base":140733788635136,"size":221184}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libAWDSupportFramework.dylib","uuid":"a572ab3d785c36d988b8e96ecb6a7ba0","base":140734513299456,"size":978944}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libAWDSupport.dylib","uuid":"c0bc288ff89032e49615f77e052b5a06","base":140734513086464,"size":212992}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libprotobuf-lite.dylib","uuid":"15e6cc7f8e9239e49ab869fbd669cfb6","base":140734556811264,"size":69632}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libprotobuf.dylib","uuid":"2cd6f85a7f0636f5bd5e27c8f097810b","base":140734556880896,"size":372736}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/C2.framework/C2","bundle_id":"com.apple.C2","build_version":"487","display_version":"1.3","uuid":"276d2410bd8d31a99883a8d1696c09da","base":140734000193536,"size":200704}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ProtectedCloudStorage.framework/ProtectedCloudStorage","bundle_id":"com.apple.ProtectedCloudStorage","build_version":"1","display_version":"1.0","uuid":"b1b8fe0d7d98306c9157aaf1683d9e34","base":140734306353152,"size":307200}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/GeoServices.framework/GeoServices","bundle_id":"com.apple.GeoServices","build_version":"1624.32.10.8.8","display_version":"1.0","uuid":"f3846a2522483aaa8ed7e45bfec3e41f","base":140734121893888,"size":15925248}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/LocationSupport.framework/LocationSupport","bundle_id":"com.apple.locationsupport","build_version":"2389.0.8","display_version":"2389.0.8","uuid":"73e7a6fc10493b55a9261f1a302b8616","base":140734188761088,"size":135168}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreLocationProtobuf.framework/CoreLocationProtobuf","uuid":"8f7e1345a7a4387086134d795474f5cb","base":140734047490048,"size":294912}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MobileSpotlightIndex.framework/MobileSpotlightIndex","bundle_id":"com.apple.mobilespotlight.index","build_version":"2075.4","display_version":"10.7.0","uuid":"6879f1f1a59a38f5b4508234e8914f9c","base":140734209744896,"size":2404352}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MetadataUtilities.framework/MetadataUtilities","bundle_id":"com.apple.spotlight.metadata.utilities","build_version":"2075.4","display_version":"1.0","uuid":"039f8af3f5f23892a0952368ff2c953e","base":140734207574016,"size":225280}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreSpotlight.framework/CoreSpotlight","bundle_id":"com.apple.CoreSpotlight","build_version":"2075.4","display_version":"1.0","uuid":"a1347735e0183302b6e0509778a7c1ff","base":140733813334016,"size":401408}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Intents.framework/Intents","bundle_id":"com.apple.Intents","build_version":"1","display_version":"1.0","uuid":"b9aef49000cc387a8b7856a7f115c612","base":140733835354112,"size":4300800}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ProactiveEventTracker.framework/ProactiveEventTracker","bundle_id":"com.apple.proactive.support.ProactiveEventTracker","build_version":"258.4","display_version":"1.0","uuid":"6c2d3f3685103cb1b0b6ceb8630dad6b","base":140734304448512,"size":122880}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ProactiveSupport.framework/ProactiveSupport","bundle_id":"com.apple.proactive.support.ProactiveSupport","build_version":"258.4","display_version":"1.0","uuid":"2b0b9d24e61e3c1cb83a16ebe3fc777b","base":140734305058816,"size":401408}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SearchFoundation.framework/SearchFoundation","bundle_id":"com.apple.SearchFoundation","build_version":"312.3.4","display_version":"1.0","uuid":"284c3d06b6a43652afced0a019d287e8","base":140734324826112,"size":1339392}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/DataDetectorsNaturalLanguage.framework/DataDetectorsNaturalLanguage","bundle_id":"com.apple.DataDetectorsNaturalLanguage","build_version":"154","display_version":"1.0","uuid":"49117180149f35c3ab5f9f62d8c52cc5","base":140734072119296,"size":262144}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IntentsFoundation.framework/IntentsFoundation","bundle_id":"com.apple.IntentsFoundation","build_version":"1","display_version":"1.0","uuid":"74551825c69e3cb8836af227de39e965","base":140734184058880,"size":49152}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/InternationalTextSearch.framework/InternationalTextSearch","bundle_id":"com.apple.InternationalTextSearch","build_version":"1","display_version":"1.0","uuid":"7710ce9dbb8d30c889d119dcb88c73a4","base":140734184284160,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/StreamingZip.framework/StreamingZip","bundle_id":"com.apple.StreamingZip","build_version":"1","display_version":"1.0","uuid":"1726353dcf1638b3b89c7a314af7cae1","base":140734366822400,"size":266240}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/EventKit.framework/EventKit","bundle_id":"com.apple.eventkit","build_version":"1.0","display_version":"1.0.0","uuid":"7493e186e6043f25beab098fdb1f94ba","base":140733817004032,"size":1036288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/ResponseKit.framework/ResponseKit","bundle_id":"com.apple.ResponseKit","build_version":"148","display_version":"1.0","uuid":"e27447853ec032f1a64501f7ad19cfb3","base":140734312648704,"size":1064960}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CalendarDaemon.framework/CalendarDaemon","bundle_id":"com.apple.CalendarDaemon","display_version":"1.0","uuid":"300750d36fb23c088cd9e30178e55f9e","base":140734003417088,"size":348160}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CalendarDatabase.framework/CalendarDatabase","bundle_id":"com.apple.CalendarDatabase","display_version":"1.0","uuid":"d63346182e993c83a316dff8d08d271a","base":140734003765248,"size":610304}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CalendarFoundation.framework/CalendarFoundation","bundle_id":"com.apple.CalendarFoundation","build_version":"1141.2.3","display_version":"8.0","uuid":"5cdd3ffa3207305fb345145c1697c507","base":140734004375552,"size":393216}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/iCalendar.framework/iCalendar","bundle_id":"com.apple.iCalendar","build_version":"811.2.1","display_version":"7.0","uuid":"56ec2e6b49933f54b9f61ed1c318f5db","base":140734480670720,"size":200704}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/PersonaKit.framework/PersonaKit","bundle_id":"com.apple.PersonaKit","build_version":"1","display_version":"1.0","uuid":"85666d53fd6d3fccb1fece8ef35606af","base":140734279036928,"size":49152}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreDAV.framework/CoreDAV","bundle_id":"com.apple.coredav","build_version":"871.3.1","display_version":"1.0.1","uuid":"2d3a1ad97d4c3f5b835c73419b41afde","base":140734039941120,"size":557056}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/NLP.framework/NLP","bundle_id":"com.apple.NLP","build_version":"202","display_version":"1.0","uuid":"8f5eac96f3db39f7b2bc1fb02a7ac98c","base":140734217199616,"size":962560}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Montreal.framework/Montreal","bundle_id":"com.apple.Montreal","build_version":"121","display_version":"1.0","uuid":"4bca6aa65f8b3f1fa1c3fb94a71e2834","base":140734213054464,"size":1445888}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreSymbolication.framework/CoreSymbolication","bundle_id":"com.apple.CoreSymbolication","build_version":"64509.98.1","display_version":"11.0","uuid":"211abfd9e4403769883d7293b9e440b1","base":140734066425856,"size":499712}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/AVFoundation.framework/Frameworks/AVFAudio.framework/AVFAudio","bundle_id":"com.apple.audio.AVFAudio","display_version":"1.0","uuid":"f603821f39c434458455c4226624d4e9","base":140733741260800,"size":888832}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MediaToolbox.framework/MediaToolbox","bundle_id":"com.apple.MediaToolbox","build_version":"2520.9.1.4","display_version":"1.0","uuid":"4aa9bac8e6e5320e851fb003e7686fb5","base":140733859020800,"size":4780032}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Pegasus.framework/Pegasus","bundle_id":"com.apple.Pegasus","build_version":"141","display_version":"1.0","uuid":"085e435e0e4d3679bceaccdbc7195787","base":140734278418432,"size":200704}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/RemoteTextInput.framework/RemoteTextInput","bundle_id":"com.apple.RemoteTextInput","build_version":"1","display_version":"1.0","uuid":"04e3ff32cb53345d8ba8269f1c539ff3","base":140734311841792,"size":65536}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MediaServices.framework/MediaServices","bundle_id":"com.apple.MediaServices","build_version":"1","display_version":"1.0","uuid":"0635025b86f63c0d89b1c50e75fe1d7a","base":140734203518976,"size":225280}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CorePDF.framework/CorePDF","bundle_id":"com.apple.CorePDF","build_version":"518.6","display_version":"5.0","uuid":"5f33da3c69843571bd86a343bfbf1a3a","base":140734052548608,"size":798720}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CorePrediction.framework/CorePrediction","bundle_id":"com.apple.CorePrediction","build_version":"1","display_version":"1.0","uuid":"e0549bf6191033ea9420d73594e8dddf","base":140734054244352,"size":319488}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/PDFKit.framework/PDFKit","bundle_id":"com.apple.PDFKit","build_version":"825.13","display_version":"1.0","uuid":"f94d47800e6533efa55cb48091a9b72e","base":140733904302080,"size":811008}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/SafariSafeBrowsing.framework/SafariSafeBrowsing","bundle_id":"com.apple.Safari.SafeBrowsing","build_version":"14608.4.9.0.5","display_version":"14608","uuid":"5763c8d7ce703378b8d891a9d845d6a7","base":140734320091136,"size":294912}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreOptimization.framework/CoreOptimization","bundle_id":"com.apple.CoreOptimization","build_version":"1","display_version":"1.0","uuid":"beaf6ebe0ebe3e3db732afa3ae70f336","base":140734052528128,"size":20480}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/RevealCore.framework/RevealCore","bundle_id":"com.apple.RevealCore","build_version":"17","display_version":"1.0","uuid":"935e8b1f00ea3299a4f48c3e1fa67818","base":140734313713664,"size":20480}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/NaturalLanguage.framework/NaturalLanguage","bundle_id":"com.apple.NaturalLanguage","build_version":"57","display_version":"1.0","uuid":"3fbee9a370b93798a784880eb200b474","base":140733884129280,"size":217088}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreML.framework/CoreML","bundle_id":"com.apple.CoreML","build_version":"1","display_version":"1.0","uuid":"182bfa72d80f322db8ec06e92b16ec3a","base":140733806796800,"size":2998272}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/Espresso.framework/Espresso","bundle_id":"com.apple.vision.EspressoFramework","build_version":"188.2","display_version":"1.0","uuid":"9fdb9deb4a573083836da4ff84871bbe","base":140734086656000,"size":5656576}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CTCarrierSpace.framework/CTCarrierSpace","bundle_id":"com.apple.coretelephony.CTCarrierSpace","build_version":"1","display_version":"1.0","uuid":"7e6f45efe9d93edc9e2a62bd28a6fbf7","base":140734001373184,"size":61440}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AppStoreDaemon.framework/AppStoreDaemon","bundle_id":"com.apple.AppStoreDaemon","build_version":"1","display_version":"1.0","uuid":"de7927e29100352592b51ac4813235b9","base":140733983371264,"size":446464}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/StoreServices.framework/StoreServices","bundle_id":"com.apple.storeservices","build_version":"1","uuid":"fb0642ea255c34e491556013bdf1072c","base":140734364233728,"size":1912832}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libusrtcp.dylib","uuid":"cd163bbef8c4339c81f769ae39f090b2","base":140734559256576,"size":364544}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libboringssl.dylib","uuid":"0c7ac9e5eaec3aaa915d82df7f00604c","base":140734536691712,"size":802816}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libobjc-trampolines.dylib","uuid":"ff03d0d943aa32f2b9ed98f2f1e9fa76","base":4551426048,"size":16384}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libMobileGestaltExtensions.dylib","uuid":"50d0e0dd559d3d9fbade75707dc3dfc7","base":140734534066176,"size":40960}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/CoreServicesInternal.framework/CoreServicesInternal","bundle_id":"com.apple.CoreServicesInternal","build_version":"446.5","display_version":"446.5","uuid":"1df93307bcd03c5a8c987da5790a780c","base":140734061412352,"size":176128}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/log/liblog_network.dylib","uuid":"05712dd918dd3883954592a33e74e4a1","base":140734560899072,"size":12288}}
+{"load":{"path":"/Applications/Xcode_11_3.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Libraries/libCGInterfaces.dylib","uuid":"38437f3648723c2dbaf9d32bd9d706a0","base":140733743038464,"size":94208}}

+ 3 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/errors_a.clsrecord

@@ -0,0 +1,3 @@
+{"error":{"domain":"43726173686C79746963735F4170702E437573746F6D53776966744572726F7231","code":0,"time":1579796960,"stacktrace":[4305958120,4305971884,4305597712,4305600396,4305367168,4305599948,4305597064,4305388400,4305388516,7019809992,7090961912,7084730348,7084731232,7084725912,7091202336,7091207708,7091059116,7091559928,7091569584,7091541300,7022330120,7022329948,7022327752,7022306964,7022305088,7192687924,7090956896,4305579428,7020727832]}}
+{"error":{"domain":"43726173686C79746963735F4170702E437573746F6D53776966744572726F7232","code":1,"time":1579796961,"stacktrace":[4305958120,4305971884,4305597712,4305600396,4305367168,4305599948,4305597064,4305388400,4305388516,7019809992,7090961912,7084730348,7084731232,7084725912,7091202336,7091207708,7091059116,7091559928,7091569584,7091541300,7022330120,7022329948,7022327752,7022306964,7022305088,7192687924,7090956896,4305579428,7020727832]}}
+{"error":{"domain":"43726173686C79746963735F4170702E437573746F6D53776966744572726F7233","code":2,"time":1579796961,"stacktrace":[4305958120,4305971884,4305597712,4305600396,4305367168,4305599948,4305597064,4305388400,4305388516,7019809992,7090961912,7084730348,7084731232,7084725912,7091202336,7091207708,7091059116,7091559928,7091569584,7091541300,7022330120,7022329948,7022327752,7022306964,7022305088,7192687924,7090956896,4305579428,7020727832]}}

+ 1 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/errors_b.clsrecord

@@ -0,0 +1 @@
+{"error":{"domain":"43726173686C79746963735F4170702E437573746F6D53776966744572726F7234","code":4,"time":1579796966,"stacktrace":[4305958121,4305971884,4305597712,4305600396,4305367168,4305599948,4305597064,4305388400,4305388516,7019809992,7090961912,7084730348,7084731232,7084725912,7091202336,7091207708,7091059116,7091559928,7091569584,7091541300,7022330120,7022329948,7022327752,7022306964,7022305088,7192687924,7090956896,4305579428,7020727833]}}

文件差異過大導致無法顯示
+ 1 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/exception.clsrecord


+ 12 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/internal_incremental_kv.clsrecord

@@ -0,0 +1,12 @@
+{"kv":{"key":"636f6d2e63726173686c79746963732e696e2d6261636b67726f756e64","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e75692d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6b69742d73746172742d74696d65","value":"352e3539373233"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e757365722d6964","value":"61736461736964617369646a617369"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e696e2d6261636b67726f756e64","value":"30"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e66697273742d72756e2d6c6f6f702d74696d65","value":"33372e393534353338"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}
+{"kv":{"key":"636f6d2e63726173686c79746963732e6465766963652d6f7269656e746174696f6e","value":"31"}}

+ 6 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/log_a.clsrecord

@@ -0,0 +1,6 @@
+{"log":{"msg":"41206c6f67","time":1581375414063}}
+{"log":{"msg":"41206c6f67","time":1581375414063}}
+{"log":{"msg":"41206c6f67","time":1581375414063}}
+{"log":{"msg":"41206c6f67","time":1581375414063}}
+{"log":{"msg":"613a20414141412c20423a204242424242","time":1581375414064}}
+{"log":{"msg":"2441243a7b226e616d65223a224556454e54222c22706172616d6574657273223a7b227072696365223a3130302c225f6f223a22617070227d7d","time":1581375414079}}

文件差異過大導致無法顯示
+ 1 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/mach_exception.clsrecord


+ 4 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/metadata.clsrecord

@@ -0,0 +1,4 @@
+{"identity":{"generator":"Crashlytics iOS SDK/4.0.0-beta.4","display_version":"4.0.0-beta.4","build_version":"4.0.0-beta.4","started_at":1581375414,"session_id":"af86acaaad2f41f8b660b3c17a41c6e8","install_id":"CB880F1A-3D91-4794-8C5C-50245CBDD5DE","beta_token":null,"absolute_log_timestamps":true}}
+{"host":{"model":"iOS Simulator (iPhone)","machine":"x86_64","cpu":"Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz","os_build_version":"19C57","os_display_version":"13.3.0","platform":"ios","locale":"en_US"}}
+{"application":{"bundle_id":"com.crashlytics.release-test-4-0-0-beta-1","custom_bundle_id":null,"build_version":"3","display_version":"1.4","extension_id":null}}
+{"executable":{"architecture":"x86_64","uuid":"d5e7ada9003c32b1aaf11e8a3362c29f","base":4517593088,"size":1470464,"encrypted":false,"minimum_sdk_version":"0.0.0","built_sdk_version":"0.0.0"}}

+ 343 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/sdk.log

@@ -0,0 +1,343 @@
+WARN  [FIRCLSMachExceptionRegister:312] original 0x0 0x4e 0x0 0x0
+WARN  [FIRCLSMachExceptionRegister:312] original 0x6303 0x1000 0x80000003 0x7
+WARN  [FIRCLSMachExceptionReadMessage:203] Accepted mach exception message
+WARN  [FIRCLSMachExceptionDispatchMessage:212] Mach exception: 0x1, count: 2, code: 0x%llx 0x%llx
+WARN  [FIRCLSMachExceptionDispatchMessage:221] Unregistering handler
+WARN  [FIRCLSMachExceptionDispatchMessage:227] Restoring original signal handlers
+WARN  [FIRCLSMachExceptionDispatchMessage:233] Recording mach exception
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 0 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5141100a at 0x7fff513f6000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 708)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 40019d8
+INFO  [FIRCLSCompactUnwindDwarfFrame:384] Trying to read dwarf data with offset %lx
+WARN  [FIRCLSDwarfInstructionsEnumerate:597] Running instructions from 0x7fff5141fc51 to 0x7fff5141fc58
+WARN  [FIRCLSDwarfParseAndExecute_def_cfa:341] DW_CFA_def_cfa %llu, %lld
+WARN  [FIRCLSDwarfParseAndExecute_offset:490] DW_CFA_offset 16, %lld
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:597] Running instructions from 0x7fff51421631 to 0x7fff51421638
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfInstructionsEnumerate:609] DW_CFA_nop
+WARN  [FIRCLSDwarfGetSavedRegister:817] Getting register 1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23baa37e at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1010001
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff514110d5 at 0x7fff513f6000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 708)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff47a6c4c7 at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 59344)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff47a6b2b6 at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 59344)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff480cebbe at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 133072)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff480d04c5 at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 133072)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff480ab53a at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 133072)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff4812c719 at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 137168)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 510558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff4812f1df at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 137168)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 510558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bd4470 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bd439b at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1030161
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bd3b73 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bce87e at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bce065 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff384c0baf at 0x7fff384bd000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 88)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1020021
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff48092d4c at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 133072)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d452d73 at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5227ec24 at 0x7fff5227e000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 80)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+WARN  [FIRCLSCompactUnwindGetTargetAddress:91] Error: PC is invalid
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:240] Unable to find PC in second level
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff5227ec24
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 1 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b6259 at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff523b6259
+INFO  [FIRCLSUnwindWithFramePointer:128] Attempting stack scan
+DEBUG [FIRCLSUnwindFirstExecutableAddress:297] Checking address 0x70000f26de38 => 0x7fff523b65d0
+DEBUG [FIRCLSUnwindFirstExecutableAddress:306] Checking for executable 0x7fff523b65d0
+INFO  [FIRCLSUnwindWithFramePointer:130] Stack scan successful
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b65cf at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bd3cf4 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bcea16 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bce065 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff2576b86e at 0x7fff256b8000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 13996)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff2576bae1 at 0x7fff256b8000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 13996)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff48135027 at 0x7fff475db000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 137168)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff257817a6 at 0x7fff256b8000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 13996)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 510558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff52466e64 at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1010001
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5246283a at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff5246283a
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 2 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b792d at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff523b792d
+INFO  [FIRCLSUnwindWithFramePointer:128] Attempting stack scan
+DEBUG [FIRCLSUnwindFirstExecutableAddress:297] Checking address 0x70000f2f1fa8 => 0x7fff52463760
+DEBUG [FIRCLSUnwindFirstExecutableAddress:306] Checking for executable 0x7fff52463760
+INFO  [FIRCLSUnwindWithFramePointer:130] Stack scan successful
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5246375f at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1040b11
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff52462826 at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff52462826
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 3 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b792d at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff523b792d
+INFO  [FIRCLSUnwindWithFramePointer:128] Attempting stack scan
+DEBUG [FIRCLSUnwindFirstExecutableAddress:297] Checking address 0x70000f3f7b18 => 0x7fff52463760
+DEBUG [FIRCLSUnwindFirstExecutableAddress:306] Checking for executable 0x7fff52463760
+INFO  [FIRCLSUnwindWithFramePointer:130] Stack scan successful
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5246375f at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1040b11
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff52462826 at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff52462826
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 4 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b792d at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff523b792d
+INFO  [FIRCLSUnwindWithFramePointer:128] Attempting stack scan
+DEBUG [FIRCLSUnwindFirstExecutableAddress:297] Checking address 0x70000f603b18 => 0x7fff52463760
+DEBUG [FIRCLSUnwindFirstExecutableAddress:306] Checking for executable 0x7fff52463760
+INFO  [FIRCLSUnwindWithFramePointer:130] Stack scan successful
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5246375f at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1040b11
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff52462826 at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff52462826
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 5 data
+WARN  [FIRCLSProcessGetThreadState:185] Faking current thread
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d4919b0 at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d490e4f at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d490c29 at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d47fe0e at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d4847cb at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d484443 at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x10d48411d at 0x10d450000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 1164)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1000000
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff52466e64 at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1010001
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5246283a at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff5246283a
+INFO  [FIRCLSProcessRecordAllThreads:486] recording thread 6 data
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b6259 at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff523b6259
+INFO  [FIRCLSUnwindWithFramePointer:128] Attempting stack scan
+DEBUG [FIRCLSUnwindFirstExecutableAddress:297] Checking address 0x70000f687e18 => 0x7fff523b65d0
+DEBUG [FIRCLSUnwindFirstExecutableAddress:306] Checking for executable 0x7fff523b65d0
+INFO  [FIRCLSUnwindWithFramePointer:130] Stack scan successful
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff523b65cf at 0x7fff523b5000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 96)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bd3cf4 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 10558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bcea16 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff23bce065 at 0x7fff23b34000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 11644)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff22f985da at 0x7fff22d91000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 41900)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 610558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff257817a6 at 0x7fff256b8000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 13996)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 510558d1
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff52466e64 at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+DEBUG [FIRCLSCompactUnwindComputeRegisters:43] Computing registers for encoding 1010001
+DEBUG [FIRCLSUnwindWithCompactUnwindInfo:239] Binary image for 0x7fff5246283a at 0x7fff52461000
+DEBUG [FIRCLSCompactUnwindLookup:330] Found first level (second => 84)
+INFO  [FIRCLSCompactUnwindLookupSecondLevel:303] Found a second level compressed header
+INFO  [FIRCLSCompactUnwindLookupSecondLevelCompressed:285] Entry has has no unwind info
+INFO  [FIRCLSCompactUnwindLookup:335] Second-level PC lookup failed
+INFO  [FIRCLSCompactUnwindLookupAndCompute:361] Unable to lookup compact unwind for pc 0x7fff5246283a
+INFO  [FIRCLSProcessRecordAllThreads:496] completed recording all thread data
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:789] attempting to read crash info string
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+DEBUG [FIRCLSProcessRecordCrashInfo:772] Found crash info with version 5
+WARN  [FIRCLSCreateCrashedMarkerFile:30] Created the crashed marker file
+WARN  [FIRCLSMachExceptionReply:259] Sending exception reply
+WARN  [FIRCLSMachExceptionReply:269] 

文件差異過大導致無法顯示
+ 1 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/signal.clsrecord


+ 1 - 0
Crashlytics/UnitTests/Data/ios_all_files_crash/user_incremental_kv.clsrecord

@@ -0,0 +1 @@
+{"kv":{"key":"445341444153445341","value":"414453415344444153"}}

+ 4 - 0
Crashlytics/UnitTests/Data/valid_metadata/metadata.clsrecord

@@ -0,0 +1,4 @@
+{"identity":{"generator":"Crashlytics iOS SDK/4.0.0-beta.1","display_version":"4.0.0-beta.1","build_version":"4.0.0-beta.1","started_at":1579796954,"session_id":"f6cdb3f99e6f4c20a4d68a08c35e7b36","install_id":"169DB25B-8F1D-4115-8364-3887DA9DE73C","beta_token":null,"absolute_log_timestamps":true}}
+{"host":{"model":"iPhone11,8","machine":"N841AP","os_build_version":"17C54","os_display_version":"13.3.0","platform":"ios","locale":"en_US"}}
+{"application":{"bundle_id":"com.google.crashlytics.app.ios-host","custom_bundle_id":null,"build_version":"1","display_version":"1.0","extension_id":null}}
+{"executable":{"architecture":"arm64","uuid":"0341c4166f253830a94a5698cee7fea7","base":4305256448,"size":1392640,"encrypted":false,"minimum_sdk_version":"9.0.0","built_sdk_version":"13.2.0"}}

+ 1 - 1
Crashlytics/UnitTests/FIRCLSFileManagerTests.m

@@ -65,7 +65,7 @@
 
   XCTAssertTrue([self doesFileExist:path], @"");
 
-  path = [path stringByAppendingPathComponent:@"v4/reports"];
+  path = [path stringByAppendingPathComponent:@"v5/reports"];
   XCTAssertTrue([self doesFileExist:path], @"");
 
   for (NSString* subpath in @[ @"active", @"prepared", @"processing" ]) {

+ 202 - 0
Crashlytics/UnitTests/FIRCLSReportAdapterTests.m

@@ -0,0 +1,202 @@
+// Copyright 2020 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <Foundation/Foundation.h>
+#import <XCTest/XCTest.h>
+
+#import "FIRCLSRecordApplication.h"
+#import "FIRCLSRecordHost.h"
+#import "FIRCLSRecordIdentity.h"
+#import "FIRCLSReportAdapter.h"
+#import "FIRCLSReportAdapter_Private.h"
+
+#import "FIRCLSFile.h"
+
+#import <GoogleDataTransport/GDTCOREvent.h>
+#import <GoogleDataTransport/GDTCORTargets.h>
+#import <GoogleDataTransport/GDTCORTransport.h>
+
+@interface FIRCLSReportAdapterTests : XCTestCase
+
+@end
+
+@implementation FIRCLSReportAdapterTests
+
+/// Attempt sending a proto report to the reporting endpoint
+- (void)testSendProtoReport {
+  NSString *minCrash =
+      [[FIRCLSReportAdapterTests resourcePath] stringByAppendingPathComponent:@"bare_min_crash"];
+
+  FIRCLSReportAdapter *adapter =
+      [[FIRCLSReportAdapter alloc] initWithPath:minCrash
+                                    googleAppId:@"1:17586535263:ios:83778f4dc7e8a26ef794ea"
+                                          orgId:@"5bec84f69ea6961d03000dc5"];
+
+  GDTCORTransport *transport = [[GDTCORTransport alloc] initWithMappingID:@"1206"
+                                                             transformers:nil
+                                                                   target:kGDTCORTargetCSH];
+  GDTCOREvent *event = [transport eventForTransport];
+  event.dataObject = adapter;
+  event.qosTier = GDTCOREventQoSFast;  // Bypass batching and have the event get sent out ASAP
+  [transport sendDataEvent:event];
+}
+
+/// This test is useful for testing the binary output of the proto message
+- (void)testProtoOutput {
+  NSString *minCrash =
+      [[FIRCLSReportAdapterTests resourcePath] stringByAppendingPathComponent:@"bare_min_crash"];
+
+  FIRCLSReportAdapter *adapter =
+      [[FIRCLSReportAdapter alloc] initWithPath:minCrash
+                                    googleAppId:@"1:17586535263:ios:83778f4dc7e8a26ef794ea"
+                                          orgId:@"5bec84f69ea6961d03000dc5"];
+
+  NSData *data = adapter.transportBytes;
+
+  NSError *error = nil;
+  NSString *outputPath =
+      [[FIRCLSReportAdapterTests resourcePath] stringByAppendingPathComponent:@"output.proto"];
+
+  [data writeToFile:outputPath options:NSDataWritingAtomic error:&error];
+  NSLog(@"Output path: %@", outputPath);
+  if (error) {
+    NSLog(@"Write returned error: %@", [error localizedDescription]);
+  }
+
+  // Put a breakpoint here to copy the file from the output path.
+}
+
+/// It is important that a crash does not occur when reading persisted crash files
+/// Verify various invalid input cases.
+- (void)testInvalidRecordCases {
+  id adapter __unused = [[FIRCLSReportAdapter alloc] initWithPath:@"nonExistentPath"
+                                                      googleAppId:@"appID"
+                                                            orgId:@"orgID"];
+
+  id application __unused = [[FIRCLSRecordApplication alloc] initWithDict:nil];
+  id host __unused = [[FIRCLSRecordHost alloc] initWithDict:nil];
+  id identity __unused = [[FIRCLSRecordIdentity alloc] initWithDict:nil];
+
+  NSDictionary *emptyDict = [[NSDictionary alloc] init];
+  id application2 __unused = [[FIRCLSRecordApplication alloc] initWithDict:emptyDict];
+  id host2 __unused = [[FIRCLSRecordHost alloc] initWithDict:emptyDict];
+  id identity2 __unused = [[FIRCLSRecordIdentity alloc] initWithDict:emptyDict];
+}
+
+- (void)testCorruptMetadataCLSRecordFile {
+  id adapter __unused = [FIRCLSReportAdapterTests adapterForCorruptMetadata];
+}
+
+- (void)testRecordMetadataFile {
+  FIRCLSReportAdapter *adapter = [FIRCLSReportAdapterTests adapterForValidMetadata];
+
+  // Verify identity
+  XCTAssertTrue([adapter.identity.build_version isEqualToString:@"4.0.0-beta.1"]);
+  XCTAssertTrue(
+      [adapter.identity.install_id isEqualToString:@"169DB25B-8F1D-4115-8364-3887DA9DE73C"]);
+
+  // Verify host
+  XCTAssertTrue([adapter.host.platform isEqualToString:@"ios"]);
+
+  // Verify application
+  XCTAssertTrue([adapter.application.build_version isEqualToString:@"1"]);
+  XCTAssertTrue([adapter.application.display_version isEqualToString:@"1.0"]);
+}
+
+- (void)testReportProto {
+  FIRCLSReportAdapter *adapter = [FIRCLSReportAdapterTests adapterForAllCrashes];
+  google_crashlytics_Report report = [adapter protoReport];
+  XCTAssertTrue([self isPBData:report.sdk_version equalToString:adapter.identity.build_version]);
+  XCTAssertTrue([self isPBData:report.gmp_app_id equalToString:@"appID"]);
+  XCTAssertEqual(report.platform, google_crashlytics_Platforms_IOS);
+  XCTAssertTrue([self isPBData:report.installation_uuid equalToString:adapter.identity.install_id]);
+  XCTAssertTrue([self isPBData:report.display_version
+                 equalToString:adapter.application.display_version]);
+
+  // Files payload
+  XCTAssertTrue([self isPBData:report.apple_payload.org_id equalToString:@"orgID"]);
+  XCTAssertEqual(report.apple_payload.files_count, 10);
+
+  NSArray<NSString *> *clsRecords = adapter.clsRecordFilePaths;
+  for (NSUInteger i = 0; i < clsRecords.count; i++) {
+    XCTAssertTrue([self isPBData:report.apple_payload.files[i].filename
+                   equalToString:clsRecords[i].lastPathComponent]);
+    NSData *data = [NSData dataWithContentsOfFile:clsRecords[i] options:0 error:nil];
+    XCTAssertTrue([self isPBData:report.apple_payload.files[i].contents equalToData:data]);
+  }
+}
+
+// Helper functions
+#pragma mark - Helper Functions
+
++ (FIRCLSReportAdapter *)adapterForAllCrashes {
+  return [[FIRCLSReportAdapter alloc]
+      initWithPath:[[FIRCLSReportAdapterTests resourcePath]
+                       stringByAppendingPathComponent:@"ios_all_files_crash"]
+       googleAppId:@"appID"
+             orgId:@"orgID"];
+}
+
++ (FIRCLSReportAdapter *)adapterForCorruptMetadata {
+  return [[FIRCLSReportAdapter alloc]
+      initWithPath:[[FIRCLSReportAdapterTests resourcePath]
+                       stringByAppendingPathComponent:@"corrupt_metadata"]
+       googleAppId:@"appID"
+             orgId:@"orgID"];
+}
+
++ (FIRCLSReportAdapter *)adapterForValidMetadata {
+  return [[FIRCLSReportAdapter alloc]
+      initWithPath:[[FIRCLSReportAdapterTests resourcePath]
+                       stringByAppendingPathComponent:@"valid_metadata"]
+       googleAppId:@"appID"
+             orgId:@"orgID"];
+}
+
++ (NSString *)resourcePath {
+  return [[NSBundle bundleForClass:[self class]] resourcePath];
+}
+
+#pragma mark - Assertion Helpers for NanoPB Types
+
+- (BOOL)isPBData:(pb_bytes_array_t *)pbString equalToString:(NSString *)str {
+  pb_bytes_array_t *expected = FIRCLSEncodeString(str);
+  return [self isPBArray:pbString equalToArray:expected];
+}
+
+- (BOOL)isPBData:(pb_bytes_array_t *)pbString equalToData:(NSData *)data {
+  pb_bytes_array_t *expected = FIRCLSEncodeData(data);
+  return [self isPBArray:pbString equalToArray:expected];
+}
+
+- (BOOL)isPBArray:(pb_bytes_array_t *)array equalToArray:(pb_bytes_array_t *)expected {
+  // Treat the empty string as the same as a missing field
+  if ((!array) && expected->size == 0) {
+    return true;
+  }
+
+  if (array->size != expected->size) {
+    return false;
+  }
+
+  for (int i = 0; i < array->size; i++) {
+    if (expected->bytes[i] != array->bytes[i]) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+@end

+ 14 - 11
Crashlytics/UnitTests/FIRCLSReportManagerTests.m

@@ -35,6 +35,7 @@
 #import "FIRCLSMockFileManager.h"
 #import "FIRCLSMockReportManager.h"
 #import "FIRCLSMockReportUploader.h"
+#import "FIRMockGDTCoreTransport.h"
 #import "FIRMockInstallations.h"
 
 #define TEST_API_KEY (@"DB5C8FA65C0D43419120FB96CFDBDE0C")
@@ -73,15 +74,16 @@
 
   FIRMockInstallations *iid = [[FIRMockInstallations alloc] initWithFID:@"test_token"];
 
-  FABMockApplicationIdentifierModel *appIDModel = [[FABMockApplicationIdentifierModel alloc] init];
-  appIDModel.bundleID = TEST_BUNDLE_ID;
+  FIRMockGDTCORTransport *transport = [[FIRMockGDTCORTransport alloc] initWithMappingID:@"id"
+                                                                           transformers:nil
+                                                                                 target:0];
 
   self.reportManager = [[FIRCLSMockReportManager alloc] initWithFileManager:self.fileManager
                                                               installations:iid
                                                                   analytics:nil
                                                                 googleAppID:TEST_GOOGLE_APP_ID
                                                                 dataArbiter:self.dataArbiter
-                                                                 appIDModel:appIDModel];
+                                                            googleTransport:transport];
   self.reportManager.bundleIdentifier = TEST_BUNDLE_ID;
 }
 
@@ -108,8 +110,9 @@
 }
 
 - (NSArray *)contentsOfPreparedPath {
-  return [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.fileManager.preparedPath
-                                                             error:nil];
+  return
+      [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.fileManager.legacyPreparedPath
+                                                          error:nil];
 }
 
 - (NSArray *)contentsOfProcessingPath {
@@ -480,8 +483,8 @@
 
 - (void)testFilesLeftInPrepared {
   // Drop a phony multipart-mime file in here, with non-zero contents.
-  XCTAssert([_fileManager createDirectoryAtPath:_fileManager.preparedPath]);
-  NSString *path = [_fileManager.preparedPath stringByAppendingPathComponent:@"phony-report"];
+  XCTAssert([_fileManager createDirectoryAtPath:_fileManager.legacyPreparedPath]);
+  NSString *path = [_fileManager.legacyPreparedPath stringByAppendingPathComponent:@"phony-report"];
   path = [path stringByAppendingPathExtension:@".multipart-mime"];
 
   XCTAssertTrue([[_fileManager underlyingFileManager]
@@ -501,8 +504,8 @@
 
 - (void)testFilesLeftInPreparedWithDataCollectionDisabled {
   // drop a phony multipart-mime file in here, with non-zero contents
-  XCTAssert([_fileManager createDirectoryAtPath:_fileManager.preparedPath]);
-  NSString *path = [_fileManager.preparedPath stringByAppendingPathComponent:@"phony-report"];
+  XCTAssert([_fileManager createDirectoryAtPath:_fileManager.legacyPreparedPath]);
+  NSString *path = [_fileManager.legacyPreparedPath stringByAppendingPathComponent:@"phony-report"];
   path = [path stringByAppendingPathExtension:@".multipart-mime"];
 
   XCTAssertTrue([[_fileManager underlyingFileManager]
@@ -529,8 +532,8 @@
 
 - (void)testSuccessfulSubmission {
   // drop a phony multipart-mime file in here, with non-zero contents
-  XCTAssert([_fileManager createDirectoryAtPath:_fileManager.preparedPath]);
-  NSString *path = [_fileManager.preparedPath stringByAppendingPathComponent:@"phony-report"];
+  XCTAssert([_fileManager createDirectoryAtPath:_fileManager.legacyPreparedPath]);
+  NSString *path = [_fileManager.legacyPreparedPath stringByAppendingPathComponent:@"phony-report"];
   path = [path stringByAppendingPathExtension:@".multipart-mime"];
 
   XCTAssertTrue([[_fileManager underlyingFileManager]

+ 177 - 18
Crashlytics/UnitTests/FIRCLSReportUploaderTests.m

@@ -19,10 +19,15 @@
 #import "FABMockApplicationIdentifierModel.h"
 #import "FIRCLSApplication.h"
 #include "FIRCLSConstants.h"
+#include "FIRCLSDataCollectionToken.h"
 #include "FIRCLSDefines.h"
 #include "FIRCLSFileManager.h"
+#include "FIRCLSInternalReport.h"
+#include "FIRCLSMockFileManager.h"
+#include "FIRCLSMockNetworkClient.h"
 #include "FIRCLSMockSettings.h"
 #include "FIRCLSSettings.h"
+#include "FIRMockGDTCoreTransport.h"
 
 NSString *const TestEndpoint = @"https://reports.crashlytics.com";
 
@@ -30,9 +35,13 @@ NSString *const TestEndpoint = @"https://reports.crashlytics.com";
     : XCTestCase <FIRCLSReportUploaderDelegate, FIRCLSReportUploaderDataSource>
 
 @property(nonatomic, strong) FIRCLSReportUploader *uploader;
-@property(nonatomic, strong) FIRCLSFileManager *fileManager;
+@property(nonatomic, strong) FIRCLSMockFileManager *fileManager;
 @property(nonatomic, strong) NSOperationQueue *queue;
-@property(nonatomic, strong) NSURL *url;
+@property(nonatomic, strong) FIRCLSMockNetworkClient *networkClient;
+
+// Add mock prefix to names as there are naming conflicts with FIRCLSReportUploaderDelegate
+@property(nonatomic, strong) FIRMockGDTCORTransport *mockDataTransport;
+@property(nonatomic, strong) FIRCLSMockSettings *mockSettings;
 
 @end
 
@@ -41,21 +50,24 @@ NSString *const TestEndpoint = @"https://reports.crashlytics.com";
 - (void)setUp {
   [super setUp];
 
+  FABMockApplicationIdentifierModel *appIDModel = [[FABMockApplicationIdentifierModel alloc] init];
   self.queue = [NSOperationQueue new];
-
-  self.fileManager = [[FIRCLSFileManager alloc] init];
+  self.mockSettings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
+                                                           appIDModel:appIDModel];
+  self.mockSettings.fetchedBundleID = self.bundleIdentifier;
+  self.networkClient = [[FIRCLSMockNetworkClient alloc] initWithQueue:self.queue
+                                                          fileManager:self.fileManager
+                                                             delegate:nil];
+  self.fileManager = [[FIRCLSMockFileManager alloc] init];
   self.uploader = [[FIRCLSReportUploader alloc] initWithQueue:self.queue
                                                      delegate:self
                                                    dataSource:self
-                                                       client:nil
-                                                  fileManager:nil
+                                                       client:self.networkClient
+                                                  fileManager:self.fileManager
                                                     analytics:nil];
-
-  // glue together a string that will work for both platforms
-  NSString *urlString =
-      [NSString stringWithFormat:@"%@/sdk-api/v1/platforms/%@/apps/%@/reports", TestEndpoint,
-                                 FIRCLSApplicationGetPlatform(), self.bundleIdentifier];
-  self.url = [NSURL URLWithString:urlString];
+  self.mockDataTransport = [[FIRMockGDTCORTransport alloc] initWithMappingID:@"mappingID"
+                                                                transformers:nil
+                                                                      target:1206];
 }
 
 - (void)tearDown {
@@ -64,8 +76,153 @@ NSString *const TestEndpoint = @"https://reports.crashlytics.com";
   [super tearDown];
 }
 
+#pragma mark - Tests
+
 - (void)testURLGeneration {
-  XCTAssertEqualObjects([self.uploader reportURL], _url);
+  NSString *urlString =
+      [NSString stringWithFormat:@"%@/sdk-api/v1/platforms/%@/apps/%@/reports", TestEndpoint,
+                                 FIRCLSApplicationGetPlatform(), self.bundleIdentifier];
+  NSURL *url = [NSURL URLWithString:urlString];
+
+  XCTAssertEqualObjects([self.uploader reportURL], url);
+}
+
+- (void)testPrepareReport {
+  NSString *path = [self.fileManager.activePath stringByAppendingPathComponent:@"pkg_uuid"];
+  FIRCLSInternalReport *report = [[FIRCLSInternalReport alloc] initWithPath:path];
+  self.mockSettings.orgID = @"orgID";
+  self.mockSettings.shouldUseNewReportEndpoint = YES;
+  self.fileManager.moveItemAtPathResult = [NSNumber numberWithInt:1];
+
+  [self.uploader prepareAndSubmitReport:report
+                    dataCollectionToken:FIRCLSDataCollectionToken.validToken
+                               asUrgent:YES
+                         withProcessing:YES];
+
+  // Verify with the last move operation is from processing -> prepared
+  XCTAssertTrue(
+      [self.fileManager.moveItemAtPath_destDir containsString:self.fileManager.preparedPath]);
+}
+
+- (void)testPrepareLegacyReport {
+  NSString *path = [self.fileManager.activePath stringByAppendingPathComponent:@"pkg_uuid"];
+  FIRCLSInternalReport *report = [[FIRCLSInternalReport alloc] initWithPath:path];
+  self.mockSettings.orgID = @"orgID";
+  self.mockSettings.shouldUseNewReportEndpoint = NO;
+  self.fileManager.moveItemAtPathResult = [NSNumber numberWithInt:1];
+
+  [self.uploader prepareAndSubmitReport:report
+                    dataCollectionToken:FIRCLSDataCollectionToken.validToken
+                               asUrgent:YES
+                         withProcessing:YES];
+
+  // Verify with the last move operation is from active -> processing for the legacy workflow
+  // FIRCLSPackageReportOperation will then move the report from processing -> prepared-legacy
+  XCTAssertTrue(
+      [self.fileManager.moveItemAtPath_destDir containsString:self.fileManager.processingPath]);
+}
+
+- (void)testUploadPackagedReportWithPath {
+  [self runUploadPackagedReportWithUrgency:NO];
+}
+
+- (void)testUploadPackagedReportWithLegacyPath {
+  [self runUploadPackagedReportLegacyWithUrgency:NO];
+}
+
+- (void)testUrgentUploadPackagedReportWithPath {
+  [self runUploadPackagedReportWithUrgency:YES];
+}
+
+- (void)testUrgentUploadPackagedReportWithLegacyPath {
+  [self runUploadPackagedReportLegacyWithUrgency:YES];
+}
+
+- (void)testUploadPackagedReportWithMismatchPathAndSettings {
+  [self setUpForLegacyUpload];
+
+  BOOL success = [self.uploader uploadPackagedReportAtPath:[self packagePath]
+                                       dataCollectionToken:FIRCLSDataCollectionToken.validToken
+                                                  asUrgent:NO];
+  XCTAssertFalse(success);
+  XCTAssertNil(self.mockDataTransport.sendDataEvent_event);
+  XCTAssertNil(self.networkClient.startUploadRequest);
+}
+
+- (void)testUploadPackagedReportWithoutDataCollectionToken {
+  [self setUpForUpload];
+
+  BOOL success = [self.uploader uploadPackagedReportAtPath:[self packagePath]
+                                       dataCollectionToken:nil
+                                                  asUrgent:NO];
+  XCTAssertFalse(success);
+  XCTAssertNil(self.mockDataTransport.sendDataEvent_event);
+  XCTAssertNil(self.networkClient.startUploadRequest);
+}
+
+- (void)testUploadPackagedReportNotGDTWritten {
+  [self setUpForUpload];
+  self.mockDataTransport.sendDataEvent_wasWritten = NO;
+
+  [self.uploader uploadPackagedReportAtPath:[self packagePath] dataCollectionToken:nil asUrgent:NO];
+
+  // Did not delete report
+  XCTAssertNil(self.fileManager.removedItemAtPath_path);
+}
+
+- (void)testUploadPackagedReportGDTError {
+  [self setUpForUpload];
+  self.mockDataTransport.sendDataEvent_error = [[NSError alloc] initWithDomain:@"domain"
+                                                                          code:1
+                                                                      userInfo:nil];
+
+  [self.uploader uploadPackagedReportAtPath:[self packagePath] dataCollectionToken:nil asUrgent:NO];
+
+  // Did not delete report
+  XCTAssertNil(self.fileManager.removedItemAtPath_path);
+}
+
+#pragma mark - Helper functions
+
+- (NSString *)packagePath {
+  return [self.fileManager.preparedPath stringByAppendingPathComponent:@"pkg_uuid"];
+}
+
+- (void)runUploadPackagedReportWithUrgency:(BOOL)urgent {
+  [self setUpForUpload];
+
+  BOOL success = [self.uploader uploadPackagedReportAtPath:[self packagePath]
+                                       dataCollectionToken:FIRCLSDataCollectionToken.validToken
+                                                  asUrgent:urgent];
+  XCTAssertTrue(success);
+  XCTAssertNotNil(self.mockDataTransport.sendDataEvent_event);
+  XCTAssertNil(self.networkClient.startUploadRequest);
+  XCTAssertEqualObjects(self.fileManager.removedItemAtPath_path, [self packagePath]);
+}
+
+- (void)runUploadPackagedReportLegacyWithUrgency:(BOOL)urgent {
+  NSString *packagePath =
+      [self.fileManager.legacyPreparedPath stringByAppendingPathComponent:@"pkg_uuid"];
+
+  [self setUpForLegacyUpload];
+
+  BOOL success = [self.uploader uploadPackagedReportAtPath:packagePath
+                                       dataCollectionToken:FIRCLSDataCollectionToken.validToken
+                                                  asUrgent:urgent];
+  XCTAssertTrue(success);
+  XCTAssertNil(self.mockDataTransport.sendDataEvent_event);
+  XCTAssertNotNil(self.networkClient.startUploadRequest);
+}
+
+- (void)setUpForUpload {
+  self.mockSettings.shouldUseNewReportEndpoint = YES;
+  self.mockDataTransport.sendDataEvent_wasWritten = YES;
+}
+
+- (void)setUpForLegacyUpload {
+  self.mockSettings.shouldUseNewReportEndpoint = NO;
+  self.mockDataTransport.sendDataEvent_wasWritten = YES;
+  self.fileManager.fileSizeAtPathResult = [NSNumber numberWithInt:1];
 }
 
 #pragma mark - FIRCLSReportUploaderDelegate
@@ -75,6 +232,8 @@ NSString *const TestEndpoint = @"https://reports.crashlytics.com";
                                error:(NSError *)error {
 }
 
+#pragma mark - FIRCLSReportUploaderDataSource
+
 - (NSString *)bundleIdentifier {
   return @"com.test.TestApp";
 }
@@ -83,12 +242,12 @@ NSString *const TestEndpoint = @"https://reports.crashlytics.com";
   return @"someGoogleAppId";
 }
 
+- (GDTCORTransport *)googleTransport {
+  return self.mockDataTransport;
+}
+
 - (FIRCLSSettings *)settings {
-  FABMockApplicationIdentifierModel *appIDModel = [[FABMockApplicationIdentifierModel alloc] init];
-  FIRCLSMockSettings *settings = [[FIRCLSMockSettings alloc] initWithFileManager:self.fileManager
-                                                                      appIDModel:appIDModel];
-  settings.fetchedBundleID = self.bundleIdentifier;
-  return settings;
+  return self.mockSettings;
 }
 
 - (void)didCompleteAllSubmissions {

+ 58 - 0
Crashlytics/UnitTests/FIRCLSSettingsTests.m

@@ -95,6 +95,8 @@ NSString *const TestChangedGoogleAppID = @"2:changed:google:app:id";
   XCTAssertEqual(self.settings.logBufferSize, 64 * 1000);
   XCTAssertEqual(self.settings.maxCustomExceptions, 8);
   XCTAssertEqual(self.settings.maxCustomKeys, 64);
+
+  XCTAssertFalse(self.settings.shouldUseNewReportEndpoint);
 }
 
 - (BOOL)writeSettings:(const NSString *)settings error:(NSError **)error {
@@ -382,6 +384,7 @@ NSString *const TestChangedGoogleAppID = @"2:changed:google:app:id";
   XCTAssertEqualObjects(self.settings.fetchedBundleID, nil);
   XCTAssertFalse(self.settings.appNeedsOnboarding);
   XCTAssertEqual(self.settings.errorLogBufferSize, 64 * 1000);
+  XCTAssertFalse(self.settings.shouldUseNewReportEndpoint);
 }
 
 - (void)testCorruptCacheKey {
@@ -419,4 +422,59 @@ NSString *const TestChangedGoogleAppID = @"2:changed:google:app:id";
   XCTAssertEqual(self.settings.errorLogBufferSize, 64 * 1000);
 }
 
+- (void)testNewReportEndpointSettings {
+  NSString *settingsJSON =
+      @"{\"settings_version\":3,\"cache_duration\":60,\"app\":{\"status\":\"activated\",\"update_"
+      @"required\":false,\"report_upload_variant\":2}}";
+
+  NSError *error = nil;
+  [self writeSettings:settingsJSON error:&error];
+  NSTimeInterval currentTimestamp = [NSDate timeIntervalSinceReferenceDate];
+  [self.settings cacheSettingsWithGoogleAppID:TestGoogleAppID currentTimestamp:currentTimestamp];
+
+  XCTAssertNil(error, "%@", error);
+  XCTAssertTrue(self.settings.shouldUseNewReportEndpoint);
+}
+
+- (void)testLegacyReportEndpointSettings {
+  NSString *settingsJSON =
+      @"{\"settings_version\":3,\"cache_duration\":60,\"app\":{\"status\":\"activated\",\"update_"
+      @"required\":false,\"report_upload_variant\":1}}";
+
+  NSError *error = nil;
+  [self writeSettings:settingsJSON error:&error];
+  NSTimeInterval currentTimestamp = [NSDate timeIntervalSinceReferenceDate];
+  [self.settings cacheSettingsWithGoogleAppID:TestGoogleAppID currentTimestamp:currentTimestamp];
+
+  XCTAssertNil(error, "%@", error);
+  XCTAssertFalse(self.settings.shouldUseNewReportEndpoint);
+}
+
+- (void)testLegacyReportEndpointSettingsWithNonExistentKey {
+  NSString *settingsJSON = @"{\"settings_version\":3,\"cache_duration\":60,\"app\":{\"status\":"
+                           @"\"activated\",\"update_required\":false}}";
+
+  NSError *error = nil;
+  [self writeSettings:settingsJSON error:&error];
+  NSTimeInterval currentTimestamp = [NSDate timeIntervalSinceReferenceDate];
+  [self.settings cacheSettingsWithGoogleAppID:TestGoogleAppID currentTimestamp:currentTimestamp];
+
+  XCTAssertNil(error, "%@", error);
+  XCTAssertFalse(self.settings.shouldUseNewReportEndpoint);
+}
+
+- (void)testLegacyReportEndpointSettingsWithUnknownValue {
+  NSString *newEndpointJSON =
+      @"{\"settings_version\":3,\"cache_duration\":60,\"app\":{\"status\":\"activated\",\"update_"
+      @"required\":false,\"report_upload_variant\":xyz}}";
+
+  NSError *error = nil;
+  [self writeSettings:newEndpointJSON error:&error];
+  NSTimeInterval currentTimestamp = [NSDate timeIntervalSinceReferenceDate];
+  [self.settings cacheSettingsWithGoogleAppID:TestGoogleAppID currentTimestamp:currentTimestamp];
+
+  XCTAssertNil(error, "%@", error);
+  XCTAssertFalse(self.settings.shouldUseNewReportEndpoint);
+}
+
 @end

+ 12 - 0
Crashlytics/UnitTests/Mocks/FIRCLSMockFileManager.h

@@ -26,13 +26,25 @@
 // Incremented when a remove happens with removeItemAtPath
 @property(nonatomic) NSInteger removeCount;
 
+// Overrides fileSizeAtPath if set
+@property(nonatomic, copy) NSNumber *fileSizeAtPathResult;
+
 // Will be fulfilled when the expected number of removes have happened
 // using removeItemAtPath
 //
 // Users should initialize this in their test.
 @property(nonatomic, strong) XCTestExpectation *removeExpectation;
 
+@property(nonatomic, copy) NSString *removedItemAtPath_path;
+
 // Overriding the method for testing Settings
 - (BOOL)removeItemAtPath:(NSString *)path;
 
+// Overrides moveItemAtPath if set
+@property(nonatomic) NSNumber *moveItemAtPathResult;
+@property(nonatomic, copy) NSString *moveItemAtPath_path;
+@property(nonatomic, copy) NSString *moveItemAtPath_destDir;
+
+- (BOOL)moveItemAtPath:(NSString *)path toDirectory:(NSString *)destDir;
+
 @end

+ 21 - 0
Crashlytics/UnitTests/Mocks/FIRCLSMockFileManager.m

@@ -31,6 +31,8 @@
 }
 
 - (BOOL)removeItemAtPath:(NSString *)path {
+  self.removedItemAtPath_path = path;
+
   [super removeItemAtPath:path];
 
   self.removeCount += 1;
@@ -44,4 +46,23 @@
   return YES;
 }
 
+- (NSNumber *)fileSizeAtPath:(NSString *)path {
+  if (self.fileSizeAtPathResult != nil) {
+    return self.fileSizeAtPathResult;
+  }
+
+  return [super fileSizeAtPath:path];
+}
+
+- (BOOL)moveItemAtPath:(NSString *)path toDirectory:(NSString *)destDir {
+  self.moveItemAtPath_path = path;
+  self.moveItemAtPath_destDir = destDir;
+
+  if (self.moveItemAtPathResult != nil) {
+    return self.moveItemAtPathResult.intValue > 0;
+  }
+
+  return [super moveItemAtPath:path toDirectory:destDir];
+}
+
 @end

+ 2 - 0
Crashlytics/UnitTests/Mocks/FIRCLSMockNetworkClient.h

@@ -16,4 +16,6 @@
 
 @interface FIRCLSMockNetworkClient : FIRCLSNetworkClient
 
+@property(nonatomic, strong) NSURLRequest *startUploadRequest;
+
 @end

+ 2 - 0
Crashlytics/UnitTests/Mocks/FIRCLSMockNetworkClient.m

@@ -18,7 +18,9 @@
 
 - (void)startUploadRequest:(NSURLRequest *)request
                   filePath:(NSString *)path
+       dataCollectionToken:(FIRCLSDataCollectionToken *)dataCollectionToken
                immediately:(BOOL)immediate {
+  self.startUploadRequest = request;
   NSLog(@"intercepted request");
 }
 

+ 2 - 3
Crashlytics/UnitTests/Mocks/FIRCLSMockReportManager.h

@@ -25,10 +25,9 @@ NS_ASSUME_NONNULL_BEGIN
 - (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager
                       installations:(FIRInstallations *)installations
                           analytics:(nullable id<FIRAnalyticsInterop>)analytics
-                        googleAppID:(NSString *)googleAppID
+                        googleAppID:(nonnull NSString *)googleAppID
                         dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter
-                         appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel
-    NS_DESIGNATED_INITIALIZER;
+                    googleTransport:(GDTCORTransport *)googleTransport NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)initWithFileManager:(FIRCLSFileManager *)fileManager
                       installations:(FIRInstallations *)instanceID

+ 5 - 8
Crashlytics/UnitTests/Mocks/FIRCLSMockReportManager.m

@@ -14,18 +14,16 @@
 
 #import "FIRCLSMockReportManager.h"
 
-#import "FIRCLSApplicationIdentifierModel.h"
 #import "FIRCLSContext.h"
 #import "FIRCLSMockNetworkClient.h"
 #import "FIRCLSMockReportUploader.h"
 
+#import "FIRInstallations.h"
+
 @interface FIRCLSMockReportManager () {
   FIRCLSMockReportUploader *_uploader;
 }
 
-// Made this a property so we can override this with mocked values
-@property(nonatomic, strong) FIRCLSApplicationIdentifierModel *appIDModel;
-
 @end
 
 @implementation FIRCLSMockReportManager
@@ -38,18 +36,17 @@
                           analytics:(id<FIRAnalyticsInterop>)analytics
                         googleAppID:(nonnull NSString *)googleAppID
                         dataArbiter:(FIRCLSDataCollectionArbiter *)dataArbiter
-                         appIDModel:(FIRCLSApplicationIdentifierModel *)appIDModel {
+                    googleTransport:(GDTCORTransport *)googleTransport {
   self = [super initWithFileManager:fileManager
                       installations:installations
                           analytics:analytics
                         googleAppID:googleAppID
-                        dataArbiter:dataArbiter];
+                        dataArbiter:dataArbiter
+                    googleTransport:(GDTCORTransport *)googleTransport];
   if (!self) {
     return nil;
   }
 
-  _appIDModel = appIDModel;
-
   _uploader = [[FIRCLSMockReportUploader alloc] initWithQueue:self.operationQueue
                                                      delegate:self
                                                    dataSource:self

+ 1 - 0
Crashlytics/UnitTests/Mocks/FIRCLSMockSettings.h

@@ -18,5 +18,6 @@
 
 @property(nonatomic, copy) NSString* orgID;
 @property(nonatomic, copy) NSString* fetchedBundleID;
+@property(nonatomic) BOOL shouldUseNewReportEndpoint;
 
 @end

+ 1 - 0
Crashlytics/UnitTests/Mocks/FIRCLSMockSettings.m

@@ -20,5 +20,6 @@
 // and bypass the normal functionality
 @synthesize orgID;
 @synthesize fetchedBundleID;
+@synthesize shouldUseNewReportEndpoint;
 
 @end

+ 33 - 0
Crashlytics/UnitTests/Mocks/FIRMockGDTCoreTransport.h

@@ -0,0 +1,33 @@
+// Copyright 2020 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <GoogleDataTransport/GDTCORTransport.h>
+
+@interface FIRMockGDTCORTransport : GDTCORTransport
+
+@property(nonatomic, copy) NSString *mappingID;
+@property(nonatomic) NSInteger target;
+
+@property(nonatomic, strong) GDTCOREvent *sendDataEvent_event;
+@property(nonatomic, strong) NSError *sendDataEvent_error;
+@property(nonatomic) BOOL sendDataEvent_wasWritten;
+
+- (instancetype)initWithMappingID:(NSString *)mappingID
+                     transformers:(NSArray<id<GDTCOREventTransformer>> *)transformers
+                           target:(NSInteger)target NS_DESIGNATED_INITIALIZER;
+
+- (void)sendDataEvent:(GDTCOREvent *)event
+           onComplete:(void (^)(BOOL wasWritten, NSError *error))completion;
+
+@end

+ 35 - 0
Crashlytics/UnitTests/Mocks/FIRMockGDTCoreTransport.m

@@ -0,0 +1,35 @@
+// Copyright 2020 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "FIRMockGDTCoreTransport.h"
+
+@implementation FIRMockGDTCORTransport
+
+- (instancetype)initWithMappingID:(NSString *)mappingID
+                     transformers:(NSArray<id<GDTCOREventTransformer>> *)transformers
+                           target:(NSInteger)target {
+  _mappingID = mappingID;
+  _target = target;
+  _sendDataEvent_wasWritten = YES;
+
+  return [super initWithMappingID:mappingID transformers:transformers target:target];
+}
+
+- (void)sendDataEvent:(GDTCOREvent *)event
+           onComplete:(void (^)(BOOL wasWritten, NSError *error))completion {
+  self.sendDataEvent_event = event;
+  completion(self.sendDataEvent_wasWritten, self.sendDataEvent_error);
+}
+
+@end

+ 22 - 0
Crashlytics/generate_project.sh

@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# Copyright 2020 Google
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+readonly DIR="$( git rev-parse --show-toplevel )"
+
+"$DIR/Crashlytics/ProtoSupport/generate_crashlytics_protos.sh" || echo "Something went wrong generating protos.";
+
+pod gen "${DIR}/FirebaseCrashlytics.podspec" --auto-open --gen-directory="${DIR}/gen" --local-sources="${DIR}" --platforms=ios,macos,tvos --clean

+ 13 - 3
FirebaseCrashlytics.podspec

@@ -20,6 +20,7 @@ Pod::Spec.new do |s|
   s.prefix_header_file = false
 
   s.source_files = 'Crashlytics/Crashlytics/**/*.{c,h,m,mm}',
+    'Crashlytics/Protogen/**/*.{c,h,m,mm}',
     'Crashlytics/Shared/**/*.{c,h,m,mm}',
     'Crashlytics/third_party/**/*.{c,h,m,mm}'
 
@@ -44,6 +45,9 @@ Pod::Spec.new do |s|
   s.dependency 'FirebaseInstallations', '~> 1.1'
   s.dependency 'FirebaseAnalyticsInterop', '~> 1.2'
   s.dependency 'PromisesObjC', '~> 1.2'
+  s.dependency 'GoogleDataTransport', '~> 4.0'
+  s.dependency 'GoogleDataTransportCCTSupport', '~> 1.3'
+  s.dependency 'nanopb', '~> 0.3.901'
 
   s.libraries = 'c++', 'z'
   s.frameworks = 'Security', 'SystemConfiguration'
@@ -52,7 +56,9 @@ Pod::Spec.new do |s|
     'GCC_C_LANGUAGE_STANDARD' => 'c99',
     'GCC_PREPROCESSOR_DEFINITIONS' =>
       'DISPLAY_VERSION=' + s.version.to_s + ' ' +
-      'CLS_SDK_NAME="Crashlytics iOS SDK" ',
+      'CLS_SDK_NAME="Crashlytics iOS SDK" ' +
+      # For nanopb:
+      'PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1',
     'OTHER_LD_FLAGS' => '$(inherited) -sectcreate __TEXT __info_plist'
   }
 
@@ -60,7 +66,9 @@ Pod::Spec.new do |s|
     'GCC_C_LANGUAGE_STANDARD' => 'c99',
     'GCC_PREPROCESSOR_DEFINITIONS' =>
       'DISPLAY_VERSION=' + s.version.to_s + ' ' +
-      'CLS_SDK_NAME="Crashlytics Mac SDK" ',
+      'CLS_SDK_NAME="Crashlytics Mac SDK" ' +
+      # For nanopb:
+      'PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1',
     'OTHER_LD_FLAGS' => '$(inherited) -sectcreate __TEXT __info_plist'
   }
 
@@ -68,7 +76,9 @@ Pod::Spec.new do |s|
     'GCC_C_LANGUAGE_STANDARD' => 'c99',
     'GCC_PREPROCESSOR_DEFINITIONS' =>
       'DISPLAY_VERSION=' + s.version.to_s + ' ' +
-      'CLS_SDK_NAME="Crashlytics tvOS SDK" ',
+      'CLS_SDK_NAME="Crashlytics tvOS SDK" ' +
+      # For nanopb:
+      'PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1',
     'OTHER_LD_FLAGS' => '$(inherited) -sectcreate __TEXT __info_plist'
   }
 

+ 2 - 0
scripts/check_whitespace.sh

@@ -26,6 +26,8 @@ options=(
 )
 
 git grep "${options[@]}" -- \
+    ':(exclude)Crashlytics/ProtoSupport' \
+    ':(exclude)Crashlytics/UnitTests/Data' \
     ':(exclude)Firebase/CoreDiagnostics/FIRCDLibrary/Protogen/nanopb' \
     ':(exclude)Firebase/CoreDiagnostics/ProtoSupport' \
     ':(exclude)CoreOnly/NOTICES' \

部分文件因文件數量過多而無法顯示