Skip to content

Commit c0558fd

Browse files
committed
Merge branch 'release/v3.2-27'
2 parents 9cdd8a6 + 5136ec8 commit c0558fd

File tree

77 files changed

+645
-652
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+645
-652
lines changed

.gitmodules

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,25 @@
66
url = https://github.com/meganz/MWPhotoBrowser.git
77
[submodule "iMEGA/Vendor/SVProgressHUD"]
88
path = iMEGA/Vendor/SVProgressHUD
9-
url = https://github.com/meganz/SVProgressHUD.git
9+
url = https://github.com/SVProgressHUD/SVProgressHUD.git
1010
[submodule "iMEGA/Vendor/sskeychain"]
1111
path = iMEGA/Vendor/sskeychain
1212
url = https://github.com/meganz/sskeychain.git
1313
[submodule "iMEGA/Vendor/GKContactImage"]
1414
path = iMEGA/Vendor/GKContactImage
15-
url = https://github.com/meganz/GKContactImage.git
15+
url = https://github.com/gekitz/GKContactImage.git
1616
[submodule "iMEGA/Vendor/Reachability"]
1717
path = iMEGA/Vendor/Reachability
18-
url = https://github.com/meganz/Reachability.git
18+
url = https://github.com/tonymillion/Reachability.git
1919
[submodule "iMEGA/Vendor/LTHPasscodeViewController"]
2020
path = iMEGA/Vendor/LTHPasscodeViewController
21-
url = https://github.com/jnavarrom/LTHPasscodeViewController.git
21+
url = https://github.com/rolandleth/LTHPasscodeViewController.git
2222
[submodule "iMEGA/Vendor/SVWebViewController"]
2323
path = iMEGA/Vendor/SVWebViewController
24-
url = https://github.com/meganz/SVWebViewController.git
24+
url = https://github.com/TransitApp/SVWebViewController.git
2525
[submodule "iMEGA/Vendor/DZNEmptyDataSet"]
2626
path = iMEGA/Vendor/DZNEmptyDataSet
27-
url = https://github.com/meganz/DZNEmptyDataSet.git
27+
url = https://github.com/dzenbot/DZNEmptyDataSet.git
2828
[submodule "iMEGA/Vendor/AMLocalizedString"]
2929
path = iMEGA/Vendor/AMLocalizedString
3030
url = https://github.com/tagyro/AMLocalizedString.git
@@ -33,4 +33,4 @@
3333
url = https://github.com/meganz/CTAssetsPickerController.git
3434
[submodule "iMEGA/Vendor/DateTools"]
3535
path = iMEGA/Vendor/DateTools
36-
url = https://github.com/meganz/DateTools.git
36+
url = https://github.com/MatthewYork/DateTools.git

MEGA.xcodeproj/project.pbxproj

