diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 89d1938b..56242158 100755
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -6,6 +6,6 @@
+
-
-
+
\ No newline at end of file
diff --git a/External/Pearl b/External/Pearl
index 986f092d..8086bd1b 160000
--- a/External/Pearl
+++ b/External/Pearl
@@ -1 +1 @@
-Subproject commit 986f092d10eaab64b2ff7347f29e193b9b9e5de4
+Subproject commit 8086bd1b71e6d9d49e47a95a724ef672bf138a94
diff --git a/External/iOS/Crashlytics.framework/Crashlytics b/External/iOS/Crashlytics.framework/Crashlytics
deleted file mode 120000
index 7074275f..00000000
--- a/External/iOS/Crashlytics.framework/Crashlytics
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Crashlytics
\ No newline at end of file
diff --git a/External/iOS/Crashlytics.framework/Crashlytics b/External/iOS/Crashlytics.framework/Crashlytics
new file mode 100755
index 00000000..81992ef6
Binary files /dev/null and b/External/iOS/Crashlytics.framework/Crashlytics differ
diff --git a/External/iOS/Crashlytics.framework/Headers b/External/iOS/Crashlytics.framework/Headers
deleted file mode 120000
index a177d2a6..00000000
--- a/External/iOS/Crashlytics.framework/Headers
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Headers
\ No newline at end of file
diff --git a/External/iOS/Crashlytics.framework/Headers/ANSCompatibility.h b/External/iOS/Crashlytics.framework/Headers/ANSCompatibility.h
new file mode 100644
index 00000000..6ec011d9
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/ANSCompatibility.h
@@ -0,0 +1,31 @@
+//
+// ANSCompatibility.h
+// AnswersKit
+//
+// Copyright (c) 2015 Crashlytics, Inc. All rights reserved.
+//
+
+#pragma once
+
+#if !__has_feature(nullability)
+#define nonnull
+#define nullable
+#define _Nullable
+#define _Nonnull
+#endif
+
+#ifndef NS_ASSUME_NONNULL_BEGIN
+#define NS_ASSUME_NONNULL_BEGIN
+#endif
+
+#ifndef NS_ASSUME_NONNULL_END
+#define NS_ASSUME_NONNULL_END
+#endif
+
+#if __has_feature(objc_generics)
+#define ANS_GENERIC_NSARRAY(type) NSArray
+#define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary
+#else
+#define ANS_GENERIC_NSARRAY(type) NSArray
+#define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary
+#endif
diff --git a/External/iOS/Crashlytics.framework/Headers/Answers.h b/External/iOS/Crashlytics.framework/Headers/Answers.h
new file mode 100644
index 00000000..91c6b0e6
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/Answers.h
@@ -0,0 +1,206 @@
+//
+// Answers.h
+// Crashlytics
+//
+// Copyright (c) 2015 Crashlytics, Inc. All rights reserved.
+//
+
+#import
+#import "ANSCompatibility.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface Answers : NSObject
+
+/**
+ * Log a Sign Up event to see users signing up for your app in real-time, understand how
+ * many users are signing up with different methods and their success rate signing up.
+ *
+ * @param signUpMethodOrNil The method by which a user logged in, e.g. Twitter or Digits.
+ * @param signUpSucceededOrNil The ultimate success or failure of the login
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logSignUpWithMethod:(nullable NSString *)signUpMethodOrNil
+ success:(nullable NSNumber *)signUpSucceededOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log an Log In event to see users logging into your app in real-time, understand how many
+ * users are logging in with different methods and their success rate logging into your app.
+ *
+ * @param loginMethodOrNil The method by which a user logged in, e.g. email, Twitter or Digits.
+ * @param loginSucceededOrNil The ultimate success or failure of the login
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logLoginWithMethod:(nullable NSString *)loginMethodOrNil
+ success:(nullable NSNumber *)loginSucceededOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Share event to see users sharing from your app in real-time, letting you
+ * understand what content they're sharing from the type or genre down to the specific id.
+ *
+ * @param shareMethodOrNil The method by which a user shared, e.g. email, Twitter, SMS.
+ * @param contentNameOrNil The human readable name for this piece of content.
+ * @param contentTypeOrNil The type of content shared.
+ * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this event.
+ */
++ (void)logShareWithMethod:(nullable NSString *)shareMethodOrNil
+ contentName:(nullable NSString *)contentNameOrNil
+ contentType:(nullable NSString *)contentTypeOrNil
+ contentId:(nullable NSString *)contentIdOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log an Invite Event to track how users are inviting other users into
+ * your application.
+ *
+ * @param inviteMethodOrNil The method of invitation, e.g. GameCenter, Twitter, email.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logInviteWithMethod:(nullable NSString *)inviteMethodOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Purchase event to see your revenue in real-time, understand how many users are making purchases, see which
+ * items are most popular, and track plenty of other important purchase-related metrics.
+ *
+ * @param itemPriceOrNil The purchased item's price.
+ * @param currencyOrNil The ISO4217 currency code. Example: USD
+ * @param purchaseSucceededOrNil Was the purchase succesful or unsuccesful
+ * @param itemNameOrNil The human-readable form of the item's name. Example:
+ * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU
+ * @param itemTypeOrNil The type, or genre of the item. Example: Song
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logPurchaseWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil
+ currency:(nullable NSString *)currencyOrNil
+ success:(nullable NSNumber *)purchaseSucceededOrNil
+ itemName:(nullable NSString *)itemNameOrNil
+ itemType:(nullable NSString *)itemTypeOrNil
+ itemId:(nullable NSString *)itemIdOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Level Start Event to track where users are in your game.
+ *
+ * @param levelNameOrNil The level name
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this level start event.
+ */
++ (void)logLevelStart:(nullable NSString *)levelNameOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Level End event to track how users are completing levels in your game.
+ *
+ * @param levelNameOrNil The name of the level completed, E.G. "1" or "Training"
+ * @param scoreOrNil The score the user completed the level with.
+ * @param levelCompletedSuccesfullyOrNil A boolean representing whether or not the level was completed succesfully.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logLevelEnd:(nullable NSString *)levelNameOrNil
+ score:(nullable NSNumber *)scoreOrNil
+ success:(nullable NSNumber *)levelCompletedSuccesfullyOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log an Add to Cart event to see users adding items to a shopping cart in real-time, understand how
+ * many users start the purchase flow, see which items are most popular, and track plenty of other important
+ * purchase-related metrics.
+ *
+ * @param itemPriceOrNil The purchased item's price.
+ * @param currencyOrNil The ISO4217 currency code. Example: USD
+ * @param itemNameOrNil The human-readable form of the item's name. Example:
+ * @param itemTypeOrNil The type, or genre of the item. Example: Song
+ * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logAddToCartWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil
+ currency:(nullable NSString *)currencyOrNil
+ itemName:(nullable NSString *)itemNameOrNil
+ itemType:(nullable NSString *)itemTypeOrNil
+ itemId:(nullable NSString *)itemIdOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Start Checkout event to see users moving through the purchase funnel in real-time, understand how many
+ * users are doing this and how much they're spending per checkout, and see how it related to other important
+ * purchase-related metrics.
+ *
+ * @param totalPriceOrNil The total price of the cart.
+ * @param currencyOrNil The ISO4217 currency code. Example: USD
+ * @param itemCountOrNil The number of items in the cart.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.
+ */
++ (void)logStartCheckoutWithPrice:(nullable NSDecimalNumber *)totalPriceOrNil
+ currency:(nullable NSString *)currencyOrNil
+ itemCount:(nullable NSNumber *)itemCountOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Rating event to see users rating content within your app in real-time and understand what
+ * content is most engaging, from the type or genre down to the specific id.
+ *
+ * @param ratingOrNil The integer rating given by the user.
+ * @param contentNameOrNil The human readable name for this piece of content.
+ * @param contentTypeOrNil The type of content shared.
+ * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this event.
+ */
++ (void)logRating:(nullable NSNumber *)ratingOrNil
+ contentName:(nullable NSString *)contentNameOrNil
+ contentType:(nullable NSString *)contentTypeOrNil
+ contentId:(nullable NSString *)contentIdOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Content View event to see users viewing content within your app in real-time and
+ * understand what content is most engaging, from the type or genre down to the specific id.
+ *
+ * @param contentNameOrNil The human readable name for this piece of content.
+ * @param contentTypeOrNil The type of content shared.
+ * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this event.
+ */
++ (void)logContentViewWithName:(nullable NSString *)contentNameOrNil
+ contentType:(nullable NSString *)contentTypeOrNil
+ contentId:(nullable NSString *)contentIdOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Search event allows you to see users searching within your app in real-time and understand
+ * exactly what they're searching for.
+ *
+ * @param queryOrNil The user's query.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this event.
+ */
++ (void)logSearchWithQuery:(nullable NSString *)queryOrNil
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+/**
+ * Log a Custom Event to see user actions that are uniquely important for your app in real-time, to see how often
+ * they're performing these actions with breakdowns by different categories you add. Use a human-readable name for
+ * the name of the event, since this is how the event will appear in Answers.
+ *
+ * @param eventName The human-readable name for the event.
+ * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase. Attribute keys
+ * must be NSString
and and values must be NSNumber
or NSString
.
+ * @discussion How we treat NSNumbers
:
+ * We will provide information about the distribution of values over time.
+ *
+ * How we treat NSStrings
:
+ * NSStrings are used as categorical data, allowing comparison across different category values.
+ * Strings are limited to a maximum length of 100 characters, attributes over this length will be
+ * truncated.
+ *
+ * When tracking the Tweet views to better understand user engagement, sending the tweet's length
+ * and the type of media present in the tweet allows you to track how tweet length and the type of media influence
+ * engagement.
+ */
++ (void)logCustomEventWithName:(NSString *)eventName
+ customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/External/iOS/Crashlytics.framework/Headers/CLSAttributes.h b/External/iOS/Crashlytics.framework/Headers/CLSAttributes.h
new file mode 100644
index 00000000..1526b0dc
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/CLSAttributes.h
@@ -0,0 +1,33 @@
+//
+// CLSAttributes.h
+// Crashlytics
+//
+// Copyright (c) 2015 Crashlytics, Inc. All rights reserved.
+//
+
+#pragma once
+
+#define CLS_DEPRECATED(x) __attribute__ ((deprecated(x)))
+
+#if !__has_feature(nullability)
+ #define nonnull
+ #define nullable
+ #define _Nullable
+ #define _Nonnull
+#endif
+
+#ifndef NS_ASSUME_NONNULL_BEGIN
+ #define NS_ASSUME_NONNULL_BEGIN
+#endif
+
+#ifndef NS_ASSUME_NONNULL_END
+ #define NS_ASSUME_NONNULL_END
+#endif
+
+#if __has_feature(objc_generics)
+ #define CLS_GENERIC_NSARRAY(type) NSArray
+ #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary
+#else
+ #define CLS_GENERIC_NSARRAY(type) NSArray
+ #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary
+#endif
diff --git a/External/iOS/Crashlytics.framework/Headers/CLSLogging.h b/External/iOS/Crashlytics.framework/Headers/CLSLogging.h
new file mode 100644
index 00000000..59590d54
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/CLSLogging.h
@@ -0,0 +1,64 @@
+//
+// CLSLogging.h
+// Crashlytics
+//
+// Copyright (c) 2015 Crashlytics, Inc. All rights reserved.
+//
+#ifdef __OBJC__
+#import "CLSAttributes.h"
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+#endif
+
+
+
+/**
+ *
+ * The CLS_LOG macro provides as easy way to gather more information in your log messages that are
+ * sent with your crash data. CLS_LOG prepends your custom log message with the function name and
+ * line number where the macro was used. If your app was built with the DEBUG preprocessor macro
+ * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog.
+ * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only.
+ *
+ * Example output:
+ * -[AppDelegate login:] line 134 $ login start
+ *
+ * If you would like to change this macro, create a new header file, unset our define and then define
+ * your own version. Make sure this new header file is imported after the Crashlytics header file.
+ *
+ * #undef CLS_LOG
+ * #define CLS_LOG(__FORMAT__, ...) CLSNSLog...
+ *
+ **/
+#ifdef __OBJC__
+#ifdef DEBUG
+#define CLS_LOG(__FORMAT__, ...) CLSNSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
+#define CLS_LOG(__FORMAT__, ...) CLSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
+#endif
+#endif
+
+/**
+ *
+ * Add logging that will be sent with your crash data. This logging will not show up in the system.log
+ * and will only be visible in your Crashlytics dashboard.
+ *
+ **/
+
+#ifdef __OBJC__
+OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
+OBJC_EXTERN void CLSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0);
+
+/**
+ *
+ * Add logging that will be sent with your crash data. This logging will show up in the system.log
+ * and your Crashlytics dashboard. It is not recommended for Release builds.
+ *
+ **/
+OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
+OBJC_EXTERN void CLSNSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0);
+
+
+NS_ASSUME_NONNULL_END
+#endif
diff --git a/External/iOS/Crashlytics.framework/Headers/CLSReport.h b/External/iOS/Crashlytics.framework/Headers/CLSReport.h
new file mode 100644
index 00000000..6e3a5153
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/CLSReport.h
@@ -0,0 +1,103 @@
+//
+// CLSReport.h
+// Crashlytics
+//
+// Copyright (c) 2015 Crashlytics, Inc. All rights reserved.
+//
+
+#import
+#import "CLSAttributes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * The CLSCrashReport protocol is deprecated. See the CLSReport class and the CrashyticsDelegate changes for details.
+ **/
+@protocol CLSCrashReport
+
+@property (nonatomic, copy, readonly) NSString *identifier;
+@property (nonatomic, copy, readonly) NSDictionary *customKeys;
+@property (nonatomic, copy, readonly) NSString *bundleVersion;
+@property (nonatomic, copy, readonly) NSString *bundleShortVersionString;
+@property (nonatomic, copy, readonly) NSDate *crashedOnDate;
+@property (nonatomic, copy, readonly) NSString *OSVersion;
+@property (nonatomic, copy, readonly) NSString *OSBuildVersion;
+
+@end
+
+/**
+ * The CLSReport exposes an interface to the phsyical report that Crashlytics has created. You can
+ * use this class to get information about the event, and can also set some values after the
+ * event has occured.
+ **/
+@interface CLSReport : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
++ (instancetype)new NS_UNAVAILABLE;
+
+/**
+ * Returns the session identifier for the report.
+ **/
+@property (nonatomic, copy, readonly) NSString *identifier;
+
+/**
+ * Returns the custom key value data for the report.
+ **/
+@property (nonatomic, copy, readonly) NSDictionary *customKeys;
+
+/**
+ * Returns the CFBundleVersion of the application that generated the report.
+ **/
+@property (nonatomic, copy, readonly) NSString *bundleVersion;
+
+/**
+ * Returns the CFBundleShortVersionString of the application that generated the report.
+ **/
+@property (nonatomic, copy, readonly) NSString *bundleShortVersionString;
+
+/**
+ * Returns the date that the report was created.
+ **/
+@property (nonatomic, copy, readonly) NSDate *dateCreated;
+
+/**
+ * Returns the os version that the application crashed on.
+ **/
+@property (nonatomic, copy, readonly) NSString *OSVersion;
+
+/**
+ * Returns the os build version that the application crashed on.
+ **/
+@property (nonatomic, copy, readonly) NSString *OSBuildVersion;
+
+/**
+ * Returns YES if the report contains any crash information, otherwise returns NO.
+ **/
+@property (nonatomic, assign, readonly) BOOL isCrash;
+
+/**
+ * You can use this method to set, after the event, additional custom keys. The rules
+ * and semantics for this method are the same as those documented in Crashlytics.h. Be aware
+ * that the maximum size and count of custom keys is still enforced, and you can overwrite keys
+ * and/or cause excess keys to be deleted by using this method.
+ **/
+- (void)setObjectValue:(nullable id)value forKey:(NSString *)key;
+
+/**
+ * Record an application-specific user identifier. See Crashlytics.h for details.
+ **/
+@property (nonatomic, copy, nullable) NSString * userIdentifier;
+
+/**
+ * Record a user name. See Crashlytics.h for details.
+ **/
+@property (nonatomic, copy, nullable) NSString * userName;
+
+/**
+ * Record a user email. See Crashlytics.h for details.
+ **/
+@property (nonatomic, copy, nullable) NSString * userEmail;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/External/iOS/Crashlytics.framework/Headers/CLSStackFrame.h b/External/iOS/Crashlytics.framework/Headers/CLSStackFrame.h
new file mode 100644
index 00000000..a9c0f296
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/CLSStackFrame.h
@@ -0,0 +1,37 @@
+//
+// CLSStackFrame.h
+// Crashlytics
+//
+// Copyright 2015 Crashlytics, Inc. All rights reserved.
+//
+
+#import
+#import "CLSAttributes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ *
+ * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to
+ * record information about non-ObjC/C++ exceptions. All information included here will be displayed
+ * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the
+ * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities
+ * in the process.
+ *
+ **/
+@interface CLSStackFrame : NSObject
+
++ (instancetype)stackFrame;
++ (instancetype)stackFrameWithAddress:(NSUInteger)address;
++ (instancetype)stackFrameWithSymbol:(NSString *)symbol;
+
+@property (nonatomic, copy, nullable) NSString *symbol;
+@property (nonatomic, copy, nullable) NSString *library;
+@property (nonatomic, copy, nullable) NSString *fileName;
+@property (nonatomic, assign) uint32_t lineNumber;
+@property (nonatomic, assign) uint64_t offset;
+@property (nonatomic, assign) uint64_t address;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/External/iOS/Crashlytics.framework/Headers/Crashlytics.h b/External/iOS/Crashlytics.framework/Headers/Crashlytics.h
new file mode 100644
index 00000000..dff88a63
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Headers/Crashlytics.h
@@ -0,0 +1,248 @@
+//
+// Crashlytics.h
+// Crashlytics
+//
+// Copyright (c) 2015 Crashlytics, Inc. All rights reserved.
+//
+
+#import
+
+#import "CLSAttributes.h"
+#import "CLSLogging.h"
+#import "CLSReport.h"
+#import "CLSStackFrame.h"
+#import "Answers.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol CrashlyticsDelegate;
+
+/**
+ * Crashlytics. Handles configuration and initialization of Crashlytics.
+ */
+@interface Crashlytics : NSObject
+
+@property (nonatomic, readonly, copy) NSString *APIKey;
+@property (nonatomic, readonly, copy) NSString *version;
+@property (nonatomic, assign) BOOL debugMode;
+
+/**
+ *
+ * The delegate can be used to influence decisions on reporting and behavior, as well as reacting
+ * to previous crashes.
+ *
+ * Make certain that the delegate is setup before starting Crashlytics with startWithAPIKey:... or
+ * via +[Fabric with:...]. Failure to do will result in missing any delegate callbacks that occur
+ * synchronously during start.
+ *
+ **/
+@property (nonatomic, assign, nullable) id delegate;
+
+/**
+ * The recommended way to install Crashlytics into your application is to place a call to +startWithAPIKey:
+ * in your -application:didFinishLaunchingWithOptions: or -applicationDidFinishLaunching:
+ * method.
+ *
+ * Note: Starting with 3.0, the submission process has been significantly improved. The delay parameter
+ * is no longer required to throttle submissions on launch, performance will be great without it.
+ *
+ * @param apiKey The Crashlytics API Key for this app
+ *
+ * @return The singleton Crashlytics instance
+ */
++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey;
++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey: instead.");
+
+/**
+ * If you need the functionality provided by the CrashlyticsDelegate protocol, you can use
+ * these convenience methods to activate the framework and set the delegate in one call.
+ *
+ * @param apiKey The Crashlytics API Key for this app
+ * @param delegate A delegate object which conforms to CrashlyticsDelegate.
+ *
+ * @return The singleton Crashlytics instance
+ */
++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id)delegate;
++ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id)delegate afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey:delegate: instead.");
+
+/**
+ * Access the singleton Crashlytics instance.
+ *
+ * @return The singleton Crashlytics instance
+ */
++ (Crashlytics *)sharedInstance;
+
+/**
+ * The easiest way to cause a crash - great for testing!
+ */
+- (void)crash;
+
+/**
+ * The easiest way to cause a crash with an exception - great for testing.
+ */
+- (void)throwException;
+
+/**
+ * Specify a user identifier which will be visible in the Crashlytics UI.
+ *
+ * Many of our customers have requested the ability to tie crashes to specific end-users of their
+ * application in order to facilitate responses to support requests or permit the ability to reach
+ * out for more information. We allow you to specify up to three separate values for display within
+ * the Crashlytics UI - but please be mindful of your end-user's privacy.
+ *
+ * We recommend specifying a user identifier - an arbitrary string that ties an end-user to a record
+ * in your system. This could be a database id, hash, or other value that is meaningless to a
+ * third-party observer but can be indexed and queried by you.
+ *
+ * Optionally, you may also specify the end-user's name or username, as well as email address if you
+ * do not have a system that works well with obscured identifiers.
+ *
+ * Pursuant to our EULA, this data is transferred securely throughout our system and we will not
+ * disseminate end-user data unless required to by law. That said, if you choose to provide end-user
+ * contact information, we strongly recommend that you disclose this in your application's privacy
+ * policy. Data privacy is of our utmost concern.
+ *
+ * @param identifier An arbitrary user identifier string which ties an end-user to a record in your system.
+ */
+- (void)setUserIdentifier:(nullable NSString *)identifier;
+
+/**
+ * Specify a user name which will be visible in the Crashlytics UI.
+ * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs.
+ * @see setUserIdentifier:
+ *
+ * @param name An end user's name.
+ */
+- (void)setUserName:(nullable NSString *)name;
+
+/**
+ * Specify a user email which will be visible in the Crashlytics UI.
+ * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs.
+ *
+ * @see setUserIdentifier:
+ *
+ * @param email An end user's email address.
+ */
+- (void)setUserEmail:(nullable NSString *)email;
+
++ (void)setUserIdentifier:(nullable NSString *)identifier CLS_DEPRECATED("Please access this method via +sharedInstance");
++ (void)setUserName:(nullable NSString *)name CLS_DEPRECATED("Please access this method via +sharedInstance");
++ (void)setUserEmail:(nullable NSString *)email CLS_DEPRECATED("Please access this method via +sharedInstance");
+
+/**
+ * Set a value for a for a key to be associated with your crash data which will be visible in the Crashlytics UI.
+ * When setting an object value, the object is converted to a string. This is typically done by calling
+ * -[NSObject description].
+ *
+ * @param value The object to be associated with the key
+ * @param key The key with which to associate the value
+ */
+- (void)setObjectValue:(nullable id)value forKey:(NSString *)key;
+
+/**
+ * Set an int value for a key to be associated with your crash data which will be visible in the Crashlytics UI.
+ *
+ * @param value The integer value to be set
+ * @param key The key with which to associate the value
+ */
+- (void)setIntValue:(int)value forKey:(NSString *)key;
+
+/**
+ * Set an BOOL value for a key to be associated with your crash data which will be visible in the Crashlytics UI.
+ *
+ * @param value The BOOL value to be set
+ * @param key The key with which to associate the value
+ */
+- (void)setBoolValue:(BOOL)value forKey:(NSString *)key;
+
+/**
+ * Set an float value for a key to be associated with your crash data which will be visible in the Crashlytics UI.
+ *
+ * @param value The float value to be set
+ * @param key The key with which to associate the value
+ */
+- (void)setFloatValue:(float)value forKey:(NSString *)key;
+
++ (void)setObjectValue:(nullable id)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance");
++ (void)setIntValue:(int)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance");
++ (void)setBoolValue:(BOOL)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance");
++ (void)setFloatValue:(float)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance");
+
+/**
+ * This method can be used to record a single exception structure in a report. This is particularly useful
+ * when your code interacts with non-native languages like Lua, C#, or Javascript. This call can be
+ * expensive and should only be used shortly before process termination. This API is not intended be to used
+ * to log NSException objects. All safely-reportable NSExceptions are automatically captured by
+ * Crashlytics.
+ *
+ * @param name The name of the custom exception
+ * @param reason The reason this exception occured
+ * @param frameArray An array of CLSStackFrame objects
+ */
+- (void)recordCustomExceptionName:(NSString *)name reason:(nullable NSString *)reason frameArray:(CLS_GENERIC_NSARRAY(CLSStackFrame *) *)frameArray;
+
+- (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:");
+- (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:");
++ (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:");
++ (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:");
+
+@end
+
+/**
+ *
+ * The CrashlyticsDelegate protocol provides a mechanism for your application to take
+ * action on events that occur in the Crashlytics crash reporting system. You can make
+ * use of these calls by assigning an object to the Crashlytics' delegate property directly,
+ * or through the convenience +startWithAPIKey:delegate: method.
+ *
+ */
+@protocol CrashlyticsDelegate
+@optional
+
+
+- (void)crashlyticsDidDetectCrashDuringPreviousExecution:(Crashlytics *)crashlytics CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:");
+- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id )crash CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:");
+
+/**
+ *
+ * Called when a Crashlytics instance has determined that the last execution of the
+ * application ended in a crash. This is called synchronously on Crashlytics
+ * initialization. Your delegate must invoke the completionHandler, but does not need to do so
+ * synchronously, or even on the main thread. Invoking completionHandler with NO will cause the
+ * detected report to be deleted and not submitted to Crashlytics. This is useful for
+ * implementing permission prompts, or other more-complex forms of logic around submitting crashes.
+ *
+ * @warning Failure to invoke the completionHandler will prevent submissions from being reported. Watch out.
+ *
+ * @warning Just implementing this delegate method will disable all forms of synchronous report submission. This can
+ * impact the reliability of reporting crashes very early in application launch.
+ *
+ * @param report The CLSReport object representing the last detected crash
+ * @param completionHandler The completion handler to call when your logic has completed.
+ *
+ */
+- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler;
+
+/**
+ * If your app is running on an OS that supports it (OS X 10.9+, iOS 7.0+), Crashlytics will submit
+ * most reports using out-of-process background networking operations. This results in a significant
+ * improvement in reliability of reporting, as well as power and performance wins for your users.
+ * If you don't want this functionality, you can disable by returning NO from this method.
+ *
+ * @warning Background submission is not supported for extensions on iOS or OS X.
+ *
+ * @param crashlytics The Crashlytics singleton instance
+ *
+ * @return Return NO if you don't want out-of-process background network operations.
+ *
+ */
+- (BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics;
+
+@end
+
+/**
+ * `CrashlyticsKit` can be used as a parameter to `[Fabric with:@[CrashlyticsKit]];` in Objective-C. In Swift, use Crashlytics.sharedInstance()
+ */
+#define CrashlyticsKit [Crashlytics sharedInstance]
+
+NS_ASSUME_NONNULL_END
diff --git a/External/iOS/Crashlytics.framework/Info.plist b/External/iOS/Crashlytics.framework/Info.plist
new file mode 100644
index 00000000..07836131
--- /dev/null
+++ b/External/iOS/Crashlytics.framework/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ BuildMachineOSBuild
+ 14E46
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ Crashlytics
+ CFBundleIdentifier
+ com.twitter.crashlytics.ios
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Crashlytics
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 3.3.4
+ CFBundleSignature
+ ????
+ CFBundleSupportedPlatforms
+
+ iPhoneOS
+
+ CFBundleVersion
+ 82
+ DTCompiler
+ com.apple.compilers.llvm.clang.1_0
+ DTPlatformBuild
+ 13A340
+ DTPlatformName
+ iphoneos
+ DTPlatformVersion
+ 9.0
+ DTSDKBuild
+ 13A340
+ DTSDKName
+ iphoneos9.0
+ DTXcode
+ 0700
+ DTXcodeBuild
+ 7A220
+ MinimumOSVersion
+ 6.0
+ NSHumanReadableCopyright
+ Copyright © 2015 Crashlytics, Inc. All rights reserved.
+ UIDeviceFamily
+
+ 1
+ 2
+
+
+
diff --git a/External/iOS/Crashlytics.framework/Modules/module.modulemap b/External/iOS/Crashlytics.framework/Modules/module.modulemap
index e552e9ca..da0845e3 100644
--- a/External/iOS/Crashlytics.framework/Modules/module.modulemap
+++ b/External/iOS/Crashlytics.framework/Modules/module.modulemap
@@ -1,6 +1,14 @@
framework module Crashlytics {
- umbrella header "Crashlytics.h"
+ header "Crashlytics.h"
+ header "Answers.h"
+ header "ANSCompatibility.h"
+ header "CLSLogging.h"
+ header "CLSReport.h"
+ header "CLSStackFrame.h"
+ header "CLSAttributes.h"
- export *
- module * { export * }
+ export *
+
+ link "z"
+ link "c++"
}
diff --git a/External/iOS/Crashlytics.framework/Resources b/External/iOS/Crashlytics.framework/Resources
deleted file mode 120000
index 953ee36f..00000000
--- a/External/iOS/Crashlytics.framework/Resources
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Resources
\ No newline at end of file
diff --git a/External/iOS/Crashlytics.framework/Versions/A/Crashlytics b/External/iOS/Crashlytics.framework/Versions/A/Crashlytics
deleted file mode 100644
index 42d9da7e..00000000
Binary files a/External/iOS/Crashlytics.framework/Versions/A/Crashlytics and /dev/null differ
diff --git a/External/iOS/Crashlytics.framework/Versions/A/Headers/Crashlytics.h b/External/iOS/Crashlytics.framework/Versions/A/Headers/Crashlytics.h
deleted file mode 100644
index 9683173c..00000000
--- a/External/iOS/Crashlytics.framework/Versions/A/Headers/Crashlytics.h
+++ /dev/null
@@ -1,225 +0,0 @@
-//
-// Crashlytics.h
-// Crashlytics
-//
-// Copyright 2013 Crashlytics, Inc. All rights reserved.
-//
-
-#import
-
-/**
- *
- * The CLS_LOG macro provides as easy way to gather more information in your log messages that are
- * sent with your crash data. CLS_LOG prepends your custom log message with the function name and
- * line number where the macro was used. If your app was built with the DEBUG preprocessor macro
- * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog.
- * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only.
- *
- * Example output:
- * -[AppDelegate login:] line 134 $ login start
- *
- * If you would like to change this macro, create a new header file, unset our define and then define
- * your own version. Make sure this new header file is imported after the Crashlytics header file.
- *
- * #undef CLS_LOG
- * #define CLS_LOG(__FORMAT__, ...) CLSNSLog...
- *
- **/
-#ifdef DEBUG
-#define CLS_LOG(__FORMAT__, ...) CLSNSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
-#else
-#define CLS_LOG(__FORMAT__, ...) CLSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
-#endif
-
-/**
- *
- * Add logging that will be sent with your crash data. This logging will not show up in the system.log
- * and will only be visible in your Crashlytics dashboard.
- *
- **/
-OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
-OBJC_EXTERN void CLSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0);
-
-/**
- *
- * Add logging that will be sent with your crash data. This logging will show up in the system.log
- * and your Crashlytics dashboard. It is not recommended for Release builds.
- *
- **/
-OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
-OBJC_EXTERN void CLSNSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0);
-
-
-@protocol CrashlyticsDelegate;
-
-@interface Crashlytics : NSObject
-
-@property (nonatomic, readonly, copy) NSString *apiKey;
-@property (nonatomic, readonly, copy) NSString *version;
-@property (nonatomic, assign) BOOL debugMode;
-
-@property (nonatomic, assign) NSObject *delegate;
-
-/**
- *
- * The recommended way to install Crashlytics into your application is to place a call
- * to +startWithAPIKey: in your -application:didFinishLaunchingWithOptions: method.
- *
- * This delay defaults to 1 second in order to generally give the application time to
- * fully finish launching.
- *
- **/
-+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey;
-+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey afterDelay:(NSTimeInterval)delay;
-
-/**
- *
- * If you need the functionality provided by the CrashlyticsDelegate protocol, you can use
- * these convenience methods to activate the framework and set the delegate in one call.
- *
- **/
-+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(NSObject *)delegate;
-+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(NSObject *)delegate afterDelay:(NSTimeInterval)delay;
-
-/**
- *
- * Access the singleton Crashlytics instance.
- *
- **/
-+ (Crashlytics *)sharedInstance;
-
-/**
- *
- * The easiest way to cause a crash - great for testing!
- *
- **/
-- (void)crash;
-
-/**
- *
- * Many of our customers have requested the ability to tie crashes to specific end-users of their
- * application in order to facilitate responses to support requests or permit the ability to reach
- * out for more information. We allow you to specify up to three separate values for display within
- * the Crashlytics UI - but please be mindful of your end-user's privacy.
- *
- * We recommend specifying a user identifier - an arbitrary string that ties an end-user to a record
- * in your system. This could be a database id, hash, or other value that is meaningless to a
- * third-party observer but can be indexed and queried by you.
- *
- * Optionally, you may also specify the end-user's name or username, as well as email address if you
- * do not have a system that works well with obscured identifiers.
- *
- * Pursuant to our EULA, this data is transferred securely throughout our system and we will not
- * disseminate end-user data unless required to by law. That said, if you choose to provide end-user
- * contact information, we strongly recommend that you disclose this in your application's privacy
- * policy. Data privacy is of our utmost concern.
- *
- **/
-- (void)setUserIdentifier:(NSString *)identifier;
-- (void)setUserName:(NSString *)name;
-- (void)setUserEmail:(NSString *)email;
-
-+ (void)setUserIdentifier:(NSString *)identifier;
-+ (void)setUserName:(NSString *)name;
-+ (void)setUserEmail:(NSString *)email;
-
-/**
- *
- * Set a value for a key to be associated with your crash data.
- *
- **/
-- (void)setObjectValue:(id)value forKey:(NSString *)key;
-- (void)setIntValue:(int)value forKey:(NSString *)key;
-- (void)setBoolValue:(BOOL)value forKey:(NSString *)key;
-- (void)setFloatValue:(float)value forKey:(NSString *)key;
-
-+ (void)setObjectValue:(id)value forKey:(NSString *)key;
-+ (void)setIntValue:(int)value forKey:(NSString *)key;
-+ (void)setBoolValue:(BOOL)value forKey:(NSString *)key;
-+ (void)setFloatValue:(float)value forKey:(NSString *)key;
-
-@end
-
-/**
- * The CLSCrashReport protocol exposes methods that you can call on crash report objects passed
- * to delegate methods. If you want these values or the entire object to stay in memory retain
- * them or copy them.
- **/
-@protocol CLSCrashReport
-@required
-
-/**
- * Returns the session identifier for the crash report.
- **/
-@property (nonatomic, readonly) NSString *identifier;
-
-/**
- * Returns the custom key value data for the crash report.
- **/
-@property (nonatomic, readonly) NSDictionary *customKeys;
-
-/**
- * Returns the CFBundleVersion of the application that crashed.
- **/
-@property (nonatomic, readonly) NSString *bundleVersion;
-
-/**
- * Returns the CFBundleShortVersionString of the application that crashed.
- **/
-@property (nonatomic, readonly) NSString *bundleShortVersionString;
-
-/**
- * Returns the date that the application crashed at.
- **/
-@property (nonatomic, readonly) NSDate *crashedOnDate;
-
-/**
- * Returns the os version that the application crashed on.
- **/
-@property (nonatomic, readonly) NSString *OSVersion;
-
-/**
- * Returns the os build version that the application crashed on.
- **/
-@property (nonatomic, readonly) NSString *OSBuildVersion;
-
-@end
-
-/**
- *
- * The CrashlyticsDelegate protocol provides a mechanism for your application to take
- * action on events that occur in the Crashlytics crash reporting system. You can make
- * use of these calls by assigning an object to the Crashlytics' delegate property directly,
- * or through the convenience startWithAPIKey:delegate:... methods.
- *
- **/
-@protocol CrashlyticsDelegate
-@optional
-
-/**
- *
- * Called once a Crashlytics instance has determined that the last execution of the
- * application ended in a crash. This is called some time after the crash reporting
- * process has begun. If you have specified a delay in one of the
- * startWithAPIKey:... calls, this will take at least that long to be invoked.
- *
- **/
-- (void)crashlyticsDidDetectCrashDuringPreviousExecution:(Crashlytics *)crashlytics;
-
-/**
- *
- * Just like crashlyticsDidDetectCrashDuringPreviousExecution this delegate method is
- * called once a Crashlytics instance has determined that the last execution of the
- * application ended in a crash. A CLSCrashReport is passed back that contains data about
- * the last crash report that was generated. See the CLSCrashReport protocol for method details.
- * This method is called after crashlyticsDidDetectCrashDuringPreviousExecution.
- *
- **/
-- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id )crash;
-
-@end
-
-/**
- * `CrashlyticsKit` can be used as a parameter to `[Fabric with:@[CrashlyticsKit]];` in Objective-C. In Swift, simply use `Crashlytics()`
- */
-#define CrashlyticsKit [Crashlytics sharedInstance]
diff --git a/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist b/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist
deleted file mode 100644
index ead462e6..00000000
--- a/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- English
- CFBundleExecutable
- Crashlytics
- CFBundleIdentifier
- com.crashlytics.ios
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- Crashlytics
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 2.2.10
- CFBundleSupportedPlatforms
-
- iPhoneOS
-
- CFBundleVersion
- 45
- DTPlatformName
- iphoneos
- MinimumOSVersion
- 4.0
-
-
diff --git a/External/iOS/Crashlytics.framework/Versions/Current b/External/iOS/Crashlytics.framework/Versions/Current
deleted file mode 120000
index 8c7e5a66..00000000
--- a/External/iOS/Crashlytics.framework/Versions/Current
+++ /dev/null
@@ -1 +0,0 @@
-A
\ No newline at end of file
diff --git a/External/iOS/Crashlytics.framework/run b/External/iOS/Crashlytics.framework/run
index c79b0288..f4c57328 100755
Binary files a/External/iOS/Crashlytics.framework/run and b/External/iOS/Crashlytics.framework/run differ
diff --git a/External/iOS/Crashlytics.framework/submit b/External/iOS/Crashlytics.framework/submit
index 65568e31..11cdbc04 100755
Binary files a/External/iOS/Crashlytics.framework/submit and b/External/iOS/Crashlytics.framework/submit differ
diff --git a/External/iOS/Crashlytics.framework/uploadDSYM b/External/iOS/Crashlytics.framework/uploadDSYM
new file mode 100755
index 00000000..1d3cbe59
Binary files /dev/null and b/External/iOS/Crashlytics.framework/uploadDSYM differ
diff --git a/External/iOS/Fabric.framework/Fabric b/External/iOS/Fabric.framework/Fabric
new file mode 100755
index 00000000..da5acd2f
Binary files /dev/null and b/External/iOS/Fabric.framework/Fabric differ
diff --git a/External/iOS/Fabric.framework/Headers/FABAttributes.h b/External/iOS/Fabric.framework/Headers/FABAttributes.h
new file mode 100644
index 00000000..f4e06394
--- /dev/null
+++ b/External/iOS/Fabric.framework/Headers/FABAttributes.h
@@ -0,0 +1,48 @@
+//
+// FABAttributes.h
+// Fabric
+//
+// Copyright (c) 2015 Twitter. All rights reserved.
+//
+
+#pragma once
+
+#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x)))
+
+#if __has_feature(nullability)
+ #define fab_nullable nullable
+ #define fab_nonnull nonnull
+ #define fab_null_unspecified null_unspecified
+ #define fab_null_resettable null_resettable
+ #define __fab_nullable __nullable
+ #define __fab_nonnull __nonnull
+ #define __fab_null_unspecified __null_unspecified
+#else
+ #define fab_nullable
+ #define fab_nonnull
+ #define fab_null_unspecified
+ #define fab_null_resettable
+ #define __fab_nullable
+ #define __fab_nonnull
+ #define __fab_null_unspecified
+#endif
+
+#ifndef NS_ASSUME_NONNULL_BEGIN
+ #define NS_ASSUME_NONNULL_BEGIN
+#endif
+
+#ifndef NS_ASSUME_NONNULL_END
+ #define NS_ASSUME_NONNULL_END
+#endif
+
+
+/**
+ * The following macros are defined here to provide
+ * backwards compatability. If you are still using
+ * them you should migrate to the new versions that
+ * are defined above.
+ */
+#define FAB_NONNULL __fab_nonnull
+#define FAB_NULLABLE __fab_nullable
+#define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN
+#define FAB_END_NONNULL NS_ASSUME_NONNULL_END
diff --git a/External/iOS/Fabric.framework/Headers/Fabric.h b/External/iOS/Fabric.framework/Headers/Fabric.h
new file mode 100644
index 00000000..47a3d055
--- /dev/null
+++ b/External/iOS/Fabric.framework/Headers/Fabric.h
@@ -0,0 +1,64 @@
+//
+// Fabric.h
+//
+// Copyright (c) 2015 Twitter. All rights reserved.
+//
+
+#import
+#import "FABAttributes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+#if TARGET_OS_IPHONE
+#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000
+ #error "Fabric's minimum iOS version is 6.0"
+#endif
+#else
+#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070
+ #error "Fabric's minimum OS X version is 10.7"
+#endif
+#endif
+
+/**
+ * Fabric Base. Coordinates configuration and starts all provided kits.
+ */
+@interface Fabric : NSObject
+
+/**
+ * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use.
+ *
+ * For example, in Objective-C:
+ *
+ * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];`
+ *
+ * Swift:
+ *
+ * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])`
+ *
+ * Only the first call to this method is honored. Subsequent calls are no-ops.
+ *
+ * @param kitClasses An array of kit Class objects
+ *
+ * @return Returns the shared Fabric instance. In most cases this can be ignored.
+ */
++ (instancetype)with:(NSArray *)kitClasses;
+
+/**
+ * Returns the Fabric singleton object.
+ */
++ (instancetype)sharedSDK;
+
+/**
+ * This BOOL enables or disables debug logging, such as kit version information. The default value is NO.
+ */
+@property (nonatomic, assign) BOOL debug;
+
+/**
+ * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance.
+ */
+- (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance.");
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/External/iOS/Fabric.framework/Info.plist b/External/iOS/Fabric.framework/Info.plist
new file mode 100644
index 00000000..4b07ac25
--- /dev/null
+++ b/External/iOS/Fabric.framework/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ BuildMachineOSBuild
+ 14E46
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ Fabric
+ CFBundleIdentifier
+ io.fabric.sdk.ios
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Fabric
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.5.5
+ CFBundleSignature
+ ????
+ CFBundleSupportedPlatforms
+
+ iPhoneOS
+
+ CFBundleVersion
+ 30
+ DTCompiler
+ com.apple.compilers.llvm.clang.1_0
+ DTPlatformBuild
+ 13A340
+ DTPlatformName
+ iphoneos
+ DTPlatformVersion
+ 9.0
+ DTSDKBuild
+ 13A340
+ DTSDKName
+ iphoneos9.0
+ DTXcode
+ 0700
+ DTXcodeBuild
+ 7A220
+ MinimumOSVersion
+ 6.0
+ NSHumanReadableCopyright
+ Copyright © 2015 Twitter. All rights reserved.
+ UIDeviceFamily
+
+ 1
+ 2
+
+
+
diff --git a/External/iOS/Fabric.framework/Modules/module.modulemap b/External/iOS/Fabric.framework/Modules/module.modulemap
new file mode 100644
index 00000000..2a312239
--- /dev/null
+++ b/External/iOS/Fabric.framework/Modules/module.modulemap
@@ -0,0 +1,6 @@
+framework module Fabric {
+ umbrella header "Fabric.h"
+
+ export *
+ module * { export * }
+}
\ No newline at end of file
diff --git a/External/iOS/Fabric.framework/run b/External/iOS/Fabric.framework/run
new file mode 100755
index 00000000..f4c57328
--- /dev/null
+++ b/External/iOS/Fabric.framework/run
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+# run
+#
+# Copyright (c) 2015 Crashlytics. All rights reserved.
+
+# Figure out where we're being called from
+DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+
+# Quote path in case of spaces or special chars
+DIR="\"${DIR}"
+
+PATH_SEP="/"
+VALIDATE_COMMAND="uploadDSYM\" $@ validate"
+UPLOAD_COMMAND="uploadDSYM\" $@"
+
+# Ensure params are as expected, run in sync mode to validate
+eval $DIR$PATH_SEP$VALIDATE_COMMAND
+return_code=$?
+
+if [[ $return_code != 0 ]]; then
+ exit $return_code
+fi
+
+# Verification passed, upload dSYM in background to prevent Xcode from waiting
+# Note: Validation is performed again before upload.
+# Output can still be found in Console.app
+eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 &
diff --git a/External/iOS/Fabric.framework/uploadDSYM b/External/iOS/Fabric.framework/uploadDSYM
new file mode 100755
index 00000000..55d78a1d
Binary files /dev/null and b/External/iOS/Fabric.framework/uploadDSYM differ
diff --git a/MasterPassword/C/mpw-bench.c b/MasterPassword/C/mpw-bench.c
index 05ca66f1..a479b927 100644
--- a/MasterPassword/C/mpw-bench.c
+++ b/MasterPassword/C/mpw-bench.c
@@ -69,39 +69,39 @@ int main(int argc, char *const argv[]) {
masterKey, siteName, siteType, siteCounter, siteVariant, siteContext, MPAlgorithmVersionCurrent ) );
free( (void *)masterKey );
- if (i % 1 == 0)
- fprintf( stderr, "\rmpw: iteration %d / %d..", i, iterations );
+ if (i % ( iterations / 100 ) == 0)
+ fprintf( stderr, "\rmpw: iteration %d / %d (%d%%)..", i, iterations, i * 100 / iterations );
}
const double mpwSpeed = mpw_showSpeed( startTime, iterations, "mpw" );
// Start SHA-256
- iterations = 50000000;
+ iterations = 45000000;
uint8_t hash[32];
mpw_getTime( &startTime );
for (int i = 0; i < iterations; ++i) {
SHA256_Buf( masterPassword, strlen( masterPassword ), hash );
- if (i % 1000 == 0)
- fprintf( stderr, "\rsha256: iteration %d / %d..", i, iterations );
+ if (i % ( iterations / 100 ) == 0)
+ fprintf( stderr, "\rsha256: iteration %d / %d (%d%%)..", i, iterations, i * 100 / iterations );
}
const double sha256Speed = mpw_showSpeed( startTime, iterations, "sha256" );
// Start BCrypt
int bcrypt_cost = 9;
- iterations = 600;
+ iterations = 500;
mpw_getTime( &startTime );
for (int i = 0; i < iterations; ++i) {
crypt( masterPassword, crypt_gensalt( "$2b$", bcrypt_cost, fullName, strlen( fullName ) ) );
- if (i % 10 == 0)
- fprintf( stderr, "\rbcrypt (cost %d): iteration %d / %d..", bcrypt_cost, i, iterations );
+ if (i % ( iterations / 100 ) == 0)
+ fprintf( stderr, "\rbcrypt (cost %d): iteration %d / %d (%d%%)..", bcrypt_cost, i, iterations, i * 100 / iterations );
}
const double bcrypt9Speed = mpw_showSpeed( startTime, iterations, "bcrypt9" );
// Summarize.
fprintf( stdout, "\n== SUMMARY ==\nOn this machine,\n" );
- fprintf( stdout, " - mpw is %f times slower than sha256.\n", sha256Speed / mpwSpeed );
- fprintf( stdout, " - mpw is %f times slower than bcrypt (cost 9).\n", bcrypt9Speed / mpwSpeed );
+ fprintf( stdout, " - mpw is %f times slower than sha256 (reference: 414000 on an MBP Late 2013).\n", sha256Speed / mpwSpeed );
+ fprintf( stdout, " - mpw is %f times slower than bcrypt (cost 9) (reference: 4.86 on an MBP Late 2013).\n", bcrypt9Speed / mpwSpeed );
return 0;
}
diff --git a/MasterPassword/ObjC/MPAppDelegate_Key.m b/MasterPassword/ObjC/MPAppDelegate_Key.m
index 2b993521..47ef09a6 100644
--- a/MasterPassword/ObjC/MPAppDelegate_Key.m
+++ b/MasterPassword/ObjC/MPAppDelegate_Key.m
@@ -150,8 +150,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
@try {
if ([[MPConfig get].sendInfo boolValue]) {
#ifdef CRASHLYTICS
- [Crashlytics setObjectValue:user.userID forKey:@"username"];
- [Crashlytics setUserName:user.userID];
+ [[Crashlytics sharedInstance] setObjectValue:user.userID forKey:@"username"];
+ [[Crashlytics sharedInstance] setUserName:user.userID];
#endif
}
}
diff --git a/MasterPassword/ObjC/MPAppDelegate_Store.m b/MasterPassword/ObjC/MPAppDelegate_Store.m
index c1131ad2..b86b0410 100644
--- a/MasterPassword/ObjC/MPAppDelegate_Store.m
+++ b/MasterPassword/ObjC/MPAppDelegate_Store.m
@@ -821,9 +821,9 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
NSString *contentExport = content?: @"";
[export appendFormat:@"%@ %8ld %8S %25S\t%25S\t%@\n",
lastUsedExport, usesExport,
- (const unichar *)[typeExport cStringUsingEncoding:NSUTF16StringEncoding],
- (const unichar *)[loginNameExport cStringUsingEncoding:NSUTF16StringEncoding],
- (const unichar *)[siteName cStringUsingEncoding:NSUTF16StringEncoding],
+ (const unsigned short *)[typeExport cStringUsingEncoding:NSUTF16StringEncoding],
+ (const unsigned short *)[loginNameExport cStringUsingEncoding:NSUTF16StringEncoding],
+ (const unsigned short *)[siteName cStringUsingEncoding:NSUTF16StringEncoding],
contentExport];
}
diff --git a/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m b/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m
index eea75a52..bee7db5b 100644
--- a/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m
+++ b/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m
@@ -46,10 +46,10 @@
#if defined (DEBUG) || defined (ADHOC)
[Crashlytics sharedInstance].debugMode = YES;
#endif
- [Crashlytics setUserIdentifier:[PearlKeyChain deviceIdentifier]];
- [Crashlytics setObjectValue:[PearlKeyChain deviceIdentifier] forKey:@"deviceIdentifier"];
- [Crashlytics setUserName:@"Anonymous"];
- [Crashlytics setObjectValue:@"Anonymous" forKey:@"username"];
+ [[Crashlytics sharedInstance] setUserIdentifier:[PearlKeyChain deviceIdentifier]];
+ [[Crashlytics sharedInstance] setObjectValue:[PearlKeyChain deviceIdentifier] forKey:@"deviceIdentifier"];
+ [[Crashlytics sharedInstance] setUserName:@"Anonymous"];
+ [[Crashlytics sharedInstance] setObjectValue:@"Anonymous" forKey:@"username"];
[Crashlytics startWithAPIKey:crashlyticsAPIKey];
[[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) {
PearlLogLevel level = PearlLogLevelInfo;
diff --git a/MasterPassword/ObjC/iOS/MasterPassword-Info.plist b/MasterPassword/ObjC/iOS/MasterPassword-Info.plist
index 0c32cda6..6f053941 100644
--- a/MasterPassword/ObjC/iOS/MasterPassword-Info.plist
+++ b/MasterPassword/ObjC/iOS/MasterPassword-Info.plist
@@ -43,6 +43,20 @@
????
CFBundleVersion
[auto]
+ Fabric
+
+ APIKey
+ 0d10c90776f5ef5acd01ddbeaca9a6cba4814560
+ Kits
+
+
+ KitInfo
+
+ KitName
+ Crashlytics
+
+
+
LSRequiresIPhoneOS
NSHumanReadableCopyright
diff --git a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj
index 58296d80..47e0e9b5 100644
--- a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj
+++ b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj
@@ -98,6 +98,9 @@
DA29993219C9132F00AF7DF1 /* thumb_generated_login@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA29993119C9132F00AF7DF1 /* thumb_generated_login@3x.png */; };
DA29993319C9214600AF7DF1 /* icon_star-hollow.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD382A1711E29600CF925C /* icon_star-hollow.png */; };
DA29993419C9214600AF7DF1 /* icon_star-hollow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD382B1711E29600CF925C /* icon_star-hollow@2x.png */; };
+ DA2C3D611BD95EEE001137B3 /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2C3D601BD95EEE001137B3 /* Fabric.framework */; };
+ DA2C3D631BD96126001137B3 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2C3D621BD96126001137B3 /* libc++.tbd */; };
+ DA2C3D651BD9612F001137B3 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2C3D641BD9612F001137B3 /* libz.tbd */; };
DA2CA4DD18D28859007798F8 /* NSArray+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */; };
DA2CA4DE18D28859007798F8 /* NSArray+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */; };
DA2CA4DF18D28859007798F8 /* NSTimer+PearlBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */; };
@@ -163,7 +166,6 @@
DA6701B816406A4100B61001 /* Accounts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701B716406A4100B61001 /* Accounts.framework */; settings = {ATTRIBUTES = (Required, ); }; };
DA6701DE16406B7300B61001 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701DD16406B7300B61001 /* Social.framework */; settings = {ATTRIBUTES = (Required, ); }; };
DA6701E016406BB400B61001 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6701DF16406BB400B61001 /* AdSupport.framework */; settings = {ATTRIBUTES = (Required, ); }; };
- DA672D2F14F92C6B004A189C /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DA672D2E14F92C6B004A189C /* libz.dylib */; };
DA672D3014F9413D004A189C /* libPearl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC77CAD148291A600BCF976 /* libPearl.a */; };
DA67460D18DE7F0C00DFE240 /* Exo2.0-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA67460918DE7F0C00DFE240 /* Exo2.0-Thin.otf */; };
DA67460E18DE7F0C00DFE240 /* Exo2.0-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA67460A18DE7F0C00DFE240 /* Exo2.0-Regular.otf */; };
@@ -171,7 +173,6 @@
DA67461018DE7F0C00DFE240 /* Exo2.0-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA67460C18DE7F0C00DFE240 /* Exo2.0-Bold.otf */; };
DA69540617D975D900BF294E /* icon_gears.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37841711E29500CF925C /* icon_gears.png */; };
DA69540717D975D900BF294E /* icon_gears@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37851711E29500CF925C /* icon_gears@2x.png */; };
- DA72BD7919C137DE00E6ACFE /* libopensslcrypto-ios-dev.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA72BD7719C137D500E6ACFE /* libopensslcrypto-ios-dev.a */; };
DA72BD7B19C1510C00E6ACFE /* UIView+FontScale.m in Sources */ = {isa = PBXBuildFile; fileRef = DACE2F6719BA6A2A0010F92E /* UIView+FontScale.m */; };
DA73049D194E022700E72520 /* ui_spinner.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD36511711E29400CF925C /* ui_spinner.png */; };
DA73049E194E022700E72520 /* ui_spinner@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD36521711E29400CF925C /* ui_spinner@2x.png */; };
@@ -331,7 +332,6 @@
DACE2F6C19BA6A2A0010F92E /* PearlMutableStaticTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DACE2F6819BA6A2A0010F92E /* PearlMutableStaticTableViewController.m */; };
DACE2F6D19BA6A2A0010F92E /* PearlMutableStaticTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DACE2F6919BA6A2A0010F92E /* PearlMutableStaticTableViewController.h */; };
DACE2F6E19BA6A2A0010F92E /* UIView+FontScale.h in Headers */ = {isa = PBXBuildFile; fileRef = DACE2F6A19BA6A2A0010F92E /* UIView+FontScale.h */; };
- DAD312C21552A22700A3F9ED /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD312C01552A20800A3F9ED /* libsqlite3.dylib */; };
DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = DAE1EF2417E942DE00BC0086 /* Localizable.strings */; };
DAE2725919C93B80007C5262 /* libInAppSettingsKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAFC5655172C573B00CB5CC5 /* libInAppSettingsKit.a */; };
DAE2725A19C93B8E007C5262 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA70EC7F1811B13C00F65DB2 /* StoreKit.framework */; };
@@ -601,6 +601,10 @@
DA29992D19C86F5700AF7DF1 /* thumb_generated_login@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumb_generated_login@2x.png"; sourceTree = ""; };
DA29992E19C86F5700AF7DF1 /* thumb_generated_login.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumb_generated_login.png; sourceTree = ""; };
DA29993119C9132F00AF7DF1 /* thumb_generated_login@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumb_generated_login@3x.png"; sourceTree = ""; };
+ DA2C3D5E1BD95DEF001137B3 /* libscryptenc-ios-dev.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libscryptenc-ios-dev.a"; sourceTree = ""; };
+ DA2C3D601BD95EEE001137B3 /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Fabric.framework; path = ../../../External/iOS/Fabric.framework; sourceTree = ""; };
+ DA2C3D621BD96126001137B3 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
+ DA2C3D641BD9612F001137B3 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Pearl.m"; sourceTree = ""; };
DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Pearl.h"; sourceTree = ""; };
DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+PearlBlock.m"; sourceTree = ""; };
@@ -665,14 +669,12 @@
DA6701B716406A4100B61001 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = System/Library/Frameworks/Accounts.framework; sourceTree = SDKROOT; };
DA6701DD16406B7300B61001 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; };
DA6701DF16406BB400B61001 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
- DA672D2E14F92C6B004A189C /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
DA67460918DE7F0C00DFE240 /* Exo2.0-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Thin.otf"; sourceTree = ""; };
DA67460A18DE7F0C00DFE240 /* Exo2.0-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Regular.otf"; sourceTree = ""; };
DA67460B18DE7F0C00DFE240 /* Exo2.0-ExtraBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-ExtraBold.otf"; sourceTree = ""; };
DA67460C18DE7F0C00DFE240 /* Exo2.0-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo2.0-Bold.otf"; sourceTree = ""; };
DA6774351A4749CC004F356A /* mpw-tests.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-tests.c"; sourceTree = ""; };
DA70EC7F1811B13C00F65DB2 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
- DA72BD7419C133BF00E6ACFE /* libscryptenc-ios-sim.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libscryptenc-ios-sim.a"; sourceTree = ""; };
DA72BD7719C137D500E6ACFE /* libopensslcrypto-ios-dev.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libopensslcrypto-ios-dev.a"; sourceTree = ""; };
DA8495271A9146E600B3053D /* MasterPassword 7.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MasterPassword 7.xcdatamodel"; sourceTree = ""; };
DA854C8118D4CFBF00106317 /* avatar-add@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar-add@2x.png"; sourceTree = ""; };
@@ -1407,7 +1409,6 @@
DACE2F6819BA6A2A0010F92E /* PearlMutableStaticTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlMutableStaticTableViewController.m; sourceTree = ""; };
DACE2F6919BA6A2A0010F92E /* PearlMutableStaticTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlMutableStaticTableViewController.h; sourceTree = ""; };
DACE2F6A19BA6A2A0010F92E /* UIView+FontScale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+FontScale.h"; sourceTree = ""; };
- DAD312C01552A20800A3F9ED /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
DADBB55918DB0CFC00D099FE /* keyboard-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keyboard-dark@2x.png"; sourceTree = ""; };
DAE1EF2317E942DE00BC0086 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
DAE2726119CE9CB3007C5262 /* UITableViewCell+PearlDeque.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableViewCell+PearlDeque.m"; sourceTree = ""; };
@@ -1550,6 +1551,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ DA2C3D651BD9612F001137B3 /* libz.tbd in Frameworks */,
+ DA2C3D631BD96126001137B3 /* libc++.tbd in Frameworks */,
DAA1761B19D86D0D0044227B /* libAttributedMarkdown.a in Frameworks */,
DA32D03E19D11293004F3F0E /* libKCOrderedAccessorFix.a in Frameworks */,
DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */,
@@ -1558,20 +1561,18 @@
DA6701E016406BB400B61001 /* AdSupport.framework in Frameworks */,
DA6701DE16406B7300B61001 /* Social.framework in Frameworks */,
DA6701B816406A4100B61001 /* Accounts.framework in Frameworks */,
- DAD312C21552A22700A3F9ED /* libsqlite3.dylib in Frameworks */,
DABB981615100B4000B05417 /* SystemConfiguration.framework in Frameworks */,
DA672D3014F9413D004A189C /* libPearl.a in Frameworks */,
- DA672D2F14F92C6B004A189C /* libz.dylib in Frameworks */,
DAEBC45314F6364500987BF6 /* QuartzCore.framework in Frameworks */,
DA95D5F214DF0B2C008D1B94 /* MessageUI.framework in Frameworks */,
DA48856019A5A82E000C2D79 /* Crashlytics.framework in Frameworks */,
DAC632891486D9690075AEA5 /* Security.framework in Frameworks */,
- DA72BD7919C137DE00E6ACFE /* libopensslcrypto-ios-dev.a in Frameworks */,
DA5BFA49147E415C00F98B1E /* UIKit.framework in Frameworks */,
DA5BFA4B147E415C00F98B1E /* Foundation.framework in Frameworks */,
DA5BFA4D147E415C00F98B1E /* CoreGraphics.framework in Frameworks */,
DA5BFA4F147E415C00F98B1E /* CoreData.framework in Frameworks */,
93D399433EA75E50656040CB /* Twitter.framework in Frameworks */,
+ DA2C3D611BD95EEE001137B3 /* Fabric.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1773,6 +1774,9 @@
DA5BFA47147E415C00F98B1E /* Frameworks */ = {
isa = PBXGroup;
children = (
+ DA2C3D641BD9612F001137B3 /* libz.tbd */,
+ DA2C3D621BD96126001137B3 /* libc++.tbd */,
+ DA2C3D601BD95EEE001137B3 /* Fabric.framework */,
DA3B844D190FC5DF00246EEA /* Crashlytics.framework */,
DA70EC7F1811B13C00F65DB2 /* StoreKit.framework */,
DA6701DF16406BB400B61001 /* AdSupport.framework */,
@@ -1780,10 +1784,8 @@
DA6701B716406A4100B61001 /* Accounts.framework */,
93D394077F8FAB8167647187 /* Twitter.framework */,
DAAC35DD156BD77D00C5FD93 /* CoreTelephony.framework */,
- DAD312C01552A20800A3F9ED /* libsqlite3.dylib */,
DA95D5F014DF0B1E008D1B94 /* MessageUI.framework */,
DABB981515100B4000B05417 /* SystemConfiguration.framework */,
- DA672D2E14F92C6B004A189C /* libz.dylib */,
DAEBC45214F6364500987BF6 /* QuartzCore.framework */,
DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */,
DAC632871486D95D0075AEA5 /* Security.framework */,
@@ -1798,11 +1800,11 @@
DA5E5C6317248959003798D8 /* lib */ = {
isa = PBXGroup;
children = (
- DA72BD7719C137D500E6ACFE /* libopensslcrypto-ios-dev.a */,
- DA72BD7419C133BF00E6ACFE /* libscryptenc-ios-sim.a */,
- DAE8E65119867AB500416A0F /* libopensslcrypto-ios.a */,
- DAFFC63E17EDDA7C007BB020 /* libscryptenc-ios.a */,
DA5E5C6417248959003798D8 /* include */,
+ DA72BD7719C137D500E6ACFE /* libopensslcrypto-ios-dev.a */,
+ DAE8E65119867AB500416A0F /* libopensslcrypto-ios.a */,
+ DA2C3D5E1BD95DEF001137B3 /* libscryptenc-ios-dev.a */,
+ DAFFC63E17EDDA7C007BB020 /* libscryptenc-ios.a */,
);
path = lib;
sourceTree = "";
@@ -4020,15 +4022,18 @@
);
OTHER_LDFLAGS = (
"$(inherited)",
- "-lscryptenc-ios",
"-framework",
Reveal,
);
+ "OTHER_LDFLAGS[sdk=iphoneos*]" = (
+ "$(inherited)",
+ "-lscryptenc-ios",
+ "-lopensslcrypto-ios",
+ );
"OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
"$(inherited)",
- "-lscryptenc-ios-sim",
- "-framework",
- Reveal,
+ "-lscryptenc-ios-dev",
+ "-lopensslcrypto-ios-dev",
);
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
PROVISIONING_PROFILE = "";
@@ -4057,13 +4062,16 @@
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto/lib\"",
"$(inherited)",
);
- OTHER_LDFLAGS = (
+ OTHER_LDFLAGS = "$(inherited)";
+ "OTHER_LDFLAGS[sdk=iphoneos*]" = (
"$(inherited)",
"-lscryptenc-ios",
+ "-lopensslcrypto-ios",
);
"OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
"$(inherited)",
- "-lscryptenc-ios-sim",
+ "-lscryptenc-ios-dev",
+ "-lopensslcrypto-ios-dev",
);
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
PROVISIONING_PROFILE = "";
@@ -4173,13 +4181,16 @@
"\"$(SRCROOT)/../../../External/Pearl/Pearl-Crypto/lib\"",
"$(inherited)",
);
- OTHER_LDFLAGS = (
+ OTHER_LDFLAGS = "$(inherited)";
+ "OTHER_LDFLAGS[sdk=iphoneos*]" = (
"$(inherited)",
"-lscryptenc-ios",
+ "-lopensslcrypto-ios",
);
"OTHER_LDFLAGS[sdk=iphonesimulator*]" = (
"$(inherited)",
- "-lscryptenc-ios-sim",
+ "-lscryptenc-ios-dev",
+ "-lopensslcrypto-ios-dev",
);
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
PROVISIONING_PROFILE = "";