+6
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
415227501A6986E000EC7BB6 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4152274F1A6986E000EC7BB6 /* MapKit.framework */; };
5151
4156C80C1AD7E79A00F5E818 /* LTHKeychainUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4156C8091AD7E79A00F5E818 /* LTHKeychainUtils.m */; };
5252
4156C80D1AD7E79A00F5E818 /* LTHPasscodeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4156C80B1AD7E79A00F5E818 /* LTHPasscodeViewController.m */; };
53+
415C6B921CE39D6100B13070 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 415C6B911CE39D6100B13070 /* SVProgressAnimatedView.m */; };
5354
415DCF241BF48EFA00914A1E /* ContactRequestsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 415DCF231BF48EFA00914A1E /* ContactRequestsViewController.m */; };
5455
416625281B66552800AEB579 /* SSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 416625231B66552800AEB579 /* SSKeychain.m */; };
5556
416625291B66552800AEB579 /* SSKeychainQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 416625251B66552800AEB579 /* SSKeychainQuery.m */; };
@@ -257,6 +258,8 @@
257258
4156C8091AD7E79A00F5E818 /* LTHKeychainUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LTHKeychainUtils.m; sourceTree = "<group>"; };
258259
4156C80A1AD7E79A00F5E818 /* LTHPasscodeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LTHPasscodeViewController.h; sourceTree = "<group>"; };
259260
4156C80B1AD7E79A00F5E818 /* LTHPasscodeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = LTHPasscodeViewController.m; sourceTree = "<group>"; };
261+
415C6B901CE39D6100B13070 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVProgressAnimatedView.h; sourceTree = "<group>"; };
262+
415C6B911CE39D6100B13070 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVProgressAnimatedView.m; sourceTree = "<group>"; };
260263
415DCF221BF48EFA00914A1E /* ContactRequestsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactRequestsViewController.h; sourceTree = "<group>"; };
261264
415DCF231BF48EFA00914A1E /* ContactRequestsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactRequestsViewController.m; sourceTree = "<group>"; };
262265
416625221B66552800AEB579 /* SSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKeychain.h; sourceTree = "<group>"; };
@@ -746,6 +749,8 @@
746749
415227351A692EEF00EC7BB6 /* SVProgressHUD */ = {
747750
isa = PBXGroup;
748751
children = (
752+
415C6B901CE39D6100B13070 /* SVProgressAnimatedView.h */,
753+
415C6B911CE39D6100B13070 /* SVProgressAnimatedView.m */,
749754
41D8ECDA1BCEBD3200B8FA08 /* SVIndefiniteAnimatedView.h */,
750755
41D8ECDB1BCEBD3200B8FA08 /* SVIndefiniteAnimatedView.m */,
751756
41D8ECDC1BCEBD3200B8FA08 /* SVRadialGradientLayer.h */,
@@ -1403,6 +1408,7 @@
14031408
E8D4B8921A69429200A3B2E2 /* CreateAccountViewController.m in Sources */,
14041409
E8F791801BC5754A00C58676 /* OpenInActivity.m in Sources */,
14051410
410AD3C11C883AA900BF939E /* MEGAAVViewController.m in Sources */,
1411+
415C6B921CE39D6100B13070 /* SVProgressAnimatedView.m in Sources */,
14061412
4182B4EF1BF4ADD400E6FFB8 /* ContactRequestsTableViewCell.m in Sources */,
14071413
4147C2D11B4EE8A400A37044 /* MEGACD.xcdatamodeld in Sources */,
14081414
E8F791821BC5754A00C58676 /* ShareFolderActivity.m in Sources */,

iMEGA/AppDelegate.m

+65-108
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,12 @@
4040
#import "OfflineTableViewController.h"
4141
#import "SettingsTableViewController.h"
4242
#import "SecurityOptionsTableViewController.h"
43+
#import "ContactRequestsViewController.h"
4344

4445
#import "BrowserViewController.h"
4546
#import "MEGAStore.h"
4647
#import "MEGAPurchase.h"
4748

48-
#import <ifaddrs.h>
49-
#import <arpa/inet.h>
5049
#import <Crashlytics/Crashlytics.h>
5150
#import <Fabric/Fabric.h>
5251
#import <QuickLook/QuickLook.h>
@@ -66,7 +65,8 @@ typedef NS_ENUM(NSUInteger, URLType) {
6665
URLTypeConfirmationLink,
6766
URLTypeOpenInLink,
6867
URLTypeNewSignUpLink,
69-
URLTypeBackupLink
68+
URLTypeBackupLink,
69+
URLTypeIncomingPendingContactsLink
7070
};
7171

7272
@interface AppDelegate () <UIAlertViewDelegate, LTHPasscodeViewControllerDelegate> {
@@ -83,12 +83,12 @@ @interface AppDelegate () <UIAlertViewDelegate, LTHPasscodeViewControllerDelegat
8383
NSTimer *timerAPI_EAGAIN;
8484
}
8585

86-
@property (nonatomic, strong) NSString *IpAddress;
87-
8886
@property (nonatomic, strong) NSURL *link;
8987
@property (nonatomic) URLType urlType;
9088
@property (nonatomic, strong) NSString *emailOfNewSignUpLink;
9189

90+
@property (nonatomic, strong) UIAlertView *API_ESIDAlertView;
91+
9292
@property (nonatomic, weak) MainTabBarController *mainTBC;
9393

9494
@end
@@ -106,11 +106,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
106106
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
107107
[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
108108

109-
self.IpAddress = [self getIpAddress];
110109
[MEGAReachabilityManager sharedManager];
111110

112-
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityDidChange:) name:kReachabilityChangedNotification object:nil];
113-
114111
[UIDevice currentDevice].batteryMonitoringEnabled = YES;
115112
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryChanged:) name:UIDeviceBatteryStateDidChangeNotification object:nil];
116113

@@ -524,6 +521,11 @@ - (void)processLink:(NSURL *)url {
524521
return;
525522
}
526523

524+
if ([self isIncomingPendingContactsLink:afterSlashesString]) {
525+
self.urlType = URLTypeIncomingPendingContactsLink;
526+
return;
527+
}
528+
527529
[self showLinkNotValid];
528530
}
529531

@@ -657,6 +659,33 @@ - (BOOL)isBackupLink:(NSString *)afterSlashesString {
657659
return NO;
658660
}
659661

662+
- (BOOL)isIncomingPendingContactsLink:(NSString *)afterSlashesString {
663+
if (afterSlashesString.length < 6) {
664+
return NO;
665+
}
666+
667+
BOOL isIncomingPendingContactsLink = [[afterSlashesString substringToIndex:7] isEqualToString:@"#fm/ipc"]; //mega://"#fm/ipc"
668+
if (isIncomingPendingContactsLink) {
669+
if ([SSKeychain passwordForService:@"MEGA" account:@"sessionV3"]) {
670+
ContactRequestsViewController *contactsRequestsVC = [[UIStoryboard storyboardWithName:@"Contacts" bundle:nil] instantiateViewControllerWithIdentifier:@"ContactsRequestsViewControllerID"];
671+
UIBarButtonItem *cancelBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"cancelIcon"] style:UIBarButtonItemStylePlain target:nil action:@selector(dismissPresentedViews)];
672+
[contactsRequestsVC.navigationItem setLeftBarButtonItem:cancelBarButtonItem];
673+
MEGANavigationController *navigationController = [[MEGANavigationController alloc] initWithRootViewController:contactsRequestsVC];
674+
[self presentLinkViewController:navigationController];
675+
} else {
676+
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:AMLocalizedString(@"pleaseLogInToYourAccount", nil)
677+
message:nil
678+
delegate:self
679+
cancelButtonTitle:AMLocalizedString(@"ok", nil)
680+
otherButtonTitles:nil];
681+
[alert show];
682+
}
683+
return YES;
684+
}
685+
686+
return NO;
687+
}
688+
660689
- (void)openIn {
661690
if ([SSKeychain passwordForService:@"MEGA" account:@"sessionV3"]) {
662691
MEGANavigationController *browserNavigationController = [[UIStoryboard storyboardWithName:@"Cloud" bundle:nil] instantiateViewControllerWithIdentifier:@"BrowserNavigationControllerID"];
@@ -767,76 +796,6 @@ - (UIBarButtonItem *)cancelBarButtonItem {
767796
return cancelBarButtonItem;
768797
}
769798

770-
#pragma mark - Get IP Address
771-
772-
- (NSString *)getIpAddress {
773-
NSString *address = nil;
774-
775-
struct ifaddrs *interfaces = NULL;
776-
struct ifaddrs *temp_addr = NULL;
777-
778-
int success = 0;
779-
success = getifaddrs(&interfaces);
780-
if (success == 0) {
781-
782-
temp_addr = interfaces;
783-
while(temp_addr != NULL) {
784-
if(temp_addr->ifa_addr->sa_family == AF_INET) {
785-
if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"] || [[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"pdp_ip0"]) {
786-
char straddr[INET_ADDRSTRLEN];
787-
inet_ntop(AF_INET, (void *)&((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr, straddr, sizeof(straddr));
788-
789-
if(strncasecmp(straddr, "127.", 4) && strncasecmp(straddr, "169.254.", 8)) {
790-
address = [NSString stringWithUTF8String:straddr];
791-
}
792-
}
793-
}
794-
795-
if(temp_addr->ifa_addr->sa_family == AF_INET6) {
796-
if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"] || [[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"pdp_ip0"]) {
797-
char straddr[INET6_ADDRSTRLEN];
798-
inet_ntop(AF_INET6, (void *)&((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr, straddr, sizeof(straddr));
799-
800-
if(strncasecmp(straddr, "FE80:", 5) && strncasecmp(straddr, "FD00:", 5)) {
801-
address = [NSString stringWithUTF8String:straddr];
802-
}
803-
}
804-
}
805-
806-
temp_addr = temp_addr->ifa_next;
807-
}
808-
}
809-
810-
freeifaddrs(interfaces);
811-
812-
return address;
813-
}
814-
815-
#pragma mark - Reachability Changes
816-
817-
- (void)reachabilityDidChange:(NSNotification *)notification {
818-
819-
if ([MEGAReachabilityManager isReachable]) {
820-
NSString *currentIP = [self getIpAddress];
821-
if (![self.IpAddress isEqualToString:currentIP]) {
822-
[[MEGASdkManager sharedMEGASdk] reconnect];
823-
self.IpAddress = currentIP;
824-
}
825-
}
826-
827-
if ([[CameraUploads syncManager] isCameraUploadsEnabled]) {
828-
if (![[CameraUploads syncManager] isUseCellularConnectionEnabled]) {
829-
if ([MEGAReachabilityManager isReachableViaWWAN]) {
830-
[[CameraUploads syncManager] resetOperationQueue];
831-
}
832-
833-
if ([[MEGASdkManager sharedMEGASdk] isLoggedIn] && [MEGAReachabilityManager isReachableViaWiFi]) {
834-
[[CameraUploads syncManager] setIsCameraUploadsEnabled:YES];
835-
}
836-
}
837-
}
838-
}
839-
840799
#pragma mark - Battery changed
841800

842801
- (void)batteryChanged:(NSNotification *)notification {
@@ -1108,9 +1067,13 @@ - (void)onRequestFinish:(MEGASdk *)api request:(MEGARequest *)request error:(MEG
11081067
}
11091068

11101069
case MEGAErrorTypeApiESid: {
1111-
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:AMLocalizedString(@"loggedOut_alertTitle", nil) message:AMLocalizedString(@"loggedOutFromAnotherLocation", nil) delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
1112-
[alertView show];
1113-
[Helper logout];
1070+
if ([request type] == MEGARequestTypeLogin || [request type] == MEGARequestTypeLogout) {
1071+
if (![_API_ESIDAlertView isVisible]) {
1072+
_API_ESIDAlertView = [[UIAlertView alloc] initWithTitle:AMLocalizedString(@"loggedOut_alertTitle", nil) message:AMLocalizedString(@"loggedOutFromAnotherLocation", nil) delegate:nil cancelButtonTitle:AMLocalizedString(@"ok", nil) otherButtonTitles:nil, nil];
1073+
[_API_ESIDAlertView show];
1074+
[Helper logout];
1075+
}
1076+
}
11141077
break;
11151078
}
11161079

@@ -1120,9 +1083,12 @@ - (void)onRequestFinish:(MEGASdk *)api request:(MEGARequest *)request error:(MEG
11201083
}
11211084

11221085
case MEGAErrorTypeApiESSL: {
1123-
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:AMLocalizedString(@"sslUnverified_alertTitle", nil) message:nil delegate:nil cancelButtonTitle:AMLocalizedString(@"ok", nil) otherButtonTitles:nil, nil];
1124-
[alertView show];
1125-
[Helper logout];
1086+
if ([request type] == MEGARequestTypeLogout) {
1087+
NSString *issuer = [NSString stringWithFormat:@"(Issuer: %@)", [request text] ? [request text] : @"Unknown"];
1088+
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:AMLocalizedString(@"sslUnverified_alertTitle", nil) message:issuer delegate:nil cancelButtonTitle:AMLocalizedString(@"ok", nil) otherButtonTitles:nil, nil];
1089+
[alertView show];
1090+
[Helper logout];
1091+
}
11261092
break;
11271093
}
11281094

@@ -1353,31 +1319,10 @@ - (void)onTransferUpdate:(MEGASdk *)api transfer:(MEGATransfer *)transfer {
13531319
}
13541320

13551321
- (void)onTransferFinish:(MEGASdk *)api transfer:(MEGATransfer *)transfer error:(MEGAError *)error {
1356-
if ([error type]) {
1357-
switch ([error type]) {
1358-
case MEGAErrorTypeApiEOverQuota: {
1359-
[self showOverquotaAlert];
1360-
break;
1361-
}
1362-
1363-
default:
1364-
break;
1365-
}
1366-
return;
1367-
}
1368-
13691322
if (transfer.isStreamingTransfer) {
13701323
return;
13711324
}
13721325

1373-
//Delete local file even if we get an error
1374-
if ([transfer type] == MEGATransferTypeUpload) {
1375-
NSError *error = nil;
1376-
if (![[NSFileManager defaultManager] removeItemAtPath:transfer.path error:&error]) {
1377-
MEGALogError(@"Remove item at path: %@", error)
1378-
}
1379-
}
1380-
13811326
//Delete transfer from dictionary file even if we get an error
13821327
MEGANode *node = nil;
13831328
if ([transfer type] == MEGATransferTypeDownload) {
@@ -1388,9 +1333,23 @@ - (void)onTransferFinish:(MEGASdk *)api transfer:(MEGATransfer *)transfer error:
13881333
if (node) {
13891334
[[Helper downloadingNodes] removeObjectForKey:node.base64Handle];
13901335
}
1336+
} else if ([transfer type] == MEGATransferTypeUpload) {
1337+
NSError *error = nil;
1338+
if (![[NSFileManager defaultManager] removeItemAtPath:transfer.path error:&error]) {
1339+
MEGALogError(@"Remove item at path: %@", error)
1340+
}
13911341
}
13921342

13931343
if ([error type]) {
1344+
switch ([error type]) {
1345+
case MEGAErrorTypeApiEOverQuota: {
1346+
[self showOverquotaAlert];
1347+
break;
1348+
}
1349+
1350+
default:
1351+
break;
1352+
}
13941353
return;
13951354
}
13961355

@@ -1446,9 +1405,7 @@ - (void)onTransferFinish:(MEGASdk *)api transfer:(MEGATransfer *)transfer error:
14461405

14471406
[[NSFileManager defaultManager] removeItemAtPath:tmpImagePath error:nil];
14481407
}
1449-
}
1450-
1451-
if ([transfer type] == MEGATransferTypeUpload) {
1408+
} else if ([transfer type] == MEGATransferTypeUpload) {
14521409
if (isImage([transfer fileName].pathExtension)) {
14531410
MEGANode *node = [api nodeForHandle:transfer.nodeHandle];
14541411
[api createThumbnail:transfer.path destinatioPath:[Helper pathForNode:node searchPath:NSCachesDirectory directory:@"thumbnailsV3"]];

iMEGA/Camera uploads/CameraUploads.h

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121

2222
#import <Foundation/Foundation.h>
23+
#import <UIKit/UIKit.h>
2324
#import "MEGASdkManager.h"
2425

2526
#define kIsCameraUploadsEnabled @"IsCameraUploadsEnabled"

iMEGA/Camera uploads/MEGAAssetOperation.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ - (void)checkiOS8AndiOS9PHAsset {
204204

205205
- (void)checkiOS7ALAsset {
206206
NSDate *creationDate = [_alasset valueForProperty:ALAssetPropertyDate];
207-
NSString *extension = [[[[[_alasset defaultRepresentation] url] absoluteString] stringBetweenString:@"&ext=" andString:@"\n"] lowercaseString];
207+
NSString *extension = [[[[[_alasset defaultRepresentation] url] absoluteString] mnz_stringBetweenString:@"&ext=" andString:@"\n"] lowercaseString];
208208
NSString *name = [[_dateFormatter stringFromDate:creationDate] stringByAppendingPathExtension:extension];
209209
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:name];
210210

@@ -444,7 +444,7 @@ - (void)onTransferFinish:(MEGASdk *)api transfer:(MEGATransfer *)transfer error:
444444
if ([error type]) {
445445
if ([error type] == MEGAErrorTypeApiEIncomplete) {
446446
[self start];
447-
} else {
447+
} else if ([error type] != MEGAErrorTypeApiEExist) {
448448
[[CameraUploads syncManager] resetOperationQueue];
449449
}
450450
return;

iMEGA/Camera uploads/Photos.storyboard

+2
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@
270270
<navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="o0V-gx-grO">
271271
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
272272
<autoresizingMask key="autoresizingMask"/>
273+
<color key="barTintColor" red="0.97647058819999999" green="0.97647058819999999" blue="0.97647058819999999" alpha="1" colorSpace="calibratedRGB"/>
273274
</navigationBar>
274275
<nil name="viewControllers"/>
275276
<connections>
@@ -413,6 +414,7 @@
413414
<navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="e0Q-gH-Idh">
414415
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
415416
<autoresizingMask key="autoresizingMask"/>
417+
<color key="barTintColor" red="0.97647058819999999" green="0.97647058819999999" blue="0.97647058819999999" alpha="1" colorSpace="calibratedRGB"/>
416418
</navigationBar>
417419
<nil name="viewControllers"/>
418420
<connections>

0 commit comments

Comments
 (0)