diff --git a/Podfile.lock b/Podfile.lock index f7a9fcb0..1c817224 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,13 +1,13 @@ PODS: - Alamofire (4.2.0) - BRLOptionParser (0.3.1) - - GCDWebServer (3.3.3): - - GCDWebServer/Core (= 3.3.3) - - GCDWebServer/Core (3.3.3) + - GCDWebServer (3.4.2): + - GCDWebServer/Core (= 3.4.2) + - GCDWebServer/Core (3.4.2) - MASShortcut (2.3.6) - - RxCocoa (3.3.1): - - RxSwift (~> 3.3) - - RxSwift (3.3.1) + - RxCocoa (3.6.1): + - RxSwift (~> 3.6) + - RxSwift (3.6.1) DEPENDENCIES: - Alamofire (~> 4.2.0) @@ -20,10 +20,10 @@ DEPENDENCIES: SPEC CHECKSUMS: Alamofire: aa2e09d871c9160ac53c90e83c68064a94e3dfbe BRLOptionParser: a03256a8ff003ca1f5376c55f55f210e085a3958 - GCDWebServer: 1c39a1f0763e4eb492bee021e4270fce097d3555 + GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa - RxCocoa: 7dcb7a1860fc9cd0e23dae67ab105fc2916670b6 - RxSwift: 8fc9f2de6275a9101d518444e00bf32f1a42caac + RxCocoa: 84a08739ab186248c7f31ce4ee92d6f8a947d690 + RxSwift: f9de85ea20cd2f7716ee5409fc13523dc638e4e4 PODFILE CHECKSUM: 5abdd116651e99453ca2480b0a17344fadc111ea diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h index 78fb4c0b..59572bab 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h @@ -30,6 +30,8 @@ #import "GCDWebServerRequest.h" #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerMatchBlock is called for every handler added to the * GCDWebServer whenever a new HTTP request has started (i.e. HTTP headers have @@ -40,7 +42,7 @@ * GCDWebServerRequest instance created with the same basic info. * Otherwise, it simply returns nil. */ -typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery); +typedef GCDWebServerRequest* _Nullable (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery); /** * The GCDWebServerProcessBlock is called after the HTTP request has been fully @@ -52,7 +54,7 @@ typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, * recommended to return a GCDWebServerErrorResponse on error so more useful * information can be returned to the client. */ -typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request); +typedef GCDWebServerResponse* _Nullable (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request); /** * The GCDWebServerAsynchronousProcessBlock works like the GCDWebServerProcessBlock @@ -64,7 +66,7 @@ typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(__kindof GCDWebServerR * It's however recommended to return a GCDWebServerErrorResponse on error so more * useful information can be returned to the client. */ -typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* response); +typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* _Nullable response); typedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock); /** @@ -295,7 +297,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; /** * Sets the delegate for the server. */ -@property(nonatomic, assign) id delegate; +@property(nonatomic, weak, nullable) id delegate; /** * Returns YES if the server is currently running. @@ -315,7 +317,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * @warning This property is only valid if the server is running and Bonjour * registration has successfully completed, which can take up to a few seconds. */ -@property(nonatomic, readonly) NSString* bonjourName; +@property(nonatomic, readonly, nullable) NSString* bonjourName; /** * Returns the Bonjour service type used by the server. @@ -323,7 +325,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * @warning This property is only valid if the server is running and Bonjour * registration has successfully completed, which can take up to a few seconds. */ -@property(nonatomic, readonly) NSString* bonjourType; +@property(nonatomic, readonly, nullable) NSString* bonjourType; /** * This method is the designated initializer for the class. @@ -363,7 +365,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Returns NO if the server failed to start and sets "error" argument if not NULL. */ -- (BOOL)startWithOptions:(NSDictionary*)options error:(NSError**)error; +- (BOOL)startWithOptions:(nullable NSDictionary*)options error:(NSError** _Nullable)error; /** * Stops the server and prevents it to accepts new HTTP requests. @@ -383,7 +385,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * @warning This property is only valid if the server is running. */ -@property(nonatomic, readonly) NSURL* serverURL; +@property(nonatomic, readonly, nullable) NSURL* serverURL; /** * Returns the server's Bonjour URL. @@ -393,7 +395,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * Also be aware this property will not automatically update if the Bonjour hostname * has been dynamically changed after the server started running (this should be rare). */ -@property(nonatomic, readonly) NSURL* bonjourServerURL; +@property(nonatomic, readonly, nullable) NSURL* bonjourServerURL; /** * Returns the server's public URL. @@ -401,7 +403,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * @warning This property is only valid if the server is running and NAT port * mapping is active. */ -@property(nonatomic, readonly) NSURL* publicServerURL; +@property(nonatomic, readonly, nullable) NSURL* publicServerURL; /** * Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS) @@ -418,7 +420,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Returns NO if the server failed to start. */ -- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name; +- (BOOL)startWithPort:(NSUInteger)port bonjourName:(nullable NSString*)name; #if !TARGET_OS_IPHONE @@ -431,7 +433,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * @warning This method must be used from the main thread only. */ -- (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name; +- (BOOL)runWithPort:(NSUInteger)port bonjourName:(nullable NSString*)name; /** * Runs the server synchronously using -startWithOptions: until a SIGTERM or @@ -442,7 +444,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * @warning This method must be used from the main thread only. */ -- (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error; +- (BOOL)runWithOptions:(nullable NSDictionary*)options error:(NSError** _Nullable)error; #endif @@ -498,7 +500,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * Adds a handler to the server to respond to incoming "GET" HTTP requests * with a specific case-insensitive path with in-memory data. */ -- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge; +- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(nullable NSString*)contentType cacheAge:(NSUInteger)cacheAge; /** * Adds a handler to the server to respond to incoming "GET" HTTP requests @@ -515,7 +517,7 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * The "indexFilename" argument allows to specify an "index" file name to use * when the request path corresponds to a directory. */ -- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests; +- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(nullable NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests; @end @@ -530,11 +532,10 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Currently supported third-party logging facilities are: * - XLFacility (by the same author as GCDWebServer): https://github.com/swisspol/XLFacility - * - CocoaLumberjack: https://github.com/CocoaLumberjack/CocoaLumberjack * - * For both the built-in logging facility and CocoaLumberjack, the default - * logging level is INFO (or DEBUG if the preprocessor constant "DEBUG" - * evaluates to non-zero at compile time). + * For the built-in logging facility, the default logging level is INFO + * (or DEBUG if the preprocessor constant "DEBUG" evaluates to non-zero at + * compile time). * * It's possible to have GCDWebServer use a custom logging facility by defining * the "__GCDWEBSERVER_LOGGING_HEADER__" preprocessor constant in Xcode build @@ -575,22 +576,22 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; /** * Logs a message to the logging facility at the VERBOSE level. */ -- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the INFO level. */ -- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the WARNING level. */ -- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the ERROR level. */ -- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); @end @@ -612,8 +613,10 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * * Returns the number of failed tests or -1 if server failed to start. */ -- (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path; +- (NSInteger)runTestsWithOptions:(nullable NSDictionary*)options inDirectory:(NSString*)path; @end #endif + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m index c773f948..e52ccd4d 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m @@ -77,12 +77,6 @@ #else GCDWebServerLoggingLevel GCDWebServerLogLevel = kGCDWebServerLoggingLevel_Info; #endif -#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__) -#if DEBUG -DDLogLevel GCDWebServerLogLevel = DDLogLevelDebug; -#else -DDLogLevel GCDWebServerLogLevel = DDLogLevelInfo; -#endif #endif #if !TARGET_OS_IPHONE @@ -132,18 +126,9 @@ static void _ExecuteMainThreadRunLoopSources() { #endif -@interface GCDWebServerHandler () { -@private - GCDWebServerMatchBlock _matchBlock; - GCDWebServerAsyncProcessBlock _asyncProcessBlock; -} -@end - @implementation GCDWebServerHandler -@synthesize matchBlock=_matchBlock, asyncProcessBlock=_asyncProcessBlock; - -- (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock { +- (instancetype)initWithMatchBlock:(GCDWebServerMatchBlock _Nonnull)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock _Nonnull)processBlock { if ((self = [super init])) { _matchBlock = [matchBlock copy]; _asyncProcessBlock = [processBlock copy]; @@ -153,26 +138,19 @@ - (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(G @end -@interface GCDWebServer () { -@private - id __unsafe_unretained _delegate; +@implementation GCDWebServer { dispatch_queue_t _syncQueue; dispatch_group_t _sourceGroup; NSMutableArray* _handlers; NSInteger _activeConnections; // Accessed through _syncQueue only BOOL _connected; // Accessed on main thread only CFRunLoopTimerRef _disconnectTimer; // Accessed on main thread only - + NSDictionary* _options; - NSString* _serverName; - NSString* _authenticationRealm; NSMutableDictionary* _authenticationBasicAccounts; NSMutableDictionary* _authenticationDigestAccounts; Class _connectionClass; - BOOL _mapHEADToGET; CFTimeInterval _disconnectDelay; - dispatch_queue_priority_t _dispatchQueuePriority; - NSUInteger _port; dispatch_source_t _source4; dispatch_source_t _source6; CFNetServiceRef _registrationService; @@ -191,13 +169,6 @@ @interface GCDWebServer () { BOOL _recording; #endif } -@end - -@implementation GCDWebServer - -@synthesize delegate=_delegate, handlers=_handlers, port=_port, serverName=_serverName, authenticationRealm=_authenticationRealm, - authenticationBasicAccounts=_authenticationBasicAccounts, authenticationDigestAccounts=_authenticationDigestAccounts, - shouldAutomaticallyMapHEADToGET=_mapHEADToGET, dispatchQueuePriority=_dispatchQueuePriority; + (void)initialize { GCDWebServerInitializeFunctions(); @@ -220,7 +191,7 @@ - (void)dealloc { GWS_DCHECK(_activeConnections == 0); GWS_DCHECK(_options == nil); // The server can never be dealloc'ed while running because of the retain-cycle with the dispatch source GWS_DCHECK(_disconnectTimer == NULL); // The server can never be dealloc'ed while the disconnect timer is pending because of the retain-cycle - + #if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE dispatch_release(_sourceGroup); dispatch_release(_syncQueue); @@ -235,10 +206,10 @@ - (void)_startBackgroundTask { if (_backgroundTask == UIBackgroundTaskInvalid) { GWS_LOG_DEBUG(@"Did start background task"); _backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - + GWS_LOG_WARNING(@"Application is being suspended while %@ is still connected", [self class]); [self _endBackgroundTask]; - + }]; } else { GWS_DNOT_REACHED(); @@ -253,13 +224,13 @@ - (void)_didConnect { GWS_DCHECK(_connected == NO); _connected = YES; GWS_LOG_DEBUG(@"Did connect"); - + #if TARGET_OS_IPHONE if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) { [self _startBackgroundTask]; } #endif - + if ([_delegate respondsToSelector:@selector(webServerDidConnect:)]) { [_delegate webServerDidConnect:self]; } @@ -267,7 +238,7 @@ - (void)_didConnect { - (void)willStartConnection:(GCDWebServerConnection*)connection { dispatch_sync(_syncQueue, ^{ - + GWS_DCHECK(_activeConnections >= 0); if (_activeConnections == 0) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -282,7 +253,7 @@ - (void)willStartConnection:(GCDWebServerConnection*)connection { }); } _activeConnections += 1; - + }); } @@ -309,11 +280,11 @@ - (void)_didDisconnect { GWS_DCHECK(_connected == YES); _connected = NO; GWS_LOG_DEBUG(@"Did disconnect"); - + #if TARGET_OS_IPHONE [self _endBackgroundTask]; #endif - + if ([_delegate respondsToSelector:@selector(webServerDidDisconnect:)]) { [_delegate webServerDidDisconnect:self]; } @@ -356,9 +327,10 @@ - (NSString*)bonjourType { } - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock { - [self addHandlerWithMatchBlock:matchBlock asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(processBlock(request)); - }]; + [self addHandlerWithMatchBlock:matchBlock + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(processBlock(request)); + }]; } - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock { @@ -464,7 +436,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6 if (listeningSocket > 0) { int yes = 1; setsockopt(listeningSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); - + if (bind(listeningSocket, address, length) == 0) { if (listen(listeningSocket, (int)maxPendingConnections) == 0) { GWS_LOG_DEBUG(@"Did open %s listening socket %i", useIPv6 ? "IPv6" : "IPv4", listeningSocket); @@ -483,7 +455,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6 GWS_LOG_ERROR(@"Failed binding %s listening socket: %s (%i)", useIPv6 ? "IPv6" : "IPv4", strerror(errno), errno); close(listeningSocket); } - + } else { if (error) { *error = GCDWebServerMakePosixError(errno); @@ -497,7 +469,7 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock dispatch_group_enter(_sourceGroup); dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, dispatch_get_global_queue(_dispatchQueuePriority, 0)); dispatch_source_set_cancel_handler(source, ^{ - + @autoreleasepool { int result = close(listeningSocket); if (result != 0) { @@ -507,17 +479,17 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock } } dispatch_group_leave(_sourceGroup); - + }); dispatch_source_set_event_handler(source, ^{ - + @autoreleasepool { struct sockaddr_storage remoteSockAddr; socklen_t remoteAddrLen = sizeof(remoteSockAddr); int socket = accept(listeningSocket, (struct sockaddr*)&remoteSockAddr, &remoteAddrLen); if (socket > 0) { NSData* remoteAddress = [NSData dataWithBytes:&remoteSockAddr length:remoteAddrLen]; - + struct sockaddr_storage localSockAddr; socklen_t localAddrLen = sizeof(localSockAddr); NSData* localAddress = nil; @@ -527,28 +499,28 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock } else { GWS_DNOT_REACHED(); } - + int noSigPipe = 1; setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe)); // Make sure this socket cannot generate SIG_PIPE - + GCDWebServerConnection* connection = [[_connectionClass alloc] initWithServer:self localAddress:localAddress remoteAddress:remoteAddress socket:socket]; // Connection will automatically retain itself while opened [connection self]; // Prevent compiler from complaining about unused variable / useless statement } else { GWS_LOG_ERROR(@"Failed accepting %s socket: %s (%i)", isIPv6 ? "IPv6" : "IPv4", strerror(errno), errno); } } - + }); return source; } - (BOOL)_start:(NSError**)error { GWS_DCHECK(_source4 == NULL); - + NSUInteger port = [_GetOption(_options, GCDWebServerOption_Port, @0) unsignedIntegerValue]; BOOL bindToLocalhost = [_GetOption(_options, GCDWebServerOption_BindToLocalhost, @NO) boolValue]; NSUInteger maxPendingConnections = [_GetOption(_options, GCDWebServerOption_MaxPendingConnections, @16) unsignedIntegerValue]; - + struct sockaddr_in addr4; bzero(&addr4, sizeof(addr4)); addr4.sin_len = sizeof(addr4); @@ -568,7 +540,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed retrieving socket address: %s (%i)", strerror(errno), errno); } } - + struct sockaddr_in6 addr6; bzero(&addr6, sizeof(addr6)); addr6.sin6_len = sizeof(addr6); @@ -580,7 +552,7 @@ - (BOOL)_start:(NSError**)error { close(listeningSocket4); return NO; } - + _serverName = [_GetOption(_options, GCDWebServerOption_ServerName, NSStringFromClass([self class])) copy]; NSString* authenticationMethod = _GetOption(_options, GCDWebServerOption_AuthenticationMethod, nil); if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_Basic]) { @@ -599,27 +571,27 @@ - (BOOL)_start:(NSError**)error { }]; } _connectionClass = _GetOption(_options, GCDWebServerOption_ConnectionClass, [GCDWebServerConnection class]); - _mapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue]; + _shouldAutomaticallyMapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue]; _disconnectDelay = [_GetOption(_options, GCDWebServerOption_ConnectedStateCoalescingInterval, @1.0) doubleValue]; _dispatchQueuePriority = [_GetOption(_options, GCDWebServerOption_DispatchQueuePriority, @(DISPATCH_QUEUE_PRIORITY_DEFAULT)) longValue]; - + _source4 = [self _createDispatchSourceWithListeningSocket:listeningSocket4 isIPv6:NO]; _source6 = [self _createDispatchSourceWithListeningSocket:listeningSocket6 isIPv6:YES]; _port = port; _bindToLocalhost = bindToLocalhost; - + NSString* bonjourName = _GetOption(_options, GCDWebServerOption_BonjourName, nil); NSString* bonjourType = _GetOption(_options, GCDWebServerOption_BonjourType, @"_http._tcp"); if (bonjourName) { _registrationService = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), (__bridge CFStringRef)bonjourType, (__bridge CFStringRef)(bonjourName.length ? bonjourName : _serverName), (SInt32)_port); if (_registrationService) { CFNetServiceClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL}; - + CFNetServiceSetClient(_registrationService, _NetServiceRegisterCallBack, &context); CFNetServiceScheduleWithRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes); CFStreamError streamError = {0}; CFNetServiceRegisterWithOptions(_registrationService, 0, &streamError); - + _resolutionService = CFNetServiceCreateCopy(kCFAllocatorDefault, _registrationService); if (_resolutionService) { CFNetServiceSetClient(_resolutionService, _NetServiceResolveCallBack, &context); @@ -631,7 +603,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed creating CFNetService for registration"); } } - + if ([_GetOption(_options, GCDWebServerOption_RequestNATPortMapping, @NO) boolValue]) { DNSServiceErrorType status = DNSServiceNATPortMappingCreate(&_dnsService, 0, 0, kDNSServiceProtocol_TCP, htons(port), htons(port), 0, _DNSServiceCallBack, (__bridge void*)self); if (status == kDNSServiceErr_NoError) { @@ -654,7 +626,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed creating NAT port mapping (%i)", status); } } - + dispatch_resume(_source4); dispatch_resume(_source6); GWS_LOG_INFO(@"%@ started on port %i and reachable at %@", [self class], (int)_port, self.serverURL); @@ -663,13 +635,13 @@ - (BOOL)_start:(NSError**)error { [_delegate webServerDidStart:self]; }); } - + return YES; } - (void)_stop { GWS_DCHECK(_source4 != NULL); - + if (_dnsService) { _dnsAddress = nil; _dnsPort = 0; @@ -685,7 +657,7 @@ - (void)_stop { DNSServiceRefDeallocate(_dnsService); _dnsService = NULL; } - + if (_registrationService) { if (_resolutionService) { CFNetServiceUnscheduleFromRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes); @@ -700,7 +672,7 @@ - (void)_stop { CFRelease(_registrationService); _registrationService = NULL; } - + dispatch_source_cancel(_source6); dispatch_source_cancel(_source4); dispatch_group_wait(_sourceGroup, DISPATCH_TIME_FOREVER); // Wait until the cancellation handlers have been called which guarantees the listening sockets are closed @@ -714,12 +686,12 @@ - (void)_stop { _source4 = NULL; _port = 0; _bindToLocalhost = NO; - + _serverName = nil; _authenticationRealm = nil; _authenticationBasicAccounts = nil; _authenticationDigestAccounts = nil; - + dispatch_async(dispatch_get_main_queue(), ^{ if (_disconnectTimer) { CFRunLoopTimerInvalidate(_disconnectTimer); @@ -728,7 +700,7 @@ - (void)_stop { [self _didDisconnect]; } }); - + GWS_LOG_INFO(@"%@ stopped", [self class]); if ([_delegate respondsToSelector:@selector(webServerDidStop:)]) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -896,32 +868,38 @@ - (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error { @implementation GCDWebServer (Handlers) - (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addDefaultHandlerForMethod:method requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addDefaultHandlerForMethod:method + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addHandlerForMethod:method path:path requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addHandlerForMethod:method + path:path + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { if ([path hasPrefix:@"/"] && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } @@ -929,24 +907,28 @@ - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass: return nil; } return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } else { GWS_DNOT_REACHED(); } } - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addHandlerForMethod:method pathRegex:regex requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addHandlerForMethod:method + pathRegex:regex + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:NULL]; if (expression && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } @@ -972,8 +954,9 @@ - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex request GCDWebServerRequest* request = [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; [request setAttribute:captures forKey:GCDWebServerRequestAttribute_RegexCaptures]; return request; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } else { GWS_DNOT_REACHED(); } @@ -984,29 +967,35 @@ - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex request @implementation GCDWebServer (GETHandlers) - (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge { - [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType]; - response.cacheControlMaxAge = cacheAge; - return response; - - }]; + [self addHandlerForMethod:@"GET" + path:path + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType]; + response.cacheControlMaxAge = cacheAge; + return response; + + }]; } - (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests { - [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = nil; - if (allowRangeRequests) { - response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment]; - [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; - } else { - response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment]; - } - response.cacheControlMaxAge = cacheAge; - return response; - - }]; + [self addHandlerForMethod:@"GET" + path:path + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = nil; + if (allowRangeRequests) { + response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment]; + [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + } else { + response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment]; + } + response.cacheControlMaxAge = cacheAge; + return response; + + }]; } - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { @@ -1042,8 +1031,8 @@ - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { - (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests { if ([basePath hasPrefix:@"/"] && [basePath hasSuffix:@"/"]) { GCDWebServer* __unsafe_unretained server = self; - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:@"GET"]) { return nil; } @@ -1051,39 +1040,40 @@ - (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)di return nil; } return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = nil; - NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]]; - NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; - if (fileType) { - if ([fileType isEqualToString:NSFileTypeDirectory]) { - if (indexFilename) { - NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename]; - NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType]; - if ([indexType isEqualToString:NSFileTypeRegular]) { - return [GCDWebServerFileResponse responseWithFile:indexPath]; + + } + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = nil; + NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]]; + NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; + if (fileType) { + if ([fileType isEqualToString:NSFileTypeDirectory]) { + if (indexFilename) { + NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename]; + NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType]; + if ([indexType isEqualToString:NSFileTypeRegular]) { + return [GCDWebServerFileResponse responseWithFile:indexPath]; + } + } + response = [server _responseWithContentsOfDirectory:filePath]; + } else if ([fileType isEqualToString:NSFileTypeRegular]) { + if (allowRangeRequests) { + response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; + [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + } else { + response = [GCDWebServerFileResponse responseWithFile:filePath]; + } } } - response = [server _responseWithContentsOfDirectory:filePath]; - } else if ([fileType isEqualToString:NSFileTypeRegular]) { - if (allowRangeRequests) { - response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; - [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + if (response) { + response.cacheControlMaxAge = cacheAge; } else { - response = [GCDWebServerFileResponse responseWithFile:filePath]; + response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; } - } - } - if (response) { - response.cacheControlMaxAge = cacheAge; - } else { - response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; - } - return response; - - }]; + return response; + + }]; } else { GWS_DNOT_REACHED(); } @@ -1096,8 +1086,6 @@ @implementation GCDWebServer (Logging) + (void)setLogLevel:(int)level { #if defined(__GCDWEBSERVER_LOGGING_FACILITY_XLFACILITY__) [XLSharedFacility setMinLogLevel:level]; -#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__) - GCDWebServerLogLevel = level; #elif defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__) GCDWebServerLogLevel = level; #endif @@ -1204,11 +1192,11 @@ static void _LogResult(NSString* format, ...) { - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path { GWS_DCHECK([NSThread isMainThread]); - NSArray* ignoredHeaders = @[@"Date", @"Etag"]; // Dates are always different by definition and ETags depend on file system node IDs + NSArray* ignoredHeaders = @[ @"Date", @"Etag" ]; // Dates are always different by definition and ETags depend on file system node IDs NSInteger result = -1; if ([self startWithOptions:options error:NULL]) { _ExecuteMainThreadRunLoopSources(); - + result = 0; NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; for (NSString* requestFile in files) { @@ -1230,19 +1218,19 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p if ([responseFile hasPrefix:prefix] && [responseFile hasSuffix:@".response"]) { NSData* responseData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:responseFile]]; if (responseData) { - CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO); + CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO); if (expectedResponse) { CFHTTPMessageRef actualResponse = _CreateHTTPMessageFromPerformingRequest(requestData, self.port); if (actualResponse) { success = YES; - + CFIndex expectedStatusCode = CFHTTPMessageGetResponseStatusCode(expectedResponse); CFIndex actualStatusCode = CFHTTPMessageGetResponseStatusCode(actualResponse); if (actualStatusCode != expectedStatusCode) { _LogResult(@" Status code not matching:\n Expected: %i\n Actual: %i", (int)expectedStatusCode, (int)actualStatusCode); success = NO; } - + NSDictionary* expectedHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(expectedResponse)); NSDictionary* actualHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(actualResponse)); for (NSString* expectedHeader in expectedHeaders) { @@ -1262,7 +1250,7 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p success = NO; } } - + NSString* expectedContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(expectedResponse, CFSTR("Content-Length"))); NSData* expectedBody = CFBridgingRelease(CFHTTPMessageCopyBody(expectedResponse)); NSString* actualContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(actualResponse, CFSTR("Content-Length"))); @@ -1275,20 +1263,20 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p success = NO; #if !TARGET_OS_IPHONE #if DEBUG - if (GCDWebServerIsTextContentType([expectedHeaders objectForKey:@"Content-Type"])) { - NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; - NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; + if (GCDWebServerIsTextContentType((NSString*)[expectedHeaders objectForKey:@"Content-Type"])) { + NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:(NSString*)[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; + NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:(NSString*)[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]]; if ([expectedBody writeToFile:expectedPath atomically:YES] && [actualBody writeToFile:actualPath atomically:YES]) { NSTask* task = [[NSTask alloc] init]; [task setLaunchPath:@"/usr/bin/opendiff"]; - [task setArguments:@[expectedPath, actualPath]]; + [task setArguments:@[ expectedPath, actualPath ]]; [task launch]; } } #endif #endif } - + CFRelease(actualResponse); } CFRelease(expectedResponse); @@ -1311,9 +1299,9 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p } _ExecuteMainThreadRunLoopSources(); } - + [self stop]; - + _ExecuteMainThreadRunLoopSources(); } return result; diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h index d353c8b9..420d12a4 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h @@ -27,6 +27,8 @@ #import "GCDWebServer.h" +NS_ASSUME_NONNULL_BEGIN + @class GCDWebServerHandler; /** @@ -139,7 +141,7 @@ * The default implementation checks for HTTP authentication if applicable * and returns a barebone 401 status code response if authentication failed. */ -- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request; +- (nullable GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request; /** * Assuming a valid HTTP request was received and -preflightRequest: returned nil, @@ -169,7 +171,7 @@ * @warning If the request was invalid (e.g. the HTTP headers were malformed), * the "request" argument will be nil. */ -- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode; +- (void)abortRequest:(nullable GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode; /** * Called when the connection is closed. @@ -177,3 +179,5 @@ - (void)close; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m index 1d72f7dc..1fd56c35 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m @@ -57,23 +57,34 @@ static int32_t _connectionCounter = 0; #endif -@interface GCDWebServerConnection () { -@private - GCDWebServer* _server; - NSData* _localAddress; - NSData* _remoteAddress; +NS_ASSUME_NONNULL_BEGIN + +@interface GCDWebServerConnection (Read) +- (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block; +- (void)readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block; +- (void)readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block; +- (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block; +@end + +@interface GCDWebServerConnection (Write) +- (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block; +- (void)writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block; +- (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block; +@end + +NS_ASSUME_NONNULL_END + +@implementation GCDWebServerConnection { CFSocketNativeHandle _socket; - NSUInteger _bytesRead; - NSUInteger _bytesWritten; BOOL _virtualHEAD; - + CFHTTPMessageRef _requestMessage; GCDWebServerRequest* _request; GCDWebServerHandler* _handler; CFHTTPMessageRef _responseMessage; GCDWebServerResponse* _response; NSInteger _statusCode; - + BOOL _opened; #ifdef __GCDWEBSERVER_ENABLE_TESTING__ NSUInteger _connectionIndex; @@ -83,258 +94,6 @@ @interface GCDWebServerConnection () { int _responseFD; #endif } -@end - -@implementation GCDWebServerConnection (Read) - -- (void)_readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block { - dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) { - - @autoreleasepool { - if (error == 0) { - size_t size = dispatch_data_get_size(buffer); - if (size > 0) { - NSUInteger originalLength = data.length; - dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) { - [data appendBytes:chunkBytes length:chunkSize]; - return true; - }); - [self didReadBytes:((char*)data.bytes + originalLength) length:(data.length - originalLength)]; - block(YES); - } else { - if (_bytesRead > 0) { - GWS_LOG_ERROR(@"No more data available on socket %i", _socket); - } else { - GWS_LOG_WARNING(@"No data received from socket %i", _socket); - } - block(NO); - } - } else { - GWS_LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error); - block(NO); - } - } - - }); -} - -- (void)_readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block { - GWS_DCHECK(_requestMessage); - [self _readData:headersData withLength:NSUIntegerMax completionBlock:^(BOOL success) { - - if (success) { - NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)]; - if (range.location == NSNotFound) { - [self _readHeaders:headersData withCompletionBlock:block]; - } else { - NSUInteger length = range.location + range.length; - if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) { - if (CFHTTPMessageIsHeaderComplete(_requestMessage)) { - block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]); - } else { - GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket); - block(nil); - } - } else { - GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket); - block(nil); - } - } - } else { - block(nil); - } - - }]; -} - -- (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block { - GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]); - NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity]; - [self _readData:bodyData withLength:length completionBlock:^(BOOL success) { - - if (success) { - if (bodyData.length <= length) { - NSError* error = nil; - if ([_request performWriteData:bodyData error:&error]) { - NSUInteger remainingLength = length - bodyData.length; - if (remainingLength) { - [self _readBodyWithRemainingLength:remainingLength completionBlock:block]; - } else { - block(YES); - } - } else { - GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); - block(NO); - } - } else { - GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket); - block(NO); - GWS_DNOT_REACHED(); - } - } else { - block(NO); - } - - }]; -} - -static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) { - char buffer[size + 1]; - bcopy(bytes, buffer, size); - buffer[size] = 0; - char* end = NULL; - long result = strtol(buffer, &end, 16); - return ((end != NULL) && (*end == 0) && (result >= 0) ? result : NSNotFound); -} - -- (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block { - GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]); - - while (1) { - NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)]; - if (range.location == NSNotFound) { - break; - } - NSRange extensionRange = [chunkData rangeOfData:[NSData dataWithBytes:";" length:1] options:0 range:NSMakeRange(0, range.location)]; // Ignore chunk extensions - NSUInteger length = _ScanHexNumber((char*)chunkData.bytes, extensionRange.location != NSNotFound ? extensionRange.location : range.location); - if (length != NSNotFound) { - if (length) { - if (chunkData.length < range.location + range.length + length + 2) { - break; - } - const char* ptr = (char*)chunkData.bytes + range.location + range.length + length; - if ((*ptr == '\r') && (*(ptr + 1) == '\n')) { - NSError* error = nil; - if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) { - [chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0]; - } else { - GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); - block(NO); - return; - } - } else { - GWS_LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket); - block(NO); - return; - } - } else { - NSRange trailerRange = [chunkData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(range.location, chunkData.length - range.location)]; // Ignore trailers - if (trailerRange.location != NSNotFound) { - block(YES); - return; - } - } - } else { - GWS_LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket); - block(NO); - return; - } - } - - [self _readData:chunkData withLength:NSUIntegerMax completionBlock:^(BOOL success) { - - if (success) { - [self _readNextBodyChunk:chunkData completionBlock:block]; - } else { - block(NO); - } - - }]; -} - -@end - -@implementation GCDWebServerConnection (Write) - -- (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block { - dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{ - [data self]; // Keeps ARC from releasing data too early - }); - dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) { - - @autoreleasepool { - if (error == 0) { - GWS_DCHECK(remainingData == NULL); - [self didWriteBytes:data.bytes length:data.length]; - block(YES); - } else { - GWS_LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error); - block(NO); - } - } - - }); -#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE - dispatch_release(buffer); -#endif -} - -- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block { - GWS_DCHECK(_responseMessage); - CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage); - [self _writeData:(__bridge NSData*)data withCompletionBlock:block]; - CFRelease(data); -} - -- (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { - GWS_DCHECK([_response hasBody]); - [_response performReadDataWithCompletion:^(NSData* data, NSError* error) { - - if (data) { - if (data.length) { - if (_response.usesChunkedTransferEncoding) { - const char* hexString = [[NSString stringWithFormat:@"%lx", (unsigned long)data.length] UTF8String]; - size_t hexLength = strlen(hexString); - NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)]; - if (chunk == nil) { - GWS_LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error); - block(NO); - return; - } - char* ptr = (char*)[(NSMutableData*)chunk mutableBytes]; - bcopy(hexString, ptr, hexLength); - ptr += hexLength; - *ptr++ = '\r'; - *ptr++ = '\n'; - bcopy(data.bytes, ptr, data.length); - ptr += data.length; - *ptr++ = '\r'; - *ptr = '\n'; - data = chunk; - } - [self _writeData:data withCompletionBlock:^(BOOL success) { - - if (success) { - [self _writeBodyWithCompletionBlock:block]; - } else { - block(NO); - } - - }]; - } else { - if (_response.usesChunkedTransferEncoding) { - [self _writeData:_lastChunkData withCompletionBlock:^(BOOL success) { - - block(success); - - }]; - } else { - block(YES); - } - } - } else { - GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error); - block(NO); - } - - }]; -} - -@end - -@implementation GCDWebServerConnection - -@synthesize server=_server, localAddressData=_localAddress, remoteAddressData=_remoteAddress, totalBytesRead=_bytesRead, totalBytesWritten=_bytesWritten; + (void)initialize { if (_CRLFData == nil) { @@ -362,7 +121,7 @@ + (void)initialize { } - (BOOL)isUsingIPv6 { - const struct sockaddr* localSockAddr = _localAddress.bytes; + const struct sockaddr* localSockAddr = _localAddressData.bytes; return (localSockAddr->sa_family == AF_INET6); } @@ -376,14 +135,15 @@ - (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode { - (void)_startProcessingRequest { GWS_DCHECK(_responseMessage == NULL); - + GCDWebServerResponse* preflightResponse = [self preflightRequest:_request]; if (preflightResponse) { [self _finishProcessingRequest:preflightResponse]; } else { - [self processRequest:_request completion:^(GCDWebServerResponse* processResponse) { - [self _finishProcessingRequest:processResponse]; - }]; + [self processRequest:_request + completion:^(GCDWebServerResponse* processResponse) { + [self _finishProcessingRequest:processResponse]; + }]; } } @@ -391,7 +151,7 @@ - (void)_startProcessingRequest { - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { GWS_DCHECK(_responseMessage == NULL); BOOL hasBody = NO; - + if (response) { response = [self overrideResponse:response forRequest:_request]; } @@ -407,11 +167,11 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { _response = response; } } - + if (_response) { [self _initializeResponseHeadersWithStatusCode:_response.statusCode]; if (_response.lastModifiedDate) { - CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (__bridge CFStringRef)GCDWebServerFormatRFC822(_response.lastModifiedDate)); + CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (__bridge CFStringRef)GCDWebServerFormatRFC822((NSDate*)_response.lastModifiedDate)); } if (_response.eTag) { CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("ETag"), (__bridge CFStringRef)_response.eTag); @@ -435,25 +195,24 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { [_response.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL* stop) { CFHTTPMessageSetHeaderFieldValue(_responseMessage, (__bridge CFStringRef)key, (__bridge CFStringRef)obj); }]; - [self _writeHeadersWithCompletionBlock:^(BOOL success) { - + [self writeHeadersWithCompletionBlock:^(BOOL success) { + if (success) { if (hasBody) { - [self _writeBodyWithCompletionBlock:^(BOOL successInner) { - + [self writeBodyWithCompletionBlock:^(BOOL successInner) { + [_response performClose]; // TODO: There's nothing we can do on failure as headers have already been sent - + }]; } } else if (hasBody) { [_response performClose]; } - + }]; } else { [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; } - } - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData { @@ -463,7 +222,7 @@ - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; return; } - + if (initialData.length) { if (![_request performWriteData:initialData error:&error]) { GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); @@ -475,19 +234,20 @@ - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData } length -= initialData.length; } - + if (length) { - [self _readBodyWithRemainingLength:length completionBlock:^(BOOL success) { - - NSError* localError = nil; - if ([_request performClose:&localError]) { - [self _startProcessingRequest]; - } else { - GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + [self readBodyWithRemainingLength:length + completionBlock:^(BOOL success) { + + NSError* localError = nil; + if ([_request performClose:&localError]) { + [self _startProcessingRequest]; + } else { + GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + } + + }]; } else { if ([_request performClose:&error]) { [self _startProcessingRequest]; @@ -505,129 +265,136 @@ - (void)_readChunkedBodyWithInitialData:(NSData*)initialData { [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; return; } - + NSMutableData* chunkData = [[NSMutableData alloc] initWithData:initialData]; - [self _readNextBodyChunk:chunkData completionBlock:^(BOOL success) { - - NSError* localError = nil; - if ([_request performClose:&localError]) { - [self _startProcessingRequest]; - } else { - GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + [self readNextBodyChunk:chunkData + completionBlock:^(BOOL success) { + + NSError* localError = nil; + if ([_request performClose:&localError]) { + [self _startProcessingRequest]; + } else { + GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + } + + }]; } - (void)_readRequestHeaders { _requestMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true); NSMutableData* headersData = [[NSMutableData alloc] initWithCapacity:kHeadersReadCapacity]; - [self _readHeaders:headersData withCompletionBlock:^(NSData* extraData) { - - if (extraData) { - NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase - if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) { - requestMethod = @"GET"; - _virtualHEAD = YES; - } - NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones - NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage)); - if (requestURL) { - requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders]; - GWS_DCHECK(requestURL); - } - NSString* requestPath = requestURL ? GCDWebServerUnescapeURLString(CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL))) : nil; // Don't use -[NSURL path] which strips the ending slash - NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped; - NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{}; - if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) { - for (_handler in _server.handlers) { - _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery); - if (_request) { - break; + [self readHeaders:headersData + withCompletionBlock:^(NSData* extraData) { + + if (extraData) { + NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase + if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) { + requestMethod = @"GET"; + _virtualHEAD = YES; } - } - if (_request) { - _request.localAddressData = self.localAddressData; - _request.remoteAddressData = self.remoteAddressData; - if ([_request hasBody]) { - [_request prepareForWriting]; - if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) { - NSString* expectHeader = [requestHeaders objectForKey:@"Expect"]; - if (expectHeader) { - if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing - [self _writeData:_continueData withCompletionBlock:^(BOOL success) { - - if (success) { - if (_request.usesChunkedTransferEncoding) { - [self _readChunkedBodyWithInitialData:extraData]; - } else { - [self _readBodyWithLength:_request.contentLength initialData:extraData]; - } + NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones + NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage)); + if (requestURL) { + requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders]; + GWS_DCHECK(requestURL); + } + NSString* urlPath = requestURL ? CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL)) : nil; // Don't use -[NSURL path] which strips the ending slash + if (urlPath == nil) { + urlPath = @"/"; // CFURLCopyPath() returns NULL for a relative URL with path "//" contrary to -[NSURL path] which returns "/" + } + NSString* requestPath = urlPath ? GCDWebServerUnescapeURLString(urlPath) : nil; + NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped; + NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{}; + if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) { + for (_handler in _server.handlers) { + _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery); + if (_request) { + break; + } + } + if (_request) { + _request.localAddressData = self.localAddressData; + _request.remoteAddressData = self.remoteAddressData; + if ([_request hasBody]) { + [_request prepareForWriting]; + if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) { + NSString* expectHeader = [requestHeaders objectForKey:@"Expect"]; + if (expectHeader) { + if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing + [self writeData:_continueData + withCompletionBlock:^(BOOL success) { + + if (success) { + if (_request.usesChunkedTransferEncoding) { + [self _readChunkedBodyWithInitialData:extraData]; + } else { + [self _readBodyWithLength:_request.contentLength initialData:extraData]; + } + } + + }]; + } else { + GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed]; + } + } else { + if (_request.usesChunkedTransferEncoding) { + [self _readChunkedBodyWithInitialData:extraData]; + } else { + [self _readBodyWithLength:_request.contentLength initialData:extraData]; } - - }]; + } } else { - GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed]; + GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest]; } } else { - if (_request.usesChunkedTransferEncoding) { - [self _readChunkedBodyWithInitialData:extraData]; - } else { - [self _readBodyWithLength:_request.contentLength initialData:extraData]; - } + [self _startProcessingRequest]; } } else { - GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest]; + _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery]; + GWS_DCHECK(_request); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_NotImplemented]; } } else { - [self _startProcessingRequest]; + [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + GWS_DNOT_REACHED(); } } else { - _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery]; - GWS_DCHECK(_request); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_MethodNotAllowed]; + [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; } - } else { - [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - GWS_DNOT_REACHED(); - } - } else { - [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + + }]; } -- (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket { +- (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket { if ((self = [super init])) { _server = server; - _localAddress = localAddress; - _remoteAddress = remoteAddress; + _localAddressData = localAddress; + _remoteAddressData = remoteAddress; _socket = socket; GWS_LOG_DEBUG(@"Did open connection on socket %i", _socket); - + [_server willStartConnection:self]; - + if (![self open]) { close(_socket); return nil; } _opened = YES; - + [self _readRequestHeaders]; } return self; } - (NSString*)localAddressString { - return GCDWebServerStringFromSockAddr(_localAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_localAddressData.bytes, YES); } - (NSString*)remoteAddressString { - return GCDWebServerStringFromSockAddr(_remoteAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_remoteAddressData.bytes, YES); } - (void)dealloc { @@ -637,17 +404,17 @@ - (void)dealloc { } else { GWS_LOG_DEBUG(@"Did close connection on socket %i", _socket); } - + if (_opened) { [self close]; } - + [_server didEndConnection:self]; - + if (_requestMessage) { CFRelease(_requestMessage); } - + if (_responseMessage) { CFRelease(_responseMessage); } @@ -655,30 +422,288 @@ - (void)dealloc { @end +@implementation GCDWebServerConnection (Read) + +- (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block { + dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) { + + @autoreleasepool { + if (error == 0) { + size_t size = dispatch_data_get_size(buffer); + if (size > 0) { + NSUInteger originalLength = data.length; + dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) { + [data appendBytes:chunkBytes length:chunkSize]; + return true; + }); + [self didReadBytes:((char*)data.bytes + originalLength) length:(data.length - originalLength)]; + block(YES); + } else { + if (_totalBytesRead > 0) { + GWS_LOG_ERROR(@"No more data available on socket %i", _socket); + } else { + GWS_LOG_WARNING(@"No data received from socket %i", _socket); + } + block(NO); + } + } else { + GWS_LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error); + block(NO); + } + } + + }); +} + +- (void)readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block { + GWS_DCHECK(_requestMessage); + [self readData:headersData + withLength:NSUIntegerMax + completionBlock:^(BOOL success) { + + if (success) { + NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)]; + if (range.location == NSNotFound) { + [self readHeaders:headersData withCompletionBlock:block]; + } else { + NSUInteger length = range.location + range.length; + if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) { + if (CFHTTPMessageIsHeaderComplete(_requestMessage)) { + block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]); + } else { + GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket); + block(nil); + } + } else { + GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket); + block(nil); + } + } + } else { + block(nil); + } + + }]; +} + +- (void)readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block { + GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]); + NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity]; + [self readData:bodyData + withLength:length + completionBlock:^(BOOL success) { + + if (success) { + if (bodyData.length <= length) { + NSError* error = nil; + if ([_request performWriteData:bodyData error:&error]) { + NSUInteger remainingLength = length - bodyData.length; + if (remainingLength) { + [self readBodyWithRemainingLength:remainingLength completionBlock:block]; + } else { + block(YES); + } + } else { + GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); + block(NO); + } + } else { + GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket); + block(NO); + GWS_DNOT_REACHED(); + } + } else { + block(NO); + } + + }]; +} + +static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) { + char buffer[size + 1]; + bcopy(bytes, buffer, size); + buffer[size] = 0; + char* end = NULL; + long result = strtol(buffer, &end, 16); + return ((end != NULL) && (*end == 0) && (result >= 0) ? result : NSNotFound); +} + +- (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block { + GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]); + + while (1) { + NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)]; + if (range.location == NSNotFound) { + break; + } + NSRange extensionRange = [chunkData rangeOfData:[NSData dataWithBytes:";" length:1] options:0 range:NSMakeRange(0, range.location)]; // Ignore chunk extensions + NSUInteger length = _ScanHexNumber((char*)chunkData.bytes, extensionRange.location != NSNotFound ? extensionRange.location : range.location); + if (length != NSNotFound) { + if (length) { + if (chunkData.length < range.location + range.length + length + 2) { + break; + } + const char* ptr = (char*)chunkData.bytes + range.location + range.length + length; + if ((*ptr == '\r') && (*(ptr + 1) == '\n')) { + NSError* error = nil; + if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) { + [chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0]; + } else { + GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); + block(NO); + return; + } + } else { + GWS_LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket); + block(NO); + return; + } + } else { + NSRange trailerRange = [chunkData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(range.location, chunkData.length - range.location)]; // Ignore trailers + if (trailerRange.location != NSNotFound) { + block(YES); + return; + } + } + } else { + GWS_LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket); + block(NO); + return; + } + } + + [self readData:chunkData + withLength:NSUIntegerMax + completionBlock:^(BOOL success) { + + if (success) { + [self readNextBodyChunk:chunkData completionBlock:block]; + } else { + block(NO); + } + + }]; +} + +@end + +@implementation GCDWebServerConnection (Write) + +- (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block { + dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{ + [data self]; // Keeps ARC from releasing data too early + }); + dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) { + + @autoreleasepool { + if (error == 0) { + GWS_DCHECK(remainingData == NULL); + [self didWriteBytes:data.bytes length:data.length]; + block(YES); + } else { + GWS_LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error); + block(NO); + } + } + + }); +#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE + dispatch_release(buffer); +#endif +} + +- (void)writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block { + GWS_DCHECK(_responseMessage); + CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage); + [self writeData:(__bridge NSData*)data withCompletionBlock:block]; + CFRelease(data); +} + +- (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { + GWS_DCHECK([_response hasBody]); + [_response performReadDataWithCompletion:^(NSData* data, NSError* error) { + + if (data) { + if (data.length) { + if (_response.usesChunkedTransferEncoding) { + const char* hexString = [[NSString stringWithFormat:@"%lx", (unsigned long)data.length] UTF8String]; + size_t hexLength = strlen(hexString); + NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)]; + if (chunk == nil) { + GWS_LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error); + block(NO); + return; + } + char* ptr = (char*)[(NSMutableData*)chunk mutableBytes]; + bcopy(hexString, ptr, hexLength); + ptr += hexLength; + *ptr++ = '\r'; + *ptr++ = '\n'; + bcopy(data.bytes, ptr, data.length); + ptr += data.length; + *ptr++ = '\r'; + *ptr = '\n'; + data = chunk; + } + [self writeData:data + withCompletionBlock:^(BOOL success) { + + if (success) { + [self writeBodyWithCompletionBlock:block]; + } else { + block(NO); + } + + }]; + } else { + if (_response.usesChunkedTransferEncoding) { + [self writeData:_lastChunkData + withCompletionBlock:^(BOOL success) { + + block(success); + + }]; + } else { + block(YES); + } + } + } else { + GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error); + block(NO); + } + + }]; +} + +@end + @implementation GCDWebServerConnection (Subclassing) - (BOOL)open { #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if (_server.recordingEnabled) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" _connectionIndex = OSAtomicIncrement32(&_connectionCounter); - +#pragma clang diagnostic pop + _requestPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]; _requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); GWS_DCHECK(_requestFD > 0); - + _responsePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]; _responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); GWS_DCHECK(_responseFD > 0); } #endif - + return YES; } - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length { GWS_LOG_DEBUG(@"Connection received %lu bytes on socket %i", (unsigned long)length, _socket); - _bytesRead += length; - + _totalBytesRead += length; + #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if ((_requestFD > 0) && (write(_requestFD, bytes, length) != (ssize_t)length)) { GWS_LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno); @@ -690,8 +715,8 @@ - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length { - (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length { GWS_LOG_DEBUG(@"Connection sent %lu bytes on socket %i", (unsigned long)length, _socket); - _bytesWritten += length; - + _totalBytesWritten += length; + #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if ((_responseFD > 0) && (write(_responseFD, bytes, length) != (ssize_t)length)) { GWS_LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno); @@ -707,7 +732,7 @@ - (NSURL*)rewriteRequestURL:(NSURL*)url withMethod:(NSString*)method headers:(NS // https://tools.ietf.org/html/rfc2617 - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { - GWS_LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead); + GWS_LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_totalBytesRead); GCDWebServerResponse* response = nil; if (_server.authenticationBasicAccounts) { __block BOOL authenticated = NO; @@ -731,7 +756,7 @@ - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { NSString* authorizationHeader = [request.headers objectForKey:@"Authorization"]; if ([authorizationHeader hasPrefix:@"Digest "]) { NSString* realm = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"realm"); - if ([realm isEqualToString:_server.authenticationRealm]) { + if (realm && [_server.authenticationRealm isEqualToString:realm]) { NSString* nonce = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"nonce"); if ([nonce isEqualToString:_digestAuthenticationNonce]) { NSString* username = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @"username"); @@ -757,7 +782,7 @@ - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { } - (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion { - GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead); + GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_totalBytesRead); _handler.asyncProcessBlock(request, [completion copy]); } @@ -797,7 +822,7 @@ - (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)sta GWS_DCHECK(_responseMessage == NULL); GWS_DCHECK((statusCode >= 400) && (statusCode < 600)); [self _initializeResponseHeadersWithStatusCode:statusCode]; - [self _writeHeadersWithCompletionBlock:^(BOOL success) { + [self writeHeadersWithCompletionBlock:^(BOOL success) { ; // Nothing more to do }]; GWS_LOG_DEBUG(@"Connection aborted with status code %i on socket %i", (int)statusCode, _socket); @@ -819,7 +844,7 @@ - (void)close { } unlink([_requestPath fileSystemRepresentation]); } - + if (_responsePath) { BOOL success = NO; NSError* error = nil; @@ -835,11 +860,11 @@ - (void)close { unlink([_responsePath fileSystemRepresentation]); } #endif - + if (_request) { - GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten); + GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_totalBytesRead, (unsigned long)_totalBytesWritten); } else { - GWS_LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_bytesRead, (unsigned long)_bytesWritten); + GWS_LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_totalBytesRead, (unsigned long)_totalBytesWritten); } } diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h index e5be05cf..4235eccc 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h @@ -27,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + #ifdef __cplusplus extern "C" { #endif @@ -34,20 +36,24 @@ extern "C" { /** * Converts a file extension to the corresponding MIME type. * If there is no match, "application/octet-stream" is returned. + * + * Overrides allow to customize the built-in mapping from extensions to MIME + * types. Keys of the dictionary must be lowercased file extensions without + * the period, and the values must be the corresponding MIME types. */ -NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension); +NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary* _Nullable overrides); /** * Add percent-escapes to a string so it can be used in a URL. * The legal characters ":@/?&=+" are also escaped to ensure compatibility * with URL encoded forms and URL queries. */ -NSString* GCDWebServerEscapeURLString(NSString* string); +NSString* _Nullable GCDWebServerEscapeURLString(NSString* string); /** * Unescapes a URL percent-encoded string. */ -NSString* GCDWebServerUnescapeURLString(NSString* string); +NSString* _Nullable GCDWebServerUnescapeURLString(NSString* string); /** * Extracts the unescaped names and values from an @@ -63,7 +69,7 @@ NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form); * On iOS, returns the IPv4 or IPv6 address as a string of the WiFi * interface if connected or nil otherwise. */ -NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6); +NSString* _Nullable GCDWebServerGetPrimaryIPAddress(BOOL useIPv6); /** * Converts a date into a string using RFC822 formatting. @@ -79,7 +85,7 @@ NSString* GCDWebServerFormatRFC822(NSDate* date); * * @warning Timezones other than GMT are not supported by this function. */ -NSDate* GCDWebServerParseRFC822(NSString* string); +NSDate* _Nullable GCDWebServerParseRFC822(NSString* string); /** * Converts a date into a string using IOS 8601 formatting. @@ -94,8 +100,10 @@ NSString* GCDWebServerFormatISO8601(NSDate* date); * @warning Only "calendar" variant is supported at this time and timezones * other than GMT are not supported either. */ -NSDate* GCDWebServerParseISO8601(NSString* string); +NSDate* _Nullable GCDWebServerParseISO8601(NSString* string); #ifdef __cplusplus } #endif + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m index 25e41ca2..2a1edfc5 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m @@ -83,21 +83,28 @@ void GCDWebServerInitializeFunctions() { } NSString* GCDWebServerTruncateHeaderValue(NSString* value) { - NSRange range = [value rangeOfString:@";"]; - return range.location != NSNotFound ? [value substringToIndex:range.location] : value; + if (value) { + NSRange range = [value rangeOfString:@";"]; + if (range.location != NSNotFound) { + return [value substringToIndex:range.location]; + } + } + return value; } NSString* GCDWebServerExtractHeaderValueParameter(NSString* value, NSString* name) { NSString* parameter = nil; - NSScanner* scanner = [[NSScanner alloc] initWithString:value]; - [scanner setCaseSensitive:NO]; // Assume parameter names are case-insensitive - NSString* string = [NSString stringWithFormat:@"%@=", name]; - if ([scanner scanUpToString:string intoString:NULL]) { - [scanner scanString:string intoString:NULL]; - if ([scanner scanString:@"\"" intoString:NULL]) { - [scanner scanUpToString:@"\"" intoString:¶meter]; - } else { - [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:¶meter]; + if (value) { + NSScanner* scanner = [[NSScanner alloc] initWithString:value]; + [scanner setCaseSensitive:NO]; // Assume parameter names are case-insensitive + NSString* string = [NSString stringWithFormat:@"%@=", name]; + if ([scanner scanUpToString:string intoString:NULL]) { + [scanner scanString:string intoString:NULL]; + if ([scanner scanString:@"\"" intoString:NULL]) { + [scanner scanUpToString:@"\"" intoString:¶meter]; + } else { + [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:¶meter]; + } } } return parameter; @@ -159,17 +166,15 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { return [NSString stringWithFormat:@"<%lu bytes>", (unsigned long)data.length]; } -NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension) { - static NSDictionary* _overrides = nil; - if (_overrides == nil) { - _overrides = [[NSDictionary alloc] initWithObjectsAndKeys: - @"text/css", @"css", - nil]; - } +NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary* overrides) { + NSDictionary* builtInOverrides = @{ @"css" : @"text/css" }; NSString* mimeType = nil; extension = [extension lowercaseString]; if (extension.length) { - mimeType = [_overrides objectForKey:extension]; + mimeType = [overrides objectForKey:extension]; + if (mimeType == nil) { + mimeType = [builtInOverrides objectForKey:extension]; + } if (mimeType == nil) { CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL); if (uti) { @@ -205,13 +210,13 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { break; } [scanner setScanLocation:([scanner scanLocation] + 1)]; - + NSString* value = nil; [scanner scanUpToString:@"&" intoString:&value]; if (value == nil) { value = @""; } - + key = [key stringByReplacingOccurrencesOfString:@"+" withString:@" "]; NSString* unescapedKey = key ? GCDWebServerUnescapeURLString(key) : nil; value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "]; @@ -222,7 +227,7 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { GWS_LOG_WARNING(@"Failed parsing URL encoded form for key \"%@\" and value \"%@\"", key, value); GWS_DNOT_REACHED(); } - + if ([scanner isAtEnd]) { break; } @@ -232,15 +237,16 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { } NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService) { - NSString* string = nil; char hostBuffer[NI_MAXHOST]; char serviceBuffer[NI_MAXSERV]; - if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) >= 0) { - string = includeService ? [NSString stringWithFormat:@"%s:%s", hostBuffer, serviceBuffer] : [NSString stringWithUTF8String:hostBuffer]; - } else { + if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) != 0) { +#if DEBUG GWS_DNOT_REACHED(); +#else + return @""; +#endif } - return string; + return includeService ? [NSString stringWithFormat:@"%s:%s", hostBuffer, serviceBuffer] : (NSString*)[NSString stringWithUTF8String:hostBuffer]; } NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6) { @@ -255,7 +261,10 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { if (store) { CFPropertyListRef info = SCDynamicStoreCopyValue(store, CFSTR("State:/Network/Global/IPv4")); // There is no equivalent for IPv6 but the primary interface should be the same if (info) { - primaryInterface = [[NSString stringWithString:[(__bridge NSDictionary*)info objectForKey:@"PrimaryInterface"]] UTF8String]; + NSString* interface = [(__bridge NSDictionary*)info objectForKey:@"PrimaryInterface"]; + if (interface) { + primaryInterface = [[NSString stringWithString:interface] UTF8String]; // Copy string to auto-release pool + } CFRelease(info); } CFRelease(store); @@ -267,9 +276,9 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { struct ifaddrs* list; if (getifaddrs(&list) >= 0) { for (struct ifaddrs* ifap = list; ifap; ifap = ifap->ifa_next) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV - // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator - // Assumption holds for Apple TV running tvOS +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV + // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator + // Assumption holds for Apple TV running tvOS if (strcmp(ifap->ifa_name, "en0") && strcmp(ifap->ifa_name, "en1")) #else if (strcmp(ifap->ifa_name, primaryInterface)) @@ -303,5 +312,5 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { buffer[2 * i + 1] = byteLo >= 10 ? 'a' + byteLo - 10 : '0' + byteLo; } buffer[2 * CC_MD5_DIGEST_LENGTH] = 0; - return [NSString stringWithUTF8String:buffer]; + return (NSString*)[NSString stringWithUTF8String:buffer]; } diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h index 8150d584..d726ec2c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h @@ -81,27 +81,6 @@ #define GWS_DCHECK(__CONDITION__) XLOG_DEBUG_CHECK(__CONDITION__) #define GWS_DNOT_REACHED() XLOG_DEBUG_UNREACHABLE() -/** - * Automatically detect if CocoaLumberJack is available and if so use - * it as a logging facility. - */ - -#elif defined(__has_include) && __has_include("CocoaLumberjack/CocoaLumberjack.h") - -#import - -#define __GCDWEBSERVER_LOGGING_FACILITY_COCOALUMBERJACK__ - -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF GCDWebServerLogLevel -extern DDLogLevel GCDWebServerLogLevel; - -#define GWS_LOG_DEBUG(...) DDLogDebug(__VA_ARGS__) -#define GWS_LOG_VERBOSE(...) DDLogVerbose(__VA_ARGS__) -#define GWS_LOG_INFO(...) DDLogInfo(__VA_ARGS__) -#define GWS_LOG_WARNING(...) DDLogWarn(__VA_ARGS__) -#define GWS_LOG_ERROR(...) DDLogError(__VA_ARGS__) - /** * If all of the above fail, then use GCDWebServer built-in * logging facility. @@ -120,17 +99,32 @@ typedef NS_ENUM(int, GCDWebServerLoggingLevel) { }; extern GCDWebServerLoggingLevel GCDWebServerLogLevel; -extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) NS_FORMAT_FUNCTION(2, 3); +extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* _Nonnull format, ...) NS_FORMAT_FUNCTION(2, 3); #if DEBUG -#define GWS_LOG_DEBUG(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); } while (0) +#define GWS_LOG_DEBUG(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); \ + } while (0) #else #define GWS_LOG_DEBUG(...) #endif -#define GWS_LOG_VERBOSE(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); } while (0) -#define GWS_LOG_INFO(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); } while (0) -#define GWS_LOG_WARNING(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); } while (0) -#define GWS_LOG_ERROR(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); } while (0) +#define GWS_LOG_VERBOSE(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_INFO(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_WARNING(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_ERROR(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); \ + } while (0) #endif @@ -143,10 +137,10 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for #if DEBUG #define GWS_DCHECK(__CONDITION__) \ - do { \ - if (!(__CONDITION__)) { \ - abort(); \ - } \ + do { \ + if (!(__CONDITION__)) { \ + abort(); \ + } \ } while (0) #define GWS_DNOT_REACHED() abort() @@ -159,6 +153,8 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for #endif +NS_ASSUME_NONNULL_BEGIN + /** * GCDWebServer internal constants and APIs. */ @@ -171,29 +167,29 @@ static inline BOOL GCDWebServerIsValidByteRange(NSRange range) { } static inline NSError* GCDWebServerMakePosixError(int code) { - return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithUTF8String:strerror(code)]}]; + return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey : (NSString*)[NSString stringWithUTF8String:strerror(code)]}]; } extern void GCDWebServerInitializeFunctions(); -extern NSString* GCDWebServerNormalizeHeaderValue(NSString* value); -extern NSString* GCDWebServerTruncateHeaderValue(NSString* value); -extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSString* attribute); +extern NSString* _Nullable GCDWebServerNormalizeHeaderValue(NSString* _Nullable value); +extern NSString* _Nullable GCDWebServerTruncateHeaderValue(NSString* _Nullable value); +extern NSString* _Nullable GCDWebServerExtractHeaderValueParameter(NSString* _Nullable value, NSString* attribute); extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset); extern BOOL GCDWebServerIsTextContentType(NSString* type); extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType); -extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1,2); +extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1, 2); extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService); @interface GCDWebServerConnection () -- (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket; +- (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket; @end @interface GCDWebServer () -@property(nonatomic, readonly) NSArray* handlers; -@property(nonatomic, readonly) NSString* serverName; -@property(nonatomic, readonly) NSString* authenticationRealm; -@property(nonatomic, readonly) NSDictionary* authenticationBasicAccounts; -@property(nonatomic, readonly) NSDictionary* authenticationDigestAccounts; +@property(nonatomic, readonly) NSMutableArray* handlers; +@property(nonatomic, readonly, nullable) NSString* serverName; +@property(nonatomic, readonly, nullable) NSString* authenticationRealm; +@property(nonatomic, readonly, nullable) NSMutableDictionary* authenticationBasicAccounts; +@property(nonatomic, readonly, nullable) NSMutableDictionary* authenticationDigestAccounts; @property(nonatomic, readonly) BOOL shouldAutomaticallyMapHEADToGET; @property(nonatomic, readonly) dispatch_queue_priority_t dispatchQueuePriority; - (void)willStartConnection:(GCDWebServerConnection*)connection; @@ -207,13 +203,13 @@ extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOO @interface GCDWebServerRequest () @property(nonatomic, readonly) BOOL usesChunkedTransferEncoding; -@property(nonatomic, readwrite) NSData* localAddressData; -@property(nonatomic, readwrite) NSData* remoteAddressData; +@property(nonatomic) NSData* localAddressData; +@property(nonatomic) NSData* remoteAddressData; - (void)prepareForWriting; - (BOOL)performOpen:(NSError**)error; - (BOOL)performWriteData:(NSData*)data error:(NSError**)error; - (BOOL)performClose:(NSError**)error; -- (void)setAttribute:(id)attribute forKey:(NSString*)key; +- (void)setAttribute:(nullable id)attribute forKey:(NSString*)key; @end @interface GCDWebServerResponse () @@ -224,3 +220,5 @@ extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOO - (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block; - (void)performClose; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h index c7bc31bf..3fe90296 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h @@ -27,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + /** * Attribute key to retrieve an NSArray containing NSStrings from a GCDWebServerRequest * with the contents of any regular expression captures done on the request path. @@ -112,7 +114,7 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; * * @warning This property will be nil if there is no query in the URL. */ -@property(nonatomic, readonly) NSDictionary* query; +@property(nonatomic, readonly, nullable) NSDictionary* query; /** * Returns the content type for the body of the request parsed from the @@ -122,7 +124,7 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; * "application/octet-stream" if a body is present but there was no * "Content-Type" header. */ -@property(nonatomic, readonly) NSString* contentType; +@property(nonatomic, readonly, nullable) NSString* contentType; /** * Returns the content length for the body of the request parsed from the @@ -137,12 +139,12 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; /** * Returns the parsed "If-Modified-Since" header or nil if absent or malformed. */ -@property(nonatomic, readonly) NSDate* ifModifiedSince; +@property(nonatomic, readonly, nullable) NSDate* ifModifiedSince; /** * Returns the parsed "If-None-Match" header or nil if absent or malformed. */ -@property(nonatomic, readonly) NSString* ifNoneMatch; +@property(nonatomic, readonly, nullable) NSString* ifNoneMatch; /** * Returns the parsed "Range" header or (NSUIntegerMax, 0) if absent or malformed. @@ -184,7 +186,7 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; /** * This method is the designated initializer for the class. */ -- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query; +- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(nullable NSDictionary*)query; /** * Convenience method that checks if the contentType property is defined. @@ -201,6 +203,8 @@ extern NSString* const GCDWebServerRequestAttribute_RegexCaptures; * * @return The attribute value for the key. */ -- (id)attributeForKey:(NSString*)key; +- (nullable id)attributeForKey:(NSString*)key; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m index 7542dc00..05988cd5 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m @@ -39,22 +39,17 @@ #define kGZipInitialBufferSize (256 * 1024) @interface GCDWebServerBodyDecoder : NSObject -- (id)initWithRequest:(GCDWebServerRequest*)request writer:(id)writer; @end @interface GCDWebServerGZipDecoder : GCDWebServerBodyDecoder @end -@interface GCDWebServerBodyDecoder () { -@private +@implementation GCDWebServerBodyDecoder { GCDWebServerRequest* __unsafe_unretained _request; id __unsafe_unretained _writer; } -@end - -@implementation GCDWebServerBodyDecoder -- (id)initWithRequest:(GCDWebServerRequest*)request writer:(id)writer { +- (instancetype)initWithRequest:(GCDWebServerRequest* _Nonnull)request writer:(id _Nonnull)writer { if ((self = [super init])) { _request = request; _writer = writer; @@ -76,14 +71,10 @@ - (BOOL)close:(NSError**)error { @end -@interface GCDWebServerGZipDecoder () { -@private +@implementation GCDWebServerGZipDecoder { z_stream _stream; BOOL _finished; } -@end - -@implementation GCDWebServerGZipDecoder - (BOOL)open:(NSError**)error { int result = inflateInit2(&_stream, 15 + 16); @@ -143,77 +134,55 @@ - (BOOL)close:(NSError**)error { @end -@interface GCDWebServerRequest () { -@private - NSString* _method; - NSURL* _url; - NSDictionary* _headers; - NSString* _path; - NSDictionary* _query; - NSString* _type; - BOOL _chunked; - NSUInteger _length; - NSDate* _modifiedSince; - NSString* _noneMatch; - NSRange _range; - BOOL _gzipAccepted; - NSData* _localAddress; - NSData* _remoteAddress; - +@implementation GCDWebServerRequest { BOOL _opened; NSMutableArray* _decoders; - NSMutableDictionary* _attributes; id __unsafe_unretained _writer; + NSMutableDictionary* _attributes; } -@end - -@implementation GCDWebServerRequest : NSObject - -@synthesize method=_method, URL=_url, headers=_headers, path=_path, query=_query, contentType=_type, contentLength=_length, ifModifiedSince=_modifiedSince, ifNoneMatch=_noneMatch, - byteRange=_range, acceptsGzipContentEncoding=_gzipAccepted, usesChunkedTransferEncoding=_chunked, localAddressData=_localAddress, remoteAddressData=_remoteAddress; - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query { if ((self = [super init])) { _method = [method copy]; - _url = url; + _URL = url; _headers = headers; _path = [path copy]; _query = query; - - _type = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Content-Type"]); - _chunked = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Transfer-Encoding"]) isEqualToString:@"chunked"]; + + _contentType = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Content-Type"]); + _usesChunkedTransferEncoding = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Transfer-Encoding"]) isEqualToString:@"chunked"]; NSString* lengthHeader = [_headers objectForKey:@"Content-Length"]; if (lengthHeader) { NSInteger length = [lengthHeader integerValue]; - if (_chunked || (length < 0)) { - GWS_LOG_WARNING(@"Invalid 'Content-Length' header '%@' for '%@' request on \"%@\"", lengthHeader, _method, _url); + if (_usesChunkedTransferEncoding || (length < 0)) { + GWS_LOG_WARNING(@"Invalid 'Content-Length' header '%@' for '%@' request on \"%@\"", lengthHeader, _method, _URL); GWS_DNOT_REACHED(); return nil; } - _length = length; - if (_type == nil) { - _type = kGCDWebServerDefaultMimeType; + _contentLength = length; + if (_contentType == nil) { + _contentType = kGCDWebServerDefaultMimeType; } - } else if (_chunked) { - if (_type == nil) { - _type = kGCDWebServerDefaultMimeType; + } else if (_usesChunkedTransferEncoding) { + if (_contentType == nil) { + _contentType = kGCDWebServerDefaultMimeType; } - _length = NSUIntegerMax; + _contentLength = NSUIntegerMax; } else { - if (_type) { - GWS_LOG_WARNING(@"Ignoring 'Content-Type' header for '%@' request on \"%@\"", _method, _url); - _type = nil; // Content-Type without Content-Length or chunked-encoding doesn't make sense + if (_contentType) { + GWS_LOG_WARNING(@"Ignoring 'Content-Type' header for '%@' request on \"%@\"", _method, _URL); + _contentType = nil; // Content-Type without Content-Length or chunked-encoding doesn't make sense } - _length = NSUIntegerMax; + _contentLength = NSUIntegerMax; } - + NSString* modifiedHeader = [_headers objectForKey:@"If-Modified-Since"]; if (modifiedHeader) { - _modifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy]; + _ifModifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy]; } - _noneMatch = [_headers objectForKey:@"If-None-Match"]; - - _range = NSMakeRange(NSUIntegerMax, 0); + _ifNoneMatch = [_headers objectForKey:@"If-None-Match"]; + + _byteRange = NSMakeRange(NSUIntegerMax, 0); NSString* rangeHeader = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Range"]); if (rangeHeader) { if ([rangeHeader hasPrefix:@"bytes="]) { @@ -226,27 +195,27 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict NSString* endString = [components objectAtIndex:1]; NSInteger endValue = [endString integerValue]; if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue)) { // The second 500 bytes: "500-999" - _range.location = startValue; - _range.length = endValue - startValue + 1; + _byteRange.location = startValue; + _byteRange.length = endValue - startValue + 1; } else if (startString.length && (startValue >= 0)) { // The bytes after 9500 bytes: "9500-" - _range.location = startValue; - _range.length = NSUIntegerMax; + _byteRange.location = startValue; + _byteRange.length = NSUIntegerMax; } else if (endString.length && (endValue > 0)) { // The final 500 bytes: "-500" - _range.location = NSUIntegerMax; - _range.length = endValue; + _byteRange.location = NSUIntegerMax; + _byteRange.length = endValue; } } } } - if ((_range.location == NSUIntegerMax) && (_range.length == 0)) { // Ignore "Range" header if syntactically invalid + if ((_byteRange.location == NSUIntegerMax) && (_byteRange.length == 0)) { // Ignore "Range" header if syntactically invalid GWS_LOG_WARNING(@"Failed to parse 'Range' header \"%@\" for url: %@", rangeHeader, url); } } - + if ([[_headers objectForKey:@"Accept-Encoding"] rangeOfString:@"gzip"].location != NSNotFound) { - _gzipAccepted = YES; + _acceptsGzipContentEncoding = YES; } - + _decoders = [[NSMutableArray alloc] init]; _attributes = [[NSMutableDictionary alloc] init]; } @@ -254,11 +223,11 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict } - (BOOL)hasBody { - return _type ? YES : NO; + return _contentType ? YES : NO; } - (BOOL)hasByteRange { - return GCDWebServerIsValidByteRange(_range); + return GCDWebServerIsValidByteRange(_byteRange); } - (id)attributeForKey:(NSString*)key { @@ -287,7 +256,7 @@ - (void)prepareForWriting { } - (BOOL)performOpen:(NSError**)error { - GWS_DCHECK(_type); + GWS_DCHECK(_contentType); GWS_DCHECK(_writer); if (_opened) { GWS_DNOT_REACHED(); @@ -312,11 +281,11 @@ - (void)setAttribute:(id)attribute forKey:(NSString*)key { } - (NSString*)localAddressString { - return GCDWebServerStringFromSockAddr(_localAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_localAddressData.bytes, YES); } - (NSString*)remoteAddressString { - return GCDWebServerStringFromSockAddr(_remoteAddress.bytes, YES); + return GCDWebServerStringFromSockAddr(_remoteAddressData.bytes, YES); } - (NSString*)description { diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h index 2ec2deef..1e5e8c9a 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h @@ -27,11 +27,13 @@ #import +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerBodyReaderCompletionBlock is passed by GCDWebServer to the * GCDWebServerBodyReader object when reading data from it asynchronously. */ -typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* error); +typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* _Nullable error); /** * This protocol is used by the GCDWebServerConnection to communicate with @@ -62,7 +64,7 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * or an empty NSData there is no more body data, or nil on error and set * the "error" argument which is guaranteed to be non-NULL. */ -- (NSData*)readData:(NSError**)error; +- (nullable NSData*)readData:(NSError**)error; /** * This method is called after all body data has been sent. @@ -102,7 +104,7 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * * @warning This property must be set if a body is present. */ -@property(nonatomic, copy) NSString* contentType; +@property(nonatomic, copy, nullable) NSString* contentType; /** * Sets the content length for the body of the response. If a body is present @@ -136,14 +138,14 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * * The default value is nil. */ -@property(nonatomic, retain) NSDate* lastModifiedDate; +@property(nonatomic, nullable) NSDate* lastModifiedDate; /** * Sets the ETag for the response using the "ETag" header. * * The default value is nil. */ -@property(nonatomic, copy) NSString* eTag; +@property(nonatomic, copy, nullable) NSString* eTag; /** * Enables gzip encoding for the response body. @@ -174,7 +176,7 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err * @warning Do not attempt to override the primary headers used * by GCDWebServerResponse like "Content-Type", "ETag", etc... */ -- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header; +- (void)setValue:(nullable NSString*)value forAdditionalHeader:(NSString*)header; /** * Convenience method that checks if the contentType property is defined. @@ -206,3 +208,5 @@ typedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* data, NSError* err - (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m index a5dc5374..9153ff67 100644 --- a/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m @@ -37,22 +37,17 @@ #define kGZipInitialBufferSize (256 * 1024) @interface GCDWebServerBodyEncoder : NSObject -- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id)reader; @end @interface GCDWebServerGZipEncoder : GCDWebServerBodyEncoder @end -@interface GCDWebServerBodyEncoder () { -@private +@implementation GCDWebServerBodyEncoder { GCDWebServerResponse* __unsafe_unretained _response; id __unsafe_unretained _reader; } -@end - -@implementation GCDWebServerBodyEncoder -- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id)reader { +- (instancetype)initWithResponse:(GCDWebServerResponse* _Nonnull)response reader:(id _Nonnull)reader { if ((self = [super init])) { _response = response; _reader = reader; @@ -74,16 +69,12 @@ - (void)close { @end -@interface GCDWebServerGZipEncoder () { -@private +@implementation GCDWebServerGZipEncoder { z_stream _stream; BOOL _finished; } -@end - -@implementation GCDWebServerGZipEncoder -- (id)initWithResponse:(GCDWebServerResponse*)response reader:(id)reader { +- (instancetype)initWithResponse:(GCDWebServerResponse* _Nonnull)response reader:(id _Nonnull)reader { if ((self = [super initWithResponse:response reader:reader])) { response.contentLength = NSUIntegerMax; // Make sure "Content-Length" header is not set since we don't know it [response setValue:@"gzip" forAdditionalHeader:@"Content-Encoding"]; @@ -157,28 +148,11 @@ - (void)close { @end -@interface GCDWebServerResponse () { -@private - NSString* _type; - NSUInteger _length; - NSInteger _status; - NSUInteger _maxAge; - NSDate* _lastModified; - NSString* _eTag; - NSMutableDictionary* _headers; - BOOL _chunked; - BOOL _gzipped; - +@implementation GCDWebServerResponse { BOOL _opened; NSMutableArray* _encoders; id __unsafe_unretained _reader; } -@end - -@implementation GCDWebServerResponse - -@synthesize contentType=_type, contentLength=_length, statusCode=_status, cacheControlMaxAge=_maxAge, lastModifiedDate=_lastModified, eTag=_eTag, - gzipContentEncodingEnabled=_gzipped, additionalHeaders=_headers; + (instancetype)response { return [[[self class] alloc] init]; @@ -186,26 +160,26 @@ + (instancetype)response { - (instancetype)init { if ((self = [super init])) { - _type = nil; - _length = NSUIntegerMax; - _status = kGCDWebServerHTTPStatusCode_OK; - _maxAge = 0; - _headers = [[NSMutableDictionary alloc] init]; + _contentType = nil; + _contentLength = NSUIntegerMax; + _statusCode = kGCDWebServerHTTPStatusCode_OK; + _cacheControlMaxAge = 0; + _additionalHeaders = [[NSMutableDictionary alloc] init]; _encoders = [[NSMutableArray alloc] init]; } return self; } - (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header { - [_headers setValue:value forKey:header]; + [_additionalHeaders setValue:value forKey:header]; } - (BOOL)hasBody { - return _type ? YES : NO; + return _contentType ? YES : NO; } - (BOOL)usesChunkedTransferEncoding { - return (_type != nil) && (_length == NSUIntegerMax); + return (_contentType != nil) && (_contentLength == NSUIntegerMax); } - (BOOL)open:(NSError**)error { @@ -222,7 +196,7 @@ - (void)close { - (void)prepareForReading { _reader = self; - if (_gzipped) { + if (_gzipContentEncodingEnabled) { GCDWebServerGZipEncoder* encoder = [[GCDWebServerGZipEncoder alloc] initWithResponse:self reader:_reader]; [_encoders addObject:encoder]; _reader = encoder; @@ -230,7 +204,7 @@ - (void)prepareForReading { } - (BOOL)performOpen:(NSError**)error { - GWS_DCHECK(_type); + GWS_DCHECK(_contentType); GWS_DCHECK(_reader); if (_opened) { GWS_DNOT_REACHED(); @@ -257,24 +231,24 @@ - (void)performClose { } - (NSString*)description { - NSMutableString* description = [NSMutableString stringWithFormat:@"Status Code = %i", (int)_status]; - if (_type) { - [description appendFormat:@"\nContent Type = %@", _type]; + NSMutableString* description = [NSMutableString stringWithFormat:@"Status Code = %i", (int)_statusCode]; + if (_contentType) { + [description appendFormat:@"\nContent Type = %@", _contentType]; } - if (_length != NSUIntegerMax) { - [description appendFormat:@"\nContent Length = %lu", (unsigned long)_length]; + if (_contentLength != NSUIntegerMax) { + [description appendFormat:@"\nContent Length = %lu", (unsigned long)_contentLength]; } - [description appendFormat:@"\nCache Control Max Age = %lu", (unsigned long)_maxAge]; - if (_lastModified) { - [description appendFormat:@"\nLast Modified Date = %@", _lastModified]; + [description appendFormat:@"\nCache Control Max Age = %lu", (unsigned long)_cacheControlMaxAge]; + if (_lastModifiedDate) { + [description appendFormat:@"\nLast Modified Date = %@", _lastModifiedDate]; } if (_eTag) { [description appendFormat:@"\nETag = %@", _eTag]; } - if (_headers.count) { + if (_additionalHeaders.count) { [description appendString:@"\n"]; - for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) { - [description appendFormat:@"\n%@: %@", header, [_headers objectForKey:header]]; + for (NSString* header in [[_additionalHeaders allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [description appendFormat:@"\n%@: %@", header, [_additionalHeaders objectForKey:header]]; } } return description; diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h index 5048d080..f21a4b78 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerDataRequest subclass of GCDWebServerRequest stores the body * of the HTTP request in memory. @@ -49,12 +51,14 @@ * The text encoding used to interpret the data is extracted from the * "Content-Type" header or defaults to UTF-8. */ -@property(nonatomic, readonly) NSString* text; +@property(nonatomic, readonly, nullable) NSString* text; /** * Returns the data for the request body interpreted as a JSON object. If the * content type of the body is not JSON, or if an error occurs, nil is returned. */ -@property(nonatomic, readonly) id jsonObject; +@property(nonatomic, readonly, nullable) id jsonObject; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m index 840e985d..3ea9bba7 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m @@ -31,18 +31,14 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerDataRequest () { -@private - NSMutableData* _data; - +@interface GCDWebServerDataRequest () +@property(nonatomic) NSMutableData* data; +@end + +@implementation GCDWebServerDataRequest { NSString* _text; id _jsonObject; } -@end - -@implementation GCDWebServerDataRequest - -@synthesize data=_data; - (BOOL)open:(NSError**)error { if (self.contentLength != NSUIntegerMax) { @@ -52,7 +48,7 @@ - (BOOL)open:(NSError**)error { } if (_data == nil) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed allocating memory"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed allocating memory" }]; } return NO; } @@ -72,7 +68,7 @@ - (NSString*)description { NSMutableString* description = [NSMutableString stringWithString:[super description]]; if (_data) { [description appendString:@"\n\n"]; - [description appendString:GCDWebServerDescribeData(_data, self.contentType)]; + [description appendString:GCDWebServerDescribeData(_data, (NSString*)self.contentType)]; } return description; } diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h index ad29eaba..8aceae4d 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerFileRequest subclass of GCDWebServerRequest stores the body * of the HTTP request to a file on disk. @@ -43,3 +45,5 @@ @property(nonatomic, readonly) NSString* temporaryPath; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m index adf67a5d..8a47fcc0 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m @@ -31,16 +31,9 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerFileRequest () { -@private - NSString* _temporaryPath; +@implementation GCDWebServerFileRequest { int _file; } -@end - -@implementation GCDWebServerFileRequest - -@synthesize temporaryPath=_temporaryPath; - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query { if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) { @@ -85,14 +78,14 @@ - (BOOL)close:(NSError**)error { NSString* creationDateHeader = [self.headers objectForKey:@"X-GCDWebServer-CreationDate"]; if (creationDateHeader) { NSDate* date = GCDWebServerParseISO8601(creationDateHeader); - if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:_temporaryPath error:error]) { + if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate : date} ofItemAtPath:_temporaryPath error:error]) { return NO; } } NSString* modifiedDateHeader = [self.headers objectForKey:@"X-GCDWebServer-ModifiedDate"]; if (modifiedDateHeader) { NSDate* date = GCDWebServerParseRFC822(modifiedDateHeader); - if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: date} ofItemAtPath:_temporaryPath error:error]) { + if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate : date} ofItemAtPath:_temporaryPath error:error]) { return NO; } } diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h index 832c2e71..93ac1791 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerMultiPart class is an abstract class that wraps the content * of a part. @@ -69,7 +71,7 @@ * The text encoding used to interpret the data is extracted from the * "Content-Type" header or defaults to UTF-8. */ -@property(nonatomic, readonly) NSString* string; +@property(nonatomic, readonly, nullable) NSString* string; @end @@ -122,11 +124,13 @@ /** * Returns the first argument for a given control name or nil if not found. */ -- (GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name; +- (nullable GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name; /** * Returns the first file for a given control name or nil if not found. */ -- (GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name; +- (nullable GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m index c2fc9bfb..4e6bf09c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m @@ -42,53 +42,31 @@ } ParserState; @interface GCDWebServerMIMEStreamParser : NSObject -- (id)initWithBoundary:(NSString*)boundary defaultControlName:(NSString*)name arguments:(NSMutableArray*)arguments files:(NSMutableArray*)files; -- (BOOL)appendBytes:(const void*)bytes length:(NSUInteger)length; -- (BOOL)isAtEnd; @end static NSData* _newlineData = nil; static NSData* _newlinesData = nil; static NSData* _dashNewlineData = nil; -@interface GCDWebServerMultiPart () { -@private - NSString* _controlName; - NSString* _contentType; - NSString* _mimeType; -} -@end - @implementation GCDWebServerMultiPart -@synthesize controlName=_controlName, contentType=_contentType, mimeType=_mimeType; - -- (id)initWithControlName:(NSString*)name contentType:(NSString*)type { +- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type { if ((self = [super init])) { _controlName = [name copy]; _contentType = [type copy]; - _mimeType = GCDWebServerTruncateHeaderValue(_contentType); + _mimeType = (NSString*)GCDWebServerTruncateHeaderValue(_contentType); } return self; } @end -@interface GCDWebServerMultiPartArgument () { -@private - NSData* _data; - NSString* _string; -} -@end - @implementation GCDWebServerMultiPartArgument -@synthesize data=_data, string=_string; - -- (id)initWithControlName:(NSString*)name contentType:(NSString*)type data:(NSData*)data { +- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type data:(NSData* _Nonnull)data { if ((self = [super initWithControlName:name contentType:type])) { _data = data; - + if ([self.contentType hasPrefix:@"text/"]) { NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); _string = [[NSString alloc] initWithData:_data encoding:GCDWebServerStringEncodingFromCharset(charset)]; @@ -103,18 +81,9 @@ - (NSString*)description { @end -@interface GCDWebServerMultiPartFile () { -@private - NSString* _fileName; - NSString* _temporaryPath; -} -@end - @implementation GCDWebServerMultiPartFile -@synthesize fileName=_fileName, temporaryPath=_temporaryPath; - -- (id)initWithControlName:(NSString*)name contentType:(NSString*)type fileName:(NSString*)fileName temporaryPath:(NSString*)temporaryPath { +- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type fileName:(NSString* _Nonnull)fileName temporaryPath:(NSString* _Nonnull)temporaryPath { if ((self = [super initWithControlName:name contentType:type])) { _fileName = [fileName copy]; _temporaryPath = [temporaryPath copy]; @@ -132,15 +101,14 @@ - (NSString*)description { @end -@interface GCDWebServerMIMEStreamParser () { -@private +@implementation GCDWebServerMIMEStreamParser { NSData* _boundary; NSString* _defaultcontrolName; ParserState _state; NSMutableData* _data; NSMutableArray* _arguments; NSMutableArray* _files; - + NSString* _controlName; NSString* _fileName; NSString* _contentType; @@ -148,9 +116,6 @@ @interface GCDWebServerMIMEStreamParser () { int _tmpFile; GCDWebServerMIMEStreamParser* _subParser; } -@end - -@implementation GCDWebServerMIMEStreamParser + (void)initialize { if (_newlineData == nil) { @@ -167,7 +132,7 @@ + (void)initialize { } } -- (id)initWithBoundary:(NSString*)boundary defaultControlName:(NSString*)name arguments:(NSMutableArray*)arguments files:(NSMutableArray*)files { +- (instancetype)initWithBoundary:(NSString* _Nonnull)boundary defaultControlName:(NSString* _Nullable)name arguments:(NSMutableArray* _Nonnull)arguments files:(NSMutableArray* _Nonnull)files { NSData* data = boundary.length ? [[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSASCIIStringEncoding] : nil; if (data == nil) { GWS_DNOT_REACHED(); @@ -194,11 +159,10 @@ - (void)dealloc { // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 - (BOOL)_parseData { BOOL success = YES; - + if (_state == kParserState_Headers) { NSRange range = [_data rangeOfData:_newlinesData options:0 range:NSMakeRange(0, _data.length)]; if (range.location != NSNotFound) { - _controlName = nil; _fileName = nil; _contentType = nil; @@ -256,12 +220,12 @@ - (BOOL)_parseData { GWS_DNOT_REACHED(); success = NO; } - + [_data replaceBytesInRange:NSMakeRange(0, range.location + range.length) withBytes:NULL length:0]; _state = kParserState_Content; } } - + if ((_state == kParserState_Start) || (_state == kParserState_Content)) { NSRange range = [_data rangeOfData:_boundary options:0 range:NSMakeRange(0, _data.length)]; if (range.location != NSNotFound) { @@ -269,7 +233,6 @@ - (BOOL)_parseData { NSRange subRange1 = [_data rangeOfData:_newlineData options:NSDataSearchAnchored range:subRange]; NSRange subRange2 = [_data rangeOfData:_dashNewlineData options:NSDataSearchAnchored range:subRange]; if ((subRange1.location != NSNotFound) || (subRange2.location != NSNotFound)) { - if (_state == kParserState_Content) { const void* dataBytes = _data.bytes; NSUInteger dataLength = range.location - 2; @@ -301,7 +264,7 @@ - (BOOL)_parseData { [_arguments addObject:argument]; } } - + if (subRange1.location != NSNotFound) { [_data replaceBytesInRange:NSMakeRange(0, subRange1.location + subRange1.length) withBytes:NULL length:0]; _state = kParserState_Headers; @@ -333,7 +296,7 @@ - (BOOL)_parseData { } } } - + return success; } @@ -348,17 +311,14 @@ - (BOOL)isAtEnd { @end -@interface GCDWebServerMultiPartFormRequest () { -@private - GCDWebServerMIMEStreamParser* _parser; - NSMutableArray* _arguments; - NSMutableArray* _files; -} +@interface GCDWebServerMultiPartFormRequest () +@property(nonatomic) NSMutableArray* arguments; +@property(nonatomic) NSMutableArray* files; @end -@implementation GCDWebServerMultiPartFormRequest - -@synthesize arguments=_arguments, files=_files; +@implementation GCDWebServerMultiPartFormRequest { + GCDWebServerMIMEStreamParser* _parser; +} + (NSString*)mimeType { return @"multipart/form-data"; @@ -377,7 +337,7 @@ - (BOOL)open:(NSError**)error { _parser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:nil arguments:_arguments files:_files]; if (_parser == nil) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed starting to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed starting to parse multipart form data" }]; } return NO; } @@ -387,7 +347,7 @@ - (BOOL)open:(NSError**)error { - (BOOL)writeData:(NSData*)data error:(NSError**)error { if (![_parser appendBytes:data.bytes length:data.length]) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed continuing to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed continuing to parse multipart form data" }]; } return NO; } @@ -399,7 +359,7 @@ - (BOOL)close:(NSError**)error { _parser = nil; if (!atEnd) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed finishing to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed finishing to parse multipart form data" }]; } return NO; } diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h index 97353804..fcf177e5 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h @@ -27,6 +27,8 @@ #import "GCDWebServerDataRequest.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerURLEncodedFormRequest subclass of GCDWebServerRequest * parses the body of the HTTP request as a URL encoded form using @@ -49,3 +51,5 @@ + (NSString*)mimeType; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m index 2c5fcc59..7e0137f8 100644 --- a/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m +++ b/Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m @@ -31,16 +31,8 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerURLEncodedFormRequest () { -@private - NSDictionary* _arguments; -} -@end - @implementation GCDWebServerURLEncodedFormRequest -@synthesize arguments=_arguments; - + (NSString*)mimeType { return @"application/x-www-form-urlencoded"; } @@ -49,12 +41,10 @@ - (BOOL)close:(NSError**)error { if (![super close:error]) { return NO; } - + NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); NSString* string = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)]; _arguments = GCDWebServerParseURLEncodedForm(string); - GWS_DCHECK(_arguments); - return YES; } diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h index 6e06cd89..783f5966 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h @@ -27,11 +27,14 @@ #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerDataResponse subclass of GCDWebServerResponse reads the body * of the HTTP response from memory. */ @interface GCDWebServerDataResponse : GCDWebServerResponse +@property(nonatomic, copy) NSString* contentType; // Redeclare as non-null /** * Creates a response with data in memory and a given content type. @@ -50,40 +53,40 @@ /** * Creates a data response from text encoded using UTF-8. */ -+ (instancetype)responseWithText:(NSString*)text; ++ (nullable instancetype)responseWithText:(NSString*)text; /** * Creates a data response from HTML encoded using UTF-8. */ -+ (instancetype)responseWithHTML:(NSString*)html; ++ (nullable instancetype)responseWithHTML:(NSString*)html; /** * Creates a data response from an HTML template encoded using UTF-8. * See -initWithHTMLTemplate:variables: for details. */ -+ (instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; ++ (nullable instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; /** * Creates a data response from a serialized JSON object and the default * "application/json" content type. */ -+ (instancetype)responseWithJSONObject:(id)object; ++ (nullable instancetype)responseWithJSONObject:(id)object; /** * Creates a data response from a serialized JSON object and a custom * content type. */ -+ (instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type; ++ (nullable instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type; /** * Initializes a data response from text encoded using UTF-8. */ -- (instancetype)initWithText:(NSString*)text; +- (nullable instancetype)initWithText:(NSString*)text; /** * Initializes a data response from HTML encoded using UTF-8. */ -- (instancetype)initWithHTML:(NSString*)html; +- (nullable instancetype)initWithHTML:(NSString*)html; /** * Initializes a data response from an HTML template encoded using UTF-8. @@ -91,18 +94,20 @@ * All occurences of "%variable%" within the HTML template are replaced with * their corresponding values. */ -- (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; +- (nullable instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)variables; /** * Initializes a data response from a serialized JSON object and the default * "application/json" content type. */ -- (instancetype)initWithJSONObject:(id)object; +- (nullable instancetype)initWithJSONObject:(id)object; /** * Initializes a data response from a serialized JSON object and a custom * content type. */ -- (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type; +- (nullable instancetype)initWithJSONObject:(id)object contentType:(NSString*)type; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m index 12cd12b3..b4968474 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m @@ -31,28 +31,21 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerDataResponse () { -@private +@implementation GCDWebServerDataResponse { NSData* _data; BOOL _done; } -@end -@implementation GCDWebServerDataResponse +@dynamic contentType; + (instancetype)responseWithData:(NSData*)data contentType:(NSString*)type { return [[[self class] alloc] initWithData:data contentType:type]; } - (instancetype)initWithData:(NSData*)data contentType:(NSString*)type { - if (data == nil) { - GWS_DNOT_REACHED(); - return nil; - } - if ((self = [super init])) { _data = data; - + self.contentType = type; self.contentLength = data.length; } @@ -124,8 +117,7 @@ - (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary*)va [variables enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL* stop) { [html replaceOccurrencesOfString:[NSString stringWithFormat:@"%%%@%%", key] withString:value options:0 range:NSMakeRange(0, html.length)]; }]; - id response = [self initWithHTML:html]; - return response; + return [self initWithHTML:html]; } - (instancetype)initWithJSONObject:(id)object { @@ -135,6 +127,7 @@ - (instancetype)initWithJSONObject:(id)object { - (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type { NSData* data = [NSJSONSerialization dataWithJSONObject:object options:0 error:NULL]; if (data == nil) { + GWS_DNOT_REACHED(); return nil; } return [self initWithData:data contentType:type]; diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h index dad01147..92c834cf 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h @@ -28,6 +28,8 @@ #import "GCDWebServerDataResponse.h" #import "GCDWebServerHTTPStatusCodes.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerDataResponse subclass of GCDWebServerDataResponse generates * an HTML body from an HTTP status code and an error message. @@ -37,45 +39,47 @@ /** * Creates a client error response with the corresponding HTTP status code. */ -+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); ++ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Creates a server error response with the corresponding HTTP status code. */ -+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); ++ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Creates a client error response with the corresponding HTTP status code * and an underlying NSError. */ -+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); ++ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Creates a server error response with the corresponding HTTP status code * and an underlying NSError. */ -+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); ++ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Initializes a client error response with the corresponding HTTP status code. */ -- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); +- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Initializes a server error response with the corresponding HTTP status code. */ -- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); +- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Initializes a client error response with the corresponding HTTP status code * and an underlying NSError. */ -- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); +- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Initializes a server error response with the corresponding HTTP status code * and an underlying NSError. */ -- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); +- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m index ef6a991d..f1cd2023 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m @@ -31,10 +31,6 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerErrorResponse () -- (instancetype)initWithStatusCode:(NSInteger)statusCode underlyingError:(NSError*)underlyingError messageFormat:(NSString*)format arguments:(va_list)arguments; -@end - @implementation GCDWebServerErrorResponse + (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... { diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h index 050e92f8..9403835e 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h @@ -27,6 +27,8 @@ #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerFileResponse subclass of GCDWebServerResponse reads the body * of the HTTP response from a file on disk. @@ -36,17 +38,20 @@ * metadata. */ @interface GCDWebServerFileResponse : GCDWebServerResponse +@property(nonatomic, copy) NSString* contentType; // Redeclare as non-null +@property(nonatomic) NSDate* lastModifiedDate; // Redeclare as non-null +@property(nonatomic, copy) NSString* eTag; // Redeclare as non-null /** * Creates a response with the contents of a file. */ -+ (instancetype)responseWithFile:(NSString*)path; ++ (nullable instancetype)responseWithFile:(NSString*)path; /** * Creates a response like +responseWithFile: and sets the "Content-Disposition" * HTTP header for a download if the "attachment" argument is YES. */ -+ (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment; ++ (nullable instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment; /** * Creates a response like +responseWithFile: but restricts the file contents @@ -54,26 +59,26 @@ * * See -initWithFile:byteRange: for details. */ -+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range; ++ (nullable instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range; /** * Creates a response like +responseWithFile:byteRange: and sets the * "Content-Disposition" HTTP header for a download if the "attachment" * argument is YES. */ -+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; ++ (nullable instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; /** * Initializes a response with the contents of a file. */ -- (instancetype)initWithFile:(NSString*)path; +- (nullable instancetype)initWithFile:(NSString*)path; /** * Initializes a response like +responseWithFile: and sets the * "Content-Disposition" HTTP header for a download if the "attachment" * argument is YES. */ -- (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment; +- (nullable instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment; /** * Initializes a response like -initWithFile: but restricts the file contents @@ -86,11 +91,18 @@ * This argument would typically be set to the value of the byteRange property * of the current GCDWebServerRequest. */ -- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range; +- (nullable instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range; /** * This method is the designated initializer for the class. + * + * If MIME type overrides are specified, they allow to customize the built-in + * mapping from extensions to MIME types. Keys of the dictionary must be lowercased + * file extensions without the period, and the values must be the corresponding + * MIME types. */ -- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment; +- (nullable instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment mimeTypeOverrides:(nullable NSDictionary*)overrides; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m index a2b7c3c0..bd07518c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m @@ -35,16 +35,14 @@ #define kFileReadBufferSize (32 * 1024) -@interface GCDWebServerFileResponse () { -@private +@implementation GCDWebServerFileResponse { NSString* _path; NSUInteger _offset; NSUInteger _size; int _file; } -@end -@implementation GCDWebServerFileResponse +@dynamic contentType, lastModifiedDate, eTag; + (instancetype)responseWithFile:(NSString*)path { return [[[self class] alloc] initWithFile:path]; @@ -59,26 +57,26 @@ + (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range { } + (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment { - return [[[self class] alloc] initWithFile:path byteRange:range isAttachment:attachment]; + return [[[self class] alloc] initWithFile:path byteRange:range isAttachment:attachment mimeTypeOverrides:nil]; } - (instancetype)initWithFile:(NSString*)path { - return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:NO]; + return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:NO mimeTypeOverrides:nil]; } - (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment { - return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:attachment]; + return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:attachment mimeTypeOverrides:nil]; } - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range { - return [self initWithFile:path byteRange:range isAttachment:NO]; + return [self initWithFile:path byteRange:range isAttachment:NO mimeTypeOverrides:nil]; } static inline NSDate* _NSDateFromTimeSpec(const struct timespec* t) { return [NSDate dateWithTimeIntervalSince1970:((NSTimeInterval)t->tv_sec + (NSTimeInterval)t->tv_nsec / 1000000000.0)]; } -- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment { +- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment mimeTypeOverrides:(NSDictionary*)overrides { struct stat info; if (lstat([path fileSystemRepresentation], &info) || !(info.st_mode & S_IFREG)) { GWS_DNOT_REACHED(); @@ -91,7 +89,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme } #endif NSUInteger fileSize = (NSUInteger)info.st_size; - + BOOL hasByteRange = GCDWebServerIsValidByteRange(range); if (hasByteRange) { if (range.location != NSUIntegerMax) { @@ -108,7 +106,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme range.location = 0; range.length = fileSize; } - + if ((self = [super init])) { _path = [path copy]; _offset = range.location; @@ -118,7 +116,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme [self setValue:[NSString stringWithFormat:@"bytes %lu-%lu/%lu", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), (unsigned long)fileSize] forAdditionalHeader:@"Content-Range"]; GWS_LOG_DEBUG(@"Using content bytes range [%lu-%lu] for file \"%@\"", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), path); } - + if (attachment) { NSString* fileName = [path lastPathComponent]; NSData* data = [[fileName stringByReplacingOccurrencesOfString:@"\"" withString:@""] dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES]; @@ -130,8 +128,8 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme GWS_DNOT_REACHED(); } } - - self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension]); + + self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension], overrides); self.contentLength = _size; self.lastModifiedDate = _NSDateFromTimeSpec(&info.st_mtimespec); self.eTag = [NSString stringWithFormat:@"%llu/%li/%li", info.st_ino, info.st_mtimespec.tv_sec, info.st_mtimespec.tv_nsec]; diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h index 2731b7c6..bb48e661 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h @@ -27,12 +27,14 @@ #import "GCDWebServerResponse.h" +NS_ASSUME_NONNULL_BEGIN + /** * The GCDWebServerStreamBlock is called to stream the data for the HTTP body. * The block must return either a chunk of data, an empty NSData when done, or * nil on error and set the "error" argument which is guaranteed to be non-NULL. */ -typedef NSData* (^GCDWebServerStreamBlock)(NSError** error); +typedef NSData* _Nullable (^GCDWebServerStreamBlock)(NSError** error); /** * The GCDWebServerAsyncStreamBlock works like the GCDWebServerStreamBlock @@ -51,6 +53,7 @@ typedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlo * the body of the HTTP response using a GCD block. */ @interface GCDWebServerStreamedResponse : GCDWebServerResponse +@property(nonatomic, copy) NSString* contentType; // Redeclare as non-null /** * Creates a response with streamed data and a given content type. @@ -73,3 +76,5 @@ typedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlo - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block; @end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m index 4669617f..9387263c 100644 --- a/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m +++ b/Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m @@ -31,13 +31,11 @@ #import "GCDWebServerPrivate.h" -@interface GCDWebServerStreamedResponse () { -@private +@implementation GCDWebServerStreamedResponse { GCDWebServerAsyncStreamBlock _block; } -@end -@implementation GCDWebServerStreamedResponse +@dynamic contentType; + (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { return [[[self class] alloc] initWithContentType:type streamBlock:block]; @@ -48,19 +46,20 @@ + (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWeb } - (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { - return [self initWithContentType:type asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { - - NSError* error = nil; - NSData* data = block(&error); - completionBlock(data, error); - - }]; + return [self initWithContentType:type + asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { + + NSError* error = nil; + NSData* data = block(&error); + completionBlock(data, error); + + }]; } - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block { if ((self = [super init])) { _block = [block copy]; - + self.contentType = type; } return self; diff --git a/Pods/GCDWebServer/README.md b/Pods/GCDWebServer/README.md index 870d4e60..b22211ad 100644 --- a/Pods/GCDWebServer/README.md +++ b/Pods/GCDWebServer/README.md @@ -36,7 +36,7 @@ What's not supported (but not really required from an embedded HTTP server): Requirements: * OS X 10.7 or later (x86_64) -* iOS 5.0 or later (armv7, armv7s or arm64) +* iOS 8.0 or later (armv7, armv7s or arm64) * ARC memory management only (if you need MRC support use GCDWebServer 3.1 and earlier) Getting Started @@ -71,7 +71,7 @@ Then run `$ carthage update` and add the generated frameworks to your Xcode proj Help & Support ============== -For help with using GCDWebServer, it's best to ask your question on Stack Overflow with the [`gcdwebserver`](http://stackoverflow.com/questions/tagged/gcdwebserver) tag. +For help with using GCDWebServer, it's best to ask your question on Stack Overflow with the [`gcdwebserver`](http://stackoverflow.com/questions/tagged/gcdwebserver) tag. For bug reports and enhancement requests you can use [issues](https://github.com/swisspol/GCDWebServer/issues) in this project. Be sure to read this entire README first though! @@ -365,7 +365,7 @@ Both for debugging and informational purpose, GCDWebServer logs messages extensi By default, all messages logged by GCDWebServer are sent to its built-in logging facility, which simply outputs to ```stderr``` (assuming a terminal type device is connected). In order to better integrate with the rest of your app or because of the amount of information logged, you might want to use another logging facility. -GCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source) and [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack). If either of them is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details). +GCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source): if it is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details). It's also possible to use a custom logging facility - see [GCDWebServer.h](GCDWebServer/Core/GCDWebServer.h) for more information. diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index f7a9fcb0..1c817224 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,13 +1,13 @@ PODS: - Alamofire (4.2.0) - BRLOptionParser (0.3.1) - - GCDWebServer (3.3.3): - - GCDWebServer/Core (= 3.3.3) - - GCDWebServer/Core (3.3.3) + - GCDWebServer (3.4.2): + - GCDWebServer/Core (= 3.4.2) + - GCDWebServer/Core (3.4.2) - MASShortcut (2.3.6) - - RxCocoa (3.3.1): - - RxSwift (~> 3.3) - - RxSwift (3.3.1) + - RxCocoa (3.6.1): + - RxSwift (~> 3.6) + - RxSwift (3.6.1) DEPENDENCIES: - Alamofire (~> 4.2.0) @@ -20,10 +20,10 @@ DEPENDENCIES: SPEC CHECKSUMS: Alamofire: aa2e09d871c9160ac53c90e83c68064a94e3dfbe BRLOptionParser: a03256a8ff003ca1f5376c55f55f210e085a3958 - GCDWebServer: 1c39a1f0763e4eb492bee021e4270fce097d3555 + GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa - RxCocoa: 7dcb7a1860fc9cd0e23dae67ab105fc2916670b6 - RxSwift: 8fc9f2de6275a9101d518444e00bf32f1a42caac + RxCocoa: 84a08739ab186248c7f31ce4ee92d6f8a947d690 + RxSwift: f9de85ea20cd2f7716ee5409fc13523dc638e4e4 PODFILE CHECKSUM: 5abdd116651e99453ca2480b0a17344fadc111ea diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 0e41942a..26c445b0 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -8,328 +8,319 @@ /* Begin PBXBuildFile section */ 008D88E94858B0B8190DD42951253AD2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 015A2D47B6DA8E170E4E64108EC177CA /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F9B04B4F8691154899A7BB06F149941 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 03810806C0578A750613717248DC37CC /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 941AC673759A8487CD0E31D9222FE395 /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 03AEC3CDFC3EAC2C0366631AA17F0021 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = E149E56489936102F081551F32C5F5EB /* Reduce.swift */; }; - 03F3C06659D9C05E49701C68B2F368DB /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = C524B1525327F67736740D5488CEAFD6 /* ElementAt.swift */; }; - 0551162B7568A0F3028CF7CE13E9C1C7 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 360EB85AC720C078D420EADAF6C654ED /* GCDWebServerURLEncodedFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 06067FEB1AB279D49A3F16553693D98C /* NSTextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088BD130A0FBEAEA4D9FDAE864B58DC7 /* NSTextField+Rx.swift */; }; - 07147440201D62C544F94526CA96A5C3 /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DC1F4EFF87C0AA04AFAB87CB07ACFC2 /* SharedSequence+Operators.swift */; }; - 08067F41CEECB56CE74FFCA481092E8D /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = F8EA91701D31DC73ED6AA21F7AD637B2 /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 08DB8704904133A00B55601FAD0A012F /* AsMaybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34AEA52D361570E78F8B9792A835A1A1 /* AsMaybe.swift */; }; - 095B15AD34057F9AF7AF7DC0CD7CC6E5 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7A485A268FA20FBE6CEAB65881AF6F /* InfiniteSequence.swift */; }; - 098AA417A5494FC829E777DC5CF06ECC /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = DB83C3266870BCD77C80A5BF5F71BFE0 /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0990CFB289EC7E60955ACCF0DE727364 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B7E831C7BD9ACCDA16302B15F5A8035 /* Deferred.swift */; }; - 0A018C2159E3422F73CC243BE77CB879 /* Observable+StandardSequenceOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA80549D390412FB66E8ADB1475C39D2 /* Observable+StandardSequenceOperators.swift */; }; - 0A402C97D8A2855E4F69D8E2BFEE752E /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 234D1504F40F558DF1303E8C160D47BD /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 0B02531D97A04A562AD8FEFE3075E528 /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 912AE5C728F325B6D86D33E827E266C8 /* RxMutableBox.swift */; }; - 0B8140968914C908CFB4949F67745DD7 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 015CDD34C2C3E889192595296079F633 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0C59FF6E931F35DE452E544B4E9366E3 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0C370A9E746A9710DCDBF48091819B /* ObserverBase.swift */; }; - 0C963577F459E5A7F345D0FBD58E0A67 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60B4EBBBD5D3F3346F7E7334498186B2 /* ImmediateSchedulerType.swift */; }; - 0EF1FE250F2BFFABD61D2918C76E2916 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271DC7562BA32ADD28B4A53CA4C92137 /* SingleAsync.swift */; }; - 1012A309E82945C38EA9CA39444380DF /* NSButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4F41A96AB13FAA06EB576B1286FD61 /* NSButton+Rx.swift */; }; - 106520C21CE01A94879410E99DD37F47 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5208F42E4D16971BBD8698E9C751B6ED /* Take.swift */; }; - 10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B5C5DECEBDC9747029DD2086C6B00D /* Timeline.swift */; }; - 11C0C606C5CDBA15C8F0E1C06BEE3799 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C1694FBE9CBF06E4F1C9F38B5DFA930 /* PriorityQueue.swift */; }; - 12149EA10608B7DE38879E6242D2826C /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9C1DEE1416BA8E32A4D01FC91692DDA2 /* ko.lproj */; }; - 12C4D8F003A5CAEC8FA3C7D03A4A1484 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1AE55DF48B45CC65465B461F51CA3EA /* Window.swift */; }; - 1568BC317134F1902AB76EE65E0A18CE /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = FD0EA79B1967F9A248BD807632BC9C79 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 157AE1FBA8F6C3B710CDE90F86492010 /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = C2F0513828D310E221B920200A0AF8B9 /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 15C09589084D116390E3B04BF3B026B6 /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AAA65A3B3DF93288B9973C7991DA37 /* ControlEvent.swift */; }; - 17848AD97F24126359BC05C4E675F0A4 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B81A53E7BA7B919692592FBAEB2C093 /* SharedSequence+Operators+arity.swift */; }; - 184571546F643ABB4ADDC1DAAB6FBE78 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DB18E3EF0102CDC82F31CA6B466A8B3 /* ToArray.swift */; }; + 0093F7D38FC7D85465CC3D99E967DEBD /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B348F108925962F83EAEAC0E334CA06 /* SingleAsync.swift */; }; + 00D5F4580CB36DEEDCD9993C7AB12FC6 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534E4A964C49209EE277E82628F5710B /* BooleanDisposable.swift */; }; + 015A2D47B6DA8E170E4E64108EC177CA /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = C952CFCB4CF5FD55CFE8949FD41C9460 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 02AF6FE5E8DEE90F98111F7EA2A3C4E0 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 33607CFF1CB9E42C89084F9C17E407B0 /* RxSwift-dummy.m */; }; + 034E2CE53A5F556A85666E0818BF3717 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E44E93931EFF87E67F113CD862A0C1 /* Take.swift */; }; + 03810806C0578A750613717248DC37CC /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = E5B859D5878DCF98B3D01C2C0615A78C /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 0551162B7568A0F3028CF7CE13E9C1C7 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D03BE981ABF583B8C0A9733FC4E7758 /* GCDWebServerURLEncodedFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 079EF148723928859C047C3138DE0803 /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C5253CFC07A13DD0519ACE57BC0EC0 /* SynchronizedSubscribeType.swift */; }; + 07CC568506C88350F3D06C8D5E01FBE3 /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D5F30FE87A96D7AA09249DB4D8F82F /* SerialDisposable.swift */; }; + 08067F41CEECB56CE74FFCA481092E8D /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = D184A55F942880B696653A33913ECF93 /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0831DDBAFF287B622A0E7BF2F07067EC /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C96012B347BB2E33A987A213CA57C4 /* ObserveOn.swift */; }; + 087BC98FF9D82DC970EFDBEC0EB2F630 /* PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6873049F56F58D5ED3E44719FC73C4F6 /* PrimitiveSequence.swift */; }; + 098AA417A5494FC829E777DC5CF06ECC /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = FD0A0C898D69E818B6F386B2CBA9012F /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A402C97D8A2855E4F69D8E2BFEE752E /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 78481FCBF09A8942C2BCB258298EBDBE /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 0B8140968914C908CFB4949F67745DD7 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 09187F1FBD16DDE0A198691271E6D322 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C2489F5F28E8C78A5C0F2ACC9417BB8 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4632B46CC78EF8030FEB67D2D7C92DE /* Reduce.swift */; }; + 0E647DAEE0FA9B09AB44F2FC7F783AF6 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A7049C5EA5CF2C54BDD0F1BE4D6FCD /* InvocableScheduledItem.swift */; }; + 0EEDED92446E48374613587144395686 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1CCFB65C786E25702F68A5601E80DC /* Merge.swift */; }; + 1053278298D8F300576B4D665571E9AE /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF0DD57FB4E2DED2BA043D232A8F3E9 /* SubscriptionDisposable.swift */; }; + 10B733D4847215A070C8DA610FEB341A /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183021AC8ED6060D003674388D5B1B49 /* CombineLatest+Collection.swift */; }; + 10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8AAFB037FDFF7437E3006151BA5FE9B /* Timeline.swift */; }; + 12149EA10608B7DE38879E6242D2826C /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2255320841E837341A064E1387C85F85 /* ko.lproj */; }; + 122FFB4B36FA3F74072A453832F84ECE /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = EBBFBC78787B38998069A1A51FB6277B /* _RX.m */; }; + 12AAA6C1CF57638AE521DCE56BED0135 /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E0880FB45B513CD4BFD63BB3E7B736 /* Catch.swift */; }; + 1406A68843A0616DE9575C7F1B318023 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = E969B8C71DA98B913BC86FD4AC5574BD /* Window.swift */; }; + 1568BC317134F1902AB76EE65E0A18CE /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A338EA0CA1FE047514C4AE30D1EC601 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 157AE1FBA8F6C3B710CDE90F86492010 /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = 535DA0E1B20533E30B48C0F04AEF67CD /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 15D984826F02EEAFBC745BD8AA44630A /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AB02263E99467FF2175C1702B5ED82 /* ScheduledItem.swift */; }; + 1824713806488E78A33A48AA7BE85A2C /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3F1CC2095B445C811F0C16E005B49 /* AnyObserver.swift */; }; 1AB0577134E333EA71DCCE332191A260 /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */; }; - 1AC61C1EA2DF1703163518C3858684FC /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9FC22AFD2BA36D7C298505DD97DB07 /* Errors.swift */; }; - 1B3A98673592E3650381A338F20CA81A /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B90D6B38782365F4D874C83ED140A8 /* WithLatestFrom.swift */; }; - 1B4686F080E5DB31E0FDEC12AD725B0B /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCCB04DF57C106193307E90684240A9 /* Using.swift */; }; - 1B5CEAC4BA4628D84ED636748404D3E3 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFACEE80381FE2B4BC6E4FE88D93A85 /* HistoricalSchedulerTimeConverter.swift */; }; - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 88C081789EDC0560233A76D711CE9659 /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1BE8F717FDCFA2CC8DC9318624D80952 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D402F8A4734F5C848DA2287CD48E6202 /* RecursiveScheduler.swift */; }; - 1C7F09EA3B480077170395B01076A2CF /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC674E9D1A6B6D72CE70D5CC2FD43735 /* Debug.swift */; }; - 1EF1D9B948C91F3CAD0F2998F3765D8B /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CD1750A494B17CF183B50C961117C6D /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1FBC620BCD08041C114EEC0A11DDF69D /* DefaultIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06571839F983E684AE0631A949E65709 /* DefaultIfEmpty.swift */; }; - 20887597017160017549465EBFB7E977 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C06C7EB1ACC794EDA28251B83A3D8922 /* zh-Hant.lproj */; }; - 2247209AAAE299B2C89F2CFC75D3490D /* GroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 804280091995DFB0D7791D5300473723 /* GroupBy.swift */; }; - 2519514CB62A290340D6D2B43ECC1459 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 435BB7E73157084CAF2FE80FBE224AF2 /* OperationQueueScheduler.swift */; }; - 2527F62CEADDA5CE60852E0C067D3438 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = C74A3DC1AECDEFEFB44AB3F60FFDDC33 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2545E11592C408516EA9AC047FFD47FD /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62543C716FC9EBEA1CAC093AD57E93FD /* BRLOptionParser-dummy.m */; }; - 266E93ACE8FFB80FDF783822D630E927 /* NSControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BE0BBDCBD8F691F0357C2BFD2A61DF7 /* NSControl+Rx.swift */; }; - 27776D059250B2AEEA4FD883A98F18E2 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC318351A8A11C1C21A0A22107B2C46B /* Driver.swift */; }; - 286A79B0F2405FD08804042FE30407B1 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BD87FA3022EFB5D55062335BBAA6CDC /* GCDWebServerMultiPartFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 29D6BFCA8351A8E55B3A9B9FBBBB316D /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2FB3E4A7941F31C1970E3CC7568BC25 /* Sink.swift */; }; - 2AF6E7F79209F1F5EC7E2928FBEABC64 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCCCC4E79BB0BC425916AD8DE96CA785 /* Filter.swift */; }; - 2B60F28247A564FD61AF32BB988582DD /* ShareReplay1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4AD3BB60C4064C0FBE13775748D456 /* ShareReplay1.swift */; }; + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AC8837A9B05156CBBE4A8FECC465034F /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BE62ECDA4B3A8B13C8B78ACC98795E5 /* NSControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7C79F11D25CEDB1D05648901AFF01D /* NSControl+Rx.swift */; }; + 1C12866E3E74BE6F0513E46B48ECE1D7 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2D9F47CF554F3D0FF28A201822E872 /* Just.swift */; }; + 1D644164F050145109BA5D7BEE9614B4 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF880C34F99282A87D40EEB06740D80 /* Driver.swift */; }; + 1EF1D9B948C91F3CAD0F2998F3765D8B /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = FCD773B3B520BDB18A9BB4B403F9DC27 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F1B7F5EA399508BB5091B36C1C95671 /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E366C7D398E704625CF7481FD8243D48 /* CombineLatest.swift */; }; + 1F3245B199B67151AD148F2697312170 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16B0EBC2B5BA4309D9844CDE1932B26 /* Throttle.swift */; }; + 20887597017160017549465EBFB7E977 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E4EC11834E14E9B2C39B5615DA787A71 /* zh-Hant.lproj */; }; + 21378D436C90D7B4D65D820281D159EA /* ObservableConvertibleType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 728798194C8FC2BA7D507A14593C9C6F /* ObservableConvertibleType+SharedSequence.swift */; }; + 221FE7E633BA09E8BF6B4B2FB9470EED /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3EFB1E8AA462C2C937015579F139C13 /* Rx.swift */; }; + 224087BC52D59C54611FDC38839F2D33 /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359132E97DDCA64E851B2CE3FE71F813 /* TakeUntil.swift */; }; + 237C447BF6FCA534AB4A2F91BA2731E5 /* AsSingle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1F2B769E9F6355DF3AC956AF04D064 /* AsSingle.swift */; }; + 24DE12FB296FE104885D22B0F0D73E5C /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6E4C64CF7155899BC2A74A24FB7513F /* Producer.swift */; }; + 2527F62CEADDA5CE60852E0C067D3438 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B432AF0284AA5FB0D45EED8A72A6B1A /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2545E11592C408516EA9AC047FFD47FD /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D373DA90C38C00B903B1FD9CD05CEC4 /* BRLOptionParser-dummy.m */; }; + 260C370245B63D4004DADF4D24E3BD00 /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20E5746A4CCE940BCE91535C0D37FEB2 /* ObserverType.swift */; }; + 264617822F4D99335F47F6AFF80253BF /* Completable+AndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878BBACC17D3136FA4DD1CD04CAD85A0 /* Completable+AndThen.swift */; }; + 267EA57772E03E12F78E25D3AF60616F /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924ECD8580145EBC5702BD6D3B314F61 /* Variable.swift */; }; + 2708274C4337FB152E46FE16728C8704 /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E707C81E7EB04DBC63A2429C29DABDA4 /* SharedSequence.swift */; }; + 286A79B0F2405FD08804042FE30407B1 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = CD3F084299BD99D03F6B8FC8783B3AE8 /* GCDWebServerMultiPartFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 28B9D3AD37C41CA2B5B954BC3F2A4CD2 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A9DE35FDE449CC76ADF563645C81738 /* MainScheduler.swift */; }; + 28F9B941634C8440F300448D8F5802A2 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68041DC65BD6DADAF82378F8875B3FCB /* SynchronizedUnsubscribeType.swift */; }; + 2A2F65DFD1EE779D4F51A48FFD66C197 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E88567B756C3B048C0FE65824DF88BF5 /* HistoricalScheduler.swift */; }; + 2ADDAE50C265B5025D0B1F9764BBD3AC /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 255132D91D9485882D3509D158D686F2 /* ControlProperty.swift */; }; + 2BC4A1BBB3CF1E3736359EAC2557EBA1 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1510E6FAF4B06DADDD220C9F52E25600 /* AnonymousInvocable.swift */; }; 2C16189485F3647493E5E74E8C629E54 /* Pods-ShadowsocksX-NG-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2C2579538078FA3F4F5945718C44ACB4 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F786CE1FD64B7570C24F231E23D7566A /* SerialDispatchQueueScheduler.swift */; }; - 2C75CE551E9FD25187BC830078E6DD59 /* SwitchIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A4207D9981121566B1401ED299ECB8 /* SwitchIfEmpty.swift */; }; + 2D5E4C0C7C41AFECCAFFA9121A346A3B /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEF8F1346C831D7B8A9AB960E3B768C0 /* SchedulerType.swift */; }; 2DBAC0452D6B85DF3E41E3AEFB4EEC16 /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2E3A8BCE3E4D9114ABCBB4D7966812A8 /* NSSlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA7C38118F80CD261A2C1877652FBAE /* NSSlider+Rx.swift */; }; - 2FBF7BF077F416DB8C7C99AEAD139F9B /* UIBindingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D83FA8652F1FBA030AB17ED7FE6A3C /* UIBindingObserver.swift */; }; - 3076DFAD05E4F7F0356153478F071D74 /* MASShortcut-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F1D6D87906CF7A06C84F16A89701364 /* MASShortcut-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30E2A73CDE464DC6C23D3524F07FBB9F /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E1351027B3142F486A98424D9F42779 /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3330B1E49DA9623EA683C8808CCDAF2F /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525C68580D6831E607AD3D862DC133DD /* Buffer.swift */; }; + 300708DF4452315A732C36A381100EF6 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0BEC4717A975478F52AD458ACA42AA /* OperationQueueScheduler.swift */; }; + 3076DFAD05E4F7F0356153478F071D74 /* MASShortcut-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F552E19724BF0CC37D66E1D5DA273720 /* MASShortcut-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30DF48D3434CB214CB0A8DC882B57CE8 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65BABB33CC0139D359C0ECABD05CD0B7 /* Switch.swift */; }; + 30E2A73CDE464DC6C23D3524F07FBB9F /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 88003809F8CD8A52B418884D95EB7FFD /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 31FFC304499832DF396AEBD4FE47FD41 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B7FB3B8F0F547E0CCC3EDB3FA5509E5 /* TailRecursiveSink.swift */; }; + 327528E493914C52BB5D9C6588E46619 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752306794D721D2E1BF157AAA32771ED /* VirtualTimeScheduler.swift */; }; + 334670C40333B0360D97D38097EB5A8C /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EC1B5940ACD0BA9FE7309429D6ED68 /* Multicast.swift */; }; 33669A1E8FF6BB34131FB94871DDF908 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 33856730EE17C2CA1481049F1422FA6A /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA95DC4A3942FDA10B5AF5875F3D960 /* Logging.swift */; }; - 338E1BFAB40B2106D7B32979145BBBF3 /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FAC49BD2A6F874166D24BB5C9BA1AE /* Skip.swift */; }; - 35413ADE5985AB5E408AF576A84B4C24 /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 828EB8509B88B335C1D7D0C2B3D7D895 /* KVORepresentable+Swift.swift */; }; - 358C6A1EF83AAD32B9453D2A9E6D6AA1 /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DBFAF6F1BA01CE6183C3B565DB8322C /* BinaryDisposable.swift */; }; - 35B3DA850A250223EE5CEB9DB04D1FC4 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = C5A524C4B1015097B4130310EBF6D6B0 /* GCDWebServerResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4A286AAC017AE5547B794DD2C8AF59 /* TaskDelegate.swift */; }; - 363C02C0DC1D05C96E4C99FA291EFDE1 /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E8FD5D8A77584D71B37963D270CBAE2 /* _RXKVOObserver.m */; }; - 36E0FA5FE4424D20F0215B1C2CD85D90 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 1529BF693979ADC95825A232E3F7F71B /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 380776E07A38623224A8D296024B2C9F /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAAD2858D71A42847A49EE0FC347E9FB /* CompositeDisposable.swift */; }; + 355E3D24221C05473338AA2B0E9E613C /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D55ADD097A4317EEBBEAC8CA5D2328 /* ControlEvent+Driver.swift */; }; + 35B3DA850A250223EE5CEB9DB04D1FC4 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 72B8CEB9D05921D08AA078AE17F53770 /* GCDWebServerResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 3614DA072E285FBA231AAE506DD00722 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F5BB1CD589B3E27B8A75FA688E70401 /* BehaviorSubject.swift */; }; + 3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8395CF3A1AD4518051CE6450BDBC43BD /* TaskDelegate.swift */; }; + 36CD88E2D2099581BC19D42048D158B2 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CC9430D7E7FB49F1A03FD83C0F15DF0 /* Observable+Bind.swift */; }; + 36E0FA5FE4424D20F0215B1C2CD85D90 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 58CB4D7A6C8CB1B887645BE2595AFC0E /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 378839FF60B0284A71199E89C842E921 /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5945D007DC7A2B629B8E5987E6184267 /* NSObject+Rx+KVORepresentable.swift */; }; + 380B25054F2B7FCFE08A5228DA847BAB /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636B1F25C166F05CF62D7805112E6124 /* ObservableConvertibleType.swift */; }; + 382B5A192325665D099B202F758D765C /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1AA3C8E05F2C2D813D16D20D9984553 /* Using.swift */; }; 382EEA9832CF0E0860B998EAD0EE66E1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FEC4B8DFE8753A9B1DE598293568F30 /* SystemConfiguration.framework */; }; + 3867C0C197045398134BE70D72B7A1EA /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B29EA946AE6D8BE387824C42B121D67 /* Materialize.swift */; }; 38974DB132715266ADE00F2E3DFBB320 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 39F610E5C7762C98378BF845AC774621 /* NotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 717C5EDEA19D4107A1C3112D049EBB9C /* NotificationCenter+Rx.swift */; }; - 3ABDC8F6AC096D1B402D23DDE0DA663D /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D803CC81BFCD9AE0F09CC693CCD4993 /* TextInput.swift */; }; + 3C808C81AACAA8641399DA9AA95C0F71 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFB8EBD43A17F895E88B967D4BA489A /* ElementAt.swift */; }; + 3D31990DAC7D206A8CED0E166967345E /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 545894F30123AB01C758C6689014BCC6 /* AddRef.swift */; }; + 3D56193C6790214CE39FA76DDD3CF8D2 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8169698EDB7D60F459C13552F619848 /* Debounce.swift */; }; + 3D693429A31AF334FE584D395D7E6133 /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 72FDEB0BDDFCA5B67411693DCA3BAB36 /* _RXDelegateProxy.m */; }; 3DD0362B0B6B939B5D087A150121A4B1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 3DD39CA7E6E7BDADC4A4126FC3310FAC /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48B2C17385071197F259AB746341B272 /* LockOwnerType.swift */; }; - 3E715DFE443524EB6ADE892E4A676224 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = DF0D4DE6D3365036C0FA32D93DE77D46 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3F5958F756DADBE2D0850A0F17186CCE /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = BED1E9CAFD7494BC65249B31B68985C6 /* Event.swift */; }; - 3F68F1F5B35DB36E1D1A35AF93621DC0 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2B98DC1F57C36B412E2E662A8170642 /* InfiniteSequence.swift */; }; - 3FA20C251DB09C90B6E357ED89B534D7 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9591C37093C86F6625E89B7ECD358BDE /* VirtualTimeConverterType.swift */; }; - 4105ADAD2C51D3E4230C170EA0EC6C5B /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC8F7EF565790CE58751914BAB4C1B3 /* ReplaySubject.swift */; }; - 4193C34CAA37C733D8231452EBBE0A46 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30E2E47F7B982BA49DF174E3FDFB288B /* SynchronizedDisposeType.swift */; }; - 42B796D37251F4BCF59ADC3C56B0C05C /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 002B67F5C7E4ECAD0D0339BF321BF117 /* ConcurrentDispatchQueueScheduler.swift */; }; - 42EBF5069D107883B2BAFC32E539345A /* Observable+Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7494AFBC1F396F79B1E5BE66FDDFCD /* Observable+Concurrency.swift */; }; - 451920991DC451B2676E9A139C857DD2 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5961CAA9976325C800898EBC9E0C8A /* Queue.swift */; }; - 46507181FD708FCB8B9066F54D38F9D2 /* PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB9BC8FFFB6D237A0A82BB90707A89FA /* PrimitiveSequence.swift */; }; - 46661BD5FD35D16A1D72B05C32BA4805 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D3C195DE57AB12AEADA0C216773CC29 /* Observable+Bind.swift */; }; - 47C776FC4A5D9C0FE6E5541509E2B06E /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40784518B3B077970ACD76FF6ADC6E18 /* AddRef.swift */; }; - 4811AC35475C767F778C6E3B68648F94 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1344965A836EE2DFFA93D27044532B30 /* PriorityQueue.swift */; }; - 48FE45BD7BF4ABB32A024550ED96B4C6 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A07A8BDB7BFA69AA9291E71416EC58CF /* GCDWebServerStreamedResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 494C1BDAACA36787EE7312E98F2984CA /* PrimitiveSequence+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD39D59D26656AE80FD3F9C683849740 /* PrimitiveSequence+Zip+arity.swift */; }; - 4A4C1E2799F10F07FD0349A686041EC3 /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEA9F8AE14D36C1EDC66F1C167C4146D /* NSLayoutConstraint+Rx.swift */; }; - 4A6AF0A712D4C473177BE88389D15D2A /* MASDictionaryTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 66999DB6AE23289A4ECDBEBCC7A09C5F /* MASDictionaryTransformer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 4B69C82E603D53AC00B7733414B831A9 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A595C2E180CE19ADB5A7218E78FD8BC /* RetryWhen.swift */; }; - 4BB5255894FF4DC65E495662590280B3 /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AAA88BD8CDEC58F63BB1EABFBFE6EC /* ScheduledItem.swift */; }; - 4DD7E070B3A0D803370EE6CCA28CCA63 /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2FFA6014D5EA973E00B658481C4016 /* TakeUntil.swift */; }; - 4EDE49009B5B68074CD71F8B362F0DDC /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 47B14EF7B2C9724416D7F4F875D1CB32 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FF29AE3D6A968F4167A336AC81D6E0D /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3A7C466E29109C01509C4619554BB05 /* ObserverType.swift */; }; - 51358F3E24AC8F1A4172E388769FF1FA /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = 16E2BA0967647D17B5A037805E7CF195 /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5207EF225F11ACDE1EBB58D61DB61014 /* Observable+Multiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C56E70499D215B611C87DF7E81D7DF9 /* Observable+Multiple.swift */; }; - 5209FF4069635478A47FC5F929C25812 /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C980D73B55B8361629ADA1668748A31 /* ObservableType.swift */; }; - 5377A1F2185BF5247D6BC1CE35827700 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F4D6DC50E558CC6AE51E3AF56E5018B /* NopDisposable.swift */; }; - 5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0969FFD491CA3150D85C991F9D642BA /* Request.swift */; }; - 53D63A17DB43C044EFBAA17337600276 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E149596B24A0F722AAD04DD0E7648FC /* GCDWebServerRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 54D22FC915545C2DBECC569A2763FA93 /* RefCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8402EA2D03C261FDFF31CEC2F3E17390 /* RefCount.swift */; }; - 569E360D93A0FCB66F506D87E9BA7759 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85F519585040CC0D398A38AA0930EC4 /* Just.swift */; }; - 576C8796EAC4084B6F49BFC5C839E9D1 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 67E751429B6B9BC0FABF01B8867EF866 /* RxSwift-dummy.m */; }; - 57BC884F6BD181585A0B6F7719A49E2B /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69B06482690AB04BAC88256758995B90 /* Observable+Time.swift */; }; - 58CE04D9C6CAC7243825ABF4AB20EF32 /* MASShortcutValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = D12B3B0AB6BBE5692CC30020ED890E6C /* MASShortcutValidator.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 59CF390612B666999922B2F9B6032D43 /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385EF54CE93CF6561FBD6FCD4BC908CF /* SingleAssignmentDisposable.swift */; }; - 59FAD0BBD4C663C17F44B59EFCA2A982 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1714F14E43A69F77960977683265141 /* CombineLatest+arity.swift */; }; - 5A30DAB76BB1814664FA7DC30939DA24 /* MASShortcutBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C0EC59C08B29B12978B1C4DBDD6491F /* MASShortcutBinder.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 5AA7F01B9354C3DD1AB37F4AE65A5F4E /* Observable+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A21A2EB387821C687BFB0B5FC0D242 /* Observable+Debug.swift */; }; - 5AB880D9ADA38379AE40B94C492D6541 /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89BD8062B3919962E8EFBC3E6DBA8537 /* SharedSequence.swift */; }; - 5D8999DD4665B8E0F332EEC6B75CD6CF /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEA3B8F9A25C60DBAD70F2E3BA7DEC79 /* BooleanDisposable.swift */; }; - 5E74113E3B8562A64DB64EF45BCA52C9 /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77A56791C067FBC9E3AC1405C667F1BA /* DisposeBase.swift */; }; - 5EA93C9BD770ADB728BD2CFE4FF44DC7 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EF3B7799254D602BB02B42C4E30CFFF /* Never.swift */; }; - 5F1FA9D431587CD257C703AF16134030 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 76BDABDC97B3B4B0598FB6DF3966C3EA /* ja.lproj */; }; - 5FF7D42F51FEAEB192E61355AAEAC6DE /* MASShortcutMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = E4B98A26D58EDEECA20933684CC1C45F /* MASShortcutMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72D5CA8AF08CC028C391EB1A38C661B0 /* DispatchQueue+Alamofire.swift */; }; + 3E535F38140F4E1ECFB098340836F763 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02D299CE44B023D9B4909ED0B34FCC /* Disposable.swift */; }; + 3E715DFE443524EB6ADE892E4A676224 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 00CECA213B3AA462DCD88A69F686C862 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4075D8C048D42B2CC057C53323F3F462 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC9E4C5BE139DEDCF232F464EEE5F9A /* DispatchQueue+Extensions.swift */; }; + 41F5717673BC090472587250F4A7BDFF /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DCD7692E660B9C1FF8E7A3063F2B47 /* InvocableType.swift */; }; + 42A2F56A949ADB27CDF4ACEF31A84EB7 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = F546C188C97659BE86FA0E06FB1674BB /* DelaySubscription.swift */; }; + 437FA9F525690A3F247B254130EA26C8 /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D904A8BE8B963C1CFDCB978A106290A /* Buffer.swift */; }; + 43CA37C05E91E1511246D5A99ED30AA5 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20192591D331E03B112CEAB1C32D1FCF /* Sequence.swift */; }; + 48FE45BD7BF4ABB32A024550ED96B4C6 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B677B77B72CD0E70D2DC5499A6D18B31 /* GCDWebServerStreamedResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4A08159FBFDD0D49A7E097D1A6D8ED1C /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABFF341309F8A2E61DCB2F092DFF2CA /* Generate.swift */; }; + 4A6AF0A712D4C473177BE88389D15D2A /* MASDictionaryTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C49546F441EF6B013C11F9ECC4E494E /* MASDictionaryTransformer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4CF21399A46B77C62FF0342B6719FCCC /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5613FC3B7810194DB766F2AA387847AF /* Errors.swift */; }; + 4D634321FD0AC2411D399AF0CD21D19B /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761DD04D13CF5C96E3661EBB41496409 /* SubscribeOn.swift */; }; + 4DC0FAD6E6A6615179C8AA7C5E2862F7 /* DefaultIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2D9630B47A5E202FF1CFB831ACACDE /* DefaultIfEmpty.swift */; }; + 4EDE49009B5B68074CD71F8B362F0DDC /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = FF074D96FBC0786D113FA8954363F7EF /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F17B41C7A5D3F2A07AB16B08CECD9B7 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E8E56BD7B85F3AF4B5FE7AF03AAEE8 /* Logging.swift */; }; + 51358F3E24AC8F1A4172E388769FF1FA /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = A077B4E84F0E05629C70075B9B9D871E /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51750A5B573347F29ECB252FD6F7B809 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 606D277095EEA4BF6FEB8D9270E15542 /* SharedSequence+Operators+arity.swift */; }; + 52FC9AD6D1323BBDE4D458D780833850 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD59D3D739C07FCB2F892826F951063 /* Amb.swift */; }; + 5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BCC46A8B3A4B93914CB0C0624B3942 /* Request.swift */; }; + 53C65F51E7A47A1B14E324AF29A41AEF /* NSView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9352AFD1D6C6B57A9AF36DD5277BB196 /* NSView+Rx.swift */; }; + 53D63A17DB43C044EFBAA17337600276 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 22EE8CE9A144E74E024FCD831B543700 /* GCDWebServerRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 548EB267AD5A7FD7AC26FAAD9C2DA7AE /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C6BFE2E2D5A6B7A594B788F625561EF /* Skip.swift */; }; + 5639004CE97536B6FEA6EB60E83DE411 /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF94F2FA57AC086015ECB43EABA8CE0 /* DelegateProxy.swift */; }; + 576947974CE51E704014B05BD610775C /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25F673AD7CCCE0189ADEB549EB5F618 /* SynchronizedOnType.swift */; }; + 58CE04D9C6CAC7243825ABF4AB20EF32 /* MASShortcutValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FAE9397A18DDA64A11847EF6BA0476C /* MASShortcutValidator.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 58FD6898891A4D0E7D0E32043FB71976 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3637E3CB5915225EA71EFF6B20D7171 /* CompositeDisposable.swift */; }; + 599AEBFAB1C1C451709CC28400BA7460 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BBA11BAC502FBD57943042D6D9D8975 /* PriorityQueue.swift */; }; + 59FA89429C44FFFC10AE0FED40033C74 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FABCD0845EFCC0E95BC4EF19880A8D3 /* Filter.swift */; }; + 5A30DAB76BB1814664FA7DC30939DA24 /* MASShortcutBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 98882780F0AB1693529D79FBB62760CE /* MASShortcutBinder.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 5E167DB5B613ACD8F7823C48F73EBDB5 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ADE820F11CABD3D1C1218580FD439A2 /* Platform.Darwin.swift */; }; + 5E38136ECF2487CEB1671D6D231E3F5F /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0581044A5A088C077656011651C2465 /* Empty.swift */; }; + 5F1FA9D431587CD257C703AF16134030 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B8342F1DDDA13DCD8CF77080A6A16BCC /* ja.lproj */; }; + 5FF7D42F51FEAEB192E61355AAEAC6DE /* MASShortcutMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 55178DF04DDB4E9CA87135167C286E60 /* MASShortcutMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 601F21CBA959E531A349EB3E52FE995E /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B3925E8418FB15723527909346442D9 /* Bag.swift */; }; + 61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE411A2DEA5A7FCC657E6AE76503E34C /* DispatchQueue+Alamofire.swift */; }; 618D3C71663174E07B65950421C46D48 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 139134EE845E284F4B3ED2EF2F9A302B /* AppKit.framework */; }; - 625FB12932BD111CA0CB053F2820F15A /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D934D4D41993FB7CED17EF07D57ED0C /* NSObject+Rx+RawRepresentable.swift */; }; + 61C12CE6D79EB6A96AF17AABAFEDCBDC /* AsyncSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6FC4FABF722AF2F518BE654AD7DCE4D /* AsyncSubject.swift */; }; + 61D1DF6515813E069AA2191EDA369286 /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A20F2D6B7A2D475A3BEF0CAFE123400 /* KVORepresentable+Swift.swift */; }; + 61E61C4B8FD7BA59062CBE45764790E9 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B539B1FEB1247454F06F69690A74881 /* Queue.swift */; }; 626A7B01D3D6B6EA0869551ACE82FB8B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F857A6751201ED3D72F96DC13C729F /* ServerTrustPolicy.swift */; }; - 63B5A98D9EF3325EEF1F93ACFAB7DC39 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B42525F3404A9781D07CAE62FD5E4918 /* Timeout.swift */; }; - 64E8CC7D517563FA0FE904F5917FE2E1 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1F43CF3068C2DCAA16CAF4E7EDCE4E /* TailRecursiveSink.swift */; }; - 6670B050A7427F9C7393AB5D8D2E26FC /* NSView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A99E648BA7AA9728B58FA257DAAB8E /* NSView+Rx.swift */; }; - 66AD0D86950A5C05121AE482F5257717 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = FAFB76E73828C3673CEC60577DD3D7F0 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66DEB394C39F5DCCD70A27ECEF274983 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B306B418AC914FC9F036591616123AAF /* de.lproj */; }; - 677791FD8851F4D960BD70AE613BBA14 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E567C35466451FC7539A0BD8DA6046 /* Disposable.swift */; }; - 68EFC793F03DFFF389E88AA969A8BB70 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9ABBB68077D7AD074DFC9923895B5D6 /* Switch.swift */; }; - 69BDA19A850913A07F745502A2943BDA /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A46EF6D6AE7B13EF91E0A19B18EABEE /* SkipWhile.swift */; }; - 69E55ABC7A2FD0420B1F5DB3172B10E1 /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88DC5BE37CE2B71CAC10B055D989D0D /* URLSession+Rx.swift */; }; - 6A46A6E9EC3D5EBE6868B267874C7F75 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6621583BA40AE9A61D2F58B49462B2 /* DispatchQueueConfiguration.swift */; }; - 6B4361F5ADC6268E7953732371174FE9 /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 999B20A513A4091BA573B86714915DD0 /* MASShortcut-dummy.m */; }; - 6C62ACD1AF9B80626023D3E654D3E77B /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 49AA0901E701115CB7028794961FEE8E /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6CE32532AE4F14383FC5987D2EFC594B /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAF4B22EF3D343BEF33D2881F14213DF /* SubjectType.swift */; }; + 62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 226616D9FEC0ABA73A4365514AEE5914 /* ServerTrustPolicy.swift */; }; + 659014230849E812C6185A976081B37C /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A923BB8E574DFADCE6DFF91F708E5886 /* ObservableType+Extensions.swift */; }; + 66A31FDD5EFC2321BC1A3AE5D97C0D36 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628F693AA128B618F45155C70C6E1024 /* Zip.swift */; }; + 66AD0D86950A5C05121AE482F5257717 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = F308400B0F508083F4F2C54D3F787C5E /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66DEB394C39F5DCCD70A27ECEF274983 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 200EE4899584F5D5767A63F4E7E1A627 /* de.lproj */; }; + 6832ADBC0198335F7B502C7DA1F0ED98 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 901EFAF9E76AF0F9D3DBC7CE6212D4B8 /* NSObject+Rx.swift */; }; + 685F29779740C956045776AE4D4E8365 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DB38C96718DD2622736537BB2ECC6C2 /* SchedulerServices+Emulation.swift */; }; + 688BFF2000657BAADD192CA92249705A /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A143E562F6586266DBD22F7295D5AD /* Delay.swift */; }; + 6979DCB69E7266EC39F06DDB6D7D1EF1 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4154ED163C40AFD6A2FCB49EE532DC /* Event.swift */; }; + 6AA46000C79ED789B70D7B35743D5AD5 /* PrimitiveSequence+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57622ECC64CA3D7C8ADDDEA14B176F5 /* PrimitiveSequence+Zip+arity.swift */; }; + 6B0F3785D9AE93550ADA347C926ADB1D /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3AEFA8AAF6328813FEC6D38028EF063 /* BinaryDisposable.swift */; }; + 6B4361F5ADC6268E7953732371174FE9 /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5A23A63EA04BBF65EBBC3D5905D453 /* MASShortcut-dummy.m */; }; + 6C5CC1496F30D2247B546F3867DFD342 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6078A9FA6BBA43845BFA8D0BA163E903 /* Platform.Linux.swift */; }; + 6C62ACD1AF9B80626023D3E654D3E77B /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5222FC0287904A0C1050B9B01E9712F8 /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6CE3F1A01E6DE8F58A874B780C66A6FA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 6CEB47895E9B0D9170C31591412A7490 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63973CDD0819B187A85E746CC55ED88F /* Sample.swift */; }; - 6D1A95ED4B8C56039BEA5CB0242D1B29 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49D0AEBF622CB33505BCC1202E398B34 /* Debounce.swift */; }; - 6D1B82733CCD35C7B720D8B306969DB2 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = B6411B80A4E73D2B05D6D2DC38B39232 /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6D71A4D5D45590A99D42928E14133A61 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = F684374BB1F33C4CA323178463EB2028 /* RxCocoa.swift */; }; - 6DEC6398861E6DCBB4D67813B1E75036 /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D0D3E3125AF3C4C71554245E74E3A8C /* Map.swift */; }; - 6E8DF9E210380F39D45784980A71822F /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A04BDAC57478865FE5DD3EC203E58F10 /* CombineLatest.swift */; }; - 71AF173C50F15DA473F398350C6A5FED /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFDF2D18587604D407F5C9C506D4018D /* Lock.swift */; }; - 74EFCC6DC65CEBCF60B106F7FBB14EA2 /* MASShortcutMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 77B1E0282CBC343B82CC78C567B8B534 /* MASShortcutMonitor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 751AC207B038ADC338015FD80AA54B76 /* MASLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D679D13A827958B8B727FA6E970D093 /* MASLocalization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D1B82733CCD35C7B720D8B306969DB2 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = E8D80F3DDE713A93804F0B81C53471BB /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EB4C5113BBA1A69F56A6BC63B6E62D3 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4901C7D532E5179B742DB643CA1B408A /* ConcurrentMainScheduler.swift */; }; + 70B0A108A1AA2498B53B6247AB6B85F3 /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D5A3377EF4CDADE4D80FC29C1F20E /* ControlEvent.swift */; }; + 7214838BF73F3401200344955729C789 /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F316CF662715DAF0DC0D4AB967AD6709 /* ControlProperty+Driver.swift */; }; + 7390ED4DE06437338430EB83AF3BD56C /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE80522158C8CAE9E3CFE12B3D857F7 /* DisposeBase.swift */; }; + 74A825BD416A174CCCC55B0824EF2E05 /* GroupedObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A829DA85B827FD4953161E2FC29C0AB4 /* GroupedObservable.swift */; }; + 74EFCC6DC65CEBCF60B106F7FBB14EA2 /* MASShortcutMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = A0A5B4E433F12A0EE14939299BFA30B5 /* MASShortcutMonitor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 751AC207B038ADC338015FD80AA54B76 /* MASLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 5089235C3188BE2DE716A15C48207E8A /* MASLocalization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 75780983A83E65A597525566173E3C7C /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B792280B7BC7CA44B5D7090C8F732A0D /* RxSwift.framework */; }; - 76537FCDFF46E2EAA84E9632DB6A21ED /* MASKeyMasks.h in Headers */ = {isa = PBXBuildFile; fileRef = 259F77E2EC48E07223226DD78300AABD /* MASKeyMasks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7743CB22A5AE8379D41C0BDA7FA85470 /* ShareReplay1WhileConnected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71150F3D7194C1783C37A070F1AD879E /* ShareReplay1WhileConnected.swift */; }; - 77CFCF08FC8EA9F7758207854CED1E55 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D71F1C033CF6233A31594BA370062CA /* BehaviorSubject.swift */; }; - 7841A7635F46B11A9A96F101CF5F4354 /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DED940C0868591ED86659234813AF5B /* DelegateProxyType.swift */; }; - 78EBCD44C7BC4E2AB3ED660E9CAECFBB /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB76A421976FAB6ECBC3D127F6A77FC9 /* Empty.swift */; }; - 7A303312792E091ABAE7157A9FB83B23 /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = 42677271ADFD7C38E4A2D9A129A60105 /* _RX.m */; }; - 7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4A3D2ED8D2752319AA3649ECF09EA1 /* SessionDelegate.swift */; }; - 7B70A32CB535894B889DC0400D0DE4B5 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F9C2E8F767184184382C0659D0B57C6 /* GCDWebServerDataRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 7C46C6DFBF9F5A96C6BCE1C93052B63D /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D2D8747A63B260F80C40C9DCDAC357E /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7CD1DD00190DB1ACA427120A0F54AAB5 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 37276F2D8D3AED22ABF63827FF4C2E1D /* _RXObjCRuntime.m */; }; - 7D6E4A9CA431CA9D7BAF04817FB59C61 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6200462FD0350D942C06454BF3959B8D /* Observable.swift */; }; - 7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A03D18B60F1C426EF558F967B149830 /* Result.swift */; }; - 7E0C22AADD7C94FAED4BA3FA5802EA11 /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69DF594FDFE7BC49AA1019B10D7065E7 /* ObservableType+Extensions.swift */; }; - 7E20F5346ADC8F4F5C069EDDE10897FD /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = BFBCCDD4FB2BFEE4F62E4783156E5C68 /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7F04E0567A70E986129DD6C9E2B467F1 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7FD09C09D1BDD8476A89AA647DAF8C /* Deprecated.swift */; }; - 7F3021ED7A62270BBCA3F9A4C13285EA /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEED24A26C9B7E2A8FFD080F9C8C2AF /* SynchronizedSubscribeType.swift */; }; - 7F56F52F0503DF86BAFA5E0245643804 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214BCB3965A64FB0986840C0E083418A /* Queue.swift */; }; - 7FB525438AD4F2FB899B71CE0FC1A059 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87580AD4D9D45E84D60D81B7D6E97C0A /* Platform.Darwin.swift */; }; - 7FF7CAC8360011983D8A150A70ECAB6B /* ObserveOnSerialDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FE77EB2349A660DFADBF5CE01DEF91C /* ObserveOnSerialDispatchQueue.swift */; }; - 8087E705CC00CA7C021AF6601E343C7B /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56E8831C108769CCDBD44A22DC79FC6C /* AnonymousDisposable.swift */; }; - 81B5B2FE5823C56C6B5E712BF392F1B4 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C9C68749757A2F4BCA7FFF1CA0F9BA /* Sequence.swift */; }; - 81B6397FECC803695902CEDB37CB4DFA /* MASShortcutBinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 90BD54F6E711E6C0C832CFD421265D40 /* MASShortcutBinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 83EF434424E7664543A3087F24738083 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135780AE39D9C9BBD7443F7F21288DFB /* DelaySubscription.swift */; }; - 84A730F255D8C54A7F8A020CAC048A5A /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0394897FCAD2777CF1A4384FE731D25C /* Optional.swift */; }; - 84CE2F3B9BC695F0B6E48B2D6405659F /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = B548E9BFF5CF1A650F920B46F2078971 /* KVORepresentable+CoreGraphics.swift */; }; - 852BFFEC5A19EC92A4A72C7072E11224 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A11BED0A468B53EAE2F900A790FB03A /* Repeat.swift */; }; - 85A2F7602621DE3FBE64FE43DE060EA7 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 912D7029A05911D1FB4ABFF9E2B851C7 /* Platform.Linux.swift */; }; - 86F7FE179A98E2787500CA0DD68F2574 /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = C0064AD98E8E57DDFB68577F20E20FAC /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 886E89D85907BBD7A8C8BAA088D23E3D /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FCB8C241708CC45FF52AFA691DA336 /* GCDWebServerFileResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 889A7A900C61A4B93329387833E2C65B /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72515DA7F790ADA9DF78910C67193DB /* ObservableConvertibleType.swift */; }; - 8AE3D3F02C4FC2EB6A10602D6A18A234 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9761A45C8B106617BE144782B56D8C8C /* RxCocoaObjCRuntimeError+Extensions.swift */; }; - 8B192520AA37984CAF1D2D760A62307E /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B3D790CC9A67D70E3E0EDD445F085E1 /* Merge.swift */; }; - 8BAF2E7597F1559A99FFB9C4DBDD9279 /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E634B678C5C5CF993CA1475A75B7DEE /* Observable+Creation.swift */; }; - 8C5EA18EEE22A60BF10955E38F0D3A75 /* MASShortcutValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = C6CF6A88B14EECBA592B26FDE26199CA /* MASShortcutValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8C8CC54FC0B2BC4ACE282AD7EDE2CB6D /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F45AC654673C96B25C288CE2ED7757 /* Variable.swift */; }; - 8CBA48409C86D95E6C4ABF3B26B8D0B8 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7104A53E83466AD81DBF532DBA762E1 /* Concat.swift */; }; - 8CE914272F3F97EA9F1568043975674A /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C59EAD8143A508A0231627DD42D5C23 /* ControlTarget.swift */; }; - 8D12A35F60C0393445B793DBB638575D /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99EFFE07C47D5D98611714C066D640BC /* ControlProperty.swift */; }; - 8E48DA9023ED9B9E18414F2827949056 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB8D181B14C53055CA4F2D61166A6C7D /* Cancelable.swift */; }; - 8EA651DF52CCAF3C7F7F8DFE3EBA4130 /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCBF6FFFBBE49493E089992E786E1A20 /* ScheduledDisposable.swift */; }; - 8F3401FDD9D855007B24BE4AB7C0FC04 /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0947568290847B529166B4C9F28347BB /* SchedulerType.swift */; }; + 76537FCDFF46E2EAA84E9632DB6A21ED /* MASKeyMasks.h in Headers */ = {isa = PBXBuildFile; fileRef = B2093E2378DE5EC41D64F8387561BF3B /* MASKeyMasks.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 799FF40352661DDA83AC794E9C604783 /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA95194E204F208C75DB1F2E683163B8 /* Bag+Rx.swift */; }; + 7A5C24DD8864E48E6D43B8B98B594ADA /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9DE035DC4CC0F7DB299802037814F5E /* InfiniteSequence.swift */; }; + 7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 268E53814A4808A9CB605BFB3FEAB50F /* SessionDelegate.swift */; }; + 7B70A32CB535894B889DC0400D0DE4B5 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = F656339EB8909181989F80623859B35C /* GCDWebServerDataRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 7C4028F18BB20A49E0C8E8DC7C07765F /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55FEBC89F2833AD13021CF63D4B810E1 /* Zip+arity.swift */; }; + 7C46C6DFBF9F5A96C6BCE1C93052B63D /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = F9164999952F9F74D2945D92DD778C19 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7D2E2372D60114EADF213080223E23D5 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D97535E8704070D353435086265E041 /* TakeWhile.swift */; }; + 7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20817295866FCA3DF75F20CA436D877A /* Result.swift */; }; + 7E20F5346ADC8F4F5C069EDDE10897FD /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E647FF308219F6F10EF468CFD459D1 /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E4448CEDD753074D00755C6C8F71F0E /* UIBindingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788FB43AEDD6D9FD2ECBD95EAC8A97E5 /* UIBindingObserver.swift */; }; + 7F1D21D9C2B4DF301EF96533DF2A1FBE /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C4EEF5D5723B94ADD7BCE012A2C6E7 /* VirtualTimeConverterType.swift */; }; + 81B6397FECC803695902CEDB37CB4DFA /* MASShortcutBinder.h in Headers */ = {isa = PBXBuildFile; fileRef = FF9B0B9971EBD4F210054B63F172C41E /* MASShortcutBinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 81E3BA0A338814CAD1C95B57433B36B3 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23DD34EFE94FB8C8DCE00EE72C2473BF /* TakeLast.swift */; }; + 823CA45387E1BBB3CB7D29B91B7FA1A2 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E60ACE8054201E83089FD336ABCAA2F /* Concat.swift */; }; + 8552027632E115D6DAD1099C38090EAA /* NSTextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346BBFB5B79A5139190296845F41C8DE /* NSTextField+Rx.swift */; }; + 85924B29E50F5745628090826F2D064F /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A1567F5FA8FE7F8CB94FF8182AFE361 /* NSObject+Rx+RawRepresentable.swift */; }; + 86D3DBB91C4ABB6920ADB46B5E158E26 /* NSImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23A34F10DBCE77625288E96057F56456 /* NSImageView+Rx.swift */; }; + 86F7FE179A98E2787500CA0DD68F2574 /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FFA998983771BA589140ED254CFBD48 /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 879141B5825E41A5704D637BAFDD29AA /* NotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFBD01DC827B96A71DBE4FF69755B797 /* NotificationCenter+Rx.swift */; }; + 886E89D85907BBD7A8C8BAA088D23E3D /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F5B2D680B55A87168B90861D051B746 /* GCDWebServerFileResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 8B61FFE12CF61FE5504472C344A1ED1A /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCE02B40B95BFF261200228AF8EBC16 /* CombineLatest+arity.swift */; }; + 8B66C13BF2C26F4C8E16368CC951B78A /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BE50FB7791D6009BF033B78EA631C /* Lock.swift */; }; + 8BA0EF598E6008B8E127F20CD5871EA8 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4A6E1ABB2E00314CDA799343BF5983 /* Sample.swift */; }; + 8BA67E4A4F689245492734AEAA8D6529 /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68DFB337F054F8982CF31389DBFF6374 /* Do.swift */; }; + 8BCC39E8753AAD1634783813630FC556 /* SwitchIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C0501500E132C7E97A97A425E68D90 /* SwitchIfEmpty.swift */; }; + 8C5EA18EEE22A60BF10955E38F0D3A75 /* MASShortcutValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = E5C53D1D9FD46ACD15E6C5381BD7A754 /* MASShortcutValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F015FD16EE1580601B4856E795196FE /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F68587D16CABA9C7433492E59AB224 /* Platform.Darwin.swift */; }; 8FEBDE87BFA67E4AD0EC88774A1097F2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 8FFA3A6A77962B3A36B009A49634D081 /* MASHotKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 550F2C93957EF2301541066CF63D46BC /* MASHotKey.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 92805E4E337491904604FE86909924FA /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A1AAE28282C31243C72011FF5A4830 /* Timer.swift */; }; - 951C065E37A9ED6736A9697B231AC365 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5374966D42537C6369072660B48CF199 /* Multicast.swift */; }; - 96719B2401B89179B97BE8828702C730 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 528841720C50D9A4B73EE2A4C6A8E132 /* SynchronizedUnsubscribeType.swift */; }; - 9676160A622D6A1E0ED9A304D56E9E0B /* Variable+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFC56330DB909884DFCFFEE79C788F2 /* Variable+Driver.swift */; }; - 977E457DD1A321217C8A9CA0B1AC8C61 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = B90BBC0A33E35F445599411A4755CA2E /* SkipUntil.swift */; }; - 9794085A02FC87CF773A9EFB60C40F78 /* ConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6A1E5B8450A97482BAF559588B3DD71 /* ConnectableObservable.swift */; }; - 97B374490F695A6ECB06271EF080EB6C /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C32CA98BF3892E9768040A5EE4DCCCD2 /* nl.lproj */; }; - 98FBAAEB02A3A0CAA335BD31829CF985 /* ObservableConvertibleType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE6F293A7A5280E8364DA3F1C0B4B1B /* ObservableConvertibleType+SharedSequence.swift */; }; - 99662A21FAA5C025E034AAA5428E8D63 /* Observable+Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B22FFDD2CE991366EAEE41BA0B706A /* Observable+Binding.swift */; }; - 9A551C74F80912EFDFC942535ECA28BE /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 8865ABAF07DEA295CE14F00DEB443C41 /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9B18C2229AEFC7674EF9795A7A77DCEB /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3690656BBFBCA6B31887844429A9D961 /* Driver+Subscription.swift */; }; - 9B622302DDDA1881AC9ABA9EA4C81564 /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B53429CB1F8A25076762F2D82D97CCF /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9BDE5D29C68F5622298CA4A54A2BCDD0 /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBCDC9591CE194B7B56FC4194F75DB4E /* DistinctUntilChanged.swift */; }; - 9BE2B48A0DE5CE3C3B4EAF39DA85A876 /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FB77C479CBE2951C13C488C5CBE57E /* CurrentThreadScheduler.swift */; }; - 9D6566D484F3BA80C9400E9DD202C281 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EBB434DC5BFF77FC3F8C0215BDFC40F /* Bag.swift */; }; + 8FFA3A6A77962B3A36B009A49634D081 /* MASHotKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CD9E0BB93F28FD91CBF8872501B7280 /* MASHotKey.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 911BEA57E7620828E28399C3CEC8C5B2 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8209A41698505C3145781FDD26E699EE /* ObservableConvertibleType+Driver.swift */; }; + 92E02A303BB54BDFAED85930F2EC67A1 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6573695D6E38AB0E45298916E5927F9 /* NopDisposable.swift */; }; + 92F332AD156F10CF4364BBDAD493FB29 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6180F60B96D97B62E15F102AA5722741 /* PriorityQueue.swift */; }; + 930C2D40D19017E7D8FFA0543F0DB97B /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB6C8C0D1FA8537542033F55E1556F6C /* Zip+Collection.swift */; }; + 944C284C7390180088035BBE864823D0 /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F9FB942372907FC74EEC9507F4F190D /* SharedSequence+Operators.swift */; }; + 9487C01FE68F38908090961512AA41CE /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D2A88D8F95FB962BFE6279B46169D6 /* ScheduledItemType.swift */; }; + 96A523A42595CFE0374C023A683B3753 /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = E67F34DCD8ADF524683B1FDA27AA87D4 /* RxTarget.swift */; }; + 9709A18386118371F2831A6080BE1400 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 881AB2BAED9DBD8D39A04DCCFD4A871B /* RecursiveLock.swift */; }; + 974D6C91F4DAF42C50352A2B1FD5BA36 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD930CE2472F57A003EF8907CA3116C /* Observable.swift */; }; + 977A3E71BC55F13D5D4D924BBA878872 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C848585CA8A7F199434CE368A9DB06C /* ConcurrentDispatchQueueScheduler.swift */; }; + 97B374490F695A6ECB06271EF080EB6C /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7EE2EE9316F755CDB7B2D29A98063559 /* nl.lproj */; }; + 97D7D5D14D02DDB584E54BA9878242AC /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C68481E0A15400E90729E5B6E9C46D /* DisposeBag.swift */; }; + 99E95AAEC050D49A770629AA6B398C6D /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCFC9D5177E577E082A70923B848393 /* SynchronizedDisposeType.swift */; }; + 9A551C74F80912EFDFC942535ECA28BE /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 533BCDFF477A8BB66A84035182761408 /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B622302DDDA1881AC9ABA9EA4C81564 /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C85AD27621E054B8D7328ABDCB9697D /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9BCCF2D457FCA3F9A7688DC599FD32F1 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CB5F5627B0B6D64308CD1A83ABB3B0 /* Deferred.swift */; }; 9DB91F7B392D045AB8451F515D20D649 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 9EACF2968862DF9219BBE32011842CDF /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D6462467149007CC9112C18E0FA2BE0 /* Reactive.swift */; }; - 9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7CAE213EE8F8ECB17980C4BF269D35A /* AFError.swift */; }; - 9F5E6138A3FE1726687C407708C71B4F /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2BA85AB97126B7F170B024F033AF4F /* ConcurrentMainScheduler.swift */; }; - A0C03D1525E6CED9442AE65F080B12E2 /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FCD780817CA60F10D6C39A083DDCDC /* CombineLatest+Collection.swift */; }; - A2215749D44CF8D1C3F40EBF3FDE3DBD /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D8B840460D79AB3B8AB39A4164F4B7 /* DispatchQueue+Extensions.swift */; }; - A2871C692E9B86522F46AA4100144621 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D34D0E9C66E6F9595722372B9AED8D /* Zip+arity.swift */; }; - A2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFC679B790AD9EE3F36E8291BBECFF33 /* NetworkReachabilityManager.swift */; }; - A2CF744BF46B0F17DC6607F4D0D82944 /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF51438B3E3A777BFCF7D021F49B4043 /* KVORepresentable.swift */; }; - A2E3CE14430670CE78113A4AA2282522 /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EED0973795941F05F42B25E0C0F6D99 /* _RXDelegateProxy.m */; }; - A41241F5F212D2959EE88A02DA4B8006 /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24870AF7F42FAA0AD9ABB0325F1E135 /* ObserveOn.swift */; }; - A4DBF0AB2E88B1A9D1078042F47618B0 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 15FDCB75F28FF0766B21B59543A5AFED /* ru.lproj */; }; - A66A89FE5B6FC0BB454C391B22DA9E5D /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91767E7613F8479E6F65DDF39CDB558 /* ControlProperty+Driver.swift */; }; - A802DC058B09432DF8F56F89406CF4F3 /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D21B3357EAEBF44D19D3A611848628E /* InvocableType.swift */; }; - A8F15851A3BDF0B2474224E5776281DA /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62A7E7809BC29FA83778B027FE2021B6 /* RefCountDisposable.swift */; }; - A9EA920651EC47BDE57A5BAAD44EF55B /* AnonymousObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5B91DC04B3865DDDDC72512A5C3F54 /* AnonymousObservable.swift */; }; - A9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A030F5167FA6558FE91D25425A0B9CBA /* Alamofire-dummy.m */; }; - AA7CDF00DFA1EAFF7F28CAF33FE5BC37 /* MASHotKey.h in Headers */ = {isa = PBXBuildFile; fileRef = DE1C155D92F36B81A10B04D3AECC44DE /* MASHotKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AB8322F9B396436A004AAEBD01BF3015 /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65268C40FD5106D32C7C227F38209B3F /* PublishSubject.swift */; }; - AC5D1A3CC7602A05322EF0B0B7BF8B85 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33045890E1D4469FBFD24F367E827FAC /* TakeWhile.swift */; }; - ACA9C9D1223FED43AAE8C8130225DCCF /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 911BAB036265D98689D411112E34B452 /* RecursiveLock.swift */; }; - ACBE29C4BF8BAEA483D6EEA940FE5314 /* MASShortcutView+Bindings.m in Sources */ = {isa = PBXBuildFile; fileRef = F9A79C0537300E8EC3B4938AE3FCCE88 /* MASShortcutView+Bindings.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3BD779374EECF9D6A500A90CF6279C /* AFError.swift */; }; + 9FA23568E21FB2B69B69DE816F0D8015 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75828AB7420DC80FF4A055AD665BA0E8 /* Bag.swift */; }; + A197AB07449327D4540308FF01BC3C54 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C2A8F904CF4DBCBEF9D102DBD74AFD /* Platform.Linux.swift */; }; + A1F4FEACF258A06986DEFA39C9FC32C4 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 326A9DBB817D95D4A5840B314BF9202B /* Never.swift */; }; + A295CF7A971C3F7D7E80AF27D4CEEB3E /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2B901654D7B257777782F6F00162843 /* Timer.swift */; }; + A2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9B2D9A28ABC58CFEE373E87A4052A7 /* NetworkReachabilityManager.swift */; }; + A4DBF0AB2E88B1A9D1078042F47618B0 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3CD46935CE54DAD2A7350CB2E4DB048C /* ru.lproj */; }; + A63F9CB6A170CE00FBD441E79DCCEE49 /* ShareReplayScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B9A9B823D866CFD5C18A2DF4FBB883 /* ShareReplayScope.swift */; }; + A68383D073B808A27671BDECBC6A670F /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C50ACDF517D102DEC7195257ADFE7B /* Sink.swift */; }; + A6E3B7DAEEAC86F5517E5B10349EF854 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A9C2646B9718959021371687EE6250 /* ObserverBase.swift */; }; + A7FAD159116F1DBA5CD6E7B990C9A303 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0EC4DF0E84A696168D1071B48A4F7F4 /* AsyncLock.swift */; }; + A8BA41C1262C1E9B84D4F744E00AF0E5 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292363670323CC583F50A5989CC3D9D0 /* ImmediateSchedulerType.swift */; }; + A9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C163E270D8C0282204B45FA92F52546F /* Alamofire-dummy.m */; }; + AA3DEE3C7E1A806E5946C2BC01893808 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0C0E792C43635C8DF0BA00874B14F /* Cancelable.swift */; }; + AA7CDF00DFA1EAFF7F28CAF33FE5BC37 /* MASHotKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 55279FD33E1F40398E20D7299953F40A /* MASHotKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ACBE29C4BF8BAEA483D6EEA940FE5314 /* MASShortcutView+Bindings.m in Sources */ = {isa = PBXBuildFile; fileRef = C8E1C61760F4B2BFEC652B9A01D4F846 /* MASShortcutView+Bindings.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + ACF6603E2EC6E8B13AC63123161CD195 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B6B335F7D4B0FC8875810068B493F55 /* RxCocoaObjCRuntimeError+Extensions.swift */; }; ADE45FBACDF07286A544DC20605FE624 /* Pods-proxy_conf_helper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */; }; - AE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78D3C582CD284C68D7B5FCF58D73BF07 /* SessionManager.swift */; }; - AE2B4C3519BCF47ED52108E615A778DE /* Observable+Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED29315833FAA1E5A338CFA8005377A9 /* Observable+Single.swift */; }; - AF816ABCF197AAB5DA7362510CBC36AF /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CBC95D81A39FE47DF7664F12F9FF6E1 /* AsyncLock.swift */; }; - AFA4B1D93CB3D6DC0AA571F54239C102 /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A57E4C19B3887697A8F7105471594B11 /* AnyObserver.swift */; }; - B0C1DEAEF59617FD104B45651A9E02E7 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C22C8CFBFCA98BD54BABA13BDA83B12F /* NSObject+Rx.swift */; }; - B442B2E0FBC57B32C68E7F970A890863 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC25BCC601EFEC02F400739EAD16FDE /* SchedulerServices+Emulation.swift */; }; - B65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA733FB551621A6A266D57AAB2CEDC2C /* MultipartFormData.swift */; }; - B6E8854A928CDD5A03A136A92BAFFDC6 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 423730810CF7CCE34FE8316CFF58F0B8 /* Generate.swift */; }; - B6FE3D84E41A57384175035BC92ABEAA /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A299EE214CF95998A680C2E5EBEEC779 /* RxCocoa-dummy.m */; }; - B7EF65DA3A34ABF3B41F50ADCD198BDC /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD17FB0B8D729EB83B1AA769D30726F /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BA54F883C123CBEDD90E739B2B2ACCAE /* Variable+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E934534DD61AA5D52BB8BD519A53726 /* Variable+SharedSequence.swift */; }; - BA6C45B6BC8AED9DCFC82D7CF7A8A929 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D14826507A4DA27653782BD16CF7B1A4 /* VirtualTimeScheduler.swift */; }; - BBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3DDD5AE0D4C7DFC098D473F24ADFC5 /* Validation.swift */; }; - BC1C0A9BB7F0E803C621E106D2DD292B /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 806CAD0BC89F898F94D939211ABC3384 /* Do.swift */; }; - BE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32DA9D913B14198C262DA3670259B16 /* ParameterEncoding.swift */; }; - BED10B12B35FCD3CA735FE8A3B65774A /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A0B1A36A704F964703C9BC39827964 /* MainScheduler.swift */; }; - C06EE84D23391E9FA94864DEDE34F548 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8EDBB56EE738F917614C08B706C06291 /* fr.lproj */; }; - C171A65415727D094B9AF634E1D172A8 /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6A96F3AD4E1A22FFED4E6F0A4D1ECD /* Zip+Collection.swift */; }; - C50FA5B211B8916770FBE55623B83DA4 /* MASLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 874D347DB51D5D3E716E95F6E97CFF9A /* MASLocalization.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - C6696D7D4F90372F47C224F1687AB5D0 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D83C9C9C216CD46EAD7B39EB3A0A703C /* DisposeBag.swift */; }; - C733DF41496B0364EF379F77068B4367 /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF2C9231D3FFC3BBC92AD47C894E1F5D /* SectionedViewDataSourceType.swift */; }; - C779A6C734EA83712332BA6A13EFFE5C /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0382153B0EC132C2BECD3DCB1193B6 /* DelegateProxy.swift */; }; - C7A9B35BE31DF4C7DE1082BB94D1E8F2 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612574DE7BC9EB82F4DCE7D2E38318B9 /* StartWith.swift */; }; - C8FF11576430A8FC899515C128F80A67 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941AD6E4532B1B070D2592FE3A2AE752 /* Error.swift */; }; - C96E54153198E59FF0F8B9F7408523E0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E0CFCE9AB3B6AFD0691E63F63F62B18 /* GCDWebServerDataResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - CAA6C816B24605177BB40AA731710460 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34A2C6821DD92D46F0901C579DAEF53 /* ConnectableObservableType.swift */; }; - CAAA66DC11EF7A8AFC3F9E08689BE08A /* AsyncSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACEE1641B4A1142BE9D66F1E19A1A083 /* AsyncSubject.swift */; }; - CAFB60F384AE9659EDB5D377F5D183F9 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58CB8D564AB01DBEED55DBEB75380239 /* Platform.Linux.swift */; }; - CB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FBBC7DFAD0F5694D59ACC330B005E0 /* Response.swift */; }; - CC5DF94AD0EDC78D929C06C6E2AC1E95 /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85BE206744586C11C8C71BF92918AB7B /* Rx.swift */; }; + ADEA4A10E5631586E27024F5D6478641 /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524C8DBC63D366E5C0E8A5EA62713031 /* WithLatestFrom.swift */; }; + AE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D436A58ECC98D13B9A4C91CD460DF93 /* SessionManager.swift */; }; + AF134CF20F447E0E0DAC073D73C7F86A /* AsMaybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58A2330CC4D40F78DD08B5A8500F8BF /* AsMaybe.swift */; }; + B0D6D07A3329617011E4220080E157C0 /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C3FED0A19AFEE0E97C077B535ABB44E /* NSLayoutConstraint+Rx.swift */; }; + B25F18CA3C510C41288D907933124619 /* NSButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD7A0DC3ED806805A328B6E3183B3DD /* NSButton+Rx.swift */; }; + B65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0AC98004CCEB4CC8A5BECA09878CAA /* MultipartFormData.swift */; }; + B7EF65DA3A34ABF3B41F50ADCD198BDC /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = E9DD9AF410C94A598B2DE06E014C5DF0 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B8580D2CE60303378BFD4FBA2C6F23A7 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41DAD2203618169F641D264D7C2EE0E6 /* Error.swift */; }; + BA465CDF798AEFDE90A8C0CAAA1B1098 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92244CECCE7B444FAB2C8202E5EA4056 /* Disposables.swift */; }; + BA4E2E5784DFEA8CD5D09039B9B465A6 /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1E04FFC51E6E05C344477E8DDB777E /* _RXKVOObserver.m */; }; + BA510AF8040C827F56166B707BE76626 /* Variable+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7206D6A8DAD7ADCD7E85D9D080C6BACB /* Variable+SharedSequence.swift */; }; + BB397F55B0307FEDE4828D0092658075 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B7FB2F3741600EA98ED059FA99D203 /* RecursiveScheduler.swift */; }; + BB5641E2D7D16938833681670A55667A /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF0A1029048B0747EEF9A0E552FE307 /* KVORepresentable.swift */; }; + BBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F452BDEBCDC82858ADCB26071AA4E12D /* Validation.swift */; }; + BCB03A46BA9CA1A4D1A7539B2D6E5E1E /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A97F155FCEA6B4942A94BBB31544107 /* ImmediateScheduler.swift */; }; + BCEDD2079F8697D75351BD8880AB5F5E /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F9BA2F71CB99026197CB42B356FC63E /* ObservableType.swift */; }; + BE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44D9192CE046EB20FAF1BF26C3FC60FC /* ParameterEncoding.swift */; }; + C06EE84D23391E9FA94864DEDE34F548 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5603B5E9D6CFF759B07667A13C90112C /* fr.lproj */; }; + C1E7BF810B8A08D68980DEF88FB818AC /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC25AF2EB8052CF4B0A98541C78FA86C /* Queue.swift */; }; + C24B87BB347D484FE80D05B81B7BA225 /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15DDA519B43F0EB8DFD887D2F7A6FA8A /* SubjectType.swift */; }; + C364D9BE7F85D4001B8E8F1C6EF4B1CA /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F37E66B5A8F3C680354C935F2744C29 /* Repeat.swift */; }; + C47548C9A021ACE578E56C5825C7049F /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2EA7252711AF3E4D70DD2035DA71438 /* SingleAssignmentDisposable.swift */; }; + C50FA5B211B8916770FBE55623B83DA4 /* MASLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E128ED33CF5ECBE9E08D07D4B7672D /* MASLocalization.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + C672608508D0E7C39889E96D744F48A0 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2487CFFD3F6BA7CF97A97003B1727B18 /* SkipUntil.swift */; }; + C96E54153198E59FF0F8B9F7408523E0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FC3F16342AABB95F2FB9FC98E52CF43E /* GCDWebServerDataResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + C9C6EDFC3305BB433A24F269C643AEFF /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 321FFBA726A46A7C54E164E625D44DED /* RxCocoa-dummy.m */; }; + CA01E0AE4F5FE45BB3AA2E55D99816F6 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B264AC163CEFA27D7ED08507B018B11 /* RetryWhen.swift */; }; + CA811C461085BCD75D8B606661C2AD73 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D280C7FCC6AE30E6F8430DBA380925 /* AnonymousObserver.swift */; }; + CB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996FFF36FA1A968D9BC5367C870F15F0 /* Response.swift */; }; + CCEDF6CBEF930200FC7775BA39573BD6 /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7CDCDB0682EC04C12DD552E4910CE5 /* LockOwnerType.swift */; }; + CD66165D619F2CFA447BB599817305F1 /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = A102F9379F5A55F3D3C85A1FB3687F97 /* Map.swift */; }; CD97073476795E5EAA07C91A7F7890D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - CECC009E42390657E216EAC1EDC6274C /* AsSingle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351C16C6C5C0715F1C876D91D0EDEA09 /* AsSingle.swift */; }; - D14AF917AAA665B36A071D4272716548 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06609DFEDC0A7E3A67145994809FAAB /* Amb.swift */; }; - D2B04C075D6CA6AF10C35D8BF7DEF0D3 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E1780CA78CC5EE56892186D6699471D /* GCDWebServerFileRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - D32273245E8606A37F7600158C272C01 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88F573DA82E488BDAE8BC55E93B96B1 /* Bag.swift */; }; - D5A9F983227BEB62BCA37F568897987C /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA70E613DAD83B8D5F2C1F9DE64ECAC7 /* RxTarget.swift */; }; - D6315D7F0CC2C411BEC2097E2BEA7242 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1369962E25E1F6E43620FE725E9CE874 /* HistoricalScheduler.swift */; }; - D63E514E26A060F7C90A92AE8E9B49F9 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 405572D03A3BCC4C3EEC1F1CECFFD7EC /* GCDWebServer-dummy.m */; }; - D6EA93219364CDC135BAFE63084F6361 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B10F73EA14E609E0D648284083AE9228 /* es.lproj */; }; - D7524216B4C0994A50624825DFB7CB6B /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 4387584024C546AD5AD6B7EDD37485BF /* GCDWebServerConnection.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - D9ACDAE812F7F132507CBD9D783613D6 /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64EE1C0399B2FC8E5B84F059BC3B89F9 /* SynchronizedOnType.swift */; }; - D9ED1A4C6F894B1DC0298C280C8056EB /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57D2E434BDBDBAFB4EAB539971677BB3 /* NSObject+Rx+KVORepresentable.swift */; }; - DB94D782C6F193FB6F56D52926F2A84B /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 622BE644A5BCF7100BB04E2E0578F8C2 /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DCEB10616CAFEFE12B6D4F6A7DDBBFD4 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0708DD73E84866CEA805B9C7AB60ADE4 /* String+Rx.swift */; }; - DE24C629B3DB152EE4924B56E3CC59F5 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5151ABAABBD1A1CE800C52AB2A585634 /* pl.lproj */; }; - DF2762B53F71DBC62F8CE6D5A89E7461 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1407079A40EB921E4490FEA9DDB23222 /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DF4F1845181D496D965AD3FFD6366CCE /* GroupedObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2654F715A28779785D3AD91F2ED2388 /* GroupedObservable.swift */; }; - DFA6E4455415B3EB3BB38A9F48EEB044 /* Shortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EC98D40BE7139C7559F4E49AD0B9202 /* Shortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E16B1A45A5741C6A98DFAE5C24764F55 /* NSImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7519EEDC18867A7D4354752DF4FFB06 /* NSImageView+Rx.swift */; }; - E442EEDE70730AB746DADBB7B509B070 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4CD8E837A63DA5890EF98BA6E98D9D5 /* RecursiveLock.swift */; }; - E4BC2475373C69F1F805A462F1CA469D /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA9F52CD97C9FFDD1A42400020B5C86 /* SubscribeOn.swift */; }; - E5312C0FED7C61135F252D3A7A112990 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 64D637E8C0ED768E21CFCAE9641662B6 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - E560A21728B29AF234BD0F37AFE16F36 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 967C15B6D2FAA4BA22B657F647B6B412 /* en.lproj */; }; - E62DD91C60246BD1E4E8A0AF5D7BF0E7 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = E85ED0518085EBD804CA390B52EDDFE5 /* GCDWebServerErrorResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - E63AC9803426E8646E59772DBED7864E /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C4E480F924E52E479BFE519D781A826 /* Zip.swift */; }; - E66F7AFACFC665B23022A09E46815B5C /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2C391D236625ECDDDADDF2E2CF327C90 /* it.lproj */; }; - E88ABB06791F804707EA13EFF1BB714F /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430E0E395046F19946D55C7F791DDCC4 /* Throttle.swift */; }; - E95C2409BDE4CB6BA371A54DD05D7996 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F74323508484A216D1C8AECF3B836C /* Platform.Darwin.swift */; }; - E97573A653DE3A4CB8BAC26FB7B3E9A9 /* MASShortcutView+Bindings.h in Headers */ = {isa = PBXBuildFile; fileRef = 1918A3E00F323095B9B4FE41517A6FDA /* MASShortcutView+Bindings.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA6D2E46B967F447FFC46520EC328B5E /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 04BA1E955FC23E417978F5DE57553C65 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EBC1F84329AD2225017D47F63D55CA77 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = B29423A3BD529F4181880C1CC35631C5 /* Disposables.swift */; }; + CE270F335D051643A45CCD09FD203831 /* GroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51807E4919B34213B8F47CD576F3FC3C /* GroupBy.swift */; }; + D2B04C075D6CA6AF10C35D8BF7DEF0D3 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C4C6CEAFF5B39F833B3836EAAEC96C /* GCDWebServerFileRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D504CD5DE30A8ECF7B12BAD77637E8C5 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C5D99ED4F07DAF3A50F59C765CA416 /* String+Rx.swift */; }; + D568BE9017C4ABC2EBC93B55568FA818 /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5548D8C229700A0AEB23E7B56630426B /* RxMutableBox.swift */; }; + D63E514E26A060F7C90A92AE8E9B49F9 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 44F322EFF3BACA5D7D9D859973112A90 /* GCDWebServer-dummy.m */; }; + D6E2F0BAD0C15F29CBEA69E2A6B78DA2 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA0B69E87685AC3D2B60EF632158AE /* SerialDispatchQueueScheduler.swift */; }; + D6EA93219364CDC135BAFE63084F6361 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F3C425613054D6B8A7DFF96BE0698489 /* es.lproj */; }; + D7524216B4C0994A50624825DFB7CB6B /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = A30C48C8ED1D9EC8231B3D871BC285C7 /* GCDWebServerConnection.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D7681A76A0F47EEB17E16A5D28BD125D /* NSSlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F67068FE91E63222D2D32C4BB3BBCBD /* NSSlider+Rx.swift */; }; + D7B87735E689DBF9F8CA42227B8E6B88 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8C09387A31AC5BF4B190F880F4883D /* HistoricalSchedulerTimeConverter.swift */; }; + D81001368F100460264962569F099802 /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261420BDDFD507E93CA5EEE0286F0D2B /* KVORepresentable+CoreGraphics.swift */; }; + D98FC1E3FC63DFDC89218E02603C0531 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF7187DD22E17C86AB22B3969936E90C /* RecursiveLock.swift */; }; + DA1B86D493CD8111AFC476D0EEDD498A /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9480F95CFFC2D8DA4D91AE587BFF20B8 /* TextInput.swift */; }; + DA3CF2B75F35BF67169C4A938A21526A /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646E91BE14388979C352F573B4362A39 /* SkipWhile.swift */; }; + DB94D782C6F193FB6F56D52926F2A84B /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 99EEC612B008B452C8ACD615123EDA93 /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DCE20142AF8D357B7CCEBBE021148310 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF6DC4F50F673F957821F727AF12A71 /* DispatchQueue+Extensions.swift */; }; + DD44780BE73F9964BC370A525CC14E25 /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2946829864608D127EB046EF8BAA69D /* ReplaySubject.swift */; }; + DE24C629B3DB152EE4924B56E3CC59F5 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6786640F8B195A8E8E18BE5034B98BDD /* pl.lproj */; }; + DE68B3E9BA04A5DEA59697E2828E90A8 /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = A023097C535D0BD3D56EA8BD993D7B3F /* Dematerialize.swift */; }; + DF2762B53F71DBC62F8CE6D5A89E7461 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = D9EBA3D67FF4AF63397A5FB0F6CF1B5F /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DFA6E4455415B3EB3BB38A9F48EEB044 /* Shortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 68FC88BF39528F8F3D69BD6D8964B5A7 /* Shortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E034B9A4E3D86C8D49371909C2D49480 /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B6A945EDCE3039C33A744E0206424D /* SectionedViewDataSourceType.swift */; }; + E15C2441B7387415553D7A7C0BEEFF87 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA271EB6661517D11AE48621699B565 /* ToArray.swift */; }; + E3D6E1B68331D777282FD8CEAA4F3625 /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C165CADEE8873C8F5D15A02BF1AF555 /* ControlTarget.swift */; }; + E5055E923CCD18C703DD0464379D5075 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 023DBF06ED50965F68CFB72972CC89AB /* Scan.swift */; }; + E5312C0FED7C61135F252D3A7A112990 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 687C69F6237AA7E984907EBAB8FA2B02 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + E560A21728B29AF234BD0F37AFE16F36 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DCD30248F27B4938679C37883BDD134A /* en.lproj */; }; + E62DD91C60246BD1E4E8A0AF5D7BF0E7 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 572BE12282110872C7D8E7EF29A5033C /* GCDWebServerErrorResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + E630F719F45F55F60395139F462151E2 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DE8782EF7863C69F019CB969C665C2 /* Create.swift */; }; + E66F7AFACFC665B23022A09E46815B5C /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 48930EE93B15635DB1DC641A949AB58E /* it.lproj */; }; + E8C85C07DF36B6274953F0D8C3BD0771 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000B7BC80F254E06ADEC25B19B7C2C37 /* Timeout.swift */; }; + E925A3CA1CEE77BDCB0CE04E46FA9EB8 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A4AEAD1EF447DFE90F59D1059C79B7 /* StartWith.swift */; }; + E93BDF607D1A682D01B2DDBC0E99859A /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23C70F218FD3D53D1E083383A8C8225 /* Range.swift */; }; + E97573A653DE3A4CB8BAC26FB7B3E9A9 /* MASShortcutView+Bindings.h in Headers */ = {isa = PBXBuildFile; fileRef = 01A59C606077EB80665FFDDD235664B3 /* MASShortcutView+Bindings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA6D2E46B967F447FFC46520EC328B5E /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2738692BF965EDDE0CDA5B4D08899095 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB58AE5225AEEA217C860F6D6E558E20 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9487D19A313750E8B3F0DDB32B87E864 /* RxCocoa.swift */; }; EBEFF85070E25F0A581B7BA1E08138AC /* Pods-ShadowsocksX-NG-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */; }; - ECC084E104E80FB7345F76B6B0C15FAC /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB8FD0BE80EE67981541A1D0567EDF2A /* DispatchQueue+Extensions.swift */; }; - ED270C801E50A979CD21211BD2685550 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4209C3E1C531131A7CA7A2DA0BB1F334 /* TakeLast.swift */; }; - ED3B6D9F5F3F89371B6425AB21A42BD5 /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478441DBD43555BE4C13427FB4B1F102 /* SerialDisposable.swift */; }; - ED97B464615625E0F41D4CFE8321AF1B /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198E9BC39A4EAE7AF6607A3DE9DBD031 /* AnonymousObserver.swift */; }; - EE3A79FAA60A198321767854B60B772F /* MASDictionaryTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = CDD891211BCACC371F9D43363C3FD01F /* MASDictionaryTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED04D176C26F6B4DEE23810B8B7119B0 /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D3408600A2042F4070CA97A67C60D5 /* PublishSubject.swift */; }; + EE3A79FAA60A198321767854B60B772F /* MASDictionaryTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E29C34C13007B34D5420BE9284FDCB0 /* MASDictionaryTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE8586A641E4CB0201D2563B1EEA6C41 /* Variable+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A040CC73BFCA8B9320CEF555F949D711 /* Variable+Driver.swift */; }; EE85F313D5EC70842C812EB16038F4F2 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EFD468F10CD22B3EFAB406DAC3FCC7C9 /* Carbon.framework */; }; - EFBF1BDB8CD460EA4A9610EF91C54928 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F28BB197905FA93BEC98E5D1F6B9F75 /* Range.swift */; }; - EFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2437216A55ECC76844C12B5DC39280A0 /* Notifications.swift */; }; - EFFA4247C90B98FD9160F30905A64569 /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5048979CBD31FB3468F7CBE0F6623336 /* cs.lproj */; }; - F0CA204303CD1FDCC9AE08D89B231BA8 /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAE13F86521FDD3838D3DA229D4AC25 /* ImmediateScheduler.swift */; }; - F22B5B760326351832F4648F432136D8 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD8770BF62499E1DA3EDF0659C91CBE4 /* ObservableConvertibleType+Driver.swift */; }; - F2853E97BDDC82B8F91AE2954D27F775 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D4C11F8F1650F1661596A0F530E6BDF /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F359857602B1D4C91B4AC3D1A2CDFE1B /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 51C85F34568C70DB96CF9B23E0D503AB /* GCDWebServerFunctions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - F3C83071EFA9A3A1CEFD3DD9817AC887 /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59D23F0528F3A7600784924A107552D0 /* Bag+Rx.swift */; }; - F44386819D44846A436139CEF3D372A5 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 0444897C0A30423DE512BC301413EBC3 /* zh-Hans.lproj */; }; - F46CAF4542DF0C7D5C7B62CB1AABD54B /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC77664C6DB0A9CA9F4AC1E93463971A /* Catch.swift */; }; - F4D944E38AA9EEB0850C85C303E8E3C2 /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87C033CF62C6A03D67EA9056684E74B2 /* Delay.swift */; }; - F68A07679A05EFEF9BFDED2B37886513 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C39B1421798570CF7E02C57F90EC4B /* Producer.swift */; }; - F6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C564EF425F990F06F9867FD48C5AAC9 /* ResponseSerialization.swift */; }; - F7DCEFB4AC63035A92A1A1361DAC5D12 /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67DA5A6F6EDD732F5332FE2EAC8DB9EE /* ScheduledItemType.swift */; }; + EEAC0241CA98FB00547A1FD43393919F /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C50B5D873459E5F93927D1EC6F3505 /* CurrentThreadScheduler.swift */; }; + EFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31EB405D095DCBF9C17B60786F115283 /* Notifications.swift */; }; + EFFA4247C90B98FD9160F30905A64569 /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D998C21F60B248C532A1ED016B5074E7 /* cs.lproj */; }; + F0B96041A73DA23E9D262BA15C170D01 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 007948A0B78DA5B2FBD4E8DB9D2029DA /* ConnectableObservableType.swift */; }; + F1409EACFA70BFBB14D0661A2A64A086 /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FD63BE80EB7AD180525F89009471D6D /* Optional.swift */; }; + F2853E97BDDC82B8F91AE2954D27F775 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D6FA3B372E3D1861300774D9CACD4C15 /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2FD100BE6F84972590D979D42ED4FC4 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BC03B0B3ABA0DCA68E6E5743698D228 /* Deprecated.swift */; }; + F312C5B4C0D22FF4F993AF7F797EE199 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0CD5DD6E42873872D2B73A60081FD0 /* Debug.swift */; }; + F359857602B1D4C91B4AC3D1A2CDFE1B /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FB611A2D6465F53874DE91ED2D760BF /* GCDWebServerFunctions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F3C6B978DDBCC0E699D26D119B572EAE /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FAB42EC783B04EAEDCA833EB48269E /* Driver+Subscription.swift */; }; + F44386819D44846A436139CEF3D372A5 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8700E99248E4432CC4DC446DE4A91E41 /* zh-Hans.lproj */; }; + F5C76B37D1C8E6738569F7AA3D40F916 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82A11977CDF4CBC2948546163A27853 /* InfiniteSequence.swift */; }; + F6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC3FA38663D9266B6B5D834492C9F7A /* ResponseSerialization.swift */; }; + F705D537791FF5B259AC2BED6619F784 /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D69B5B9B62BE6A7900C1039EFEA2BC /* URLSession+Rx.swift */; }; F8815ECB42FCF09BBC99D3730DFD577C /* MASShortcut.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 288F0992DFCC5E6027AA31FD385C34D6 /* MASShortcut.bundle */; }; - F8B3D3092ED0417E8CDF32033F6122F5 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7DE4B15A2C7B806D42D1BC1189CFC19 /* Alamofire.swift */; }; - F8FDBDB785D58B00E3DD49EFD58CFA34 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2E3D4D905C0E79E9AB56BF024A35180 /* Scan.swift */; }; - F94ACA6AA0DD416E5BF05E2425E5F2A6 /* MASKeyCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = D38D66B8CF136FA1B9D3A067600536AE /* MASKeyCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FB241DBEEFCA95FE872EF4CD6623157A /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F4BE5C3ABEB89172F29F09B174D6883 /* AnonymousInvocable.swift */; }; - FBF219CBB84DD6F373B818708C889C9D /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = AB35CD1ECD0CD3643AE3F5B53C269AF5 /* GCDWebServer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - FC296F43271A48D9D4C58B5715C051D5 /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDE61F66A8638FA807B3FD84A14A57E /* ControlEvent+Driver.swift */; }; - FE567BBF31C04A25708225C9DD0B3B3F /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 187F6C028E99961913EF8CD45D358107 /* SubscriptionDisposable.swift */; }; - FF4F2998C2F400957C309F52B81C8F25 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F158686BD10F093816366CBB70A6E30 /* InvocableScheduledItem.swift */; }; - FF647F4502B0AE29095FA14A256612EE /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CBFE7DED568FC1C077023212FEEA6C4 /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF6798A03CC53C99950B31DE10942B90 /* Observable+Aggregate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5020E5D284EBAF7DED99AB83881F38 /* Observable+Aggregate.swift */; }; + F8B3D3092ED0417E8CDF32033F6122F5 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD97D49C025DAFE6EE85E866D134966 /* Alamofire.swift */; }; + F8F408461A74E2DD1C2F52EB5CE75DBC /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 863E188823EC0A70B5265256ECE53AA4 /* DelegateProxyType.swift */; }; + F94ACA6AA0DD416E5BF05E2425E5F2A6 /* MASKeyCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 77903B50BE4AEAB8D9679B1978D574DF /* MASKeyCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F9A0498BD9162FE8DB33FEC0C34799B2 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B38DD11A907BC6F5B45FBB0A35B0C /* DispatchQueueConfiguration.swift */; }; + F9A083E8499E3D6FD016386EFF9077F1 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 986B511A99FF2CD40FF4907FE5DBAD8F /* _RXObjCRuntime.m */; }; + FA47B9CD9D97967860D670B13698860B /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4DAA5324C3F0718C4CC7852CBAC50D0 /* RefCountDisposable.swift */; }; + FAAEF6075FA56D6420B259CB55DE44CD /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDE1BDB4BDD14E3E8B8C3F8ED3B3C53A /* Reactive.swift */; }; + FBA9A81E2370D564461112665A0C3B6A /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D57732901E7827AB4442A3185E7287 /* DistinctUntilChanged.swift */; }; + FBF219CBB84DD6F373B818708C889C9D /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = A9826B12E4E987A2B073DA6D32BBA53C /* GCDWebServer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + FCE19FE31F220BF73A655705230D794B /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF81F74434BA7B8FAE460E710314428D /* Deprecated.swift */; }; + FEB827276214371B67B303805489B87A /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E95ABF737E8C0AF728AE99576593651 /* ScheduledDisposable.swift */; }; + FF59638AD925FD4B1E22F7CB3B404881 /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7959286D1E30292AB76348C2712DE95B /* AnonymousDisposable.swift */; }; + FF647F4502B0AE29095FA14A256612EE /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B31A4E3C1E226E2FB724AB96C882B5A /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -392,376 +383,367 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 002B67F5C7E4ECAD0D0339BF321BF117 /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; - 015CDD34C2C3E889192595296079F633 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileResponse.h; path = GCDWebServer/Responses/GCDWebServerFileResponse.h; sourceTree = ""; }; - 0394897FCAD2777CF1A4384FE731D25C /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RxSwift/Observables/Implementations/Optional.swift; sourceTree = ""; }; - 0444897C0A30423DE512BC301413EBC3 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hans.lproj"; sourceTree = ""; }; - 045B604CBC573827216DD575F3C9A9BE /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = ""; }; - 04BA1E955FC23E417978F5DE57553C65 /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = ""; }; - 04FCB8C241708CC45FF52AFA691DA336 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileResponse.m; path = GCDWebServer/Responses/GCDWebServerFileResponse.m; sourceTree = ""; }; + 000B7BC80F254E06ADEC25B19B7C2C37 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Timeout.swift; sourceTree = ""; }; + 007948A0B78DA5B2FBD4E8DB9D2029DA /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; + 00CECA213B3AA462DCD88A69F686C862 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerMultiPartFormRequest.h; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h; sourceTree = ""; }; + 01A59C606077EB80665FFDDD235664B3 /* MASShortcutView+Bindings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASShortcutView+Bindings.h"; path = "Framework/MASShortcutView+Bindings.h"; sourceTree = ""; }; + 023DBF06ED50965F68CFB72972CC89AB /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Scan.swift; sourceTree = ""; }; + 02C96012B347BB2E33A987A213CA57C4 /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/ObserveOn.swift; sourceTree = ""; }; + 02D69B5B9B62BE6A7900C1039EFEA2BC /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSession+Rx.swift"; path = "RxCocoa/Foundation/URLSession+Rx.swift"; sourceTree = ""; }; 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-proxy_conf_helper.debug.xcconfig"; sourceTree = ""; }; - 06571839F983E684AE0631A949E65709 /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/Implementations/DefaultIfEmpty.swift; sourceTree = ""; }; - 0708DD73E84866CEA805B9C7AB60ADE4 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; - 088BD130A0FBEAEA4D9FDAE864B58DC7 /* NSTextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextField+Rx.swift"; path = "RxCocoa/macOS/NSTextField+Rx.swift"; sourceTree = ""; }; + 0598B496AD3E8300228BC3050091C4A0 /* MASShortcut.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MASShortcut.modulemap; sourceTree = ""; }; + 07BCC46A8B3A4B93914CB0C0624B3942 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.release.xcconfig"; sourceTree = ""; }; - 0947568290847B529166B4C9F28347BB /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; - 0A7A485A268FA20FBE6CEAB65881AF6F /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; - 0B2BA85AB97126B7F170B024F033AF4F /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; - 0BE0BBDCBD8F691F0357C2BFD2A61DF7 /* NSControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSControl+Rx.swift"; path = "RxCocoa/macOS/NSControl+Rx.swift"; sourceTree = ""; }; - 0C4E480F924E52E479BFE519D781A826 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Implementations/Zip.swift; sourceTree = ""; }; - 0D3C195DE57AB12AEADA0C216773CC29 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Bind.swift"; path = "RxCocoa/Common/Observable+Bind.swift"; sourceTree = ""; }; - 0DBFAF6F1BA01CE6183C3B565DB8322C /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; + 09187F1FBD16DDE0A198691271E6D322 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileResponse.h; path = GCDWebServer/Responses/GCDWebServerFileResponse.h; sourceTree = ""; }; + 09C2A8F904CF4DBCBEF9D102DBD74AFD /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; + 09C5253CFC07A13DD0519ACE57BC0EC0 /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; + 09C5D99ED4F07DAF3A50F59C765CA416 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; + 09D280C7FCC6AE30E6F8430DBA380925 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; + 0A0BEC4717A975478F52AD458ACA42AA /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; + 0ABFF341309F8A2E61DCB2F092DFF2CA /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Generate.swift; sourceTree = ""; }; + 0C165CADEE8873C8F5D15A02BF1AF555 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = ""; }; + 0C6BFE2E2D5A6B7A594B788F625561EF /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Skip.swift; sourceTree = ""; }; + 0CD9E0BB93F28FD91CBF8872501B7280 /* MASHotKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASHotKey.m; path = Framework/MASHotKey.m; sourceTree = ""; }; + 0D9D5A3377EF4CDADE4D80FC29C1F20E /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/Traits/ControlEvent.swift; sourceTree = ""; }; 0E8A27A8C9BD6FF9AE3DCBC4050CCD76 /* Pods-ShadowsocksX-NGTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-frameworks.sh"; sourceTree = ""; }; - 0EED0973795941F05F42B25E0C0F6D99 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = ""; }; - 0F158686BD10F093816366CBB70A6E30 /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; - 1096074B199A62C38833809533B6325A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 10AE621FA1B638AD24DC8416AAEA4850 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 11C39B1421798570CF7E02C57F90EC4B /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Implementations/Producer.swift; sourceTree = ""; }; - 1255CE4EF584F1227FCFE877388965BE /* GCDWebServer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.xcconfig; sourceTree = ""; }; + 0F5B2D680B55A87168B90861D051B746 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileResponse.m; path = GCDWebServer/Responses/GCDWebServerFileResponse.m; sourceTree = ""; }; + 0FABCD0845EFCC0E95BC4EF19880A8D3 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Filter.swift; sourceTree = ""; }; + 0FB611A2D6465F53874DE91ED2D760BF /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFunctions.m; path = GCDWebServer/Core/GCDWebServerFunctions.m; sourceTree = ""; }; + 0FD7A0DC3ED806805A328B6E3183B3DD /* NSButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Rx.swift"; path = "RxCocoa/macOS/NSButton+Rx.swift"; sourceTree = ""; }; + 130F7474B10251411E8A0B0095FA77F1 /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; 13333F29A08390FCEFECA0FDCDDC919F /* Pods-ShadowsocksX-NG-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-frameworks.sh"; sourceTree = ""; }; - 1344965A836EE2DFFA93D27044532B30 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; - 135780AE39D9C9BBD7443F7F21288DFB /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/Implementations/DelaySubscription.swift; sourceTree = ""; }; - 1369962E25E1F6E43620FE725E9CE874 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; 139134EE845E284F4B3ED2EF2F9A302B /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; }; - 1407079A40EB921E4490FEA9DDB23222 /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = ""; }; + 13E44E93931EFF87E67F113CD862A0C1 /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Take.swift; sourceTree = ""; }; 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NG-umbrella.h"; sourceTree = ""; }; - 1529BF693979ADC95825A232E3F7F71B /* GCDWebServerRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerRequest.h; path = GCDWebServer/Core/GCDWebServerRequest.h; sourceTree = ""; }; - 15FDCB75F28FF0766B21B59543A5AFED /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ru.lproj; sourceTree = ""; }; - 16E2BA0967647D17B5A037805E7CF195 /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutView.h; path = Framework/MASShortcutView.h; sourceTree = ""; }; - 187F6C028E99961913EF8CD45D358107 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; - 1918A3E00F323095B9B4FE41517A6FDA /* MASShortcutView+Bindings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASShortcutView+Bindings.h"; path = "Framework/MASShortcutView+Bindings.h"; sourceTree = ""; }; - 198E9BC39A4EAE7AF6607A3DE9DBD031 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; + 1510E6FAF4B06DADDD220C9F52E25600 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; + 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; + 15DA0C069A08192F0FEB6C4FA1B9FD43 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 15DDA519B43F0EB8DFD887D2F7A6FA8A /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; + 183021AC8ED6060D003674388D5B1B49 /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+Collection.swift"; path = "RxSwift/Observables/CombineLatest+Collection.swift"; sourceTree = ""; }; + 1A1567F5FA8FE7F8CB94FF8182AFE361 /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+RawRepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift"; sourceTree = ""; }; 1A8CE48109F7ED7873F4FF9D2D3603AD /* Pods-proxy_conf_helper-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-proxy_conf_helper-acknowledgements.markdown"; sourceTree = ""; }; - 1B81A53E7BA7B919692592FBAEB2C093 /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators+arity.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift"; sourceTree = ""; }; - 1BD87FA3022EFB5D55062335BBAA6CDC /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerMultiPartFormRequest.m; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m; sourceTree = ""; }; - 1C5B91DC04B3865DDDDC72512A5C3F54 /* AnonymousObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObservable.swift; path = RxSwift/Observables/Implementations/AnonymousObservable.swift; sourceTree = ""; }; - 1D4C11F8F1650F1661596A0F530E6BDF /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; - 1E0CFCE9AB3B6AFD0691E63F63F62B18 /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataResponse.m; path = GCDWebServer/Responses/GCDWebServerDataResponse.m; sourceTree = ""; }; + 1C3FED0A19AFEE0E97C077B535ABB44E /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+Rx.swift"; path = "RxCocoa/Common/NSLayoutConstraint+Rx.swift"; sourceTree = ""; }; + 1C85AD27621E054B8D7328ABDCB9697D /* BRLOptionParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BRLOptionParser.h; path = BRLOptionParser/BRLOptionParser.h; sourceTree = ""; }; + 1D373DA90C38C00B903B1FD9CD05CEC4 /* BRLOptionParser-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BRLOptionParser-dummy.m"; sourceTree = ""; }; 1F162D37B7B6534A6D80FEE301F586EE /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NGTests-acknowledgements.plist"; sourceTree = ""; }; - 214BCB3965A64FB0986840C0E083418A /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; - 234D1504F40F558DF1303E8C160D47BD /* BRLOptionParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BRLOptionParser.m; path = BRLOptionParser/BRLOptionParser.m; sourceTree = ""; }; - 23D34D0E9C66E6F9595722372B9AED8D /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Implementations/Zip+arity.swift"; sourceTree = ""; }; - 2437216A55ECC76844C12B5DC39280A0 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; + 1F9FB942372907FC74EEC9507F4F190D /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators.swift"; path = "RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift"; sourceTree = ""; }; + 200EE4899584F5D5767A63F4E7E1A627 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = de.lproj; sourceTree = ""; }; + 20192591D331E03B112CEAB1C32D1FCF /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Sequence.swift; sourceTree = ""; }; + 20817295866FCA3DF75F20CA436D877A /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + 20E5746A4CCE940BCE91535C0D37FEB2 /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; + 2255320841E837341A064E1387C85F85 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ko.lproj; sourceTree = ""; }; + 226616D9FEC0ABA73A4365514AEE5914 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; + 22D55ADD097A4317EEBBEAC8CA5D2328 /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Driver.swift"; path = "RxCocoa/Traits/Driver/ControlEvent+Driver.swift"; sourceTree = ""; }; + 22EE8CE9A144E74E024FCD831B543700 /* GCDWebServerRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerRequest.m; path = GCDWebServer/Core/GCDWebServerRequest.m; sourceTree = ""; }; + 23A34F10DBCE77625288E96057F56456 /* NSImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSImageView+Rx.swift"; path = "RxCocoa/macOS/NSImageView+Rx.swift"; sourceTree = ""; }; + 23DD34EFE94FB8C8DCE00EE72C2473BF /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/TakeLast.swift; sourceTree = ""; }; + 2487CFFD3F6BA7CF97A97003B1727B18 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/SkipUntil.swift; sourceTree = ""; }; + 24A143E562F6586266DBD22F7295D5AD /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Delay.swift; sourceTree = ""; }; 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NG-dummy.m"; sourceTree = ""; }; - 259F77E2EC48E07223226DD78300AABD /* MASKeyMasks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyMasks.h; path = Framework/MASKeyMasks.h; sourceTree = ""; }; - 271DC7562BA32ADD28B4A53CA4C92137 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/Implementations/SingleAsync.swift; sourceTree = ""; }; + 255132D91D9485882D3509D158D686F2 /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/Traits/ControlProperty.swift; sourceTree = ""; }; + 261420BDDFD507E93CA5EEE0286F0D2B /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+CoreGraphics.swift"; path = "RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift"; sourceTree = ""; }; + 268E53814A4808A9CB605BFB3FEAB50F /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; + 2738692BF965EDDE0CDA5B4D08899095 /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = ""; }; 288F0992DFCC5E6027AA31FD385C34D6 /* MASShortcut.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MASShortcut.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 28D7F65F9E64735E3320A028DCDDDD90 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2A595C2E180CE19ADB5A7218E78FD8BC /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/Implementations/RetryWhen.swift; sourceTree = ""; }; - 2C391D236625ECDDDADDF2E2CF327C90 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = it.lproj; sourceTree = ""; }; - 2C4F41A96AB13FAA06EB576B1286FD61 /* NSButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Rx.swift"; path = "RxCocoa/macOS/NSButton+Rx.swift"; sourceTree = ""; }; - 2D2D8747A63B260F80C40C9DCDAC357E /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerHTTPStatusCodes.h; path = GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h; sourceTree = ""; }; - 2DED940C0868591ED86659234813AF5B /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = ""; }; - 2E934534DD61AA5D52BB8BD519A53726 /* Variable+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+SharedSequence.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift"; sourceTree = ""; }; - 2EBB434DC5BFF77FC3F8C0215BDFC40F /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; - 2F5238F43AAC23E1434E88471A76DAA8 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-prefix.pch"; sourceTree = ""; }; - 30D8B840460D79AB3B8AB39A4164F4B7 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; - 30E2E47F7B982BA49DF174E3FDFB288B /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; - 30FBBC7DFAD0F5694D59ACC330B005E0 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; - 3261881064E033A3711EA27CE78524FC /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; - 33045890E1D4469FBFD24F367E827FAC /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/Implementations/TakeWhile.swift; sourceTree = ""; }; + 28EC1B5940ACD0BA9FE7309429D6ED68 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Multicast.swift; sourceTree = ""; }; + 292363670323CC583F50A5989CC3D9D0 /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; + 29DCD7692E660B9C1FF8E7A3063F2B47 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; + 2A2D9F47CF554F3D0FF28A201822E872 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Just.swift; sourceTree = ""; }; + 2A97F155FCEA6B4942A94BBB31544107 /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; + 2B264AC163CEFA27D7ED08507B018B11 /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/RetryWhen.swift; sourceTree = ""; }; + 2BC3FA38663D9266B6B5D834492C9F7A /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 2CC9430D7E7FB49F1A03FD83C0F15DF0 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Bind.swift"; path = "RxCocoa/Common/Observable+Bind.swift"; sourceTree = ""; }; + 2D1CCFB65C786E25702F68A5601E80DC /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Merge.swift; sourceTree = ""; }; + 2E60ACE8054201E83089FD336ABCAA2F /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Concat.swift; sourceTree = ""; }; + 2F67068FE91E63222D2D32C4BB3BBCBD /* NSSlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSSlider+Rx.swift"; path = "RxCocoa/macOS/NSSlider+Rx.swift"; sourceTree = ""; }; + 2FFA998983771BA589140ED254CFBD48 /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = ""; }; + 30A4AEAD1EF447DFE90F59D1059C79B7 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/StartWith.swift; sourceTree = ""; }; + 30FAB42EC783B04EAEDCA833EB48269E /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Subscription.swift"; path = "RxCocoa/Traits/Driver/Driver+Subscription.swift"; sourceTree = ""; }; + 31EB405D095DCBF9C17B60786F115283 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; + 321FFBA726A46A7C54E164E625D44DED /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; + 326A9DBB817D95D4A5840B314BF9202B /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Never.swift; sourceTree = ""; }; 3358F45A5BEC1A7F725167CD1969EDC8 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NG-acknowledgements.markdown"; sourceTree = ""; }; - 34AEA52D361570E78F8B9792A835A1A1 /* AsMaybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsMaybe.swift; path = RxSwift/Observables/Implementations/AsMaybe.swift; sourceTree = ""; }; - 34B22FFDD2CE991366EAEE41BA0B706A /* Observable+Binding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Binding.swift"; path = "RxSwift/Observables/Observable+Binding.swift"; sourceTree = ""; }; - 351C16C6C5C0715F1C876D91D0EDEA09 /* AsSingle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsSingle.swift; path = RxSwift/Observables/Implementations/AsSingle.swift; sourceTree = ""; }; - 360EB85AC720C078D420EADAF6C654ED /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerURLEncodedFormRequest.m; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m; sourceTree = ""; }; - 3690656BBFBCA6B31887844429A9D961 /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Subscription.swift"; path = "RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift"; sourceTree = ""; }; - 37276F2D8D3AED22ABF63827FF4C2E1D /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = ""; }; - 385EF54CE93CF6561FBD6FCD4BC908CF /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; - 3AC8F7EF565790CE58751914BAB4C1B3 /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; - 3B3D790CC9A67D70E3E0EDD445F085E1 /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Implementations/Merge.swift; sourceTree = ""; }; - 3C3DDD5AE0D4C7DFC098D473F24ADFC5 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - 3C59EAD8143A508A0231627DD42D5C23 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = ""; }; - 3F28BB197905FA93BEC98E5D1F6B9F75 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Implementations/Range.swift; sourceTree = ""; }; - 405572D03A3BCC4C3EEC1F1CECFFD7EC /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCDWebServer-dummy.m"; sourceTree = ""; }; - 40784518B3B077970ACD76FF6ADC6E18 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/Implementations/AddRef.swift; sourceTree = ""; }; - 4209C3E1C531131A7CA7A2DA0BB1F334 /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/Implementations/TakeLast.swift; sourceTree = ""; }; - 423730810CF7CCE34FE8316CFF58F0B8 /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Implementations/Generate.swift; sourceTree = ""; }; - 42677271ADFD7C38E4A2D9A129A60105 /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = ""; }; - 430E0E395046F19946D55C7F791DDCC4 /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Implementations/Throttle.swift; sourceTree = ""; }; - 435BB7E73157084CAF2FE80FBE224AF2 /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; - 4387584024C546AD5AD6B7EDD37485BF /* GCDWebServerConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerConnection.m; path = GCDWebServer/Core/GCDWebServerConnection.m; sourceTree = ""; }; + 33607CFF1CB9E42C89084F9C17E407B0 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; + 346BBFB5B79A5139190296845F41C8DE /* NSTextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextField+Rx.swift"; path = "RxCocoa/macOS/NSTextField+Rx.swift"; sourceTree = ""; }; + 359132E97DDCA64E851B2CE3FE71F813 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/TakeUntil.swift; sourceTree = ""; }; + 37CB5F5627B0B6D64308CD1A83ABB3B0 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Deferred.swift; sourceTree = ""; }; + 38A7049C5EA5CF2C54BDD0F1BE4D6FCD /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; + 3A338EA0CA1FE047514C4AE30D1EC601 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataResponse.h; path = GCDWebServer/Responses/GCDWebServerDataResponse.h; sourceTree = ""; }; + 3C3BD779374EECF9D6A500A90CF6279C /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; + 3CCE02B40B95BFF261200228AF8EBC16 /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/CombineLatest+arity.swift"; sourceTree = ""; }; + 3CD46935CE54DAD2A7350CB2E4DB048C /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ru.lproj; sourceTree = ""; }; + 3D97535E8704070D353435086265E041 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/TakeWhile.swift; sourceTree = ""; }; + 3E29C34C13007B34D5420BE9284FDCB0 /* MASDictionaryTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASDictionaryTransformer.h; path = Framework/MASDictionaryTransformer.h; sourceTree = ""; }; + 3E4A6E1ABB2E00314CDA799343BF5983 /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Sample.swift; sourceTree = ""; }; + 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; + 4019945AEEA809599FA5E80EB71F757D /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxCocoa.modulemap; sourceTree = ""; }; + 41DAD2203618169F641D264D7C2EE0E6 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Error.swift; sourceTree = ""; }; + 43C50B5D873459E5F93927D1EC6F3505 /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; + 44D9192CE046EB20FAF1BF26C3FC60FC /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 44F322EFF3BACA5D7D9D859973112A90 /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCDWebServer-dummy.m"; sourceTree = ""; }; + 45E0880FB45B513CD4BFD63BB3E7B736 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Catch.swift; sourceTree = ""; }; 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NGTests-dummy.m"; sourceTree = ""; }; - 478441DBD43555BE4C13427FB4B1F102 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; - 47B14EF7B2C9724416D7F4F875D1CB32 /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataRequest.h; path = GCDWebServer/Requests/GCDWebServerDataRequest.h; sourceTree = ""; }; - 48B2C17385071197F259AB746341B272 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; - 48FAC49BD2A6F874166D24BB5C9BA1AE /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Implementations/Skip.swift; sourceTree = ""; }; - 49AA0901E701115CB7028794961FEE8E /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerStreamedResponse.h; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.h; sourceTree = ""; }; - 49D0AEBF622CB33505BCC1202E398B34 /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Implementations/Debounce.swift; sourceTree = ""; }; - 49F857A6751201ED3D72F96DC13C729F /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; - 4A1F43CF3068C2DCAA16CAF4E7EDCE4E /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; - 4C564EF425F990F06F9867FD48C5AAC9 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; - 4F4BE5C3ABEB89172F29F09B174D6883 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; - 4F4D6DC50E558CC6AE51E3AF56E5018B /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; - 4F9B04B4F8691154899A7BB06F149941 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileRequest.h; path = GCDWebServer/Requests/GCDWebServerFileRequest.h; sourceTree = ""; }; + 48930EE93B15635DB1DC641A949AB58E /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = it.lproj; sourceTree = ""; }; + 4901C7D532E5179B742DB643CA1B408A /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; + 4A9DE35FDE449CC76ADF563645C81738 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; + 4B3925E8418FB15723527909346442D9 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; + 4FD63BE80EB7AD180525F89009471D6D /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RxSwift/Observables/Optional.swift; sourceTree = ""; }; 4FEC4B8DFE8753A9B1DE598293568F30 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 5048979CBD31FB3468F7CBE0F6623336 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = cs.lproj; sourceTree = ""; }; - 5151ABAABBD1A1CE800C52AB2A585634 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = pl.lproj; sourceTree = ""; }; - 51C85F34568C70DB96CF9B23E0D503AB /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFunctions.m; path = GCDWebServer/Core/GCDWebServerFunctions.m; sourceTree = ""; }; - 51D83FA8652F1FBA030AB17ED7FE6A3C /* UIBindingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIBindingObserver.swift; path = RxCocoa/CocoaUnits/UIBindingObserver.swift; sourceTree = ""; }; - 5208F42E4D16971BBD8698E9C751B6ED /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Implementations/Take.swift; sourceTree = ""; }; - 525C68580D6831E607AD3D862DC133DD /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Implementations/Buffer.swift; sourceTree = ""; }; - 5280B2DC564CD3CA2D4349E9AB85ADEC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 528841720C50D9A4B73EE2A4C6A8E132 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; + 4FF0A1029048B0747EEF9A0E552FE307 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = ""; }; + 5089235C3188BE2DE716A15C48207E8A /* MASLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLocalization.h; path = Framework/MASLocalization.h; sourceTree = ""; }; + 51807E4919B34213B8F47CD576F3FC3C /* GroupBy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupBy.swift; path = RxSwift/Observables/GroupBy.swift; sourceTree = ""; }; + 5222FC0287904A0C1050B9B01E9712F8 /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerStreamedResponse.h; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.h; sourceTree = ""; }; + 524C8DBC63D366E5C0E8A5EA62713031 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/WithLatestFrom.swift; sourceTree = ""; }; + 52A9C2646B9718959021371687EE6250 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; + 52F0C0E792C43635C8DF0BA00874B14F /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; 52F51F94701ABD692BFFC9F92AE2E115 /* Pods-ShadowsocksX-NG-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NG-acknowledgements.plist"; sourceTree = ""; }; - 5374966D42537C6369072660B48CF199 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Implementations/Multicast.swift; sourceTree = ""; }; - 550F2C93957EF2301541066CF63D46BC /* MASHotKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASHotKey.m; path = Framework/MASHotKey.m; sourceTree = ""; }; - 56E8831C108769CCDBD44A22DC79FC6C /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; - 57D2E434BDBDBAFB4EAB539971677BB3 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+KVORepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift"; sourceTree = ""; }; - 58CB8D564AB01DBEED55DBEB75380239 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; - 58FCD780817CA60F10D6C39A083DDCDC /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+Collection.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+Collection.swift"; sourceTree = ""; }; - 59AAA65A3B3DF93288B9973C7991DA37 /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/CocoaUnits/ControlEvent.swift; sourceTree = ""; }; - 59B5C5DECEBDC9747029DD2086C6B00D /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; - 59D23F0528F3A7600784924A107552D0 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Bag+Rx.swift"; path = "RxSwift/Extensions/Bag+Rx.swift"; sourceTree = ""; }; - 5A11BED0A468B53EAE2F900A790FB03A /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Implementations/Repeat.swift; sourceTree = ""; }; - 5C4A3D2ED8D2752319AA3649ECF09EA1 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; - 5C56E70499D215B611C87DF7E81D7DF9 /* Observable+Multiple.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Multiple.swift"; path = "RxSwift/Observables/Observable+Multiple.swift"; sourceTree = ""; }; - 5D803CC81BFCD9AE0F09CC693CCD4993 /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = ""; }; + 533BCDFF477A8BB66A84035182761408 /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = ""; }; + 534E4A964C49209EE277E82628F5710B /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; + 535DA0E1B20533E30B48C0F04AEF67CD /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcut.m; path = Framework/MASShortcut.m; sourceTree = ""; }; + 545894F30123AB01C758C6689014BCC6 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/AddRef.swift; sourceTree = ""; }; + 55178DF04DDB4E9CA87135167C286E60 /* MASShortcutMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutMonitor.h; path = Framework/MASShortcutMonitor.h; sourceTree = ""; }; + 55279FD33E1F40398E20D7299953F40A /* MASHotKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASHotKey.h; path = Framework/MASHotKey.h; sourceTree = ""; }; + 5548D8C229700A0AEB23E7B56630426B /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; + 55FEBC89F2833AD13021CF63D4B810E1 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Zip+arity.swift"; sourceTree = ""; }; + 5603B5E9D6CFF759B07667A13C90112C /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = fr.lproj; sourceTree = ""; }; + 5613FC3B7810194DB766F2AA387847AF /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; + 572BE12282110872C7D8E7EF29A5033C /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerErrorResponse.m; path = GCDWebServer/Responses/GCDWebServerErrorResponse.m; sourceTree = ""; }; + 57B9A9B823D866CFD5C18A2DF4FBB883 /* ShareReplayScope.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplayScope.swift; path = RxSwift/Observables/ShareReplayScope.swift; sourceTree = ""; }; + 58AB02263E99467FF2175C1702B5ED82 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; + 58CB4D7A6C8CB1B887645BE2595AFC0E /* GCDWebServerRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerRequest.h; path = GCDWebServer/Core/GCDWebServerRequest.h; sourceTree = ""; }; + 5945D007DC7A2B629B8E5987E6184267 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+KVORepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift"; sourceTree = ""; }; + 5AD930CE2472F57A003EF8907CA3116C /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; + 5B6B335F7D4B0FC8875810068B493F55 /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RxCocoaObjCRuntimeError+Extensions.swift"; path = "RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift"; sourceTree = ""; }; + 5BE80522158C8CAE9E3CFE12B3D857F7 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; + 5CA271EB6661517D11AE48621699B565 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/ToArray.swift; sourceTree = ""; }; + 5CBA0B69E87685AC3D2B60EF632158AE /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; + 5CCFC9D5177E577E082A70923B848393 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; + 5CF6DC4F50F673F957821F727AF12A71 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; 5D84D92D27CE8A6F5C45E8A03155C1CF /* Pods-proxy_conf_helper-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-proxy_conf_helper-frameworks.sh"; sourceTree = ""; }; - 5E149596B24A0F722AAD04DD0E7648FC /* GCDWebServerRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerRequest.m; path = GCDWebServer/Core/GCDWebServerRequest.m; sourceTree = ""; }; - 5EFC56330DB909884DFCFFEE79C788F2 /* Variable+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/Variable+Driver.swift"; sourceTree = ""; }; - 5FA15EB50AC1F6D3A499615FF5B6A824 /* BRLOptionParser-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BRLOptionParser-prefix.pch"; sourceTree = ""; }; - 60B4EBBBD5D3F3346F7E7334498186B2 /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; - 612574DE7BC9EB82F4DCE7D2E38318B9 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/Implementations/StartWith.swift; sourceTree = ""; }; - 6200462FD0350D942C06454BF3959B8D /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; - 622BE644A5BCF7100BB04E2E0578F8C2 /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-umbrella.h"; sourceTree = ""; }; - 62543C716FC9EBEA1CAC093AD57E93FD /* BRLOptionParser-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BRLOptionParser-dummy.m"; sourceTree = ""; }; - 62A7E7809BC29FA83778B027FE2021B6 /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; - 63973CDD0819B187A85E746CC55ED88F /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Implementations/Sample.swift; sourceTree = ""; }; - 64A21A2EB387821C687BFB0B5FC0D242 /* Observable+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Debug.swift"; path = "RxSwift/Observables/Observable+Debug.swift"; sourceTree = ""; }; - 64D637E8C0ED768E21CFCAE9641662B6 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutView.m; path = Framework/MASShortcutView.m; sourceTree = ""; }; - 64EE1C0399B2FC8E5B84F059BC3B89F9 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; - 65268C40FD5106D32C7C227F38209B3F /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; - 66999DB6AE23289A4ECDBEBCC7A09C5F /* MASDictionaryTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformer.m; path = Framework/MASDictionaryTransformer.m; sourceTree = ""; }; - 6746B37DEF5322A16C300B61DED7F1AD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 67DA5A6F6EDD732F5332FE2EAC8DB9EE /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; - 67E751429B6B9BC0FABF01B8867EF866 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; - 69B06482690AB04BAC88256758995B90 /* Observable+Time.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Time.swift"; path = "RxSwift/Observables/Observable+Time.swift"; sourceTree = ""; }; - 69DF594FDFE7BC49AA1019B10D7065E7 /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+Extensions.swift"; path = "RxSwift/ObservableType+Extensions.swift"; sourceTree = ""; }; - 6A03D18B60F1C426EF558F967B149830 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; - 6B53429CB1F8A25076762F2D82D97CCF /* BRLOptionParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BRLOptionParser.h; path = BRLOptionParser/BRLOptionParser.h; sourceTree = ""; }; - 6B7E831C7BD9ACCDA16302B15F5A8035 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Implementations/Deferred.swift; sourceTree = ""; }; - 6C980D73B55B8361629ADA1668748A31 /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; - 6CBFE7DED568FC1C077023212FEEA6C4 /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = ""; }; - 6CE6F293A7A5280E8364DA3F1C0B4B1B /* ObservableConvertibleType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+SharedSequence.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift"; sourceTree = ""; }; - 6D4A286AAC017AE5547B794DD2C8AF59 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; - 6D71F1C033CF6233A31594BA370062CA /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; - 6DEED24A26C9B7E2A8FFD080F9C8C2AF /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; - 6E1351027B3142F486A98424D9F42779 /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-umbrella.h"; sourceTree = ""; }; - 6E634B678C5C5CF993CA1475A75B7DEE /* Observable+Creation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Creation.swift"; path = "RxSwift/Observables/Observable+Creation.swift"; sourceTree = ""; }; - 6F8C5EB810D1464D5BE86A414DC08616 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = ""; }; - 71150F3D7194C1783C37A070F1AD879E /* ShareReplay1WhileConnected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1WhileConnected.swift; path = RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift; sourceTree = ""; }; - 717C5EDEA19D4107A1C3112D049EBB9C /* NotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NotificationCenter+Rx.swift"; path = "RxCocoa/Foundation/NotificationCenter+Rx.swift"; sourceTree = ""; }; - 72D5CA8AF08CC028C391EB1A38C661B0 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; - 76BDABDC97B3B4B0598FB6DF3966C3EA /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ja.lproj; sourceTree = ""; }; - 77A56791C067FBC9E3AC1405C667F1BA /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; - 77B1E0282CBC343B82CC78C567B8B534 /* MASShortcutMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutMonitor.m; path = Framework/MASShortcutMonitor.m; sourceTree = ""; }; - 78D3C582CD284C68D7B5FCF58D73BF07 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; - 797084A009F9EF151DBBF73DD026ADC6 /* BRLOptionParser.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.xcconfig; sourceTree = ""; }; - 79CD123F941026E950A51F29197238C8 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 7A46EF6D6AE7B13EF91E0A19B18EABEE /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/Implementations/SkipWhile.swift; sourceTree = ""; }; - 7A5020E5D284EBAF7DED99AB83881F38 /* Observable+Aggregate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Aggregate.swift"; path = "RxSwift/Observables/Observable+Aggregate.swift"; sourceTree = ""; }; + 5D904A8BE8B963C1CFDCB978A106290A /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Buffer.swift; sourceTree = ""; }; + 5DB38C96718DD2622736537BB2ECC6C2 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; + 5DEF0513A865FDE2BA2DB595F61C8538 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCDWebServer.modulemap; sourceTree = ""; }; + 5F5BB1CD589B3E27B8A75FA688E70401 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; + 5FC9E4C5BE139DEDCF232F464EEE5F9A /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; + 606D277095EEA4BF6FEB8D9270E15542 /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators+arity.swift"; path = "RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift"; sourceTree = ""; }; + 6078A9FA6BBA43845BFA8D0BA163E903 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; + 60A4BC59E7923D49D1F2DB66CC93CEF6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6180F60B96D97B62E15F102AA5722741 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; + 61F3F1CC2095B445C811F0C16E005B49 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; + 627D2F62F19998F945736C6D580E9326 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + 628F693AA128B618F45155C70C6E1024 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Zip.swift; sourceTree = ""; }; + 636B1F25C166F05CF62D7805112E6124 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; + 63D2A88D8F95FB962BFE6279B46169D6 /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; + 646E91BE14388979C352F573B4362A39 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/SkipWhile.swift; sourceTree = ""; }; + 65BABB33CC0139D359C0ECABD05CD0B7 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Switch.swift; sourceTree = ""; }; + 66C68481E0A15400E90729E5B6E9C46D /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; + 6786640F8B195A8E8E18BE5034B98BDD /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = pl.lproj; sourceTree = ""; }; + 68041DC65BD6DADAF82378F8875B3FCB /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; + 6873049F56F58D5ED3E44719FC73C4F6 /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Traits/PrimitiveSequence.swift; sourceTree = ""; }; + 687C69F6237AA7E984907EBAB8FA2B02 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutView.m; path = Framework/MASShortcutView.m; sourceTree = ""; }; + 68DFB337F054F8982CF31389DBFF6374 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Do.swift; sourceTree = ""; }; + 68FC88BF39528F8F3D69BD6D8964B5A7 /* Shortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Shortcut.h; path = Framework/Shortcut.h; sourceTree = ""; }; + 6ADE820F11CABD3D1C1218580FD439A2 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; + 6B29EA946AE6D8BE387824C42B121D67 /* Materialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Materialize.swift; path = RxSwift/Observables/Materialize.swift; sourceTree = ""; }; + 6B348F108925962F83EAEAC0E334CA06 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/SingleAsync.swift; sourceTree = ""; }; + 6B432AF0284AA5FB0D45EED8A72A6B1A /* GCDWebServerResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerResponse.h; path = GCDWebServer/Core/GCDWebServerResponse.h; sourceTree = ""; }; + 6BBA11BAC502FBD57943042D6D9D8975 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; + 6C9B2D9A28ABC58CFEE373E87A4052A7 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + 6F9BA2F71CB99026197CB42B356FC63E /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; + 7206D6A8DAD7ADCD7E85D9D080C6BACB /* Variable+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+SharedSequence.swift"; path = "RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift"; sourceTree = ""; }; + 728798194C8FC2BA7D507A14593C9C6F /* ObservableConvertibleType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+SharedSequence.swift"; path = "RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift"; sourceTree = ""; }; + 72B8CEB9D05921D08AA078AE17F53770 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerResponse.m; path = GCDWebServer/Core/GCDWebServerResponse.m; sourceTree = ""; }; + 72FDEB0BDDFCA5B67411693DCA3BAB36 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = ""; }; + 752306794D721D2E1BF157AAA32771ED /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; + 75828AB7420DC80FF4A055AD665BA0E8 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; + 761DD04D13CF5C96E3661EBB41496409 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/SubscribeOn.swift; sourceTree = ""; }; + 77903B50BE4AEAB8D9679B1978D574DF /* MASKeyCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyCodes.h; path = Framework/MASKeyCodes.h; sourceTree = ""; }; + 78481FCBF09A8942C2BCB258298EBDBE /* BRLOptionParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BRLOptionParser.m; path = BRLOptionParser/BRLOptionParser.m; sourceTree = ""; }; + 788FB43AEDD6D9FD2ECBD95EAC8A97E5 /* UIBindingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIBindingObserver.swift; path = RxCocoa/Traits/UIBindingObserver.swift; sourceTree = ""; }; + 7959286D1E30292AB76348C2712DE95B /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; + 7A20F2D6B7A2D475A3BEF0CAFE123400 /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Foundation/KVORepresentable+Swift.swift"; sourceTree = ""; }; 7B63AB91C9378BEF83982ADCC82E9770 /* GCDWebServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7CBC95D81A39FE47DF7664F12F9FF6E1 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; - 7CD1750A494B17CF183B50C961117C6D /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerErrorResponse.h; path = GCDWebServer/Responses/GCDWebServerErrorResponse.h; sourceTree = ""; }; - 7D0D3E3125AF3C4C71554245E74E3A8C /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Implementations/Map.swift; sourceTree = ""; }; - 7D6462467149007CC9112C18E0FA2BE0 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = ""; }; - 7DB18E3EF0102CDC82F31CA6B466A8B3 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/Implementations/ToArray.swift; sourceTree = ""; }; - 7E1780CA78CC5EE56892186D6699471D /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileRequest.m; path = GCDWebServer/Requests/GCDWebServerFileRequest.m; sourceTree = ""; }; - 7E8FD5D8A77584D71B37963D270CBAE2 /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = ""; }; - 804280091995DFB0D7791D5300473723 /* GroupBy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupBy.swift; path = RxSwift/Observables/Implementations/GroupBy.swift; sourceTree = ""; }; - 806CAD0BC89F898F94D939211ABC3384 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Implementations/Do.swift; sourceTree = ""; }; - 81A1AAE28282C31243C72011FF5A4830 /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Implementations/Timer.swift; sourceTree = ""; }; - 828EB8509B88B335C1D7D0C2B3D7D895 /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Foundation/KVORepresentable+Swift.swift"; sourceTree = ""; }; + 7BC64B28448C32D46B71791C7752E48F /* ResourceBundle-MASShortcut-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MASShortcut-Info.plist"; sourceTree = ""; }; + 7C7BE50FB7791D6009BF033B78EA631C /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; + 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + 7D03BE981ABF583B8C0A9733FC4E7758 /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerURLEncodedFormRequest.m; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m; sourceTree = ""; }; + 7D436A58ECC98D13B9A4C91CD460DF93 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; + 7EE2EE9316F755CDB7B2D29A98063559 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = nl.lproj; sourceTree = ""; }; + 7F37E66B5A8F3C680354C935F2744C29 /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Repeat.swift; sourceTree = ""; }; + 8209A41698505C3145781FDD26E699EE /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Driver.swift"; path = "RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift"; sourceTree = ""; }; + 82B6A945EDCE3039C33A744E0206424D /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = ""; }; + 82D5F30FE87A96D7AA09249DB4D8F82F /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; 83323A1A2936BBA3D386DCC078E3821E /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NGTests-acknowledgements.markdown"; sourceTree = ""; }; - 8402EA2D03C261FDFF31CEC2F3E17390 /* RefCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCount.swift; path = RxSwift/Observables/Implementations/RefCount.swift; sourceTree = ""; }; - 85BE206744586C11C8C71BF92918AB7B /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; - 874D347DB51D5D3E716E95F6E97CFF9A /* MASLocalization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLocalization.m; path = Framework/MASLocalization.m; sourceTree = ""; }; - 87580AD4D9D45E84D60D81B7D6E97C0A /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; - 87C033CF62C6A03D67EA9056684E74B2 /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Implementations/Delay.swift; sourceTree = ""; }; - 8865ABAF07DEA295CE14F00DEB443C41 /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = ""; }; - 88C081789EDC0560233A76D711CE9659 /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; - 88C9C68749757A2F4BCA7FFF1CA0F9BA /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Implementations/Sequence.swift; sourceTree = ""; }; - 89BD8062B3919962E8EFBC3E6DBA8537 /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift; sourceTree = ""; }; - 8B0382153B0EC132C2BECD3DCB1193B6 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = ""; }; - 8C0EC59C08B29B12978B1C4DBDD6491F /* MASShortcutBinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutBinder.m; path = Framework/MASShortcutBinder.m; sourceTree = ""; }; + 8395CF3A1AD4518051CE6450BDBC43BD /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; + 863E188823EC0A70B5265256ECE53AA4 /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = ""; }; + 8700E99248E4432CC4DC446DE4A91E41 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hans.lproj"; sourceTree = ""; }; + 87565A23AA7557C2E511616C236D8EA9 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + 878BBACC17D3136FA4DD1CD04CAD85A0 /* Completable+AndThen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Completable+AndThen.swift"; path = "RxSwift/Traits/Completable+AndThen.swift"; sourceTree = ""; }; + 88003809F8CD8A52B418884D95EB7FFD /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-umbrella.h"; sourceTree = ""; }; + 881AB2BAED9DBD8D39A04DCCFD4A871B /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; + 8A0AC98004CCEB4CC8A5BECA09878CAA /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + 8C49546F441EF6B013C11F9ECC4E494E /* MASDictionaryTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformer.m; path = Framework/MASDictionaryTransformer.m; sourceTree = ""; }; + 8C848585CA8A7F199434CE368A9DB06C /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; 8CDD45C6D7A038F415A78787317E931A /* Pods-proxy_conf_helper-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-proxy_conf_helper-resources.sh"; sourceTree = ""; }; - 8D21B3357EAEBF44D19D3A611848628E /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; - 8D679D13A827958B8B727FA6E970D093 /* MASLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLocalization.h; path = Framework/MASLocalization.h; sourceTree = ""; }; - 8E68586EDAB1716AE8A9303B3149E642 /* ResourceBundle-MASShortcut-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MASShortcut-Info.plist"; sourceTree = ""; }; - 8E9FC22AFD2BA36D7C298505DD97DB07 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; - 8EC98D40BE7139C7559F4E49AD0B9202 /* Shortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Shortcut.h; path = Framework/Shortcut.h; sourceTree = ""; }; - 8EDBB56EE738F917614C08B706C06291 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = fr.lproj; sourceTree = ""; }; - 8EF3B7799254D602BB02B42C4E30CFFF /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Implementations/Never.swift; sourceTree = ""; }; - 8F1D6D87906CF7A06C84F16A89701364 /* MASShortcut-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-umbrella.h"; sourceTree = ""; }; - 8F9C2E8F767184184382C0659D0B57C6 /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataRequest.m; path = GCDWebServer/Requests/GCDWebServerDataRequest.m; sourceTree = ""; }; - 8FE77EB2349A660DFADBF5CE01DEF91C /* ObserveOnSerialDispatchQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOnSerialDispatchQueue.swift; path = RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift; sourceTree = ""; }; - 90BD54F6E711E6C0C832CFD421265D40 /* MASShortcutBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutBinder.h; path = Framework/MASShortcutBinder.h; sourceTree = ""; }; - 911BAB036265D98689D411112E34B452 /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; - 912AE5C728F325B6D86D33E827E266C8 /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; - 912D7029A05911D1FB4ABFF9E2B851C7 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; + 901EFAF9E76AF0F9D3DBC7CE6212D4B8 /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Foundation/NSObject+Rx.swift"; sourceTree = ""; }; + 92244CECCE7B444FAB2C8202E5EA4056 /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = ""; }; + 924ECD8580145EBC5702BD6D3B314F61 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; + 9352AFD1D6C6B57A9AF36DD5277BB196 /* NSView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSView+Rx.swift"; path = "RxCocoa/macOS/NSView+Rx.swift"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 941AC673759A8487CD0E31D9222FE395 /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerPrivate.h; path = GCDWebServer/Core/GCDWebServerPrivate.h; sourceTree = ""; }; - 941AD6E4532B1B070D2592FE3A2AE752 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Implementations/Error.swift; sourceTree = ""; }; - 94E567C35466451FC7539A0BD8DA6046 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; - 94F74323508484A216D1C8AECF3B836C /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; - 9591C37093C86F6625E89B7ECD358BDE /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; - 967C15B6D2FAA4BA22B657F647B6B412 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = en.lproj; sourceTree = ""; }; - 96A99E648BA7AA9728B58FA257DAAB8E /* NSView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSView+Rx.swift"; path = "RxCocoa/macOS/NSView+Rx.swift"; sourceTree = ""; }; - 96B9E4E997A45EC8F7F95390DF683EA4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9761A45C8B106617BE144782B56D8C8C /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RxCocoaObjCRuntimeError+Extensions.swift"; path = "RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift"; sourceTree = ""; }; - 981AE7988280E3E58827A4BC2FEC206B /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxCocoa.modulemap; sourceTree = ""; }; + 9480F95CFFC2D8DA4D91AE587BFF20B8 /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = ""; }; + 9487D19A313750E8B3F0DDB32B87E864 /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = ""; }; 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.debug.xcconfig"; sourceTree = ""; }; - 999B20A513A4091BA573B86714915DD0 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = ""; }; - 99EFFE07C47D5D98611714C066D640BC /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/CocoaUnits/ControlProperty.swift; sourceTree = ""; }; + 986B511A99FF2CD40FF4907FE5DBAD8F /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = ""; }; + 98882780F0AB1693529D79FBB62760CE /* MASShortcutBinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutBinder.m; path = Framework/MASShortcutBinder.m; sourceTree = ""; }; + 996FFF36FA1A968D9BC5367C870F15F0 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 99EEC612B008B452C8ACD615123EDA93 /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-umbrella.h"; sourceTree = ""; }; + 9B1F2B769E9F6355DF3AC956AF04D064 /* AsSingle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsSingle.swift; path = RxSwift/Observables/AsSingle.swift; sourceTree = ""; }; + 9B31A4E3C1E226E2FB724AB96C882B5A /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = ""; }; + 9B539B1FEB1247454F06F69690A74881 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; 9B6ACACC69C2EA2681770741535F1D69 /* MASShortcut.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MASShortcut.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9B7FB3B8F0F547E0CCC3EDB3FA5509E5 /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; 9B8B5CBA357BDB968C73E8F58DFBC74C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.debug.xcconfig"; sourceTree = ""; }; - 9BA7C38118F80CD261A2C1877652FBAE /* NSSlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSSlider+Rx.swift"; path = "RxCocoa/macOS/NSSlider+Rx.swift"; sourceTree = ""; }; - 9C1694FBE9CBF06E4F1C9F38B5DFA930 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; - 9C1DEE1416BA8E32A4D01FC91692DDA2 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ko.lproj; sourceTree = ""; }; - 9D934D4D41993FB7CED17EF07D57ED0C /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+RawRepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift"; sourceTree = ""; }; - 9DA9F52CD97C9FFDD1A42400020B5C86 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/Implementations/SubscribeOn.swift; sourceTree = ""; }; - 9DC1F4EFF87C0AA04AFAB87CB07ACFC2 /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift"; sourceTree = ""; }; - 9E5961CAA9976325C800898EBC9E0C8A /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; - 9F0C370A9E746A9710DCDBF48091819B /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; - 9F4AD3BB60C4064C0FBE13775748D456 /* ShareReplay1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1.swift; path = RxSwift/Observables/Implementations/ShareReplay1.swift; sourceTree = ""; }; - A030F5167FA6558FE91D25425A0B9CBA /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; - A04BDAC57478865FE5DD3EC203E58F10 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/Implementations/CombineLatest.swift; sourceTree = ""; }; - A07A8BDB7BFA69AA9291E71416EC58CF /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerStreamedResponse.m; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.m; sourceTree = ""; }; - A24870AF7F42FAA0AD9ABB0325F1E135 /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/Implementations/ObserveOn.swift; sourceTree = ""; }; - A299EE214CF95998A680C2E5EBEEC779 /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; + 9BC03B0B3ABA0DCA68E6E5743698D228 /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxSwift/Deprecated.swift; sourceTree = ""; }; + 9E95ABF737E8C0AF728AE99576593651 /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; + 9FAE9397A18DDA64A11847EF6BA0476C /* MASShortcutValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutValidator.m; path = Framework/MASShortcutValidator.m; sourceTree = ""; }; + A023097C535D0BD3D56EA8BD993D7B3F /* Dematerialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dematerialize.swift; path = RxSwift/Observables/Dematerialize.swift; sourceTree = ""; }; + A040CC73BFCA8B9320CEF555F949D711 /* Variable+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+Driver.swift"; path = "RxCocoa/Traits/Driver/Variable+Driver.swift"; sourceTree = ""; }; + A077B4E84F0E05629C70075B9B9D871E /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutView.h; path = Framework/MASShortcutView.h; sourceTree = ""; }; + A0A5B4E433F12A0EE14939299BFA30B5 /* MASShortcutMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutMonitor.m; path = Framework/MASShortcutMonitor.m; sourceTree = ""; }; + A0A7422506FBD6F1F77B1F2A6D4167C1 /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-prefix.pch"; sourceTree = ""; }; + A102F9379F5A55F3D3C85A1FB3687F97 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Map.swift; sourceTree = ""; }; + A25F673AD7CCCE0189ADEB549EB5F618 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; + A30C48C8ED1D9EC8231B3D871BC285C7 /* GCDWebServerConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerConnection.m; path = GCDWebServer/Core/GCDWebServerConnection.m; sourceTree = ""; }; + A4DAA5324C3F0718C4CC7852CBAC50D0 /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-proxy_conf_helper.release.xcconfig"; sourceTree = ""; }; - A57E4C19B3887697A8F7105471594B11 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; - A7104A53E83466AD81DBF532DBA762E1 /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Implementations/Concat.swift; sourceTree = ""; }; - A7B90D6B38782365F4D874C83ED140A8 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/Implementations/WithLatestFrom.swift; sourceTree = ""; }; - A88DC5BE37CE2B71CAC10B055D989D0D /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSession+Rx.swift"; path = "RxCocoa/Foundation/URLSession+Rx.swift"; sourceTree = ""; }; - AB35CD1ECD0CD3643AE3F5B53C269AF5 /* GCDWebServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServer.m; path = GCDWebServer/Core/GCDWebServer.m; sourceTree = ""; }; - AB8D181B14C53055CA4F2D61166A6C7D /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; - ACEE1641B4A1142BE9D66F1E19A1A083 /* AsyncSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncSubject.swift; path = RxSwift/Subjects/AsyncSubject.swift; sourceTree = ""; }; + A6573695D6E38AB0E45298916E5927F9 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; + A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = ""; }; + A829DA85B827FD4953161E2FC29C0AB4 /* GroupedObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupedObservable.swift; path = RxSwift/GroupedObservable.swift; sourceTree = ""; }; + A923BB8E574DFADCE6DFF91F708E5886 /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+Extensions.swift"; path = "RxSwift/ObservableType+Extensions.swift"; sourceTree = ""; }; + A9826B12E4E987A2B073DA6D32BBA53C /* GCDWebServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServer.m; path = GCDWebServer/Core/GCDWebServer.m; sourceTree = ""; }; + A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.xcconfig; sourceTree = ""; }; + AC8837A9B05156CBBE4A8FECC465034F /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + AD0CD5DD6E42873872D2B73A60081FD0 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Debug.swift; sourceTree = ""; }; + ADD97D49C025DAFE6EE85E866D134966 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; AE6E689502E4366B125481CD898B947E /* Pods-proxy_conf_helper-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-proxy_conf_helper-acknowledgements.plist"; sourceTree = ""; }; - AE7494AFBC1F396F79B1E5BE66FDDFCD /* Observable+Concurrency.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Concurrency.swift"; path = "RxSwift/Observables/Observable+Concurrency.swift"; sourceTree = ""; }; - AF6621583BA40AE9A61D2F58B49462B2 /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = ""; }; - AFA95DC4A3942FDA10B5AF5875F3D960 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = ""; }; + AE7C79F11D25CEDB1D05648901AFF01D /* NSControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSControl+Rx.swift"; path = "RxCocoa/macOS/NSControl+Rx.swift"; sourceTree = ""; }; + AEF8F1346C831D7B8A9AB960E3B768C0 /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; + AF7187DD22E17C86AB22B3969936E90C /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; + B0EC4DF0E84A696168D1071B48A4F7F4 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; B0FC490145F0D2AD9B833C41F78CA818 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B10F73EA14E609E0D648284083AE9228 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = es.lproj; sourceTree = ""; }; - B29423A3BD529F4181880C1CC35631C5 /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = ""; }; - B2E3D4D905C0E79E9AB56BF024A35180 /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Implementations/Scan.swift; sourceTree = ""; }; - B2FB3E4A7941F31C1970E3CC7568BC25 /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Implementations/Sink.swift; sourceTree = ""; }; - B306B418AC914FC9F036591616123AAF /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = de.lproj; sourceTree = ""; }; + B11F51D93DCFD7B0948095E201A09C71 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B16B0EBC2B5BA4309D9844CDE1932B26 /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Throttle.swift; sourceTree = ""; }; + B1AA3C8E05F2C2D813D16D20D9984553 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Using.swift; sourceTree = ""; }; + B2093E2378DE5EC41D64F8387561BF3B /* MASKeyMasks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyMasks.h; path = Framework/MASKeyMasks.h; sourceTree = ""; }; + B23C70F218FD3D53D1E083383A8C8225 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Range.swift; sourceTree = ""; }; + B2EA7252711AF3E4D70DD2035DA71438 /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; B30805F63C611810B322187824EBC4A5 /* Pods-ShadowsocksX-NGTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-resources.sh"; sourceTree = ""; }; - B42525F3404A9781D07CAE62FD5E4918 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Implementations/Timeout.swift; sourceTree = ""; }; - B4A0B1A36A704F964703C9BC39827964 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; - B4AAA88BD8CDEC58F63BB1EABFBFE6EC /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; - B4FB77C479CBE2951C13C488C5CBE57E /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; - B548E9BFF5CF1A650F920B46F2078971 /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+CoreGraphics.swift"; path = "RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift"; sourceTree = ""; }; - B6411B80A4E73D2B05D6D2DC38B39232 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = ""; }; + B362693E8CB87D85D869ECEC9A308631 /* BRLOptionParser-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BRLOptionParser-prefix.pch"; sourceTree = ""; }; + B3F32502ED756288E4F37152D996A3FA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B4C0501500E132C7E97A97A425E68D90 /* SwitchIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchIfEmpty.swift; path = RxSwift/Observables/SwitchIfEmpty.swift; sourceTree = ""; }; + B4D3408600A2042F4070CA97A67C60D5 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; + B57622ECC64CA3D7C8ADDDEA14B176F5 /* PrimitiveSequence+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PrimitiveSequence+Zip+arity.swift"; path = "RxSwift/Traits/PrimitiveSequence+Zip+arity.swift"; sourceTree = ""; }; + B677B77B72CD0E70D2DC5499A6D18B31 /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerStreamedResponse.m; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.m; sourceTree = ""; }; + B6FC4FABF722AF2F518BE654AD7DCE4D /* AsyncSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncSubject.swift; path = RxSwift/Subjects/AsyncSubject.swift; sourceTree = ""; }; + B72677785827D5383DD7933263E069B1 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-prefix.pch"; sourceTree = ""; }; B792280B7BC7CA44B5D7090C8F732A0D /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B90BBC0A33E35F445599411A4755CA2E /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/Implementations/SkipUntil.swift; sourceTree = ""; }; - BA70E613DAD83B8D5F2C1F9DE64ECAC7 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; - BA733FB551621A6A266D57AAB2CEDC2C /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; - BB135DF1279B5FD0AB5683BA019DD0CA /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; - BBCDC9591CE194B7B56FC4194F75DB4E /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/Implementations/DistinctUntilChanged.swift; sourceTree = ""; }; - BCCCC4E79BB0BC425916AD8DE96CA785 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Implementations/Filter.swift; sourceTree = ""; }; - BD8770BF62499E1DA3EDF0659C91CBE4 /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift"; sourceTree = ""; }; - BDCCB04DF57C106193307E90684240A9 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Implementations/Using.swift; sourceTree = ""; }; - BE2FFA6014D5EA973E00B658481C4016 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/Implementations/TakeUntil.swift; sourceTree = ""; }; + B8342F1DDDA13DCD8CF77080A6A16BCC /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ja.lproj; sourceTree = ""; }; + BBB5913EEAFF6831515284D85F9B42AB /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; + BC25AF2EB8052CF4B0A98541C78FA86C /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; + BC5A23A63EA04BBF65EBBC3D5905D453 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = ""; }; + BDE1BDB4BDD14E3E8B8C3F8ED3B3C53A /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = ""; }; BE672B43951C625CA5F89E448A620AB0 /* Pods-ShadowsocksX-NGTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-ShadowsocksX-NGTests.modulemap"; sourceTree = ""; }; - BED1E9CAFD7494BC65249B31B68985C6 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; BF541EB164C2E45EC80ADBE338F2D325 /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BFBCCDD4FB2BFEE4F62E4783156E5C68 /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcut.h; path = Framework/MASShortcut.h; sourceTree = ""; }; - BFD17FB0B8D729EB83B1AA769D30726F /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFunctions.h; path = GCDWebServer/Core/GCDWebServerFunctions.h; sourceTree = ""; }; - C0064AD98E8E57DDFB68577F20E20FAC /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = ""; }; - C06C7EB1ACC794EDA28251B83A3D8922 /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hant.lproj"; sourceTree = ""; }; - C0969FFD491CA3150D85C991F9D642BA /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; - C1714F14E43A69F77960977683265141 /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+arity.swift"; sourceTree = ""; }; - C1A4207D9981121566B1401ED299ECB8 /* SwitchIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchIfEmpty.swift; path = RxSwift/Observables/Implementations/SwitchIfEmpty.swift; sourceTree = ""; }; - C22C8CFBFCA98BD54BABA13BDA83B12F /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Foundation/NSObject+Rx.swift"; sourceTree = ""; }; - C2F0513828D310E221B920200A0AF8B9 /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcut.m; path = Framework/MASShortcut.m; sourceTree = ""; }; - C32CA98BF3892E9768040A5EE4DCCCD2 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = nl.lproj; sourceTree = ""; }; - C32DA9D913B14198C262DA3670259B16 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; - C439FB2A46E79FAB7443860DB9209DED /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; - C524B1525327F67736740D5488CEAFD6 /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/Implementations/ElementAt.swift; sourceTree = ""; }; - C5A524C4B1015097B4130310EBF6D6B0 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerResponse.m; path = GCDWebServer/Core/GCDWebServerResponse.m; sourceTree = ""; }; - C5B2560C6A7D9250831A76E33D926588 /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; - C6CF6A88B14EECBA592B26FDE26199CA /* MASShortcutValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutValidator.h; path = Framework/MASShortcutValidator.h; sourceTree = ""; }; - C74A3DC1AECDEFEFB44AB3F60FFDDC33 /* GCDWebServerResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerResponse.h; path = GCDWebServer/Core/GCDWebServerResponse.h; sourceTree = ""; }; + C0D57732901E7827AB4442A3185E7287 /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/DistinctUntilChanged.swift; sourceTree = ""; }; + C163E270D8C0282204B45FA92F52546F /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + C1F68587D16CABA9C7433492E59AB224 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; + C45B38DD11A907BC6F5B45FBB0A35B0C /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = ""; }; + C6E4C64CF7155899BC2A74A24FB7513F /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Producer.swift; sourceTree = ""; }; C760BAF596F45988BF95E5D3C10BA670 /* libBRLOptionParser.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBRLOptionParser.a; sourceTree = BUILT_PRODUCTS_DIR; }; - CB9BC8FFFB6D237A0A82BB90707A89FA /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Units/PrimitiveSequence.swift; sourceTree = ""; }; - CC318351A8A11C1C21A0A22107B2C46B /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/CocoaUnits/Driver/Driver.swift; sourceTree = ""; }; - CC674E9D1A6B6D72CE70D5CC2FD43735 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Implementations/Debug.swift; sourceTree = ""; }; - CD39D59D26656AE80FD3F9C683849740 /* PrimitiveSequence+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PrimitiveSequence+Zip+arity.swift"; path = "RxSwift/Units/PrimitiveSequence+Zip+arity.swift"; sourceTree = ""; }; - CDC25BCC601EFEC02F400739EAD16FDE /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; - CDD891211BCACC371F9D43363C3FD01F /* MASDictionaryTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASDictionaryTransformer.h; path = Framework/MASDictionaryTransformer.h; sourceTree = ""; }; - CDFACEE80381FE2B4BC6E4FE88D93A85 /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; + C8C4EEF5D5723B94ADD7BCE012A2C6E7 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; + C8E1C61760F4B2BFEC652B9A01D4F846 /* MASShortcutView+Bindings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MASShortcutView+Bindings.m"; path = "Framework/MASShortcutView+Bindings.m"; sourceTree = ""; }; + C952CFCB4CF5FD55CFE8949FD41C9460 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileRequest.h; path = GCDWebServer/Requests/GCDWebServerFileRequest.h; sourceTree = ""; }; + C9DE8782EF7863C69F019CB969C665C2 /* Create.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Create.swift; path = RxSwift/Observables/Create.swift; sourceTree = ""; }; + CAFB8EBD43A17F895E88B967D4BA489A /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/ElementAt.swift; sourceTree = ""; }; + CB2D9630B47A5E202FF1CFB831ACACDE /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/DefaultIfEmpty.swift; sourceTree = ""; }; + CD3F084299BD99D03F6B8FC8783B3AE8 /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerMultiPartFormRequest.m; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m; sourceTree = ""; }; + CD4154ED163C40AFD6A2FCB49EE532DC /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; + CE411A2DEA5A7FCC657E6AE76503E34C /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-proxy_conf_helper-dummy.m"; sourceTree = ""; }; - CEDE61F66A8638FA807B3FD84A14A57E /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift"; sourceTree = ""; }; - CF3DCBD1B087248FA6482FA144CDBCD3 /* MASShortcut.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MASShortcut.modulemap; sourceTree = ""; }; D0531FFA0D5305257F668D1D12A1411F /* Pods_ShadowsocksX_NGTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D06609DFEDC0A7E3A67145994809FAAB /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Implementations/Amb.swift; sourceTree = ""; }; - D12B3B0AB6BBE5692CC30020ED890E6C /* MASShortcutValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutValidator.m; path = Framework/MASShortcutValidator.m; sourceTree = ""; }; - D14826507A4DA27653782BD16CF7B1A4 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; - D1F45AC654673C96B25C288CE2ED7757 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; - D2654F715A28779785D3AD91F2ED2388 /* GroupedObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupedObservable.swift; path = RxSwift/GroupedObservable.swift; sourceTree = ""; }; - D34A2C6821DD92D46F0901C579DAEF53 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; - D38D66B8CF136FA1B9D3A067600536AE /* MASKeyCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyCodes.h; path = Framework/MASKeyCodes.h; sourceTree = ""; }; - D3A7C466E29109C01509C4619554BB05 /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; - D402F8A4734F5C848DA2287CD48E6202 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; - D4CD8E837A63DA5890EF98BA6E98D9D5 /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; - D6CBB4BD325445F86290A6A3E27E8B45 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + D184A55F942880B696653A33913ECF93 /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = ""; }; + D1C4C6CEAFF5B39F833B3836EAAEC96C /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileRequest.m; path = GCDWebServer/Requests/GCDWebServerFileRequest.m; sourceTree = ""; }; + D3AEFA8AAF6328813FEC6D38028EF063 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; + D4632B46CC78EF8030FEB67D2D7C92DE /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Reduce.swift; sourceTree = ""; }; + D6FA3B372E3D1861300774D9CACD4C15 /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NGTests-umbrella.h"; sourceTree = ""; }; - D83C9C9C216CD46EAD7B39EB3A0A703C /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; - D85F519585040CC0D398A38AA0930EC4 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Implementations/Just.swift; sourceTree = ""; }; - DA80549D390412FB66E8ADB1475C39D2 /* Observable+StandardSequenceOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+StandardSequenceOperators.swift"; path = "RxSwift/Observables/Observable+StandardSequenceOperators.swift"; sourceTree = ""; }; - DAAD2858D71A42847A49EE0FC347E9FB /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; - DAF4B22EF3D343BEF33D2881F14213DF /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; - DB6A96F3AD4E1A22FFED4E6F0A4D1ECD /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+Collection.swift"; path = "RxSwift/Observables/Implementations/Zip+Collection.swift"; sourceTree = ""; }; - DB83C3266870BCD77C80A5BF5F71BFE0 /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerURLEncodedFormRequest.h; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h; sourceTree = ""; }; + D82A11977CDF4CBC2948546163A27853 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; + D8AAFB037FDFF7437E3006151BA5FE9B /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; + D998C21F60B248C532A1ED016B5074E7 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = cs.lproj; sourceTree = ""; }; + D9EBA3D67FF4AF63397A5FB0F6CF1B5F /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = ""; }; + DA02D299CE44B023D9B4909ED0B34FCC /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; + DAD59D3D739C07FCB2F892826F951063 /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Amb.swift; sourceTree = ""; }; DC250BF8313F337272DBC9DE1FB6DB6B /* Pods-ShadowsocksX-NG.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-ShadowsocksX-NG.modulemap"; sourceTree = ""; }; - DC7FD09C09D1BDD8476A89AA647DAF8C /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxSwift/Deprecated.swift; sourceTree = ""; }; - DE1C155D92F36B81A10B04D3AECC44DE /* MASHotKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASHotKey.h; path = Framework/MASHotKey.h; sourceTree = ""; }; - DEA3B8F9A25C60DBAD70F2E3BA7DEC79 /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; - DF0D4DE6D3365036C0FA32D93DE77D46 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerMultiPartFormRequest.h; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h; sourceTree = ""; }; - DF2C9231D3FFC3BBC92AD47C894E1F5D /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = ""; }; - DF51438B3E3A777BFCF7D021F49B4043 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = ""; }; - DFAE13F86521FDD3838D3DA229D4AC25 /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; + DCD30248F27B4938679C37883BDD134A /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = en.lproj; sourceTree = ""; }; + DCF0DD57FB4E2DED2BA043D232A8F3E9 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; + DD8C09387A31AC5BF4B190F880F4883D /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; E0CF346DBA2C8BDB54C4D65E01BE83B4 /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-proxy_conf_helper.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E149E56489936102F081551F32C5F5EB /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Implementations/Reduce.swift; sourceTree = ""; }; E15756B54614ACA75251861D700E1946 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E32C96F7FC2C415654F4C0F1231FA3E4 /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-prefix.pch"; sourceTree = ""; }; - E49FDA3188916AD3090FCBD300783D02 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCDWebServer.modulemap; sourceTree = ""; }; - E4B98A26D58EDEECA20933684CC1C45F /* MASShortcutMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutMonitor.h; path = Framework/MASShortcutMonitor.h; sourceTree = ""; }; - E7CAE213EE8F8ECB17980C4BF269D35A /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; - E7DE4B15A2C7B806D42D1BC1189CFC19 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; - E85ED0518085EBD804CA390B52EDDFE5 /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerErrorResponse.m; path = GCDWebServer/Responses/GCDWebServerErrorResponse.m; sourceTree = ""; }; + E1C50ACDF517D102DEC7195257ADFE7B /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Sink.swift; sourceTree = ""; }; + E1E128ED33CF5ECBE9E08D07D4B7672D /* MASLocalization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLocalization.m; path = Framework/MASLocalization.m; sourceTree = ""; }; + E1E8E56BD7B85F3AF4B5FE7AF03AAEE8 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = ""; }; + E2946829864608D127EB046EF8BAA69D /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; + E3637E3CB5915225EA71EFF6B20D7171 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; + E366C7D398E704625CF7481FD8243D48 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/CombineLatest.swift; sourceTree = ""; }; + E3EFB1E8AA462C2C937015579F139C13 /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; + E4EC11834E14E9B2C39B5615DA787A71 /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hant.lproj"; sourceTree = ""; }; + E515CE44A5FFCE8293899BD5AF596B7A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E58A2330CC4D40F78DD08B5A8500F8BF /* AsMaybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsMaybe.swift; path = RxSwift/Observables/AsMaybe.swift; sourceTree = ""; }; + E5B859D5878DCF98B3D01C2C0615A78C /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerPrivate.h; path = GCDWebServer/Core/GCDWebServerPrivate.h; sourceTree = ""; }; + E5C53D1D9FD46ACD15E6C5381BD7A754 /* MASShortcutValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutValidator.h; path = Framework/MASShortcutValidator.h; sourceTree = ""; }; + E67F34DCD8ADF524683B1FDA27AA87D4 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; + E6B7FB2F3741600EA98ED059FA99D203 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; + E707C81E7EB04DBC63A2429C29DABDA4 /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/Traits/SharedSequence/SharedSequence.swift; sourceTree = ""; }; + E88567B756C3B048C0FE65824DF88BF5 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; + E8D80F3DDE713A93804F0B81C53471BB /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = ""; }; + E969B8C71DA98B913BC86FD4AC5574BD /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Window.swift; sourceTree = ""; }; + E9DD9AF410C94A598B2DE06E014C5DF0 /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFunctions.h; path = GCDWebServer/Core/GCDWebServerFunctions.h; sourceTree = ""; }; + E9DE035DC4CC0F7DB299802037814F5E /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; EA41BEE3B4D9F1A89F0135CA91A7F472 /* Pods-ShadowsocksX-NG-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-resources.sh"; sourceTree = ""; }; EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; - EB76A421976FAB6ECBC3D127F6A77FC9 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Implementations/Empty.swift; sourceTree = ""; }; - EB8FD0BE80EE67981541A1D0567EDF2A /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; - EC77664C6DB0A9CA9F4AC1E93463971A /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Implementations/Catch.swift; sourceTree = ""; }; - ED29315833FAA1E5A338CFA8005377A9 /* Observable+Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Single.swift"; path = "RxSwift/Observables/Observable+Single.swift"; sourceTree = ""; }; - EEA9F8AE14D36C1EDC66F1C167C4146D /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+Rx.swift"; path = "RxCocoa/Common/NSLayoutConstraint+Rx.swift"; sourceTree = ""; }; - EFC679B790AD9EE3F36E8291BBECFF33 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.xcconfig; sourceTree = ""; }; + EB6C8C0D1FA8537542033F55E1556F6C /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+Collection.swift"; path = "RxSwift/Observables/Zip+Collection.swift"; sourceTree = ""; }; + EBBFBC78787B38998069A1A51FB6277B /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = ""; }; + EBF94F2FA57AC086015ECB43EABA8CE0 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = ""; }; + EF81F74434BA7B8FAE460E710314428D /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxCocoa/Deprecated.swift; sourceTree = ""; }; EFD468F10CD22B3EFAB406DAC3FCC7C9 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = DEVELOPER_DIR; }; - EFDF2D18587604D407F5C9C506D4018D /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; - F1AE55DF48B45CC65465B461F51CA3EA /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Implementations/Window.swift; sourceTree = ""; }; - F2B98DC1F57C36B412E2E662A8170642 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; - F3BEA0E59DC8EE162D7707F0458BC410 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + EFF880C34F99282A87D40EEB06740D80 /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Traits/Driver/Driver.swift; sourceTree = ""; }; + F0581044A5A088C077656011651C2465 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Empty.swift; sourceTree = ""; }; + F2B901654D7B257777782F6F00162843 /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Timer.swift; sourceTree = ""; }; + F308400B0F508083F4F2C54D3F787C5E /* GCDWebServerConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerConnection.h; path = GCDWebServer/Core/GCDWebServerConnection.h; sourceTree = ""; }; + F316CF662715DAF0DC0D4AB967AD6709 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlProperty+Driver.swift"; path = "RxCocoa/Traits/Driver/ControlProperty+Driver.swift"; sourceTree = ""; }; + F3C425613054D6B8A7DFF96BE0698489 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = es.lproj; sourceTree = ""; }; + F3FE3FD846A162F26A05D064DE8B7C21 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = ""; }; + F452BDEBCDC82858ADCB26071AA4E12D /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + F4E647FF308219F6F10EF468CFD459D1 /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcut.h; path = Framework/MASShortcut.h; sourceTree = ""; }; + F546C188C97659BE86FA0E06FB1674BB /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/DelaySubscription.swift; sourceTree = ""; }; + F552E19724BF0CC37D66E1D5DA273720 /* MASShortcut-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-umbrella.h"; sourceTree = ""; }; + F656339EB8909181989F80623859B35C /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataRequest.m; path = GCDWebServer/Requests/GCDWebServerDataRequest.m; sourceTree = ""; }; F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.release.xcconfig"; sourceTree = ""; }; - F684374BB1F33C4CA323178463EB2028 /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = ""; }; - F6A1E5B8450A97482BAF559588B3DD71 /* ConnectableObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservable.swift; path = RxSwift/Observables/Implementations/ConnectableObservable.swift; sourceTree = ""; }; - F72515DA7F790ADA9DF78910C67193DB /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; - F7519EEDC18867A7D4354752DF4FFB06 /* NSImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSImageView+Rx.swift"; path = "RxCocoa/macOS/NSImageView+Rx.swift"; sourceTree = ""; }; - F786CE1FD64B7570C24F231E23D7566A /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; - F88F573DA82E488BDAE8BC55E93B96B1 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; - F8EA91701D31DC73ED6AA21F7AD637B2 /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = ""; }; - F91767E7613F8479E6F65DDF39CDB558 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlProperty+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift"; sourceTree = ""; }; - F9A79C0537300E8EC3B4938AE3FCCE88 /* MASShortcutView+Bindings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MASShortcutView+Bindings.m"; path = "Framework/MASShortcutView+Bindings.m"; sourceTree = ""; }; - F9ABBB68077D7AD074DFC9923895B5D6 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Implementations/Switch.swift; sourceTree = ""; }; - FAFB76E73828C3673CEC60577DD3D7F0 /* GCDWebServerConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerConnection.h; path = GCDWebServer/Core/GCDWebServerConnection.h; sourceTree = ""; }; + F8169698EDB7D60F459C13552F619848 /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Debounce.swift; sourceTree = ""; }; + F9164999952F9F74D2945D92DD778C19 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerHTTPStatusCodes.h; path = GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h; sourceTree = ""; }; + FA95194E204F208C75DB1F2E683163B8 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Bag+Rx.swift"; path = "RxSwift/Extensions/Bag+Rx.swift"; sourceTree = ""; }; FBAF339F33C80576683D76394CA51047 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FCBF6FFFBBE49493E089992E786E1A20 /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; - FD0EA79B1967F9A248BD807632BC9C79 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataResponse.h; path = GCDWebServer/Responses/GCDWebServerDataResponse.h; sourceTree = ""; }; + FC1E04FFC51E6E05C344477E8DDB777E /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = ""; }; + FC3F16342AABB95F2FB9FC98E52CF43E /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataResponse.m; path = GCDWebServer/Responses/GCDWebServerDataResponse.m; sourceTree = ""; }; + FCD773B3B520BDB18A9BB4B403F9DC27 /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerErrorResponse.h; path = GCDWebServer/Responses/GCDWebServerErrorResponse.h; sourceTree = ""; }; + FD0A0C898D69E818B6F386B2CBA9012F /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerURLEncodedFormRequest.h; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h; sourceTree = ""; }; + FE7CDCDB0682EC04C12DD552E4910CE5 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; + FF074D96FBC0786D113FA8954363F7EF /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataRequest.h; path = GCDWebServer/Requests/GCDWebServerDataRequest.h; sourceTree = ""; }; + FF9B0B9971EBD4F210054B63F172C41E /* MASShortcutBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutBinder.h; path = Framework/MASShortcutBinder.h; sourceTree = ""; }; + FFBD01DC827B96A71DBE4FF69755B797 /* NotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NotificationCenter+Rx.swift"; path = "RxCocoa/Foundation/NotificationCenter+Rx.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -851,80 +833,39 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 02CDF8BDA510DD82276AE66867F81915 /* Support Files */ = { + 00A280D4C78AFD320A4205C6BF2884BE /* Core */ = { isa = PBXGroup; children = ( - 797084A009F9EF151DBBF73DD026ADC6 /* BRLOptionParser.xcconfig */, - 62543C716FC9EBEA1CAC093AD57E93FD /* BRLOptionParser-dummy.m */, - 5FA15EB50AC1F6D3A499615FF5B6A824 /* BRLOptionParser-prefix.pch */, + 2738692BF965EDDE0CDA5B4D08899095 /* GCDWebServer.h */, + A9826B12E4E987A2B073DA6D32BBA53C /* GCDWebServer.m */, + F308400B0F508083F4F2C54D3F787C5E /* GCDWebServerConnection.h */, + A30C48C8ED1D9EC8231B3D871BC285C7 /* GCDWebServerConnection.m */, + FF074D96FBC0786D113FA8954363F7EF /* GCDWebServerDataRequest.h */, + F656339EB8909181989F80623859B35C /* GCDWebServerDataRequest.m */, + 3A338EA0CA1FE047514C4AE30D1EC601 /* GCDWebServerDataResponse.h */, + FC3F16342AABB95F2FB9FC98E52CF43E /* GCDWebServerDataResponse.m */, + FCD773B3B520BDB18A9BB4B403F9DC27 /* GCDWebServerErrorResponse.h */, + 572BE12282110872C7D8E7EF29A5033C /* GCDWebServerErrorResponse.m */, + C952CFCB4CF5FD55CFE8949FD41C9460 /* GCDWebServerFileRequest.h */, + D1C4C6CEAFF5B39F833B3836EAAEC96C /* GCDWebServerFileRequest.m */, + 09187F1FBD16DDE0A198691271E6D322 /* GCDWebServerFileResponse.h */, + 0F5B2D680B55A87168B90861D051B746 /* GCDWebServerFileResponse.m */, + E9DD9AF410C94A598B2DE06E014C5DF0 /* GCDWebServerFunctions.h */, + 0FB611A2D6465F53874DE91ED2D760BF /* GCDWebServerFunctions.m */, + F9164999952F9F74D2945D92DD778C19 /* GCDWebServerHTTPStatusCodes.h */, + 00CECA213B3AA462DCD88A69F686C862 /* GCDWebServerMultiPartFormRequest.h */, + CD3F084299BD99D03F6B8FC8783B3AE8 /* GCDWebServerMultiPartFormRequest.m */, + E5B859D5878DCF98B3D01C2C0615A78C /* GCDWebServerPrivate.h */, + 58CB4D7A6C8CB1B887645BE2595AFC0E /* GCDWebServerRequest.h */, + 22EE8CE9A144E74E024FCD831B543700 /* GCDWebServerRequest.m */, + 6B432AF0284AA5FB0D45EED8A72A6B1A /* GCDWebServerResponse.h */, + 72B8CEB9D05921D08AA078AE17F53770 /* GCDWebServerResponse.m */, + 5222FC0287904A0C1050B9B01E9712F8 /* GCDWebServerStreamedResponse.h */, + B677B77B72CD0E70D2DC5499A6D18B31 /* GCDWebServerStreamedResponse.m */, + FD0A0C898D69E818B6F386B2CBA9012F /* GCDWebServerURLEncodedFormRequest.h */, + 7D03BE981ABF583B8C0A9733FC4E7758 /* GCDWebServerURLEncodedFormRequest.m */, ); - name = "Support Files"; - path = "../Target Support Files/BRLOptionParser"; - sourceTree = ""; - }; - 05DB2D724616BA9442057EBD83308168 /* RxCocoa */ = { - isa = PBXGroup; - children = ( - C0064AD98E8E57DDFB68577F20E20FAC /* _RX.h */, - 42677271ADFD7C38E4A2D9A129A60105 /* _RX.m */, - 1407079A40EB921E4490FEA9DDB23222 /* _RXDelegateProxy.h */, - 0EED0973795941F05F42B25E0C0F6D99 /* _RXDelegateProxy.m */, - 6CBFE7DED568FC1C077023212FEEA6C4 /* _RXKVOObserver.h */, - 7E8FD5D8A77584D71B37963D270CBAE2 /* _RXKVOObserver.m */, - B6411B80A4E73D2B05D6D2DC38B39232 /* _RXObjCRuntime.h */, - 37276F2D8D3AED22ABF63827FF4C2E1D /* _RXObjCRuntime.m */, - 2EBB434DC5BFF77FC3F8C0215BDFC40F /* Bag.swift */, - 59AAA65A3B3DF93288B9973C7991DA37 /* ControlEvent.swift */, - CEDE61F66A8638FA807B3FD84A14A57E /* ControlEvent+Driver.swift */, - 99EFFE07C47D5D98611714C066D640BC /* ControlProperty.swift */, - F91767E7613F8479E6F65DDF39CDB558 /* ControlProperty+Driver.swift */, - 3C59EAD8143A508A0231627DD42D5C23 /* ControlTarget.swift */, - 8B0382153B0EC132C2BECD3DCB1193B6 /* DelegateProxy.swift */, - 2DED940C0868591ED86659234813AF5B /* DelegateProxyType.swift */, - EB8FD0BE80EE67981541A1D0567EDF2A /* DispatchQueue+Extensions.swift */, - CC318351A8A11C1C21A0A22107B2C46B /* Driver.swift */, - 3690656BBFBCA6B31887844429A9D961 /* Driver+Subscription.swift */, - F2B98DC1F57C36B412E2E662A8170642 /* InfiniteSequence.swift */, - DF51438B3E3A777BFCF7D021F49B4043 /* KVORepresentable.swift */, - B548E9BFF5CF1A650F920B46F2078971 /* KVORepresentable+CoreGraphics.swift */, - 828EB8509B88B335C1D7D0C2B3D7D895 /* KVORepresentable+Swift.swift */, - AFA95DC4A3942FDA10B5AF5875F3D960 /* Logging.swift */, - 717C5EDEA19D4107A1C3112D049EBB9C /* NotificationCenter+Rx.swift */, - 2C4F41A96AB13FAA06EB576B1286FD61 /* NSButton+Rx.swift */, - 0BE0BBDCBD8F691F0357C2BFD2A61DF7 /* NSControl+Rx.swift */, - F7519EEDC18867A7D4354752DF4FFB06 /* NSImageView+Rx.swift */, - EEA9F8AE14D36C1EDC66F1C167C4146D /* NSLayoutConstraint+Rx.swift */, - C22C8CFBFCA98BD54BABA13BDA83B12F /* NSObject+Rx.swift */, - 57D2E434BDBDBAFB4EAB539971677BB3 /* NSObject+Rx+KVORepresentable.swift */, - 9D934D4D41993FB7CED17EF07D57ED0C /* NSObject+Rx+RawRepresentable.swift */, - 9BA7C38118F80CD261A2C1877652FBAE /* NSSlider+Rx.swift */, - 088BD130A0FBEAEA4D9FDAE864B58DC7 /* NSTextField+Rx.swift */, - 96A99E648BA7AA9728B58FA257DAAB8E /* NSView+Rx.swift */, - 0D3C195DE57AB12AEADA0C216773CC29 /* Observable+Bind.swift */, - BD8770BF62499E1DA3EDF0659C91CBE4 /* ObservableConvertibleType+Driver.swift */, - 6CE6F293A7A5280E8364DA3F1C0B4B1B /* ObservableConvertibleType+SharedSequence.swift */, - 94F74323508484A216D1C8AECF3B836C /* Platform.Darwin.swift */, - 58CB8D564AB01DBEED55DBEB75380239 /* Platform.Linux.swift */, - 1344965A836EE2DFFA93D27044532B30 /* PriorityQueue.swift */, - 9E5961CAA9976325C800898EBC9E0C8A /* Queue.swift */, - 911BAB036265D98689D411112E34B452 /* RecursiveLock.swift */, - 8865ABAF07DEA295CE14F00DEB443C41 /* RxCocoa.h */, - F684374BB1F33C4CA323178463EB2028 /* RxCocoa.swift */, - 9761A45C8B106617BE144782B56D8C8C /* RxCocoaObjCRuntimeError+Extensions.swift */, - F8EA91701D31DC73ED6AA21F7AD637B2 /* RxCocoaRuntime.h */, - BA70E613DAD83B8D5F2C1F9DE64ECAC7 /* RxTarget.swift */, - DF2C9231D3FFC3BBC92AD47C894E1F5D /* SectionedViewDataSourceType.swift */, - 89BD8062B3919962E8EFBC3E6DBA8537 /* SharedSequence.swift */, - 9DC1F4EFF87C0AA04AFAB87CB07ACFC2 /* SharedSequence+Operators.swift */, - 1B81A53E7BA7B919692592FBAEB2C093 /* SharedSequence+Operators+arity.swift */, - 5D803CC81BFCD9AE0F09CC693CCD4993 /* TextInput.swift */, - 51D83FA8652F1FBA030AB17ED7FE6A3C /* UIBindingObserver.swift */, - A88DC5BE37CE2B71CAC10B055D989D0D /* URLSession+Rx.swift */, - 5EFC56330DB909884DFCFFEE79C788F2 /* Variable+Driver.swift */, - 2E934534DD61AA5D52BB8BD519A53726 /* Variable+SharedSequence.swift */, - A6D905C92591DD3CC9A5586DC4788A47 /* Support Files */, - ); - path = RxCocoa; + name = Core; sourceTree = ""; }; 07568FCBBF071BD2EE0E5EBA001A4712 /* Pods-ShadowsocksX-NGTests */ = { @@ -945,66 +886,117 @@ path = "Target Support Files/Pods-ShadowsocksX-NGTests"; sourceTree = ""; }; - 2D7BA557F4C0940A77FFB9270557294B /* Support Files */ = { + 28F32049EBD3188D559CD7D71D5BE9BE /* RxCocoa */ = { isa = PBXGroup; children = ( - 96B9E4E997A45EC8F7F95390DF683EA4 /* Info.plist */, - CF3DCBD1B087248FA6482FA144CDBCD3 /* MASShortcut.modulemap */, - 6F8C5EB810D1464D5BE86A414DC08616 /* MASShortcut.xcconfig */, - 999B20A513A4091BA573B86714915DD0 /* MASShortcut-dummy.m */, - 045B604CBC573827216DD575F3C9A9BE /* MASShortcut-prefix.pch */, - 8F1D6D87906CF7A06C84F16A89701364 /* MASShortcut-umbrella.h */, - 8E68586EDAB1716AE8A9303B3149E642 /* ResourceBundle-MASShortcut-Info.plist */, + 2FFA998983771BA589140ED254CFBD48 /* _RX.h */, + EBBFBC78787B38998069A1A51FB6277B /* _RX.m */, + D9EBA3D67FF4AF63397A5FB0F6CF1B5F /* _RXDelegateProxy.h */, + 72FDEB0BDDFCA5B67411693DCA3BAB36 /* _RXDelegateProxy.m */, + 9B31A4E3C1E226E2FB724AB96C882B5A /* _RXKVOObserver.h */, + FC1E04FFC51E6E05C344477E8DDB777E /* _RXKVOObserver.m */, + E8D80F3DDE713A93804F0B81C53471BB /* _RXObjCRuntime.h */, + 986B511A99FF2CD40FF4907FE5DBAD8F /* _RXObjCRuntime.m */, + 4B3925E8418FB15723527909346442D9 /* Bag.swift */, + 0D9D5A3377EF4CDADE4D80FC29C1F20E /* ControlEvent.swift */, + 22D55ADD097A4317EEBBEAC8CA5D2328 /* ControlEvent+Driver.swift */, + 255132D91D9485882D3509D158D686F2 /* ControlProperty.swift */, + F316CF662715DAF0DC0D4AB967AD6709 /* ControlProperty+Driver.swift */, + 0C165CADEE8873C8F5D15A02BF1AF555 /* ControlTarget.swift */, + EBF94F2FA57AC086015ECB43EABA8CE0 /* DelegateProxy.swift */, + 863E188823EC0A70B5265256ECE53AA4 /* DelegateProxyType.swift */, + EF81F74434BA7B8FAE460E710314428D /* Deprecated.swift */, + 5FC9E4C5BE139DEDCF232F464EEE5F9A /* DispatchQueue+Extensions.swift */, + EFF880C34F99282A87D40EEB06740D80 /* Driver.swift */, + 30FAB42EC783B04EAEDCA833EB48269E /* Driver+Subscription.swift */, + E9DE035DC4CC0F7DB299802037814F5E /* InfiniteSequence.swift */, + 4FF0A1029048B0747EEF9A0E552FE307 /* KVORepresentable.swift */, + 261420BDDFD507E93CA5EEE0286F0D2B /* KVORepresentable+CoreGraphics.swift */, + 7A20F2D6B7A2D475A3BEF0CAFE123400 /* KVORepresentable+Swift.swift */, + E1E8E56BD7B85F3AF4B5FE7AF03AAEE8 /* Logging.swift */, + FFBD01DC827B96A71DBE4FF69755B797 /* NotificationCenter+Rx.swift */, + 0FD7A0DC3ED806805A328B6E3183B3DD /* NSButton+Rx.swift */, + AE7C79F11D25CEDB1D05648901AFF01D /* NSControl+Rx.swift */, + 23A34F10DBCE77625288E96057F56456 /* NSImageView+Rx.swift */, + 1C3FED0A19AFEE0E97C077B535ABB44E /* NSLayoutConstraint+Rx.swift */, + 901EFAF9E76AF0F9D3DBC7CE6212D4B8 /* NSObject+Rx.swift */, + 5945D007DC7A2B629B8E5987E6184267 /* NSObject+Rx+KVORepresentable.swift */, + 1A1567F5FA8FE7F8CB94FF8182AFE361 /* NSObject+Rx+RawRepresentable.swift */, + 2F67068FE91E63222D2D32C4BB3BBCBD /* NSSlider+Rx.swift */, + 346BBFB5B79A5139190296845F41C8DE /* NSTextField+Rx.swift */, + 9352AFD1D6C6B57A9AF36DD5277BB196 /* NSView+Rx.swift */, + 2CC9430D7E7FB49F1A03FD83C0F15DF0 /* Observable+Bind.swift */, + 8209A41698505C3145781FDD26E699EE /* ObservableConvertibleType+Driver.swift */, + 728798194C8FC2BA7D507A14593C9C6F /* ObservableConvertibleType+SharedSequence.swift */, + C1F68587D16CABA9C7433492E59AB224 /* Platform.Darwin.swift */, + 09C2A8F904CF4DBCBEF9D102DBD74AFD /* Platform.Linux.swift */, + 6180F60B96D97B62E15F102AA5722741 /* PriorityQueue.swift */, + 9B539B1FEB1247454F06F69690A74881 /* Queue.swift */, + 881AB2BAED9DBD8D39A04DCCFD4A871B /* RecursiveLock.swift */, + 533BCDFF477A8BB66A84035182761408 /* RxCocoa.h */, + 9487D19A313750E8B3F0DDB32B87E864 /* RxCocoa.swift */, + 5B6B335F7D4B0FC8875810068B493F55 /* RxCocoaObjCRuntimeError+Extensions.swift */, + D184A55F942880B696653A33913ECF93 /* RxCocoaRuntime.h */, + E67F34DCD8ADF524683B1FDA27AA87D4 /* RxTarget.swift */, + 82B6A945EDCE3039C33A744E0206424D /* SectionedViewDataSourceType.swift */, + E707C81E7EB04DBC63A2429C29DABDA4 /* SharedSequence.swift */, + 1F9FB942372907FC74EEC9507F4F190D /* SharedSequence+Operators.swift */, + 606D277095EEA4BF6FEB8D9270E15542 /* SharedSequence+Operators+arity.swift */, + 9480F95CFFC2D8DA4D91AE587BFF20B8 /* TextInput.swift */, + 788FB43AEDD6D9FD2ECBD95EAC8A97E5 /* UIBindingObserver.swift */, + 02D69B5B9B62BE6A7900C1039EFEA2BC /* URLSession+Rx.swift */, + A040CC73BFCA8B9320CEF555F949D711 /* Variable+Driver.swift */, + 7206D6A8DAD7ADCD7E85D9D080C6BACB /* Variable+SharedSequence.swift */, + FAE79CDC2C7965FFEF8DC80E6B817A6B /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/MASShortcut"; + path = RxCocoa; sourceTree = ""; }; - 359D3CBF032E922C6E0EBD419E5611A5 /* Pods */ = { + 4F38A79FE026B54D13A4ADE87802BA23 /* Resources */ = { isa = PBXGroup; children = ( - 9712645556A969816EEB46A364368C74 /* Alamofire */, - BD838F4740449375D7768E6248698B27 /* BRLOptionParser */, - E5268B6C8C971560742CEF27BB088DED /* GCDWebServer */, - AD089A2216580815F93912EDB4FEDE85 /* MASShortcut */, - 05DB2D724616BA9442057EBD83308168 /* RxCocoa */, - 9DF9AD84022C72252E16F01DF14949E2 /* RxSwift */, + D998C21F60B248C532A1ED016B5074E7 /* cs.lproj */, + 200EE4899584F5D5767A63F4E7E1A627 /* de.lproj */, + DCD30248F27B4938679C37883BDD134A /* en.lproj */, + F3C425613054D6B8A7DFF96BE0698489 /* es.lproj */, + 5603B5E9D6CFF759B07667A13C90112C /* fr.lproj */, + 48930EE93B15635DB1DC641A949AB58E /* it.lproj */, + B8342F1DDDA13DCD8CF77080A6A16BCC /* ja.lproj */, + 2255320841E837341A064E1387C85F85 /* ko.lproj */, + 7EE2EE9316F755CDB7B2D29A98063559 /* nl.lproj */, + 6786640F8B195A8E8E18BE5034B98BDD /* pl.lproj */, + 3CD46935CE54DAD2A7350CB2E4DB048C /* ru.lproj */, + 8700E99248E4432CC4DC446DE4A91E41 /* zh-Hans.lproj */, + E4EC11834E14E9B2C39B5615DA787A71 /* zh-Hant.lproj */, ); - name = Pods; + name = Resources; sourceTree = ""; }; - 4047D8E4A66663BBA78A370A91AE7F79 /* Resources */ = { + 5739D868472AD947DBFB4A27A0D08D8B /* Pods */ = { isa = PBXGroup; children = ( - 5048979CBD31FB3468F7CBE0F6623336 /* cs.lproj */, - B306B418AC914FC9F036591616123AAF /* de.lproj */, - 967C15B6D2FAA4BA22B657F647B6B412 /* en.lproj */, - B10F73EA14E609E0D648284083AE9228 /* es.lproj */, - 8EDBB56EE738F917614C08B706C06291 /* fr.lproj */, - 2C391D236625ECDDDADDF2E2CF327C90 /* it.lproj */, - 76BDABDC97B3B4B0598FB6DF3966C3EA /* ja.lproj */, - 9C1DEE1416BA8E32A4D01FC91692DDA2 /* ko.lproj */, - C32CA98BF3892E9768040A5EE4DCCCD2 /* nl.lproj */, - 5151ABAABBD1A1CE800C52AB2A585634 /* pl.lproj */, - 15FDCB75F28FF0766B21B59543A5AFED /* ru.lproj */, - 0444897C0A30423DE512BC301413EBC3 /* zh-Hans.lproj */, - C06C7EB1ACC794EDA28251B83A3D8922 /* zh-Hant.lproj */, + B17E9640A1D4A8265ADA3D9996A2F88A /* Alamofire */, + ECCA55967A058AAF061006AC31FD7B9D /* BRLOptionParser */, + FD9B6873D4081C5CCEF69576498728B2 /* GCDWebServer */, + F2148EAFEC18D957377DC614F758C944 /* MASShortcut */, + 28F32049EBD3188D559CD7D71D5BE9BE /* RxCocoa */, + D39D89B6092E13E49DACCE731274D097 /* RxSwift */, ); - name = Resources; + name = Pods; sourceTree = ""; }; - 6D327928671CE89EC015B75776F6298A /* Support Files */ = { + 6F4F4AB09FF3EB5CF87F58B472407041 /* Support Files */ = { isa = PBXGroup; children = ( - E49FDA3188916AD3090FCBD300783D02 /* GCDWebServer.modulemap */, - 1255CE4EF584F1227FCFE877388965BE /* GCDWebServer.xcconfig */, - 405572D03A3BCC4C3EEC1F1CECFFD7EC /* GCDWebServer-dummy.m */, - E32C96F7FC2C415654F4C0F1231FA3E4 /* GCDWebServer-prefix.pch */, - 6E1351027B3142F486A98424D9F42779 /* GCDWebServer-umbrella.h */, - 1096074B199A62C38833809533B6325A /* Info.plist */, + 60A4BC59E7923D49D1F2DB66CC93CEF6 /* Info.plist */, + 130F7474B10251411E8A0B0095FA77F1 /* RxSwift.modulemap */, + 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */, + 33607CFF1CB9E42C89084F9C17E407B0 /* RxSwift-dummy.m */, + BBB5913EEAFF6831515284D85F9B42AB /* RxSwift-prefix.pch */, + D6FA3B372E3D1861300774D9CACD4C15 /* RxSwift-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/GCDWebServer"; + path = "../Target Support Files/RxSwift"; sourceTree = ""; }; 785842678515C4CDC9428DD20DCD752D /* Targets Support Files */ = { @@ -1017,17 +1009,57 @@ name = "Targets Support Files"; sourceTree = ""; }; + 790B69D60BC48E76772183AD8030677E /* Support Files */ = { + isa = PBXGroup; + children = ( + EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */, + 1D373DA90C38C00B903B1FD9CD05CEC4 /* BRLOptionParser-dummy.m */, + B362693E8CB87D85D869ECEC9A308631 /* BRLOptionParser-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/BRLOptionParser"; + sourceTree = ""; + }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, D9727D7444B8CA54728F850F99A13C9F /* Frameworks */, - 359D3CBF032E922C6E0EBD419E5611A5 /* Pods */, + 5739D868472AD947DBFB4A27A0D08D8B /* Pods */, AEB9320F726BCC1999DC9E6198BA9F1C /* Products */, 785842678515C4CDC9428DD20DCD752D /* Targets Support Files */, ); sourceTree = ""; }; + 7EF95C42E180DBA569189077EF0D551B /* Support Files */ = { + isa = PBXGroup; + children = ( + B11F51D93DCFD7B0948095E201A09C71 /* Info.plist */, + 0598B496AD3E8300228BC3050091C4A0 /* MASShortcut.modulemap */, + A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */, + BC5A23A63EA04BBF65EBBC3D5905D453 /* MASShortcut-dummy.m */, + F3FE3FD846A162F26A05D064DE8B7C21 /* MASShortcut-prefix.pch */, + F552E19724BF0CC37D66E1D5DA273720 /* MASShortcut-umbrella.h */, + 7BC64B28448C32D46B71791C7752E48F /* ResourceBundle-MASShortcut-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/MASShortcut"; + sourceTree = ""; + }; + 83CE4EB00CCF59FFD1AFFB7D1867243C /* Support Files */ = { + isa = PBXGroup; + children = ( + 5DEF0513A865FDE2BA2DB595F61C8538 /* GCDWebServer.modulemap */, + A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */, + 44F322EFF3BACA5D7D9D859973112A90 /* GCDWebServer-dummy.m */, + A0A7422506FBD6F1F77B1F2A6D4167C1 /* GCDWebServer-prefix.pch */, + 88003809F8CD8A52B418884D95EB7FFD /* GCDWebServer-umbrella.h */, + 15DA0C069A08192F0FEB6C4FA1B9FD43 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/GCDWebServer"; + sourceTree = ""; + }; 93AB896DD6AD247E69959A4B8C06F5AC /* Pods-ShadowsocksX-NG */ = { isa = PBXGroup; children = ( @@ -1046,301 +1078,20 @@ path = "Target Support Files/Pods-ShadowsocksX-NG"; sourceTree = ""; }; - 94196550CA330CD5DBD59FF18DA025DD /* Support Files */ = { + 9701034B736920D6B75D5159F4DDF8C8 /* Support Files */ = { isa = PBXGroup; children = ( - 5280B2DC564CD3CA2D4349E9AB85ADEC /* Info.plist */, - C439FB2A46E79FAB7443860DB9209DED /* RxSwift.modulemap */, - 3261881064E033A3711EA27CE78524FC /* RxSwift.xcconfig */, - 67E751429B6B9BC0FABF01B8867EF866 /* RxSwift-dummy.m */, - BB135DF1279B5FD0AB5683BA019DD0CA /* RxSwift-prefix.pch */, - 1D4C11F8F1650F1661596A0F530E6BDF /* RxSwift-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/RxSwift"; - sourceTree = ""; - }; - 9712645556A969816EEB46A364368C74 /* Alamofire */ = { - isa = PBXGroup; - children = ( - E7CAE213EE8F8ECB17980C4BF269D35A /* AFError.swift */, - E7DE4B15A2C7B806D42D1BC1189CFC19 /* Alamofire.swift */, - 72D5CA8AF08CC028C391EB1A38C661B0 /* DispatchQueue+Alamofire.swift */, - BA733FB551621A6A266D57AAB2CEDC2C /* MultipartFormData.swift */, - EFC679B790AD9EE3F36E8291BBECFF33 /* NetworkReachabilityManager.swift */, - 2437216A55ECC76844C12B5DC39280A0 /* Notifications.swift */, - C32DA9D913B14198C262DA3670259B16 /* ParameterEncoding.swift */, - C0969FFD491CA3150D85C991F9D642BA /* Request.swift */, - 30FBBC7DFAD0F5694D59ACC330B005E0 /* Response.swift */, - 4C564EF425F990F06F9867FD48C5AAC9 /* ResponseSerialization.swift */, - 6A03D18B60F1C426EF558F967B149830 /* Result.swift */, - 49F857A6751201ED3D72F96DC13C729F /* ServerTrustPolicy.swift */, - 5C4A3D2ED8D2752319AA3649ECF09EA1 /* SessionDelegate.swift */, - 78D3C582CD284C68D7B5FCF58D73BF07 /* SessionManager.swift */, - 6D4A286AAC017AE5547B794DD2C8AF59 /* TaskDelegate.swift */, - 59B5C5DECEBDC9747029DD2086C6B00D /* Timeline.swift */, - 3C3DDD5AE0D4C7DFC098D473F24ADFC5 /* Validation.swift */, - 99FD92757D006D2B29F3C6A579522964 /* Support Files */, - ); - path = Alamofire; - sourceTree = ""; - }; - 99FD92757D006D2B29F3C6A579522964 /* Support Files */ = { - isa = PBXGroup; - children = ( - F3BEA0E59DC8EE162D7707F0458BC410 /* Alamofire.modulemap */, - D6CBB4BD325445F86290A6A3E27E8B45 /* Alamofire.xcconfig */, - A030F5167FA6558FE91D25425A0B9CBA /* Alamofire-dummy.m */, - 79CD123F941026E950A51F29197238C8 /* Alamofire-prefix.pch */, - 88C081789EDC0560233A76D711CE9659 /* Alamofire-umbrella.h */, - 10AE621FA1B638AD24DC8416AAEA4850 /* Info.plist */, + 87565A23AA7557C2E511616C236D8EA9 /* Alamofire.modulemap */, + 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */, + C163E270D8C0282204B45FA92F52546F /* Alamofire-dummy.m */, + 627D2F62F19998F945736C6D580E9326 /* Alamofire-prefix.pch */, + AC8837A9B05156CBBE4A8FECC465034F /* Alamofire-umbrella.h */, + E515CE44A5FFCE8293899BD5AF596B7A /* Info.plist */, ); name = "Support Files"; path = "../Target Support Files/Alamofire"; sourceTree = ""; }; - 9DF9AD84022C72252E16F01DF14949E2 /* RxSwift */ = { - isa = PBXGroup; - children = ( - 40784518B3B077970ACD76FF6ADC6E18 /* AddRef.swift */, - D06609DFEDC0A7E3A67145994809FAAB /* Amb.swift */, - 56E8831C108769CCDBD44A22DC79FC6C /* AnonymousDisposable.swift */, - 4F4BE5C3ABEB89172F29F09B174D6883 /* AnonymousInvocable.swift */, - 1C5B91DC04B3865DDDDC72512A5C3F54 /* AnonymousObservable.swift */, - 198E9BC39A4EAE7AF6607A3DE9DBD031 /* AnonymousObserver.swift */, - A57E4C19B3887697A8F7105471594B11 /* AnyObserver.swift */, - 34AEA52D361570E78F8B9792A835A1A1 /* AsMaybe.swift */, - 351C16C6C5C0715F1C876D91D0EDEA09 /* AsSingle.swift */, - 7CBC95D81A39FE47DF7664F12F9FF6E1 /* AsyncLock.swift */, - ACEE1641B4A1142BE9D66F1E19A1A083 /* AsyncSubject.swift */, - F88F573DA82E488BDAE8BC55E93B96B1 /* Bag.swift */, - 59D23F0528F3A7600784924A107552D0 /* Bag+Rx.swift */, - 6D71F1C033CF6233A31594BA370062CA /* BehaviorSubject.swift */, - 0DBFAF6F1BA01CE6183C3B565DB8322C /* BinaryDisposable.swift */, - DEA3B8F9A25C60DBAD70F2E3BA7DEC79 /* BooleanDisposable.swift */, - 525C68580D6831E607AD3D862DC133DD /* Buffer.swift */, - AB8D181B14C53055CA4F2D61166A6C7D /* Cancelable.swift */, - EC77664C6DB0A9CA9F4AC1E93463971A /* Catch.swift */, - A04BDAC57478865FE5DD3EC203E58F10 /* CombineLatest.swift */, - C1714F14E43A69F77960977683265141 /* CombineLatest+arity.swift */, - 58FCD780817CA60F10D6C39A083DDCDC /* CombineLatest+Collection.swift */, - DAAD2858D71A42847A49EE0FC347E9FB /* CompositeDisposable.swift */, - A7104A53E83466AD81DBF532DBA762E1 /* Concat.swift */, - 002B67F5C7E4ECAD0D0339BF321BF117 /* ConcurrentDispatchQueueScheduler.swift */, - 0B2BA85AB97126B7F170B024F033AF4F /* ConcurrentMainScheduler.swift */, - F6A1E5B8450A97482BAF559588B3DD71 /* ConnectableObservable.swift */, - D34A2C6821DD92D46F0901C579DAEF53 /* ConnectableObservableType.swift */, - B4FB77C479CBE2951C13C488C5CBE57E /* CurrentThreadScheduler.swift */, - 49D0AEBF622CB33505BCC1202E398B34 /* Debounce.swift */, - CC674E9D1A6B6D72CE70D5CC2FD43735 /* Debug.swift */, - 06571839F983E684AE0631A949E65709 /* DefaultIfEmpty.swift */, - 6B7E831C7BD9ACCDA16302B15F5A8035 /* Deferred.swift */, - 87C033CF62C6A03D67EA9056684E74B2 /* Delay.swift */, - 135780AE39D9C9BBD7443F7F21288DFB /* DelaySubscription.swift */, - DC7FD09C09D1BDD8476A89AA647DAF8C /* Deprecated.swift */, - 30D8B840460D79AB3B8AB39A4164F4B7 /* DispatchQueue+Extensions.swift */, - AF6621583BA40AE9A61D2F58B49462B2 /* DispatchQueueConfiguration.swift */, - 94E567C35466451FC7539A0BD8DA6046 /* Disposable.swift */, - B29423A3BD529F4181880C1CC35631C5 /* Disposables.swift */, - D83C9C9C216CD46EAD7B39EB3A0A703C /* DisposeBag.swift */, - 77A56791C067FBC9E3AC1405C667F1BA /* DisposeBase.swift */, - BBCDC9591CE194B7B56FC4194F75DB4E /* DistinctUntilChanged.swift */, - 806CAD0BC89F898F94D939211ABC3384 /* Do.swift */, - C524B1525327F67736740D5488CEAFD6 /* ElementAt.swift */, - EB76A421976FAB6ECBC3D127F6A77FC9 /* Empty.swift */, - 941AD6E4532B1B070D2592FE3A2AE752 /* Error.swift */, - 8E9FC22AFD2BA36D7C298505DD97DB07 /* Errors.swift */, - BED1E9CAFD7494BC65249B31B68985C6 /* Event.swift */, - BCCCC4E79BB0BC425916AD8DE96CA785 /* Filter.swift */, - 423730810CF7CCE34FE8316CFF58F0B8 /* Generate.swift */, - 804280091995DFB0D7791D5300473723 /* GroupBy.swift */, - D2654F715A28779785D3AD91F2ED2388 /* GroupedObservable.swift */, - 1369962E25E1F6E43620FE725E9CE874 /* HistoricalScheduler.swift */, - CDFACEE80381FE2B4BC6E4FE88D93A85 /* HistoricalSchedulerTimeConverter.swift */, - DFAE13F86521FDD3838D3DA229D4AC25 /* ImmediateScheduler.swift */, - 60B4EBBBD5D3F3346F7E7334498186B2 /* ImmediateSchedulerType.swift */, - 0A7A485A268FA20FBE6CEAB65881AF6F /* InfiniteSequence.swift */, - 0F158686BD10F093816366CBB70A6E30 /* InvocableScheduledItem.swift */, - 8D21B3357EAEBF44D19D3A611848628E /* InvocableType.swift */, - D85F519585040CC0D398A38AA0930EC4 /* Just.swift */, - EFDF2D18587604D407F5C9C506D4018D /* Lock.swift */, - 48B2C17385071197F259AB746341B272 /* LockOwnerType.swift */, - B4A0B1A36A704F964703C9BC39827964 /* MainScheduler.swift */, - 7D0D3E3125AF3C4C71554245E74E3A8C /* Map.swift */, - 3B3D790CC9A67D70E3E0EDD445F085E1 /* Merge.swift */, - 5374966D42537C6369072660B48CF199 /* Multicast.swift */, - 8EF3B7799254D602BB02B42C4E30CFFF /* Never.swift */, - 4F4D6DC50E558CC6AE51E3AF56E5018B /* NopDisposable.swift */, - 6200462FD0350D942C06454BF3959B8D /* Observable.swift */, - 7A5020E5D284EBAF7DED99AB83881F38 /* Observable+Aggregate.swift */, - 34B22FFDD2CE991366EAEE41BA0B706A /* Observable+Binding.swift */, - AE7494AFBC1F396F79B1E5BE66FDDFCD /* Observable+Concurrency.swift */, - 6E634B678C5C5CF993CA1475A75B7DEE /* Observable+Creation.swift */, - 64A21A2EB387821C687BFB0B5FC0D242 /* Observable+Debug.swift */, - 5C56E70499D215B611C87DF7E81D7DF9 /* Observable+Multiple.swift */, - ED29315833FAA1E5A338CFA8005377A9 /* Observable+Single.swift */, - DA80549D390412FB66E8ADB1475C39D2 /* Observable+StandardSequenceOperators.swift */, - 69B06482690AB04BAC88256758995B90 /* Observable+Time.swift */, - F72515DA7F790ADA9DF78910C67193DB /* ObservableConvertibleType.swift */, - 6C980D73B55B8361629ADA1668748A31 /* ObservableType.swift */, - 69DF594FDFE7BC49AA1019B10D7065E7 /* ObservableType+Extensions.swift */, - A24870AF7F42FAA0AD9ABB0325F1E135 /* ObserveOn.swift */, - 8FE77EB2349A660DFADBF5CE01DEF91C /* ObserveOnSerialDispatchQueue.swift */, - 9F0C370A9E746A9710DCDBF48091819B /* ObserverBase.swift */, - D3A7C466E29109C01509C4619554BB05 /* ObserverType.swift */, - 435BB7E73157084CAF2FE80FBE224AF2 /* OperationQueueScheduler.swift */, - 0394897FCAD2777CF1A4384FE731D25C /* Optional.swift */, - 87580AD4D9D45E84D60D81B7D6E97C0A /* Platform.Darwin.swift */, - 912D7029A05911D1FB4ABFF9E2B851C7 /* Platform.Linux.swift */, - CB9BC8FFFB6D237A0A82BB90707A89FA /* PrimitiveSequence.swift */, - CD39D59D26656AE80FD3F9C683849740 /* PrimitiveSequence+Zip+arity.swift */, - 9C1694FBE9CBF06E4F1C9F38B5DFA930 /* PriorityQueue.swift */, - 11C39B1421798570CF7E02C57F90EC4B /* Producer.swift */, - 65268C40FD5106D32C7C227F38209B3F /* PublishSubject.swift */, - 214BCB3965A64FB0986840C0E083418A /* Queue.swift */, - 3F28BB197905FA93BEC98E5D1F6B9F75 /* Range.swift */, - 7D6462467149007CC9112C18E0FA2BE0 /* Reactive.swift */, - D4CD8E837A63DA5890EF98BA6E98D9D5 /* RecursiveLock.swift */, - D402F8A4734F5C848DA2287CD48E6202 /* RecursiveScheduler.swift */, - E149E56489936102F081551F32C5F5EB /* Reduce.swift */, - 8402EA2D03C261FDFF31CEC2F3E17390 /* RefCount.swift */, - 62A7E7809BC29FA83778B027FE2021B6 /* RefCountDisposable.swift */, - 5A11BED0A468B53EAE2F900A790FB03A /* Repeat.swift */, - 3AC8F7EF565790CE58751914BAB4C1B3 /* ReplaySubject.swift */, - 2A595C2E180CE19ADB5A7218E78FD8BC /* RetryWhen.swift */, - 85BE206744586C11C8C71BF92918AB7B /* Rx.swift */, - 912AE5C728F325B6D86D33E827E266C8 /* RxMutableBox.swift */, - 63973CDD0819B187A85E746CC55ED88F /* Sample.swift */, - B2E3D4D905C0E79E9AB56BF024A35180 /* Scan.swift */, - FCBF6FFFBBE49493E089992E786E1A20 /* ScheduledDisposable.swift */, - B4AAA88BD8CDEC58F63BB1EABFBFE6EC /* ScheduledItem.swift */, - 67DA5A6F6EDD732F5332FE2EAC8DB9EE /* ScheduledItemType.swift */, - CDC25BCC601EFEC02F400739EAD16FDE /* SchedulerServices+Emulation.swift */, - 0947568290847B529166B4C9F28347BB /* SchedulerType.swift */, - 88C9C68749757A2F4BCA7FFF1CA0F9BA /* Sequence.swift */, - F786CE1FD64B7570C24F231E23D7566A /* SerialDispatchQueueScheduler.swift */, - 478441DBD43555BE4C13427FB4B1F102 /* SerialDisposable.swift */, - 9F4AD3BB60C4064C0FBE13775748D456 /* ShareReplay1.swift */, - 71150F3D7194C1783C37A070F1AD879E /* ShareReplay1WhileConnected.swift */, - 385EF54CE93CF6561FBD6FCD4BC908CF /* SingleAssignmentDisposable.swift */, - 271DC7562BA32ADD28B4A53CA4C92137 /* SingleAsync.swift */, - B2FB3E4A7941F31C1970E3CC7568BC25 /* Sink.swift */, - 48FAC49BD2A6F874166D24BB5C9BA1AE /* Skip.swift */, - B90BBC0A33E35F445599411A4755CA2E /* SkipUntil.swift */, - 7A46EF6D6AE7B13EF91E0A19B18EABEE /* SkipWhile.swift */, - 612574DE7BC9EB82F4DCE7D2E38318B9 /* StartWith.swift */, - 0708DD73E84866CEA805B9C7AB60ADE4 /* String+Rx.swift */, - DAF4B22EF3D343BEF33D2881F14213DF /* SubjectType.swift */, - 9DA9F52CD97C9FFDD1A42400020B5C86 /* SubscribeOn.swift */, - 187F6C028E99961913EF8CD45D358107 /* SubscriptionDisposable.swift */, - F9ABBB68077D7AD074DFC9923895B5D6 /* Switch.swift */, - C1A4207D9981121566B1401ED299ECB8 /* SwitchIfEmpty.swift */, - 30E2E47F7B982BA49DF174E3FDFB288B /* SynchronizedDisposeType.swift */, - 64EE1C0399B2FC8E5B84F059BC3B89F9 /* SynchronizedOnType.swift */, - 6DEED24A26C9B7E2A8FFD080F9C8C2AF /* SynchronizedSubscribeType.swift */, - 528841720C50D9A4B73EE2A4C6A8E132 /* SynchronizedUnsubscribeType.swift */, - 4A1F43CF3068C2DCAA16CAF4E7EDCE4E /* TailRecursiveSink.swift */, - 5208F42E4D16971BBD8698E9C751B6ED /* Take.swift */, - 4209C3E1C531131A7CA7A2DA0BB1F334 /* TakeLast.swift */, - BE2FFA6014D5EA973E00B658481C4016 /* TakeUntil.swift */, - 33045890E1D4469FBFD24F367E827FAC /* TakeWhile.swift */, - 430E0E395046F19946D55C7F791DDCC4 /* Throttle.swift */, - B42525F3404A9781D07CAE62FD5E4918 /* Timeout.swift */, - 81A1AAE28282C31243C72011FF5A4830 /* Timer.swift */, - 7DB18E3EF0102CDC82F31CA6B466A8B3 /* ToArray.swift */, - BDCCB04DF57C106193307E90684240A9 /* Using.swift */, - D1F45AC654673C96B25C288CE2ED7757 /* Variable.swift */, - 9591C37093C86F6625E89B7ECD358BDE /* VirtualTimeConverterType.swift */, - D14826507A4DA27653782BD16CF7B1A4 /* VirtualTimeScheduler.swift */, - F1AE55DF48B45CC65465B461F51CA3EA /* Window.swift */, - A7B90D6B38782365F4D874C83ED140A8 /* WithLatestFrom.swift */, - 0C4E480F924E52E479BFE519D781A826 /* Zip.swift */, - 23D34D0E9C66E6F9595722372B9AED8D /* Zip+arity.swift */, - DB6A96F3AD4E1A22FFED4E6F0A4D1ECD /* Zip+Collection.swift */, - 94196550CA330CD5DBD59FF18DA025DD /* Support Files */, - ); - path = RxSwift; - sourceTree = ""; - }; - A092F58EC487A6343E48EEDD79712C6A /* Core */ = { - isa = PBXGroup; - children = ( - 04BA1E955FC23E417978F5DE57553C65 /* GCDWebServer.h */, - AB35CD1ECD0CD3643AE3F5B53C269AF5 /* GCDWebServer.m */, - FAFB76E73828C3673CEC60577DD3D7F0 /* GCDWebServerConnection.h */, - 4387584024C546AD5AD6B7EDD37485BF /* GCDWebServerConnection.m */, - 47B14EF7B2C9724416D7F4F875D1CB32 /* GCDWebServerDataRequest.h */, - 8F9C2E8F767184184382C0659D0B57C6 /* GCDWebServerDataRequest.m */, - FD0EA79B1967F9A248BD807632BC9C79 /* GCDWebServerDataResponse.h */, - 1E0CFCE9AB3B6AFD0691E63F63F62B18 /* GCDWebServerDataResponse.m */, - 7CD1750A494B17CF183B50C961117C6D /* GCDWebServerErrorResponse.h */, - E85ED0518085EBD804CA390B52EDDFE5 /* GCDWebServerErrorResponse.m */, - 4F9B04B4F8691154899A7BB06F149941 /* GCDWebServerFileRequest.h */, - 7E1780CA78CC5EE56892186D6699471D /* GCDWebServerFileRequest.m */, - 015CDD34C2C3E889192595296079F633 /* GCDWebServerFileResponse.h */, - 04FCB8C241708CC45FF52AFA691DA336 /* GCDWebServerFileResponse.m */, - BFD17FB0B8D729EB83B1AA769D30726F /* GCDWebServerFunctions.h */, - 51C85F34568C70DB96CF9B23E0D503AB /* GCDWebServerFunctions.m */, - 2D2D8747A63B260F80C40C9DCDAC357E /* GCDWebServerHTTPStatusCodes.h */, - DF0D4DE6D3365036C0FA32D93DE77D46 /* GCDWebServerMultiPartFormRequest.h */, - 1BD87FA3022EFB5D55062335BBAA6CDC /* GCDWebServerMultiPartFormRequest.m */, - 941AC673759A8487CD0E31D9222FE395 /* GCDWebServerPrivate.h */, - 1529BF693979ADC95825A232E3F7F71B /* GCDWebServerRequest.h */, - 5E149596B24A0F722AAD04DD0E7648FC /* GCDWebServerRequest.m */, - C74A3DC1AECDEFEFB44AB3F60FFDDC33 /* GCDWebServerResponse.h */, - C5A524C4B1015097B4130310EBF6D6B0 /* GCDWebServerResponse.m */, - 49AA0901E701115CB7028794961FEE8E /* GCDWebServerStreamedResponse.h */, - A07A8BDB7BFA69AA9291E71416EC58CF /* GCDWebServerStreamedResponse.m */, - DB83C3266870BCD77C80A5BF5F71BFE0 /* GCDWebServerURLEncodedFormRequest.h */, - 360EB85AC720C078D420EADAF6C654ED /* GCDWebServerURLEncodedFormRequest.m */, - ); - name = Core; - sourceTree = ""; - }; - A6D905C92591DD3CC9A5586DC4788A47 /* Support Files */ = { - isa = PBXGroup; - children = ( - 6746B37DEF5322A16C300B61DED7F1AD /* Info.plist */, - 981AE7988280E3E58827A4BC2FEC206B /* RxCocoa.modulemap */, - C5B2560C6A7D9250831A76E33D926588 /* RxCocoa.xcconfig */, - A299EE214CF95998A680C2E5EBEEC779 /* RxCocoa-dummy.m */, - 2F5238F43AAC23E1434E88471A76DAA8 /* RxCocoa-prefix.pch */, - 622BE644A5BCF7100BB04E2E0578F8C2 /* RxCocoa-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/RxCocoa"; - sourceTree = ""; - }; - AD089A2216580815F93912EDB4FEDE85 /* MASShortcut */ = { - isa = PBXGroup; - children = ( - CDD891211BCACC371F9D43363C3FD01F /* MASDictionaryTransformer.h */, - 66999DB6AE23289A4ECDBEBCC7A09C5F /* MASDictionaryTransformer.m */, - DE1C155D92F36B81A10B04D3AECC44DE /* MASHotKey.h */, - 550F2C93957EF2301541066CF63D46BC /* MASHotKey.m */, - D38D66B8CF136FA1B9D3A067600536AE /* MASKeyCodes.h */, - 259F77E2EC48E07223226DD78300AABD /* MASKeyMasks.h */, - 8D679D13A827958B8B727FA6E970D093 /* MASLocalization.h */, - 874D347DB51D5D3E716E95F6E97CFF9A /* MASLocalization.m */, - BFBCCDD4FB2BFEE4F62E4783156E5C68 /* MASShortcut.h */, - C2F0513828D310E221B920200A0AF8B9 /* MASShortcut.m */, - 90BD54F6E711E6C0C832CFD421265D40 /* MASShortcutBinder.h */, - 8C0EC59C08B29B12978B1C4DBDD6491F /* MASShortcutBinder.m */, - E4B98A26D58EDEECA20933684CC1C45F /* MASShortcutMonitor.h */, - 77B1E0282CBC343B82CC78C567B8B534 /* MASShortcutMonitor.m */, - C6CF6A88B14EECBA592B26FDE26199CA /* MASShortcutValidator.h */, - D12B3B0AB6BBE5692CC30020ED890E6C /* MASShortcutValidator.m */, - 16E2BA0967647D17B5A037805E7CF195 /* MASShortcutView.h */, - 64D637E8C0ED768E21CFCAE9641662B6 /* MASShortcutView.m */, - 1918A3E00F323095B9B4FE41517A6FDA /* MASShortcutView+Bindings.h */, - F9A79C0537300E8EC3B4938AE3FCCE88 /* MASShortcutView+Bindings.m */, - 8EC98D40BE7139C7559F4E49AD0B9202 /* Shortcut.h */, - 4047D8E4A66663BBA78A370A91AE7F79 /* Resources */, - 2D7BA557F4C0940A77FFB9270557294B /* Support Files */, - ); - path = MASShortcut; - sourceTree = ""; - }; AEB9320F726BCC1999DC9E6198BA9F1C /* Products */ = { isa = PBXGroup; children = ( @@ -1358,6 +1109,31 @@ name = Products; sourceTree = ""; }; + B17E9640A1D4A8265ADA3D9996A2F88A /* Alamofire */ = { + isa = PBXGroup; + children = ( + 3C3BD779374EECF9D6A500A90CF6279C /* AFError.swift */, + ADD97D49C025DAFE6EE85E866D134966 /* Alamofire.swift */, + CE411A2DEA5A7FCC657E6AE76503E34C /* DispatchQueue+Alamofire.swift */, + 8A0AC98004CCEB4CC8A5BECA09878CAA /* MultipartFormData.swift */, + 6C9B2D9A28ABC58CFEE373E87A4052A7 /* NetworkReachabilityManager.swift */, + 31EB405D095DCBF9C17B60786F115283 /* Notifications.swift */, + 44D9192CE046EB20FAF1BF26C3FC60FC /* ParameterEncoding.swift */, + 07BCC46A8B3A4B93914CB0C0624B3942 /* Request.swift */, + 996FFF36FA1A968D9BC5367C870F15F0 /* Response.swift */, + 2BC3FA38663D9266B6B5D834492C9F7A /* ResponseSerialization.swift */, + 20817295866FCA3DF75F20CA436D877A /* Result.swift */, + 226616D9FEC0ABA73A4365514AEE5914 /* ServerTrustPolicy.swift */, + 268E53814A4808A9CB605BFB3FEAB50F /* SessionDelegate.swift */, + 7D436A58ECC98D13B9A4C91CD460DF93 /* SessionManager.swift */, + 8395CF3A1AD4518051CE6450BDBC43BD /* TaskDelegate.swift */, + D8AAFB037FDFF7437E3006151BA5FE9B /* Timeline.swift */, + F452BDEBCDC82858ADCB26071AA4E12D /* Validation.swift */, + 9701034B736920D6B75D5159F4DDF8C8 /* Support Files */, + ); + path = Alamofire; + sourceTree = ""; + }; B5020B0A649E766997C633601AD85F17 /* Pods-proxy_conf_helper */ = { isa = PBXGroup; children = ( @@ -1373,14 +1149,157 @@ path = "Target Support Files/Pods-proxy_conf_helper"; sourceTree = ""; }; - BD838F4740449375D7768E6248698B27 /* BRLOptionParser */ = { + D39D89B6092E13E49DACCE731274D097 /* RxSwift */ = { isa = PBXGroup; children = ( - 6B53429CB1F8A25076762F2D82D97CCF /* BRLOptionParser.h */, - 234D1504F40F558DF1303E8C160D47BD /* BRLOptionParser.m */, - 02CDF8BDA510DD82276AE66867F81915 /* Support Files */, + 545894F30123AB01C758C6689014BCC6 /* AddRef.swift */, + DAD59D3D739C07FCB2F892826F951063 /* Amb.swift */, + 7959286D1E30292AB76348C2712DE95B /* AnonymousDisposable.swift */, + 1510E6FAF4B06DADDD220C9F52E25600 /* AnonymousInvocable.swift */, + 09D280C7FCC6AE30E6F8430DBA380925 /* AnonymousObserver.swift */, + 61F3F1CC2095B445C811F0C16E005B49 /* AnyObserver.swift */, + E58A2330CC4D40F78DD08B5A8500F8BF /* AsMaybe.swift */, + 9B1F2B769E9F6355DF3AC956AF04D064 /* AsSingle.swift */, + B0EC4DF0E84A696168D1071B48A4F7F4 /* AsyncLock.swift */, + B6FC4FABF722AF2F518BE654AD7DCE4D /* AsyncSubject.swift */, + 75828AB7420DC80FF4A055AD665BA0E8 /* Bag.swift */, + FA95194E204F208C75DB1F2E683163B8 /* Bag+Rx.swift */, + 5F5BB1CD589B3E27B8A75FA688E70401 /* BehaviorSubject.swift */, + D3AEFA8AAF6328813FEC6D38028EF063 /* BinaryDisposable.swift */, + 534E4A964C49209EE277E82628F5710B /* BooleanDisposable.swift */, + 5D904A8BE8B963C1CFDCB978A106290A /* Buffer.swift */, + 52F0C0E792C43635C8DF0BA00874B14F /* Cancelable.swift */, + 45E0880FB45B513CD4BFD63BB3E7B736 /* Catch.swift */, + E366C7D398E704625CF7481FD8243D48 /* CombineLatest.swift */, + 3CCE02B40B95BFF261200228AF8EBC16 /* CombineLatest+arity.swift */, + 183021AC8ED6060D003674388D5B1B49 /* CombineLatest+Collection.swift */, + 878BBACC17D3136FA4DD1CD04CAD85A0 /* Completable+AndThen.swift */, + E3637E3CB5915225EA71EFF6B20D7171 /* CompositeDisposable.swift */, + 2E60ACE8054201E83089FD336ABCAA2F /* Concat.swift */, + 8C848585CA8A7F199434CE368A9DB06C /* ConcurrentDispatchQueueScheduler.swift */, + 4901C7D532E5179B742DB643CA1B408A /* ConcurrentMainScheduler.swift */, + 007948A0B78DA5B2FBD4E8DB9D2029DA /* ConnectableObservableType.swift */, + C9DE8782EF7863C69F019CB969C665C2 /* Create.swift */, + 43C50B5D873459E5F93927D1EC6F3505 /* CurrentThreadScheduler.swift */, + F8169698EDB7D60F459C13552F619848 /* Debounce.swift */, + AD0CD5DD6E42873872D2B73A60081FD0 /* Debug.swift */, + CB2D9630B47A5E202FF1CFB831ACACDE /* DefaultIfEmpty.swift */, + 37CB5F5627B0B6D64308CD1A83ABB3B0 /* Deferred.swift */, + 24A143E562F6586266DBD22F7295D5AD /* Delay.swift */, + F546C188C97659BE86FA0E06FB1674BB /* DelaySubscription.swift */, + A023097C535D0BD3D56EA8BD993D7B3F /* Dematerialize.swift */, + 9BC03B0B3ABA0DCA68E6E5743698D228 /* Deprecated.swift */, + 5CF6DC4F50F673F957821F727AF12A71 /* DispatchQueue+Extensions.swift */, + C45B38DD11A907BC6F5B45FBB0A35B0C /* DispatchQueueConfiguration.swift */, + DA02D299CE44B023D9B4909ED0B34FCC /* Disposable.swift */, + 92244CECCE7B444FAB2C8202E5EA4056 /* Disposables.swift */, + 66C68481E0A15400E90729E5B6E9C46D /* DisposeBag.swift */, + 5BE80522158C8CAE9E3CFE12B3D857F7 /* DisposeBase.swift */, + C0D57732901E7827AB4442A3185E7287 /* DistinctUntilChanged.swift */, + 68DFB337F054F8982CF31389DBFF6374 /* Do.swift */, + CAFB8EBD43A17F895E88B967D4BA489A /* ElementAt.swift */, + F0581044A5A088C077656011651C2465 /* Empty.swift */, + 41DAD2203618169F641D264D7C2EE0E6 /* Error.swift */, + 5613FC3B7810194DB766F2AA387847AF /* Errors.swift */, + CD4154ED163C40AFD6A2FCB49EE532DC /* Event.swift */, + 0FABCD0845EFCC0E95BC4EF19880A8D3 /* Filter.swift */, + 0ABFF341309F8A2E61DCB2F092DFF2CA /* Generate.swift */, + 51807E4919B34213B8F47CD576F3FC3C /* GroupBy.swift */, + A829DA85B827FD4953161E2FC29C0AB4 /* GroupedObservable.swift */, + E88567B756C3B048C0FE65824DF88BF5 /* HistoricalScheduler.swift */, + DD8C09387A31AC5BF4B190F880F4883D /* HistoricalSchedulerTimeConverter.swift */, + 2A97F155FCEA6B4942A94BBB31544107 /* ImmediateScheduler.swift */, + 292363670323CC583F50A5989CC3D9D0 /* ImmediateSchedulerType.swift */, + D82A11977CDF4CBC2948546163A27853 /* InfiniteSequence.swift */, + 38A7049C5EA5CF2C54BDD0F1BE4D6FCD /* InvocableScheduledItem.swift */, + 29DCD7692E660B9C1FF8E7A3063F2B47 /* InvocableType.swift */, + 2A2D9F47CF554F3D0FF28A201822E872 /* Just.swift */, + 7C7BE50FB7791D6009BF033B78EA631C /* Lock.swift */, + FE7CDCDB0682EC04C12DD552E4910CE5 /* LockOwnerType.swift */, + 4A9DE35FDE449CC76ADF563645C81738 /* MainScheduler.swift */, + A102F9379F5A55F3D3C85A1FB3687F97 /* Map.swift */, + 6B29EA946AE6D8BE387824C42B121D67 /* Materialize.swift */, + 2D1CCFB65C786E25702F68A5601E80DC /* Merge.swift */, + 28EC1B5940ACD0BA9FE7309429D6ED68 /* Multicast.swift */, + 326A9DBB817D95D4A5840B314BF9202B /* Never.swift */, + A6573695D6E38AB0E45298916E5927F9 /* NopDisposable.swift */, + 5AD930CE2472F57A003EF8907CA3116C /* Observable.swift */, + 636B1F25C166F05CF62D7805112E6124 /* ObservableConvertibleType.swift */, + 6F9BA2F71CB99026197CB42B356FC63E /* ObservableType.swift */, + A923BB8E574DFADCE6DFF91F708E5886 /* ObservableType+Extensions.swift */, + 02C96012B347BB2E33A987A213CA57C4 /* ObserveOn.swift */, + 52A9C2646B9718959021371687EE6250 /* ObserverBase.swift */, + 20E5746A4CCE940BCE91535C0D37FEB2 /* ObserverType.swift */, + 0A0BEC4717A975478F52AD458ACA42AA /* OperationQueueScheduler.swift */, + 4FD63BE80EB7AD180525F89009471D6D /* Optional.swift */, + 6ADE820F11CABD3D1C1218580FD439A2 /* Platform.Darwin.swift */, + 6078A9FA6BBA43845BFA8D0BA163E903 /* Platform.Linux.swift */, + 6873049F56F58D5ED3E44719FC73C4F6 /* PrimitiveSequence.swift */, + B57622ECC64CA3D7C8ADDDEA14B176F5 /* PrimitiveSequence+Zip+arity.swift */, + 6BBA11BAC502FBD57943042D6D9D8975 /* PriorityQueue.swift */, + C6E4C64CF7155899BC2A74A24FB7513F /* Producer.swift */, + B4D3408600A2042F4070CA97A67C60D5 /* PublishSubject.swift */, + BC25AF2EB8052CF4B0A98541C78FA86C /* Queue.swift */, + B23C70F218FD3D53D1E083383A8C8225 /* Range.swift */, + BDE1BDB4BDD14E3E8B8C3F8ED3B3C53A /* Reactive.swift */, + AF7187DD22E17C86AB22B3969936E90C /* RecursiveLock.swift */, + E6B7FB2F3741600EA98ED059FA99D203 /* RecursiveScheduler.swift */, + D4632B46CC78EF8030FEB67D2D7C92DE /* Reduce.swift */, + A4DAA5324C3F0718C4CC7852CBAC50D0 /* RefCountDisposable.swift */, + 7F37E66B5A8F3C680354C935F2744C29 /* Repeat.swift */, + E2946829864608D127EB046EF8BAA69D /* ReplaySubject.swift */, + 2B264AC163CEFA27D7ED08507B018B11 /* RetryWhen.swift */, + E3EFB1E8AA462C2C937015579F139C13 /* Rx.swift */, + 5548D8C229700A0AEB23E7B56630426B /* RxMutableBox.swift */, + 3E4A6E1ABB2E00314CDA799343BF5983 /* Sample.swift */, + 023DBF06ED50965F68CFB72972CC89AB /* Scan.swift */, + 9E95ABF737E8C0AF728AE99576593651 /* ScheduledDisposable.swift */, + 58AB02263E99467FF2175C1702B5ED82 /* ScheduledItem.swift */, + 63D2A88D8F95FB962BFE6279B46169D6 /* ScheduledItemType.swift */, + 5DB38C96718DD2622736537BB2ECC6C2 /* SchedulerServices+Emulation.swift */, + AEF8F1346C831D7B8A9AB960E3B768C0 /* SchedulerType.swift */, + 20192591D331E03B112CEAB1C32D1FCF /* Sequence.swift */, + 5CBA0B69E87685AC3D2B60EF632158AE /* SerialDispatchQueueScheduler.swift */, + 82D5F30FE87A96D7AA09249DB4D8F82F /* SerialDisposable.swift */, + 57B9A9B823D866CFD5C18A2DF4FBB883 /* ShareReplayScope.swift */, + B2EA7252711AF3E4D70DD2035DA71438 /* SingleAssignmentDisposable.swift */, + 6B348F108925962F83EAEAC0E334CA06 /* SingleAsync.swift */, + E1C50ACDF517D102DEC7195257ADFE7B /* Sink.swift */, + 0C6BFE2E2D5A6B7A594B788F625561EF /* Skip.swift */, + 2487CFFD3F6BA7CF97A97003B1727B18 /* SkipUntil.swift */, + 646E91BE14388979C352F573B4362A39 /* SkipWhile.swift */, + 30A4AEAD1EF447DFE90F59D1059C79B7 /* StartWith.swift */, + 09C5D99ED4F07DAF3A50F59C765CA416 /* String+Rx.swift */, + 15DDA519B43F0EB8DFD887D2F7A6FA8A /* SubjectType.swift */, + 761DD04D13CF5C96E3661EBB41496409 /* SubscribeOn.swift */, + DCF0DD57FB4E2DED2BA043D232A8F3E9 /* SubscriptionDisposable.swift */, + 65BABB33CC0139D359C0ECABD05CD0B7 /* Switch.swift */, + B4C0501500E132C7E97A97A425E68D90 /* SwitchIfEmpty.swift */, + 5CCFC9D5177E577E082A70923B848393 /* SynchronizedDisposeType.swift */, + A25F673AD7CCCE0189ADEB549EB5F618 /* SynchronizedOnType.swift */, + 09C5253CFC07A13DD0519ACE57BC0EC0 /* SynchronizedSubscribeType.swift */, + 68041DC65BD6DADAF82378F8875B3FCB /* SynchronizedUnsubscribeType.swift */, + 9B7FB3B8F0F547E0CCC3EDB3FA5509E5 /* TailRecursiveSink.swift */, + 13E44E93931EFF87E67F113CD862A0C1 /* Take.swift */, + 23DD34EFE94FB8C8DCE00EE72C2473BF /* TakeLast.swift */, + 359132E97DDCA64E851B2CE3FE71F813 /* TakeUntil.swift */, + 3D97535E8704070D353435086265E041 /* TakeWhile.swift */, + B16B0EBC2B5BA4309D9844CDE1932B26 /* Throttle.swift */, + 000B7BC80F254E06ADEC25B19B7C2C37 /* Timeout.swift */, + F2B901654D7B257777782F6F00162843 /* Timer.swift */, + 5CA271EB6661517D11AE48621699B565 /* ToArray.swift */, + B1AA3C8E05F2C2D813D16D20D9984553 /* Using.swift */, + 924ECD8580145EBC5702BD6D3B314F61 /* Variable.swift */, + C8C4EEF5D5723B94ADD7BCE012A2C6E7 /* VirtualTimeConverterType.swift */, + 752306794D721D2E1BF157AAA32771ED /* VirtualTimeScheduler.swift */, + E969B8C71DA98B913BC86FD4AC5574BD /* Window.swift */, + 524C8DBC63D366E5C0E8A5EA62713031 /* WithLatestFrom.swift */, + 628F693AA128B618F45155C70C6E1024 /* Zip.swift */, + 55FEBC89F2833AD13021CF63D4B810E1 /* Zip+arity.swift */, + EB6C8C0D1FA8537542033F55E1556F6C /* Zip+Collection.swift */, + 6F4F4AB09FF3EB5CF87F58B472407041 /* Support Files */, ); - path = BRLOptionParser; + path = RxSwift; sourceTree = ""; }; D9727D7444B8CA54728F850F99A13C9F /* Frameworks */ = { @@ -1403,11 +1322,65 @@ name = "OS X"; sourceTree = ""; }; - E5268B6C8C971560742CEF27BB088DED /* GCDWebServer */ = { + ECCA55967A058AAF061006AC31FD7B9D /* BRLOptionParser */ = { + isa = PBXGroup; + children = ( + 1C85AD27621E054B8D7328ABDCB9697D /* BRLOptionParser.h */, + 78481FCBF09A8942C2BCB258298EBDBE /* BRLOptionParser.m */, + 790B69D60BC48E76772183AD8030677E /* Support Files */, + ); + path = BRLOptionParser; + sourceTree = ""; + }; + F2148EAFEC18D957377DC614F758C944 /* MASShortcut */ = { + isa = PBXGroup; + children = ( + 3E29C34C13007B34D5420BE9284FDCB0 /* MASDictionaryTransformer.h */, + 8C49546F441EF6B013C11F9ECC4E494E /* MASDictionaryTransformer.m */, + 55279FD33E1F40398E20D7299953F40A /* MASHotKey.h */, + 0CD9E0BB93F28FD91CBF8872501B7280 /* MASHotKey.m */, + 77903B50BE4AEAB8D9679B1978D574DF /* MASKeyCodes.h */, + B2093E2378DE5EC41D64F8387561BF3B /* MASKeyMasks.h */, + 5089235C3188BE2DE716A15C48207E8A /* MASLocalization.h */, + E1E128ED33CF5ECBE9E08D07D4B7672D /* MASLocalization.m */, + F4E647FF308219F6F10EF468CFD459D1 /* MASShortcut.h */, + 535DA0E1B20533E30B48C0F04AEF67CD /* MASShortcut.m */, + FF9B0B9971EBD4F210054B63F172C41E /* MASShortcutBinder.h */, + 98882780F0AB1693529D79FBB62760CE /* MASShortcutBinder.m */, + 55178DF04DDB4E9CA87135167C286E60 /* MASShortcutMonitor.h */, + A0A5B4E433F12A0EE14939299BFA30B5 /* MASShortcutMonitor.m */, + E5C53D1D9FD46ACD15E6C5381BD7A754 /* MASShortcutValidator.h */, + 9FAE9397A18DDA64A11847EF6BA0476C /* MASShortcutValidator.m */, + A077B4E84F0E05629C70075B9B9D871E /* MASShortcutView.h */, + 687C69F6237AA7E984907EBAB8FA2B02 /* MASShortcutView.m */, + 01A59C606077EB80665FFDDD235664B3 /* MASShortcutView+Bindings.h */, + C8E1C61760F4B2BFEC652B9A01D4F846 /* MASShortcutView+Bindings.m */, + 68FC88BF39528F8F3D69BD6D8964B5A7 /* Shortcut.h */, + 4F38A79FE026B54D13A4ADE87802BA23 /* Resources */, + 7EF95C42E180DBA569189077EF0D551B /* Support Files */, + ); + path = MASShortcut; + sourceTree = ""; + }; + FAE79CDC2C7965FFEF8DC80E6B817A6B /* Support Files */ = { + isa = PBXGroup; + children = ( + B3F32502ED756288E4F37152D996A3FA /* Info.plist */, + 4019945AEEA809599FA5E80EB71F757D /* RxCocoa.modulemap */, + 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */, + 321FFBA726A46A7C54E164E625D44DED /* RxCocoa-dummy.m */, + B72677785827D5383DD7933263E069B1 /* RxCocoa-prefix.pch */, + 99EEC612B008B452C8ACD615123EDA93 /* RxCocoa-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/RxCocoa"; + sourceTree = ""; + }; + FD9B6873D4081C5CCEF69576498728B2 /* GCDWebServer */ = { isa = PBXGroup; children = ( - A092F58EC487A6343E48EEDD79712C6A /* Core */, - 6D327928671CE89EC015B75776F6298A /* Support Files */, + 00A280D4C78AFD320A4205C6BF2884BE /* Core */, + 83CE4EB00CCF59FFD1AFFB7D1867243C /* Support Files */, ); path = GCDWebServer; sourceTree = ""; @@ -1589,7 +1562,7 @@ isa = PBXNativeTarget; buildConfigurationList = D913F5C08F647E9FCC34C3A5B3030BD5 /* Build configuration list for PBXNativeTarget "RxCocoa" */; buildPhases = ( - E4683809F6E2E0E13A1DA3716D22762E /* Sources */, + BFA83558D5EAD45E880E89BCA3CA66B3 /* Sources */, AC6EF4DCF3427EDD23A06A9ACE60D1CB /* Frameworks */, 8D0544708D493A52C828804099AE01DC /* Headers */, ); @@ -1663,7 +1636,7 @@ isa = PBXNativeTarget; buildConfigurationList = C3C04E339BA1928DBC29CEFD07DC6ADF /* Build configuration list for PBXNativeTarget "RxSwift" */; buildPhases = ( - 2BF821D2760C912E8AB21AE0059F2E19 /* Sources */, + D0CF4D1BE6AFAE220B3DC5CCA6988D1C /* Sources */, 656F921478BE483858A20165B6945F4A /* Frameworks */, 515CC0B658FC2F28D886B75DF18D212D /* Headers */, ); @@ -1786,169 +1759,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 2BF821D2760C912E8AB21AE0059F2E19 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 47C776FC4A5D9C0FE6E5541509E2B06E /* AddRef.swift in Sources */, - D14AF917AAA665B36A071D4272716548 /* Amb.swift in Sources */, - 8087E705CC00CA7C021AF6601E343C7B /* AnonymousDisposable.swift in Sources */, - FB241DBEEFCA95FE872EF4CD6623157A /* AnonymousInvocable.swift in Sources */, - A9EA920651EC47BDE57A5BAAD44EF55B /* AnonymousObservable.swift in Sources */, - ED97B464615625E0F41D4CFE8321AF1B /* AnonymousObserver.swift in Sources */, - AFA4B1D93CB3D6DC0AA571F54239C102 /* AnyObserver.swift in Sources */, - 08DB8704904133A00B55601FAD0A012F /* AsMaybe.swift in Sources */, - CECC009E42390657E216EAC1EDC6274C /* AsSingle.swift in Sources */, - AF816ABCF197AAB5DA7362510CBC36AF /* AsyncLock.swift in Sources */, - CAAA66DC11EF7A8AFC3F9E08689BE08A /* AsyncSubject.swift in Sources */, - F3C83071EFA9A3A1CEFD3DD9817AC887 /* Bag+Rx.swift in Sources */, - D32273245E8606A37F7600158C272C01 /* Bag.swift in Sources */, - 77CFCF08FC8EA9F7758207854CED1E55 /* BehaviorSubject.swift in Sources */, - 358C6A1EF83AAD32B9453D2A9E6D6AA1 /* BinaryDisposable.swift in Sources */, - 5D8999DD4665B8E0F332EEC6B75CD6CF /* BooleanDisposable.swift in Sources */, - 3330B1E49DA9623EA683C8808CCDAF2F /* Buffer.swift in Sources */, - 8E48DA9023ED9B9E18414F2827949056 /* Cancelable.swift in Sources */, - F46CAF4542DF0C7D5C7B62CB1AABD54B /* Catch.swift in Sources */, - 59FAD0BBD4C663C17F44B59EFCA2A982 /* CombineLatest+arity.swift in Sources */, - A0C03D1525E6CED9442AE65F080B12E2 /* CombineLatest+Collection.swift in Sources */, - 6E8DF9E210380F39D45784980A71822F /* CombineLatest.swift in Sources */, - 380776E07A38623224A8D296024B2C9F /* CompositeDisposable.swift in Sources */, - 8CBA48409C86D95E6C4ABF3B26B8D0B8 /* Concat.swift in Sources */, - 42B796D37251F4BCF59ADC3C56B0C05C /* ConcurrentDispatchQueueScheduler.swift in Sources */, - 9F5E6138A3FE1726687C407708C71B4F /* ConcurrentMainScheduler.swift in Sources */, - 9794085A02FC87CF773A9EFB60C40F78 /* ConnectableObservable.swift in Sources */, - CAA6C816B24605177BB40AA731710460 /* ConnectableObservableType.swift in Sources */, - 9BE2B48A0DE5CE3C3B4EAF39DA85A876 /* CurrentThreadScheduler.swift in Sources */, - 6D1A95ED4B8C56039BEA5CB0242D1B29 /* Debounce.swift in Sources */, - 1C7F09EA3B480077170395B01076A2CF /* Debug.swift in Sources */, - 1FBC620BCD08041C114EEC0A11DDF69D /* DefaultIfEmpty.swift in Sources */, - 0990CFB289EC7E60955ACCF0DE727364 /* Deferred.swift in Sources */, - F4D944E38AA9EEB0850C85C303E8E3C2 /* Delay.swift in Sources */, - 83EF434424E7664543A3087F24738083 /* DelaySubscription.swift in Sources */, - 7F04E0567A70E986129DD6C9E2B467F1 /* Deprecated.swift in Sources */, - A2215749D44CF8D1C3F40EBF3FDE3DBD /* DispatchQueue+Extensions.swift in Sources */, - 6A46A6E9EC3D5EBE6868B267874C7F75 /* DispatchQueueConfiguration.swift in Sources */, - 677791FD8851F4D960BD70AE613BBA14 /* Disposable.swift in Sources */, - EBC1F84329AD2225017D47F63D55CA77 /* Disposables.swift in Sources */, - C6696D7D4F90372F47C224F1687AB5D0 /* DisposeBag.swift in Sources */, - 5E74113E3B8562A64DB64EF45BCA52C9 /* DisposeBase.swift in Sources */, - 9BDE5D29C68F5622298CA4A54A2BCDD0 /* DistinctUntilChanged.swift in Sources */, - BC1C0A9BB7F0E803C621E106D2DD292B /* Do.swift in Sources */, - 03F3C06659D9C05E49701C68B2F368DB /* ElementAt.swift in Sources */, - 78EBCD44C7BC4E2AB3ED660E9CAECFBB /* Empty.swift in Sources */, - C8FF11576430A8FC899515C128F80A67 /* Error.swift in Sources */, - 1AC61C1EA2DF1703163518C3858684FC /* Errors.swift in Sources */, - 3F5958F756DADBE2D0850A0F17186CCE /* Event.swift in Sources */, - 2AF6E7F79209F1F5EC7E2928FBEABC64 /* Filter.swift in Sources */, - B6E8854A928CDD5A03A136A92BAFFDC6 /* Generate.swift in Sources */, - 2247209AAAE299B2C89F2CFC75D3490D /* GroupBy.swift in Sources */, - DF4F1845181D496D965AD3FFD6366CCE /* GroupedObservable.swift in Sources */, - D6315D7F0CC2C411BEC2097E2BEA7242 /* HistoricalScheduler.swift in Sources */, - 1B5CEAC4BA4628D84ED636748404D3E3 /* HistoricalSchedulerTimeConverter.swift in Sources */, - F0CA204303CD1FDCC9AE08D89B231BA8 /* ImmediateScheduler.swift in Sources */, - 0C963577F459E5A7F345D0FBD58E0A67 /* ImmediateSchedulerType.swift in Sources */, - 095B15AD34057F9AF7AF7DC0CD7CC6E5 /* InfiniteSequence.swift in Sources */, - FF4F2998C2F400957C309F52B81C8F25 /* InvocableScheduledItem.swift in Sources */, - A802DC058B09432DF8F56F89406CF4F3 /* InvocableType.swift in Sources */, - 569E360D93A0FCB66F506D87E9BA7759 /* Just.swift in Sources */, - 71AF173C50F15DA473F398350C6A5FED /* Lock.swift in Sources */, - 3DD39CA7E6E7BDADC4A4126FC3310FAC /* LockOwnerType.swift in Sources */, - BED10B12B35FCD3CA735FE8A3B65774A /* MainScheduler.swift in Sources */, - 6DEC6398861E6DCBB4D67813B1E75036 /* Map.swift in Sources */, - 8B192520AA37984CAF1D2D760A62307E /* Merge.swift in Sources */, - 951C065E37A9ED6736A9697B231AC365 /* Multicast.swift in Sources */, - 5EA93C9BD770ADB728BD2CFE4FF44DC7 /* Never.swift in Sources */, - 5377A1F2185BF5247D6BC1CE35827700 /* NopDisposable.swift in Sources */, - FF6798A03CC53C99950B31DE10942B90 /* Observable+Aggregate.swift in Sources */, - 99662A21FAA5C025E034AAA5428E8D63 /* Observable+Binding.swift in Sources */, - 42EBF5069D107883B2BAFC32E539345A /* Observable+Concurrency.swift in Sources */, - 8BAF2E7597F1559A99FFB9C4DBDD9279 /* Observable+Creation.swift in Sources */, - 5AA7F01B9354C3DD1AB37F4AE65A5F4E /* Observable+Debug.swift in Sources */, - 5207EF225F11ACDE1EBB58D61DB61014 /* Observable+Multiple.swift in Sources */, - AE2B4C3519BCF47ED52108E615A778DE /* Observable+Single.swift in Sources */, - 0A018C2159E3422F73CC243BE77CB879 /* Observable+StandardSequenceOperators.swift in Sources */, - 57BC884F6BD181585A0B6F7719A49E2B /* Observable+Time.swift in Sources */, - 7D6E4A9CA431CA9D7BAF04817FB59C61 /* Observable.swift in Sources */, - 889A7A900C61A4B93329387833E2C65B /* ObservableConvertibleType.swift in Sources */, - 7E0C22AADD7C94FAED4BA3FA5802EA11 /* ObservableType+Extensions.swift in Sources */, - 5209FF4069635478A47FC5F929C25812 /* ObservableType.swift in Sources */, - A41241F5F212D2959EE88A02DA4B8006 /* ObserveOn.swift in Sources */, - 7FF7CAC8360011983D8A150A70ECAB6B /* ObserveOnSerialDispatchQueue.swift in Sources */, - 0C59FF6E931F35DE452E544B4E9366E3 /* ObserverBase.swift in Sources */, - 4FF29AE3D6A968F4167A336AC81D6E0D /* ObserverType.swift in Sources */, - 2519514CB62A290340D6D2B43ECC1459 /* OperationQueueScheduler.swift in Sources */, - 84A730F255D8C54A7F8A020CAC048A5A /* Optional.swift in Sources */, - 7FB525438AD4F2FB899B71CE0FC1A059 /* Platform.Darwin.swift in Sources */, - 85A2F7602621DE3FBE64FE43DE060EA7 /* Platform.Linux.swift in Sources */, - 494C1BDAACA36787EE7312E98F2984CA /* PrimitiveSequence+Zip+arity.swift in Sources */, - 46507181FD708FCB8B9066F54D38F9D2 /* PrimitiveSequence.swift in Sources */, - 11C0C606C5CDBA15C8F0E1C06BEE3799 /* PriorityQueue.swift in Sources */, - F68A07679A05EFEF9BFDED2B37886513 /* Producer.swift in Sources */, - AB8322F9B396436A004AAEBD01BF3015 /* PublishSubject.swift in Sources */, - 7F56F52F0503DF86BAFA5E0245643804 /* Queue.swift in Sources */, - EFBF1BDB8CD460EA4A9610EF91C54928 /* Range.swift in Sources */, - 9EACF2968862DF9219BBE32011842CDF /* Reactive.swift in Sources */, - E442EEDE70730AB746DADBB7B509B070 /* RecursiveLock.swift in Sources */, - 1BE8F717FDCFA2CC8DC9318624D80952 /* RecursiveScheduler.swift in Sources */, - 03AEC3CDFC3EAC2C0366631AA17F0021 /* Reduce.swift in Sources */, - 54D22FC915545C2DBECC569A2763FA93 /* RefCount.swift in Sources */, - A8F15851A3BDF0B2474224E5776281DA /* RefCountDisposable.swift in Sources */, - 852BFFEC5A19EC92A4A72C7072E11224 /* Repeat.swift in Sources */, - 4105ADAD2C51D3E4230C170EA0EC6C5B /* ReplaySubject.swift in Sources */, - 4B69C82E603D53AC00B7733414B831A9 /* RetryWhen.swift in Sources */, - CC5DF94AD0EDC78D929C06C6E2AC1E95 /* Rx.swift in Sources */, - 0B02531D97A04A562AD8FEFE3075E528 /* RxMutableBox.swift in Sources */, - 576C8796EAC4084B6F49BFC5C839E9D1 /* RxSwift-dummy.m in Sources */, - 6CEB47895E9B0D9170C31591412A7490 /* Sample.swift in Sources */, - F8FDBDB785D58B00E3DD49EFD58CFA34 /* Scan.swift in Sources */, - 8EA651DF52CCAF3C7F7F8DFE3EBA4130 /* ScheduledDisposable.swift in Sources */, - 4BB5255894FF4DC65E495662590280B3 /* ScheduledItem.swift in Sources */, - F7DCEFB4AC63035A92A1A1361DAC5D12 /* ScheduledItemType.swift in Sources */, - B442B2E0FBC57B32C68E7F970A890863 /* SchedulerServices+Emulation.swift in Sources */, - 8F3401FDD9D855007B24BE4AB7C0FC04 /* SchedulerType.swift in Sources */, - 81B5B2FE5823C56C6B5E712BF392F1B4 /* Sequence.swift in Sources */, - 2C2579538078FA3F4F5945718C44ACB4 /* SerialDispatchQueueScheduler.swift in Sources */, - ED3B6D9F5F3F89371B6425AB21A42BD5 /* SerialDisposable.swift in Sources */, - 2B60F28247A564FD61AF32BB988582DD /* ShareReplay1.swift in Sources */, - 7743CB22A5AE8379D41C0BDA7FA85470 /* ShareReplay1WhileConnected.swift in Sources */, - 59CF390612B666999922B2F9B6032D43 /* SingleAssignmentDisposable.swift in Sources */, - 0EF1FE250F2BFFABD61D2918C76E2916 /* SingleAsync.swift in Sources */, - 29D6BFCA8351A8E55B3A9B9FBBBB316D /* Sink.swift in Sources */, - 338E1BFAB40B2106D7B32979145BBBF3 /* Skip.swift in Sources */, - 977E457DD1A321217C8A9CA0B1AC8C61 /* SkipUntil.swift in Sources */, - 69BDA19A850913A07F745502A2943BDA /* SkipWhile.swift in Sources */, - C7A9B35BE31DF4C7DE1082BB94D1E8F2 /* StartWith.swift in Sources */, - DCEB10616CAFEFE12B6D4F6A7DDBBFD4 /* String+Rx.swift in Sources */, - 6CE32532AE4F14383FC5987D2EFC594B /* SubjectType.swift in Sources */, - E4BC2475373C69F1F805A462F1CA469D /* SubscribeOn.swift in Sources */, - FE567BBF31C04A25708225C9DD0B3B3F /* SubscriptionDisposable.swift in Sources */, - 68EFC793F03DFFF389E88AA969A8BB70 /* Switch.swift in Sources */, - 2C75CE551E9FD25187BC830078E6DD59 /* SwitchIfEmpty.swift in Sources */, - 4193C34CAA37C733D8231452EBBE0A46 /* SynchronizedDisposeType.swift in Sources */, - D9ACDAE812F7F132507CBD9D783613D6 /* SynchronizedOnType.swift in Sources */, - 7F3021ED7A62270BBCA3F9A4C13285EA /* SynchronizedSubscribeType.swift in Sources */, - 96719B2401B89179B97BE8828702C730 /* SynchronizedUnsubscribeType.swift in Sources */, - 64E8CC7D517563FA0FE904F5917FE2E1 /* TailRecursiveSink.swift in Sources */, - 106520C21CE01A94879410E99DD37F47 /* Take.swift in Sources */, - ED270C801E50A979CD21211BD2685550 /* TakeLast.swift in Sources */, - 4DD7E070B3A0D803370EE6CCA28CCA63 /* TakeUntil.swift in Sources */, - AC5D1A3CC7602A05322EF0B0B7BF8B85 /* TakeWhile.swift in Sources */, - E88ABB06791F804707EA13EFF1BB714F /* Throttle.swift in Sources */, - 63B5A98D9EF3325EEF1F93ACFAB7DC39 /* Timeout.swift in Sources */, - 92805E4E337491904604FE86909924FA /* Timer.swift in Sources */, - 184571546F643ABB4ADDC1DAAB6FBE78 /* ToArray.swift in Sources */, - 1B4686F080E5DB31E0FDEC12AD725B0B /* Using.swift in Sources */, - 8C8CC54FC0B2BC4ACE282AD7EDE2CB6D /* Variable.swift in Sources */, - 3FA20C251DB09C90B6E357ED89B534D7 /* VirtualTimeConverterType.swift in Sources */, - BA6C45B6BC8AED9DCFC82D7CF7A8A929 /* VirtualTimeScheduler.swift in Sources */, - 12C4D8F003A5CAEC8FA3C7D03A4A1484 /* Window.swift in Sources */, - 1B3A98673592E3650381A338F20CA81A /* WithLatestFrom.swift in Sources */, - A2871C692E9B86522F46AA4100144621 /* Zip+arity.swift in Sources */, - C171A65415727D094B9AF634E1D172A8 /* Zip+Collection.swift in Sources */, - E63AC9803426E8646E59772DBED7864E /* Zip.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 32B9974868188C4803318E36329C87FE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2019,6 +1829,66 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BFA83558D5EAD45E880E89BCA3CA66B3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 122FFB4B36FA3F74072A453832F84ECE /* _RX.m in Sources */, + 3D693429A31AF334FE584D395D7E6133 /* _RXDelegateProxy.m in Sources */, + BA4E2E5784DFEA8CD5D09039B9B465A6 /* _RXKVOObserver.m in Sources */, + F9A083E8499E3D6FD016386EFF9077F1 /* _RXObjCRuntime.m in Sources */, + 601F21CBA959E531A349EB3E52FE995E /* Bag.swift in Sources */, + 355E3D24221C05473338AA2B0E9E613C /* ControlEvent+Driver.swift in Sources */, + 70B0A108A1AA2498B53B6247AB6B85F3 /* ControlEvent.swift in Sources */, + 7214838BF73F3401200344955729C789 /* ControlProperty+Driver.swift in Sources */, + 2ADDAE50C265B5025D0B1F9764BBD3AC /* ControlProperty.swift in Sources */, + E3D6E1B68331D777282FD8CEAA4F3625 /* ControlTarget.swift in Sources */, + 5639004CE97536B6FEA6EB60E83DE411 /* DelegateProxy.swift in Sources */, + F8F408461A74E2DD1C2F52EB5CE75DBC /* DelegateProxyType.swift in Sources */, + FCE19FE31F220BF73A655705230D794B /* Deprecated.swift in Sources */, + 4075D8C048D42B2CC057C53323F3F462 /* DispatchQueue+Extensions.swift in Sources */, + F3C6B978DDBCC0E699D26D119B572EAE /* Driver+Subscription.swift in Sources */, + 1D644164F050145109BA5D7BEE9614B4 /* Driver.swift in Sources */, + 7A5C24DD8864E48E6D43B8B98B594ADA /* InfiniteSequence.swift in Sources */, + D81001368F100460264962569F099802 /* KVORepresentable+CoreGraphics.swift in Sources */, + 61D1DF6515813E069AA2191EDA369286 /* KVORepresentable+Swift.swift in Sources */, + BB5641E2D7D16938833681670A55667A /* KVORepresentable.swift in Sources */, + 4F17B41C7A5D3F2A07AB16B08CECD9B7 /* Logging.swift in Sources */, + 879141B5825E41A5704D637BAFDD29AA /* NotificationCenter+Rx.swift in Sources */, + B25F18CA3C510C41288D907933124619 /* NSButton+Rx.swift in Sources */, + 1BE62ECDA4B3A8B13C8B78ACC98795E5 /* NSControl+Rx.swift in Sources */, + 86D3DBB91C4ABB6920ADB46B5E158E26 /* NSImageView+Rx.swift in Sources */, + B0D6D07A3329617011E4220080E157C0 /* NSLayoutConstraint+Rx.swift in Sources */, + 378839FF60B0284A71199E89C842E921 /* NSObject+Rx+KVORepresentable.swift in Sources */, + 85924B29E50F5745628090826F2D064F /* NSObject+Rx+RawRepresentable.swift in Sources */, + 6832ADBC0198335F7B502C7DA1F0ED98 /* NSObject+Rx.swift in Sources */, + D7681A76A0F47EEB17E16A5D28BD125D /* NSSlider+Rx.swift in Sources */, + 8552027632E115D6DAD1099C38090EAA /* NSTextField+Rx.swift in Sources */, + 53C65F51E7A47A1B14E324AF29A41AEF /* NSView+Rx.swift in Sources */, + 36CD88E2D2099581BC19D42048D158B2 /* Observable+Bind.swift in Sources */, + 911BEA57E7620828E28399C3CEC8C5B2 /* ObservableConvertibleType+Driver.swift in Sources */, + 21378D436C90D7B4D65D820281D159EA /* ObservableConvertibleType+SharedSequence.swift in Sources */, + 8F015FD16EE1580601B4856E795196FE /* Platform.Darwin.swift in Sources */, + A197AB07449327D4540308FF01BC3C54 /* Platform.Linux.swift in Sources */, + 92F332AD156F10CF4364BBDAD493FB29 /* PriorityQueue.swift in Sources */, + 61E61C4B8FD7BA59062CBE45764790E9 /* Queue.swift in Sources */, + 9709A18386118371F2831A6080BE1400 /* RecursiveLock.swift in Sources */, + C9C6EDFC3305BB433A24F269C643AEFF /* RxCocoa-dummy.m in Sources */, + EB58AE5225AEEA217C860F6D6E558E20 /* RxCocoa.swift in Sources */, + ACF6603E2EC6E8B13AC63123161CD195 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */, + 96A523A42595CFE0374C023A683B3753 /* RxTarget.swift in Sources */, + E034B9A4E3D86C8D49371909C2D49480 /* SectionedViewDataSourceType.swift in Sources */, + 51750A5B573347F29ECB252FD6F7B809 /* SharedSequence+Operators+arity.swift in Sources */, + 944C284C7390180088035BBE864823D0 /* SharedSequence+Operators.swift in Sources */, + 2708274C4337FB152E46FE16728C8704 /* SharedSequence.swift in Sources */, + DA1B86D493CD8111AFC476D0EEDD498A /* TextInput.swift in Sources */, + 7E4448CEDD753074D00755C6C8F71F0E /* UIBindingObserver.swift in Sources */, + F705D537791FF5B259AC2BED6619F784 /* URLSession+Rx.swift in Sources */, + EE8586A641E4CB0201D2563B1EEA6C41 /* Variable+Driver.swift in Sources */, + BA510AF8040C827F56166B707BE76626 /* Variable+SharedSequence.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C85081056E3DF73EFBB147D8F01CDE65 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2026,62 +1896,156 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E4683809F6E2E0E13A1DA3716D22762E /* Sources */ = { + D0CF4D1BE6AFAE220B3DC5CCA6988D1C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7A303312792E091ABAE7157A9FB83B23 /* _RX.m in Sources */, - A2E3CE14430670CE78113A4AA2282522 /* _RXDelegateProxy.m in Sources */, - 363C02C0DC1D05C96E4C99FA291EFDE1 /* _RXKVOObserver.m in Sources */, - 7CD1DD00190DB1ACA427120A0F54AAB5 /* _RXObjCRuntime.m in Sources */, - 9D6566D484F3BA80C9400E9DD202C281 /* Bag.swift in Sources */, - FC296F43271A48D9D4C58B5715C051D5 /* ControlEvent+Driver.swift in Sources */, - 15C09589084D116390E3B04BF3B026B6 /* ControlEvent.swift in Sources */, - A66A89FE5B6FC0BB454C391B22DA9E5D /* ControlProperty+Driver.swift in Sources */, - 8D12A35F60C0393445B793DBB638575D /* ControlProperty.swift in Sources */, - 8CE914272F3F97EA9F1568043975674A /* ControlTarget.swift in Sources */, - C779A6C734EA83712332BA6A13EFFE5C /* DelegateProxy.swift in Sources */, - 7841A7635F46B11A9A96F101CF5F4354 /* DelegateProxyType.swift in Sources */, - ECC084E104E80FB7345F76B6B0C15FAC /* DispatchQueue+Extensions.swift in Sources */, - 9B18C2229AEFC7674EF9795A7A77DCEB /* Driver+Subscription.swift in Sources */, - 27776D059250B2AEEA4FD883A98F18E2 /* Driver.swift in Sources */, - 3F68F1F5B35DB36E1D1A35AF93621DC0 /* InfiniteSequence.swift in Sources */, - 84CE2F3B9BC695F0B6E48B2D6405659F /* KVORepresentable+CoreGraphics.swift in Sources */, - 35413ADE5985AB5E408AF576A84B4C24 /* KVORepresentable+Swift.swift in Sources */, - A2CF744BF46B0F17DC6607F4D0D82944 /* KVORepresentable.swift in Sources */, - 33856730EE17C2CA1481049F1422FA6A /* Logging.swift in Sources */, - 39F610E5C7762C98378BF845AC774621 /* NotificationCenter+Rx.swift in Sources */, - 1012A309E82945C38EA9CA39444380DF /* NSButton+Rx.swift in Sources */, - 266E93ACE8FFB80FDF783822D630E927 /* NSControl+Rx.swift in Sources */, - E16B1A45A5741C6A98DFAE5C24764F55 /* NSImageView+Rx.swift in Sources */, - 4A4C1E2799F10F07FD0349A686041EC3 /* NSLayoutConstraint+Rx.swift in Sources */, - D9ED1A4C6F894B1DC0298C280C8056EB /* NSObject+Rx+KVORepresentable.swift in Sources */, - 625FB12932BD111CA0CB053F2820F15A /* NSObject+Rx+RawRepresentable.swift in Sources */, - B0C1DEAEF59617FD104B45651A9E02E7 /* NSObject+Rx.swift in Sources */, - 2E3A8BCE3E4D9114ABCBB4D7966812A8 /* NSSlider+Rx.swift in Sources */, - 06067FEB1AB279D49A3F16553693D98C /* NSTextField+Rx.swift in Sources */, - 6670B050A7427F9C7393AB5D8D2E26FC /* NSView+Rx.swift in Sources */, - 46661BD5FD35D16A1D72B05C32BA4805 /* Observable+Bind.swift in Sources */, - F22B5B760326351832F4648F432136D8 /* ObservableConvertibleType+Driver.swift in Sources */, - 98FBAAEB02A3A0CAA335BD31829CF985 /* ObservableConvertibleType+SharedSequence.swift in Sources */, - E95C2409BDE4CB6BA371A54DD05D7996 /* Platform.Darwin.swift in Sources */, - CAFB60F384AE9659EDB5D377F5D183F9 /* Platform.Linux.swift in Sources */, - 4811AC35475C767F778C6E3B68648F94 /* PriorityQueue.swift in Sources */, - 451920991DC451B2676E9A139C857DD2 /* Queue.swift in Sources */, - ACA9C9D1223FED43AAE8C8130225DCCF /* RecursiveLock.swift in Sources */, - B6FE3D84E41A57384175035BC92ABEAA /* RxCocoa-dummy.m in Sources */, - 6D71A4D5D45590A99D42928E14133A61 /* RxCocoa.swift in Sources */, - 8AE3D3F02C4FC2EB6A10602D6A18A234 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */, - D5A9F983227BEB62BCA37F568897987C /* RxTarget.swift in Sources */, - C733DF41496B0364EF379F77068B4367 /* SectionedViewDataSourceType.swift in Sources */, - 17848AD97F24126359BC05C4E675F0A4 /* SharedSequence+Operators+arity.swift in Sources */, - 07147440201D62C544F94526CA96A5C3 /* SharedSequence+Operators.swift in Sources */, - 5AB880D9ADA38379AE40B94C492D6541 /* SharedSequence.swift in Sources */, - 3ABDC8F6AC096D1B402D23DDE0DA663D /* TextInput.swift in Sources */, - 2FBF7BF077F416DB8C7C99AEAD139F9B /* UIBindingObserver.swift in Sources */, - 69E55ABC7A2FD0420B1F5DB3172B10E1 /* URLSession+Rx.swift in Sources */, - 9676160A622D6A1E0ED9A304D56E9E0B /* Variable+Driver.swift in Sources */, - BA54F883C123CBEDD90E739B2B2ACCAE /* Variable+SharedSequence.swift in Sources */, + 3D31990DAC7D206A8CED0E166967345E /* AddRef.swift in Sources */, + 52FC9AD6D1323BBDE4D458D780833850 /* Amb.swift in Sources */, + FF59638AD925FD4B1E22F7CB3B404881 /* AnonymousDisposable.swift in Sources */, + 2BC4A1BBB3CF1E3736359EAC2557EBA1 /* AnonymousInvocable.swift in Sources */, + CA811C461085BCD75D8B606661C2AD73 /* AnonymousObserver.swift in Sources */, + 1824713806488E78A33A48AA7BE85A2C /* AnyObserver.swift in Sources */, + AF134CF20F447E0E0DAC073D73C7F86A /* AsMaybe.swift in Sources */, + 237C447BF6FCA534AB4A2F91BA2731E5 /* AsSingle.swift in Sources */, + A7FAD159116F1DBA5CD6E7B990C9A303 /* AsyncLock.swift in Sources */, + 61C12CE6D79EB6A96AF17AABAFEDCBDC /* AsyncSubject.swift in Sources */, + 799FF40352661DDA83AC794E9C604783 /* Bag+Rx.swift in Sources */, + 9FA23568E21FB2B69B69DE816F0D8015 /* Bag.swift in Sources */, + 3614DA072E285FBA231AAE506DD00722 /* BehaviorSubject.swift in Sources */, + 6B0F3785D9AE93550ADA347C926ADB1D /* BinaryDisposable.swift in Sources */, + 00D5F4580CB36DEEDCD9993C7AB12FC6 /* BooleanDisposable.swift in Sources */, + 437FA9F525690A3F247B254130EA26C8 /* Buffer.swift in Sources */, + AA3DEE3C7E1A806E5946C2BC01893808 /* Cancelable.swift in Sources */, + 12AAA6C1CF57638AE521DCE56BED0135 /* Catch.swift in Sources */, + 8B61FFE12CF61FE5504472C344A1ED1A /* CombineLatest+arity.swift in Sources */, + 10B733D4847215A070C8DA610FEB341A /* CombineLatest+Collection.swift in Sources */, + 1F1B7F5EA399508BB5091B36C1C95671 /* CombineLatest.swift in Sources */, + 264617822F4D99335F47F6AFF80253BF /* Completable+AndThen.swift in Sources */, + 58FD6898891A4D0E7D0E32043FB71976 /* CompositeDisposable.swift in Sources */, + 823CA45387E1BBB3CB7D29B91B7FA1A2 /* Concat.swift in Sources */, + 977A3E71BC55F13D5D4D924BBA878872 /* ConcurrentDispatchQueueScheduler.swift in Sources */, + 6EB4C5113BBA1A69F56A6BC63B6E62D3 /* ConcurrentMainScheduler.swift in Sources */, + F0B96041A73DA23E9D262BA15C170D01 /* ConnectableObservableType.swift in Sources */, + E630F719F45F55F60395139F462151E2 /* Create.swift in Sources */, + EEAC0241CA98FB00547A1FD43393919F /* CurrentThreadScheduler.swift in Sources */, + 3D56193C6790214CE39FA76DDD3CF8D2 /* Debounce.swift in Sources */, + F312C5B4C0D22FF4F993AF7F797EE199 /* Debug.swift in Sources */, + 4DC0FAD6E6A6615179C8AA7C5E2862F7 /* DefaultIfEmpty.swift in Sources */, + 9BCCF2D457FCA3F9A7688DC599FD32F1 /* Deferred.swift in Sources */, + 688BFF2000657BAADD192CA92249705A /* Delay.swift in Sources */, + 42A2F56A949ADB27CDF4ACEF31A84EB7 /* DelaySubscription.swift in Sources */, + DE68B3E9BA04A5DEA59697E2828E90A8 /* Dematerialize.swift in Sources */, + F2FD100BE6F84972590D979D42ED4FC4 /* Deprecated.swift in Sources */, + DCE20142AF8D357B7CCEBBE021148310 /* DispatchQueue+Extensions.swift in Sources */, + F9A0498BD9162FE8DB33FEC0C34799B2 /* DispatchQueueConfiguration.swift in Sources */, + 3E535F38140F4E1ECFB098340836F763 /* Disposable.swift in Sources */, + BA465CDF798AEFDE90A8C0CAAA1B1098 /* Disposables.swift in Sources */, + 97D7D5D14D02DDB584E54BA9878242AC /* DisposeBag.swift in Sources */, + 7390ED4DE06437338430EB83AF3BD56C /* DisposeBase.swift in Sources */, + FBA9A81E2370D564461112665A0C3B6A /* DistinctUntilChanged.swift in Sources */, + 8BA67E4A4F689245492734AEAA8D6529 /* Do.swift in Sources */, + 3C808C81AACAA8641399DA9AA95C0F71 /* ElementAt.swift in Sources */, + 5E38136ECF2487CEB1671D6D231E3F5F /* Empty.swift in Sources */, + B8580D2CE60303378BFD4FBA2C6F23A7 /* Error.swift in Sources */, + 4CF21399A46B77C62FF0342B6719FCCC /* Errors.swift in Sources */, + 6979DCB69E7266EC39F06DDB6D7D1EF1 /* Event.swift in Sources */, + 59FA89429C44FFFC10AE0FED40033C74 /* Filter.swift in Sources */, + 4A08159FBFDD0D49A7E097D1A6D8ED1C /* Generate.swift in Sources */, + CE270F335D051643A45CCD09FD203831 /* GroupBy.swift in Sources */, + 74A825BD416A174CCCC55B0824EF2E05 /* GroupedObservable.swift in Sources */, + 2A2F65DFD1EE779D4F51A48FFD66C197 /* HistoricalScheduler.swift in Sources */, + D7B87735E689DBF9F8CA42227B8E6B88 /* HistoricalSchedulerTimeConverter.swift in Sources */, + BCB03A46BA9CA1A4D1A7539B2D6E5E1E /* ImmediateScheduler.swift in Sources */, + A8BA41C1262C1E9B84D4F744E00AF0E5 /* ImmediateSchedulerType.swift in Sources */, + F5C76B37D1C8E6738569F7AA3D40F916 /* InfiniteSequence.swift in Sources */, + 0E647DAEE0FA9B09AB44F2FC7F783AF6 /* InvocableScheduledItem.swift in Sources */, + 41F5717673BC090472587250F4A7BDFF /* InvocableType.swift in Sources */, + 1C12866E3E74BE6F0513E46B48ECE1D7 /* Just.swift in Sources */, + 8B66C13BF2C26F4C8E16368CC951B78A /* Lock.swift in Sources */, + CCEDF6CBEF930200FC7775BA39573BD6 /* LockOwnerType.swift in Sources */, + 28B9D3AD37C41CA2B5B954BC3F2A4CD2 /* MainScheduler.swift in Sources */, + CD66165D619F2CFA447BB599817305F1 /* Map.swift in Sources */, + 3867C0C197045398134BE70D72B7A1EA /* Materialize.swift in Sources */, + 0EEDED92446E48374613587144395686 /* Merge.swift in Sources */, + 334670C40333B0360D97D38097EB5A8C /* Multicast.swift in Sources */, + A1F4FEACF258A06986DEFA39C9FC32C4 /* Never.swift in Sources */, + 92E02A303BB54BDFAED85930F2EC67A1 /* NopDisposable.swift in Sources */, + 974D6C91F4DAF42C50352A2B1FD5BA36 /* Observable.swift in Sources */, + 380B25054F2B7FCFE08A5228DA847BAB /* ObservableConvertibleType.swift in Sources */, + 659014230849E812C6185A976081B37C /* ObservableType+Extensions.swift in Sources */, + BCEDD2079F8697D75351BD8880AB5F5E /* ObservableType.swift in Sources */, + 0831DDBAFF287B622A0E7BF2F07067EC /* ObserveOn.swift in Sources */, + A6E3B7DAEEAC86F5517E5B10349EF854 /* ObserverBase.swift in Sources */, + 260C370245B63D4004DADF4D24E3BD00 /* ObserverType.swift in Sources */, + 300708DF4452315A732C36A381100EF6 /* OperationQueueScheduler.swift in Sources */, + F1409EACFA70BFBB14D0661A2A64A086 /* Optional.swift in Sources */, + 5E167DB5B613ACD8F7823C48F73EBDB5 /* Platform.Darwin.swift in Sources */, + 6C5CC1496F30D2247B546F3867DFD342 /* Platform.Linux.swift in Sources */, + 6AA46000C79ED789B70D7B35743D5AD5 /* PrimitiveSequence+Zip+arity.swift in Sources */, + 087BC98FF9D82DC970EFDBEC0EB2F630 /* PrimitiveSequence.swift in Sources */, + 599AEBFAB1C1C451709CC28400BA7460 /* PriorityQueue.swift in Sources */, + 24DE12FB296FE104885D22B0F0D73E5C /* Producer.swift in Sources */, + ED04D176C26F6B4DEE23810B8B7119B0 /* PublishSubject.swift in Sources */, + C1E7BF810B8A08D68980DEF88FB818AC /* Queue.swift in Sources */, + E93BDF607D1A682D01B2DDBC0E99859A /* Range.swift in Sources */, + FAAEF6075FA56D6420B259CB55DE44CD /* Reactive.swift in Sources */, + D98FC1E3FC63DFDC89218E02603C0531 /* RecursiveLock.swift in Sources */, + BB397F55B0307FEDE4828D0092658075 /* RecursiveScheduler.swift in Sources */, + 0C2489F5F28E8C78A5C0F2ACC9417BB8 /* Reduce.swift in Sources */, + FA47B9CD9D97967860D670B13698860B /* RefCountDisposable.swift in Sources */, + C364D9BE7F85D4001B8E8F1C6EF4B1CA /* Repeat.swift in Sources */, + DD44780BE73F9964BC370A525CC14E25 /* ReplaySubject.swift in Sources */, + CA01E0AE4F5FE45BB3AA2E55D99816F6 /* RetryWhen.swift in Sources */, + 221FE7E633BA09E8BF6B4B2FB9470EED /* Rx.swift in Sources */, + D568BE9017C4ABC2EBC93B55568FA818 /* RxMutableBox.swift in Sources */, + 02AF6FE5E8DEE90F98111F7EA2A3C4E0 /* RxSwift-dummy.m in Sources */, + 8BA0EF598E6008B8E127F20CD5871EA8 /* Sample.swift in Sources */, + E5055E923CCD18C703DD0464379D5075 /* Scan.swift in Sources */, + FEB827276214371B67B303805489B87A /* ScheduledDisposable.swift in Sources */, + 15D984826F02EEAFBC745BD8AA44630A /* ScheduledItem.swift in Sources */, + 9487C01FE68F38908090961512AA41CE /* ScheduledItemType.swift in Sources */, + 685F29779740C956045776AE4D4E8365 /* SchedulerServices+Emulation.swift in Sources */, + 2D5E4C0C7C41AFECCAFFA9121A346A3B /* SchedulerType.swift in Sources */, + 43CA37C05E91E1511246D5A99ED30AA5 /* Sequence.swift in Sources */, + D6E2F0BAD0C15F29CBEA69E2A6B78DA2 /* SerialDispatchQueueScheduler.swift in Sources */, + 07CC568506C88350F3D06C8D5E01FBE3 /* SerialDisposable.swift in Sources */, + A63F9CB6A170CE00FBD441E79DCCEE49 /* ShareReplayScope.swift in Sources */, + C47548C9A021ACE578E56C5825C7049F /* SingleAssignmentDisposable.swift in Sources */, + 0093F7D38FC7D85465CC3D99E967DEBD /* SingleAsync.swift in Sources */, + A68383D073B808A27671BDECBC6A670F /* Sink.swift in Sources */, + 548EB267AD5A7FD7AC26FAAD9C2DA7AE /* Skip.swift in Sources */, + C672608508D0E7C39889E96D744F48A0 /* SkipUntil.swift in Sources */, + DA3CF2B75F35BF67169C4A938A21526A /* SkipWhile.swift in Sources */, + E925A3CA1CEE77BDCB0CE04E46FA9EB8 /* StartWith.swift in Sources */, + D504CD5DE30A8ECF7B12BAD77637E8C5 /* String+Rx.swift in Sources */, + C24B87BB347D484FE80D05B81B7BA225 /* SubjectType.swift in Sources */, + 4D634321FD0AC2411D399AF0CD21D19B /* SubscribeOn.swift in Sources */, + 1053278298D8F300576B4D665571E9AE /* SubscriptionDisposable.swift in Sources */, + 30DF48D3434CB214CB0A8DC882B57CE8 /* Switch.swift in Sources */, + 8BCC39E8753AAD1634783813630FC556 /* SwitchIfEmpty.swift in Sources */, + 99E95AAEC050D49A770629AA6B398C6D /* SynchronizedDisposeType.swift in Sources */, + 576947974CE51E704014B05BD610775C /* SynchronizedOnType.swift in Sources */, + 079EF148723928859C047C3138DE0803 /* SynchronizedSubscribeType.swift in Sources */, + 28F9B941634C8440F300448D8F5802A2 /* SynchronizedUnsubscribeType.swift in Sources */, + 31FFC304499832DF396AEBD4FE47FD41 /* TailRecursiveSink.swift in Sources */, + 034E2CE53A5F556A85666E0818BF3717 /* Take.swift in Sources */, + 81E3BA0A338814CAD1C95B57433B36B3 /* TakeLast.swift in Sources */, + 224087BC52D59C54611FDC38839F2D33 /* TakeUntil.swift in Sources */, + 7D2E2372D60114EADF213080223E23D5 /* TakeWhile.swift in Sources */, + 1F3245B199B67151AD148F2697312170 /* Throttle.swift in Sources */, + E8C85C07DF36B6274953F0D8C3BD0771 /* Timeout.swift in Sources */, + A295CF7A971C3F7D7E80AF27D4CEEB3E /* Timer.swift in Sources */, + E15C2441B7387415553D7A7C0BEEFF87 /* ToArray.swift in Sources */, + 382B5A192325665D099B202F758D765C /* Using.swift in Sources */, + 267EA57772E03E12F78E25D3AF60616F /* Variable.swift in Sources */, + 7F1D21D9C2B4DF301EF96533DF2A1FBE /* VirtualTimeConverterType.swift in Sources */, + 327528E493914C52BB5D9C6588E46619 /* VirtualTimeScheduler.swift in Sources */, + 1406A68843A0616DE9575C7F1B318023 /* Window.swift in Sources */, + ADEA4A10E5631586E27024F5D6478641 /* WithLatestFrom.swift in Sources */, + 7C4028F18BB20A49E0C8E8DC7C07765F /* Zip+arity.swift in Sources */, + 930C2D40D19017E7D8FFA0543F0DB97B /* Zip+Collection.swift in Sources */, + 66A31FDD5EFC2321BC1A3AE5D97C0D36 /* Zip.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2203,7 +2167,7 @@ }; 46A3C7E91154C2330969A66B9480072A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8C5EB810D1464D5BE86A414DC08616 /* MASShortcut.xcconfig */; + baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2282,7 +2246,7 @@ }; 4B824F36959F7509C6EADD5D7C0BBF70 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8C5EB810D1464D5BE86A414DC08616 /* MASShortcut.xcconfig */; + baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2317,7 +2281,7 @@ }; 4C8680BBF2C4646A883AEB692C45DD0D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3261881064E033A3711EA27CE78524FC /* RxSwift.xcconfig */; + baseConfigurationReference = 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2345,7 +2309,7 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2353,7 +2317,7 @@ }; 4EE6FA9CE312F9796EF2038BF1B9BC03 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D6CBB4BD325445F86290A6A3E27E8B45 /* Alamofire.xcconfig */; + baseConfigurationReference = 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2389,7 +2353,7 @@ }; 7AECFCD77D8667B289BE7C6B62D614A5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D6CBB4BD325445F86290A6A3E27E8B45 /* Alamofire.xcconfig */; + baseConfigurationReference = 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2425,7 +2389,7 @@ }; 7F85541659A067CF326B2DF15039555D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8C5EB810D1464D5BE86A414DC08616 /* MASShortcut.xcconfig */; + baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; @@ -2508,7 +2472,7 @@ }; A874781789BD2BC39A2EEBE7AA84D7D7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3261881064E033A3711EA27CE78524FC /* RxSwift.xcconfig */; + baseConfigurationReference = 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2536,7 +2500,7 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2544,7 +2508,7 @@ }; ADE16BF5D9415B20062C86CEE527EAD8 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1255CE4EF584F1227FCFE877388965BE /* GCDWebServer.xcconfig */; + baseConfigurationReference = A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2619,7 +2583,7 @@ }; C47912F2809D7A6562A6FB5F738EA705 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1255CE4EF584F1227FCFE877388965BE /* GCDWebServer.xcconfig */; + baseConfigurationReference = A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2703,7 +2667,7 @@ }; CBD587DEE79227D0D9EAEE32BD70E73A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C5B2560C6A7D9250831A76E33D926588 /* RxCocoa.xcconfig */; + baseConfigurationReference = 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2731,7 +2695,7 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2776,7 +2740,7 @@ }; E408EB62CC8A2272E3D5D347991F240D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C5B2560C6A7D9250831A76E33D926588 /* RxCocoa.xcconfig */; + baseConfigurationReference = 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2804,7 +2768,7 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2812,7 +2776,7 @@ }; F0EA07314D673F0102E08D1AE900D484 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 797084A009F9EF151DBBF73DD026ADC6 /* BRLOptionParser.xcconfig */; + baseConfigurationReference = EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2837,7 +2801,7 @@ }; F1B067679E8618A86DA283BCD4698C6D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8C5EB810D1464D5BE86A414DC08616 /* MASShortcut.xcconfig */; + baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; @@ -2856,7 +2820,7 @@ }; F72F4F6D8102F41B7F5F58FE0DA7FDAD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 797084A009F9EF151DBBF73DD026ADC6 /* BRLOptionParser.xcconfig */; + baseConfigurationReference = EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; diff --git a/Pods/RxCocoa/Platform/RecursiveLock.swift b/Pods/RxCocoa/Platform/RecursiveLock.swift index 10b9bbb0..c03471d5 100644 --- a/Pods/RxCocoa/Platform/RecursiveLock.swift +++ b/Pods/RxCocoa/Platform/RecursiveLock.swift @@ -6,7 +6,7 @@ // Copyright © 2016 Krunoslav Zaher. All rights reserved. // -import Foundation +import class Foundation.NSRecursiveLock #if TRACE_RESOURCES class RecursiveLock: NSRecursiveLock { diff --git a/Pods/RxCocoa/README.md b/Pods/RxCocoa/README.md index dce9a230..bdf8a2ba 100644 --- a/Pods/RxCocoa/README.md +++ b/Pods/RxCocoa/README.md @@ -3,12 +3,6 @@ [![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) -## About Rx - -**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0.** - -**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch.** - Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable` interface. This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET). @@ -27,7 +21,7 @@ KVO observing, async operations and streams are all unified under [abstraction o * [why use rx?](Documentation/Why.md) * [the basics, getting started with RxSwift](Documentation/GettingStarted.md) -* [units](Documentation/Units.md) - what is `Driver`, `ControlProperty`, and `Variable` ... and why do they exist? +* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, `ControlProperty`, and `Variable` ... and why do they exist? * [testing](Documentation/UnitTests.md) * [tips and common errors](Documentation/Tips.md) * [debugging](Documentation/GettingStarted.md#debugging) @@ -81,11 +75,10 @@ KVO observing, async operations and streams are all unified under [abstraction o let searchResults = searchBar.rx.text.orEmpty .throttle(0.3, scheduler: MainScheduler.instance) .distinctUntilChanged() - .flatMapLatest { query -> Observable<[Repository]> in + .flatMapLatest { query -> Observable<[Repository]> in if query.isEmpty { return .just([]) } - return searchGitHub(query) .catchErrorJustReturn([]) } @@ -97,7 +90,7 @@ let searchResults = searchBar.rx.text.orEmpty
 searchResults
-    .bindTo(tableView.rx.items(cellIdentifier: "Cell")) {
+    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) {
         (index, repository: Repository, cell) in
         cell.textLabel?.text = repository.name
         cell.detailTextLabel?.text = repository.url
@@ -111,6 +104,7 @@ searchResults
 
 * Xcode 8.0
 * Swift 3.0
+* Swift 2.3 ([use `rxswift-2.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) instead)
 
 ## Installation
 
@@ -184,6 +178,12 @@ let package = Package(
 $ swift build
 ```
 
+To build or test a module with RxTest dependency, set `TEST=1`. ([RxSwift >= 3.4.2](https://github.com/ReactiveX/RxSwift/releases/tag/3.4.2))
+
+```bash
+$ TEST=1 swift test
+```
+
 ### Manually using git submodules
 
 * Add RxSwift as a submodule
@@ -200,6 +200,8 @@ $ git submodule add git@github.com:ReactiveX/RxSwift.git
 
 * [http://reactivex.io/](http://reactivex.io/)
 * [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)
+* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift)
+* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)
 * [Erik Meijer (Wikipedia)](http://en.wikipedia.org/wiki/Erik_Meijer_%28computer_scientist%29)
 * [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)
 * [Reactive Programming Overview (Jafar Husain from Netflix)](https://www.youtube.com/watch?v=dwP1TNXE6fc)
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift b/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift
deleted file mode 100644
index 8c4ec23f..00000000
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift
+++ /dev/null
@@ -1,350 +0,0 @@
-// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project 
-//
-//  SharedSequence+Operators+arity.swift
-//  RxCocoa
-//
-//  Created by Krunoslav Zaher on 10/14/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-#if !RX_NO_MODULE
-import RxSwift
-#endif
-
-
-
-// 2
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
-
-// 3
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
-
-// 4
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
-
-// 5
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
-
-// 6
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy,
-            O1.SharingStrategy == O6.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy,
-            O1.SharingStrategy == O6.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
-
-// 7
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy,
-            O1.SharingStrategy == O6.SharingStrategy,
-            O1.SharingStrategy == O7.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy,
-            O1.SharingStrategy == O6.SharingStrategy,
-            O1.SharingStrategy == O7.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
-
-// 8
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func zip
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy,
-            O1.SharingStrategy == O6.SharingStrategy,
-            O1.SharingStrategy == O7.SharingStrategy,
-            O1.SharingStrategy == O8.SharingStrategy {
-        let source = Observable.zip(
-            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),
-            resultSelector: resultSelector
-        )
-
-        return SharedSequence(source)
-    }
-}
-
-extension SharedSequence {
-    /**
-    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-    */
-    public static func combineLatest
-        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)
-        -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy,
-            O1.SharingStrategy == O3.SharingStrategy,
-            O1.SharingStrategy == O4.SharingStrategy,
-            O1.SharingStrategy == O5.SharingStrategy,
-            O1.SharingStrategy == O6.SharingStrategy,
-            O1.SharingStrategy == O7.SharingStrategy,
-            O1.SharingStrategy == O8.SharingStrategy {
-        let source = Observable.combineLatest(
-                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),
-                resultSelector: resultSelector
-            )
-
-        return SharedSequence(source)
-    }
-}
-
-
diff --git a/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift b/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift
index 7766bd69..f964784b 100644
--- a/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift
+++ b/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift
@@ -253,8 +253,8 @@ extension DelegateProxyType {
                     
                 return Disposables.create { [weak object] in
                     subscription.dispose()
-                    unregisterDelegate.dispose()
                     object?.layoutIfNeeded()
+                    unregisterDelegate.dispose()
                 }
             }
         }
diff --git a/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift b/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift
index 378c177d..79184445 100644
--- a/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift
+++ b/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift
@@ -7,7 +7,7 @@
 //
 
 #if !RX_NO_MODULE
-import RxSwift
+    import RxSwift
 #endif
 
 extension ObservableType {
@@ -18,10 +18,10 @@ extension ObservableType {
     In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables
     writing more consistent binding code.
     
-    - parameter observer: Observer that receives events.
+    - parameter to: Observer that receives events.
     - returns: Disposable object that can be used to unsubscribe the observer.
     */
-    public func bindTo(_ observer: O) -> Disposable where O.E == E {
+    public func bind(to observer: O) -> Disposable where O.E == E {
         return self.subscribe(observer)
     }
 
@@ -31,10 +31,10 @@ extension ObservableType {
      In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables
      writing more consistent binding code.
 
-     - parameter observer: Observer that receives events.
+     - parameter to: Observer that receives events.
      - returns: Disposable object that can be used to unsubscribe the observer.
      */
-    public func bindTo(_ observer: O) -> Disposable where O.E == E? {
+    public func bind(to observer: O) -> Disposable where O.E == E? {
         return self.map { $0 }.subscribe(observer)
     }
 
@@ -44,10 +44,10 @@ extension ObservableType {
     In case error occurs in debug mode, `fatalError` will be raised.
     In case error occurs in release mode, `error` will be logged.
 
-    - parameter variable: Target variable for sequence elements.
+    - parameter to: Target variable for sequence elements.
     - returns: Disposable object that can be used to unsubscribe the observer.
     */
-    public func bindTo(_ variable: Variable) -> Disposable {
+    public func bind(to variable: Variable) -> Disposable {
         return subscribe { e in
             switch e {
             case let .next(element):
@@ -71,20 +71,20 @@ extension ObservableType {
      In case error occurs in debug mode, `fatalError` will be raised.
      In case error occurs in release mode, `error` will be logged.
 
-     - parameter variable: Target variable for sequence elements.
+     - parameter to: Target variable for sequence elements.
      - returns: Disposable object that can be used to unsubscribe the observer.
      */
-    public func bindTo(_ variable: Variable) -> Disposable {
-        return self.map { $0 as E? }.bindTo(variable)
+    public func bind(to variable: Variable) -> Disposable {
+        return self.map { $0 as E? }.bind(to: variable)
     }
     
     /**
     Subscribes to observable sequence using custom binder function.
     
-    - parameter binder: Function used to bind elements from `self`.
+    - parameter to: Function used to bind elements from `self`.
     - returns: Object representing subscription.
     */
-    public func bindTo(_ binder: (Self) -> R) -> R {
+    public func bind(to binder: (Self) -> R) -> R {
         return binder(self)
     }
 
@@ -92,15 +92,15 @@ extension ObservableType {
     Subscribes to observable sequence using custom binder function and final parameter passed to binder function
     after `self` is passed.
     
-        public func bindTo(binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {
+        public func bind(to binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {
             return binder(self)(curriedArgument)
         }
     
-    - parameter binder: Function used to bind elements from `self`.
+    - parameter to: Function used to bind elements from `self`.
     - parameter curriedArgument: Final argument passed to `binder` to finish binding process.
     - returns: Object representing subscription.
     */
-    public func bindTo(_ binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {
+    public func bind(to binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {
          return binder(self)(curriedArgument)
     }
     
@@ -114,7 +114,7 @@ extension ObservableType {
     - parameter onNext: Action to invoke for each element in the observable sequence.
     - returns: Subscription object used to unsubscribe from the observable sequence.
     */
-    public func bindNext(_ onNext: @escaping (E) -> Void) -> Disposable {
+    public func bind(onNext: @escaping (E) -> Void) -> Disposable {
         return subscribe(onNext: onNext, onError: { error in
             let error = "Binding error: \(error)"
             #if DEBUG
diff --git a/Pods/RxCocoa/RxCocoa/Deprecated.swift b/Pods/RxCocoa/RxCocoa/Deprecated.swift
new file mode 100644
index 00000000..d4b4ae0e
--- /dev/null
+++ b/Pods/RxCocoa/RxCocoa/Deprecated.swift
@@ -0,0 +1,134 @@
+//
+//  Deprecated.swift
+//  RxCocoa
+//
+//  Created by Krunoslav Zaher on 3/19/17.
+//  Copyright © 2017 Krunoslav Zaher. All rights reserved.
+//
+
+#if !RX_NO_MODULE
+    import RxSwift
+#endif
+
+extension ObservableType {
+
+    /**
+     Creates new subscription and sends elements to observer.
+
+     In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables
+     writing more consistent binding code.
+
+     - parameter observer: Observer that receives events.
+     - returns: Disposable object that can be used to unsubscribe the observer.
+     */
+    @available(*, deprecated, renamed: "bind(to:)")
+    public func bindTo(_ observer: O) -> Disposable where O.E == E {
+        return self.subscribe(observer)
+    }
+
+    /**
+     Creates new subscription and sends elements to observer.
+
+     In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables
+     writing more consistent binding code.
+
+     - parameter observer: Observer that receives events.
+     - returns: Disposable object that can be used to unsubscribe the observer.
+     */
+    @available(*, deprecated, renamed: "bind(to:)")
+    public func bindTo(_ observer: O) -> Disposable where O.E == E? {
+        return self.map { $0 }.subscribe(observer)
+    }
+
+    /**
+     Creates new subscription and sends elements to variable.
+
+     In case error occurs in debug mode, `fatalError` will be raised.
+     In case error occurs in release mode, `error` will be logged.
+
+     - parameter variable: Target variable for sequence elements.
+     - returns: Disposable object that can be used to unsubscribe the observer.
+     */
+    @available(*, deprecated, renamed: "bind(to:)")
+    public func bindTo(_ variable: Variable) -> Disposable {
+        return subscribe { e in
+            switch e {
+            case let .next(element):
+                variable.value = element
+            case let .error(error):
+                let error = "Binding error to variable: \(error)"
+                #if DEBUG
+                    rxFatalError(error)
+                #else
+                    print(error)
+                #endif
+            case .completed:
+                break
+            }
+        }
+    }
+
+    /**
+     Creates new subscription and sends elements to variable.
+
+     In case error occurs in debug mode, `fatalError` will be raised.
+     In case error occurs in release mode, `error` will be logged.
+
+     - parameter variable: Target variable for sequence elements.
+     - returns: Disposable object that can be used to unsubscribe the observer.
+     */
+    @available(*, deprecated, renamed: "bind(to:)")
+    public func bindTo(_ variable: Variable) -> Disposable {
+        return self.map { $0 as E? }.bindTo(variable)
+    }
+
+    /**
+     Subscribes to observable sequence using custom binder function.
+
+     - parameter binder: Function used to bind elements from `self`.
+     - returns: Object representing subscription.
+     */
+    @available(*, deprecated, renamed: "bind(to:)")
+    public func bindTo(_ binder: (Self) -> R) -> R {
+        return binder(self)
+    }
+
+    /**
+     Subscribes to observable sequence using custom binder function and final parameter passed to binder function
+     after `self` is passed.
+
+     public func bindTo(binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {
+     return binder(self)(curriedArgument)
+     }
+
+     - parameter binder: Function used to bind elements from `self`.
+     - parameter curriedArgument: Final argument passed to `binder` to finish binding process.
+     - returns: Object representing subscription.
+     */
+    @available(*, deprecated, renamed: "bind(to:)")
+    public func bindTo(_ binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {
+        return binder(self)(curriedArgument)
+    }
+
+
+    /**
+     Subscribes an element handler to an observable sequence.
+
+     In case error occurs in debug mode, `fatalError` will be raised.
+     In case error occurs in release mode, `error` will be logged.
+
+     - parameter onNext: Action to invoke for each element in the observable sequence.
+     - returns: Subscription object used to unsubscribe from the observable sequence.
+     */
+    @available(*, deprecated, renamed: "bind(onNext:)")
+    public func bindNext(_ onNext: @escaping (E) -> Void) -> Disposable {
+        return subscribe(onNext: onNext, onError: { error in
+            let error = "Binding error: \(error)"
+            #if DEBUG
+                rxFatalError(error)
+            #else
+                print(error)
+            #endif
+        })
+    }
+}
diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift
index cb2573ca..93f2a746 100644
--- a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift
+++ b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift
@@ -8,7 +8,7 @@
 
 #if !os(Linux)
 
-import Foundation
+import Foundation.NSObject
 #if !RX_NO_MODULE
     import RxSwift
 #endif
diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift
index 897cdb3c..63449ce0 100644
--- a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift
+++ b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift
@@ -8,7 +8,7 @@
 
 #if !os(Linux)
 
-import Foundation
+import Foundation.NSObject
 #if !RX_NO_MODULE
     import RxSwift
 #endif
diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift
index 85b4a4a6..9330c9b1 100644
--- a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift
+++ b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift
@@ -8,7 +8,7 @@
 
 #if !os(Linux)
 
-import Foundation
+import Foundation.NSObject
 #if !RX_NO_MODULE
     import RxSwift
     #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux)
diff --git a/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift b/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift
index da46a02d..2f21fcac 100644
--- a/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift
+++ b/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift
@@ -102,7 +102,7 @@ fileprivate func convertResponseToString(_ response: URLResponse?, _ error: NSEr
 
     if let error = error {
         if error.domain == NSURLErrorDomain && error.code == NSURLErrorCancelled {
-            return "Cancelled (\(ms)ms)"
+            return "Canceled (\(ms)ms)"
         }
         return "Failure (\(ms)ms): NSError > \(error)"
     }
@@ -141,7 +141,11 @@ extension Reactive where Base: URLSession {
                 if Logging.URLRequests(request) {
                     let interval = Date().timeIntervalSince(d ?? Date())
                     print(convertURLRequestToCurlCommand(request))
-                    print(convertResponseToString(response, error.map { $0 as NSError }, interval))
+                    #if os(Linux)
+                        print(convertResponseToString(response, error.flatMap { $0 as? NSError }, interval))
+                    #else
+                        print(convertResponseToString(response, error.map { $0 as NSError }, interval))
+                    #endif
                 }
                 
                 guard let response = response, let data = data else {
diff --git a/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m b/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m
index 669fab45..0a78e7a1 100644
--- a/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m
+++ b/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m
@@ -136,8 +136,6 @@ BOOL RX_is_method_with_description_void(struct objc_method_description method) {
     return strncmp(method.types, @encode(void), 1) == 0;
 }
 
-// inspired by https://github.com/ReactiveCocoa/ReactiveCocoa/blob/swift-development/ReactiveCocoa/Objective-C/NSInvocation%2BRACTypeParsing.m
-// awesome work
 id __nonnull RX_extract_argument_at_index(NSInvocation * __nonnull invocation, NSUInteger index) {
     const char *argumentType = [invocation.methodSignature getArgumentTypeAtIndex:index];
     
@@ -261,10 +259,6 @@ static NSMethodSignatureRef RX_method_signature(id __nonnull __unsafe_unretained
     return encoding;
 }
 
-// inspired by
-// https://github.com/mikeash/MAZeroingWeakRef/blob/master/Source/MAZeroingWeakRef.m
-// https://github.com/ReactiveCocoa/ReactiveCocoa/blob/swift-development/ReactiveCocoa/Objective-C/NSObject%2BRACDeallocating.m
-// https://github.com/steipete/Aspects
 @interface RXObjCRuntime: NSObject
 
 @property (nonatomic, assign) pthread_mutex_t lock;
@@ -371,13 +365,13 @@ IMP __nonnull RX_default_target_implementation() {
 #define EXAMPLE_PARAMETER(_1, index, type)        RX_CAT2(_, type):(type)SEPARATE_BY_UNDERSCORE(type, index)          // generates -> _type:(type)type_0
 #define SELECTOR_PART(_1, index, type)            RX_CAT2(_, type:)                                                   // generates -> _type:
 
-#define COMMA_DELIMITED_ARGUMENTS(...)            RX_FOR(_, SEPARATE_BY_COMMA, NOT_NULL_ARGUMENT_CAT, ## __VA_ARGS__)
-#define ARGUMENTS(...)                            RX_FOR_COMMA(_, NAME_CAT, ## __VA_ARGS__)
-#define DECLARE_ARGUMENTS(...)                    RX_FOR_COMMA(_, TYPE_AND_NAME_CAT, ## __VA_ARGS__)
+#define COMMA_DELIMITED_ARGUMENTS(...)            RX_FOREACH(_, SEPARATE_BY_COMMA, NOT_NULL_ARGUMENT_CAT, ## __VA_ARGS__)
+#define ARGUMENTS(...)                            RX_FOREACH_COMMA(_, NAME_CAT, ## __VA_ARGS__)
+#define DECLARE_ARGUMENTS(...)                    RX_FOREACH_COMMA(_, TYPE_AND_NAME_CAT, ## __VA_ARGS__)
 
 // optimized observe methods
 
-#define GENERATE_METHOD_IDENTIFIER(...)          RX_CAT2(swizzle, RX_FOR(_, CAT, UNDERSCORE_TYPE_CAT, ## __VA_ARGS__))
+#define GENERATE_METHOD_IDENTIFIER(...)          RX_CAT2(swizzle, RX_FOREACH(_, CAT, UNDERSCORE_TYPE_CAT, ## __VA_ARGS__))
 
 #define GENERATE_OBSERVE_METHOD_DECLARATION(...)                                 \
     -(BOOL)GENERATE_METHOD_IDENTIFIER(__VA_ARGS__):(Class __nonnull)class        \
@@ -386,10 +380,10 @@ -(BOOL)GENERATE_METHOD_IDENTIFIER(__VA_ARGS__):(Class __nonnull)class        \
 
 
 #define BUILD_EXAMPLE_METHOD(return_value, ...) \
-    +(return_value)RX_CAT2(RX_CAT2(example_, return_value), RX_FOR(_, SEPARATE_BY_SPACE, EXAMPLE_PARAMETER, ## __VA_ARGS__)) {}
+    +(return_value)RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_BY_SPACE, EXAMPLE_PARAMETER, ## __VA_ARGS__)) {}
 
 #define BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ...) \
-    RX_CAT2(RX_CAT2(example_, return_value), RX_FOR(_, SEPARATE_BY_SPACE, SELECTOR_PART, ## __VA_ARGS__))
+    RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_BY_SPACE, SELECTOR_PART, ## __VA_ARGS__))
 
 #define SWIZZLE_OBSERVE_METHOD(return_value, ...)                                                                                                       \
     @interface RXObjCRuntime (GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__))                                                                 \
diff --git a/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h b/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h
index aae17770..b868ac97 100644
--- a/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h
+++ b/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h
@@ -34,43 +34,14 @@
 
 /**
  Checks that the local `error` instance exists before assigning it's value by reference.
- This macro exists to work around static analysis warnings — `NSError` is always assumed to be `nullable`, even though we explictly define the method parameter as `nonnull`. See http://www.openradar.me/21766176 for more details.
+ This macro exists to work around static analysis warnings — `NSError` is always assumed to be `nullable`, even though we explicitly define the method parameter as `nonnull`. See http://www.openradar.me/21766176 for more details.
  */
 #define RX_THROW_ERROR(errorValue, returnValue) if (error != nil) { *error = (errorValue); } return (returnValue);
 
-// Inspired by http://p99.gforge.inria.fr
-
-// https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC26
 #define RX_CAT2(_1, _2) _RX_CAT2(_1, _2)
+#define _RX_CAT2(_1, _2) _1 ## _2
 
 #define RX_ELEMENT_AT(n, ...) RX_CAT2(_RX_ELEMENT_AT_, n)(__VA_ARGS__)
-
-#define RX_COUNT(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)
-
-/**
- #define JOIN(context, index, head, tail) head; tail
- #define APPLY(context, index, item) item = (context)[index]
-
- RX_FOR(A, JOIN, APPLY, toto, tutu);
-
- toto = (A)[0]; tutu = (A)[1];
- */
-#define RX_FOR(context, join, generate, ...) RX_CAT2( _RX_FOR_, RX_COUNT(__VA_ARGS__))(context, 0, join, generate, ## __VA_ARGS__)
-
-/**
- #define JOIN(context, index, head, tail) head tail
- #define APPLY(context, index, item) item = (context)[index]
-
- RX_FOR(A, JOIN, APPLY, toto, tutu);
-
- , toto = (A)[0], tutu = (A)[1]
- */
-#define RX_FOR_COMMA(context, generate, ...) RX_CAT2( _RX_FOR_COMMA_, RX_COUNT(__VA_ARGS__))(context, 0, generate, ## __VA_ARGS__)
-
-#define RX_INC(x) RX_CAT2(_RX_INC_, x)
-
-// element at
-
 #define _RX_ELEMENT_AT_0(x, ...) x
 #define _RX_ELEMENT_AT_1(_0, x, ...) x
 #define _RX_ELEMENT_AT_2(_0, _1, x, ...) x
@@ -79,61 +50,44 @@
 #define _RX_ELEMENT_AT_5(_0, _1, _2, _3, _4, x, ...) x
 #define _RX_ELEMENT_AT_6(_0, _1, _2, _3, _4, _5, x, ...) x
 
-// rx for
+#define RX_COUNT(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)
+#define RX_EMPTY(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 0, 0, 0, 0, 0, 0, 1)
 
-#define _RX_FOR_0(context, index, join, generate)
+/**
+ #define SUM(context, index, head, tail) head + tail
+ #define MAP(context, index, element) (context)[index] * (element)
 
-#define _RX_FOR_1(context, index, join, generate, head) \
-    generate(context, index, head)
+ RX_FOR(numbers, SUM, MAP, b0, b1, b2);
 
-#define _RX_FOR_2(context, index, join, generate, head, ...) \
-    join(context, index, generate(context, index, head), _RX_FOR_1(context, RX_INC(index), join, generate, __VA_ARGS__))
+ (numbers)[0] * (b0) + (numbers)[1] * (b1) + (numbers[2]) * (b2)
+ */
 
-#define _RX_FOR_3(context, index, join, generate, head, ...) \
-    join(context, index, generate(context, index, head), _RX_FOR_2(context, RX_INC(index), join, generate, __VA_ARGS__))
+#define RX_FOREACH(context, concat, map, ...) RX_FOR_MAX(RX_COUNT(__VA_ARGS__), _RX_FOREACH_CONCAT, _RX_FOREACH_MAP, context, concat, map, __VA_ARGS__)
+#define _RX_FOREACH_CONCAT(index, head, tail, context, concat, map, ...) concat(context, index, head, tail)
+#define _RX_FOREACH_MAP(index, context, concat, map, ...) map(context, index, RX_ELEMENT_AT(index, __VA_ARGS__))
 
-#define _RX_FOR_4(context, index, join, generate, head, ...) \
-    join(context, index, generate(context, index, head), _RX_FOR_3(context, RX_INC(index), join, generate, __VA_ARGS__))
+/**
+ #define MAP(context, index, item) (context)[index] * (item)
 
-#define _RX_FOR_5(context, index, join, generate, head, ...) \
-    join(context, index, generate(context, index, head), _RX_FOR_4(context, RX_INC(index), join, generate, __VA_ARGS__))
+ RX_FOR_COMMA(numbers, MAP, b0, b1);
 
-#define _RX_FOR_6(context, index, join, generate, head, ...) \
-    join(context, index, generate(context, index, head), _RX_FOR_5(context, RX_INC(index), join, generate, __VA_ARGS__))
+ ,(numbers)[0] * b0, (numbers)[1] * b1
+ */
+#define RX_FOREACH_COMMA(context, map, ...) RX_CAT2(_RX_FOREACH_COMMA_EMPTY_, RX_EMPTY(__VA_ARGS__))(context, map, ## __VA_ARGS__)
+#define _RX_FOREACH_COMMA_EMPTY_1(context, map, ...)
+#define _RX_FOREACH_COMMA_EMPTY_0(context, map, ...) , RX_FOR_MAX(RX_COUNT(__VA_ARGS__), _RX_FOREACH_COMMA_CONCAT, _RX_FOREACH_COMMA_MAP, context, map, __VA_ARGS__)
+#define _RX_FOREACH_COMMA_CONCAT(index, head, tail, context, map, ...) head, tail
+#define _RX_FOREACH_COMMA_MAP(index, context, map, ...) map(context, index, RX_ELEMENT_AT(index, __VA_ARGS__))
 
 // rx for
 
-#define _RX_FOR_COMMA_0(context, index, generate)
-
-#define _RX_FOR_COMMA_1(context, index, generate, head) \
-    , generate(context, index, head)
-
-#define _RX_FOR_COMMA_2(context, index, generate, head, ...) \
-    , generate(context, index, head) _RX_FOR_COMMA_1(context, RX_INC(index), generate, __VA_ARGS__)
+#define RX_FOR_MAX(max, concat, map, ...) RX_CAT2(RX_FOR_, max)(concat, map, ## __VA_ARGS__)
 
-#define _RX_FOR_COMMA_3(context, index, generate, head, ...) \
-    , generate(context, index, head) _RX_FOR_COMMA_2(context, RX_INC(index), generate, __VA_ARGS__)
+#define RX_FOR_0(concat, map, ...)
+#define RX_FOR_1(concat, map, ...) map(0, __VA_ARGS__)
+#define RX_FOR_2(concat, map, ...) concat(1, RX_FOR_1(concat, map, ## __VA_ARGS__), map(1, __VA_ARGS__), __VA_ARGS__)
+#define RX_FOR_3(concat, map, ...) concat(2, RX_FOR_2(concat, map, ## __VA_ARGS__), map(2, __VA_ARGS__), __VA_ARGS__)
+#define RX_FOR_4(concat, map, ...) concat(3, RX_FOR_3(concat, map, ## __VA_ARGS__), map(3, __VA_ARGS__), __VA_ARGS__)
+#define RX_FOR_5(concat, map, ...) concat(4, RX_FOR_4(concat, map, ## __VA_ARGS__), map(4, __VA_ARGS__), __VA_ARGS__)
+#define RX_FOR_6(concat, map, ...) concat(5, RX_FOR_5(concat, map, ## __VA_ARGS__), map(5, __VA_ARGS__), __VA_ARGS__)
 
-#define _RX_FOR_COMMA_4(context, index, generate, head, ...) \
-    , generate(context, index, head) _RX_FOR_COMMA_3(context, RX_INC(index), generate, __VA_ARGS__)
-
-#define _RX_FOR_COMMA_5(context, index, generate, head, ...) \
-    , generate(context, index, head) _RX_FOR_COMMA_4(context, RX_INC(index), generate, __VA_ARGS__)
-
-#define _RX_FOR_COMMA_6(context, index, generate, head, ...) \
-    , generate(context, index, head) _RX_FOR_COMMA_5(context, RX_INC(index), generate, __VA_ARGS__)
-
-
-// rx inc
-
-#define _RX_INC_0   1
-#define _RX_INC_1   2
-#define _RX_INC_2   3
-#define _RX_INC_3   4
-#define _RX_INC_4   5
-#define _RX_INC_5   6
-#define _RX_INC_6   7
-
-// rx cat
-
-#define _RX_CAT2(_1, _2) _1 ## _2
diff --git a/Pods/RxCocoa/RxCocoa/RxCocoa.swift b/Pods/RxCocoa/RxCocoa/RxCocoa.swift
index 37fb82e7..95e6dfa2 100644
--- a/Pods/RxCocoa/RxCocoa/RxCocoa.swift
+++ b/Pods/RxCocoa/RxCocoa/RxCocoa.swift
@@ -49,7 +49,7 @@ extension RxCocoaError {
         case let .itemsNotYetBound(object):
             return "Data source is set, but items are not yet bound to user interface for `\(object)`."
         case let .invalidPropertyName(object, propertyName):
-            return "Object `\(object)` dosn't have a property named `\(propertyName)`."
+            return "Object `\(object)` doesn't have a property named `\(propertyName)`."
         case let .invalidObjectOnKeyPath(object, sourceObject, propertyName):
             return "Unobservable object `\(object)` was observed as `\(propertyName)` of `\(sourceObject)`."
         case .errorDuringSwizzling:
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlEvent.swift b/Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift
similarity index 91%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/ControlEvent.swift
rename to Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift
index 9c9a19b3..e8d3d7cc 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlEvent.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift
@@ -18,7 +18,7 @@ public protocol ControlEventType : ObservableType {
 }
 
 /**
-    Unit for `Observable`/`ObservableType` that represents event on UI element.
+    Trait for `Observable`/`ObservableType` that represents event on UI element.
 
     It's properties are:
 
@@ -33,7 +33,7 @@ public protocol ControlEventType : ObservableType {
 
     **It is implementor's responsibility to make sure that that all other properties enumerated above are satisfied.**
 
-    **If they aren't, then using this unit communicates wrong properties and could potentially break someone's code.**
+    **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.**
 
     **In case `events` observable sequence that is being passed into initializer doesn't satisfy all enumerated
      properties, please don't use this unit.**
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlProperty.swift b/Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift
similarity index 95%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/ControlProperty.swift
rename to Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift
index 39230772..cdac1ab9 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlProperty.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift
@@ -18,7 +18,7 @@ public protocol ControlPropertyType : ObservableType, ObserverType {
 }
 
 /**
-    Unit for `Observable`/`ObservableType` that represents property of UI element.
+    Trait for `Observable`/`ObservableType` that represents property of UI element.
  
     Sequence of values only represents initial control value and user initiated value changes.
     Programatic value changes won't be reported.
@@ -37,7 +37,7 @@ public protocol ControlPropertyType : ObservableType, ObserverType {
 
     **It is implementor's responsibility to make sure that that all other properties enumerated above are satisfied.**
 
-    **If they aren't, then using this unit communicates wrong properties and could potentially break someone's code.**
+    **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.**
 
     **In case `values` observable sequence that is being passed into initializer doesn't satisfy all enumerated
     properties, please don't use this unit.**
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift
similarity index 92%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift
rename to Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift
index 8edf2a94..7a9f0b09 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift
@@ -11,7 +11,7 @@ import RxSwift
 #endif
     
 extension ControlEvent {
-    /// Converts `ControlEvent` to `Driver` unit.
+    /// Converts `ControlEvent` to `Driver` trait.
     ///
     /// `ControlEvent` already can't fail, so no special case needs to be handled.
     public func asDriver() -> Driver {
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift
similarity index 92%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift
rename to Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift
index a8010038..214ed19c 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift
@@ -11,7 +11,7 @@ import RxSwift
 #endif
 
 extension ControlProperty {
-    /// Converts `ControlProperty` to `Driver` unit.
+    /// Converts `ControlProperty` to `Driver` trait.
     ///
     /// `ControlProperty` already can't fail, so no special case needs to be handled.
     public func asDriver() -> Driver {
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift
similarity index 97%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift
rename to Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift
index 3e7ce891..9957ce3b 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift
@@ -13,7 +13,7 @@ import RxSwift
 private let driverErrorMessage = "`drive*` family of methods can be only called from `MainThread`.\n" +
 "This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\n"
 
-// This would ideally be Driver, but unfortunatelly Driver can't be extended in Swift 3.0
+// This would ideally be Driver, but unfortunately Driver can't be extended in Swift 3.0
 extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {
     /**
     Creates new subscription and sends elements to observer.
@@ -110,9 +110,9 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt
     
     - parameter onNext: Action to invoke for each element in the observable sequence.
     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
-    gracefully completed, errored, or if the generation is cancelled by disposing subscription)
+    gracefully completed, errored, or if the generation is canceled by disposing subscription)
     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
-    gracefully completed, errored, or if the generation is cancelled by disposing subscription)
+    gracefully completed, errored, or if the generation is canceled by disposing subscription)
     - returns: Subscription object used to unsubscribe from the observable sequence.
     */
     public func drive(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable {
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift
similarity index 85%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver.swift
rename to Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift
index 2a25b7f1..fa35c9d3 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift
@@ -12,13 +12,13 @@
 
 
 /**
- Unit that represents observable sequence with following properties:
+ Trait that represents observable sequence with following properties:
 
  - it never fails
  - it delivers events on `MainScheduler.instance`
  - `shareReplayLatestWhileConnected()` behavior
  - all observers share sequence computation resources
- - it's stateful, upon subscription (calling subscribe) last element is immediatelly replayed if it was produced
+ - it's stateful, upon subscription (calling subscribe) last element is immediately replayed if it was produced
  - computation of elements is reference counted with respect to the number of observers
  - if there are no subscribers, it will release sequence computation resources
 
@@ -32,12 +32,12 @@
  If `drive*`, `subscribe*` and `bind*` are called from background thread, it is possible that initial replay
  will happen on background thread, and subsequent events will arrive on main thread.
 
- To find out more about units and how to use them, please visit `Documentation/Units.md`.
+ To find out more about traits and how to use them, please visit `Documentation/Traits.md`.
  */
 public typealias Driver = SharedSequence
 
 public struct DriverSharingStrategy: SharingStrategyProtocol {
-    public static var scheduler: SchedulerType { return driverObserveOnScheduler }
+    public static var scheduler: SchedulerType { return driverObserveOnScheduler() }
     public static func share(_ source: Observable) -> Observable {
         return source.shareReplayLatestWhileConnected()
     }
@@ -58,12 +58,12 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt
 */
 public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) {
     let originalObserveOnScheduler = driverObserveOnScheduler
-    driverObserveOnScheduler = scheduler
+    driverObserveOnScheduler = { return scheduler }
 
     action()
 
     // If you remove this line , compiler buggy optimizations will change behavior of this code
-    _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(driverObserveOnScheduler)
+    _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(scheduler)
     // Scary, I know
 
     driverObserveOnScheduler = originalObserveOnScheduler
@@ -87,4 +87,4 @@ func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: Sche
     }
 }
 
-fileprivate var driverObserveOnScheduler: SchedulerType = MainScheduler.instance
+fileprivate var driverObserveOnScheduler: () -> SchedulerType = { MainScheduler() }
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift
similarity index 100%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift
rename to Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Variable+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/Variable+Driver.swift
similarity index 100%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Variable+Driver.swift
rename to Pods/RxCocoa/RxCocoa/Traits/Driver/Variable+Driver.swift
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift
similarity index 100%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift
rename to Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift
diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift
new file mode 100644
index 00000000..4e66cdb6
--- /dev/null
+++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift
@@ -0,0 +1,658 @@
+// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project 
+//
+//  SharedSequence+Operators+arity.swift
+//  RxCocoa
+//
+//  Created by Krunoslav Zaher on 10/14/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+#if !RX_NO_MODULE
+import RxSwift
+#endif
+
+
+
+// 2
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
+
+// 3
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
+
+// 4
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
+
+// 5
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
+
+// 6
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
+
+// 7
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
+
+// 8
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy,
+            SharingStrategy == O8.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),
+            resultSelector: resultSelector
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func zip
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy,
+            SharingStrategy == O8.SharingStrategy {
+        let source = Observable.zip(
+            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable()
+        )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequence {
+    /**
+    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy,
+            SharingStrategy == O8.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),
+                resultSelector: resultSelector
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+extension SharedSequenceConvertibleType where E == Any {
+    /**
+    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.
+
+    - returns: An observable sequence containing the result of combining elements of the sources.
+    */
+    public static func combineLatest
+        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)
+        -> SharedSequence where SharingStrategy == O1.SharingStrategy,
+            SharingStrategy == O2.SharingStrategy,
+            SharingStrategy == O3.SharingStrategy,
+            SharingStrategy == O4.SharingStrategy,
+            SharingStrategy == O5.SharingStrategy,
+            SharingStrategy == O6.SharingStrategy,
+            SharingStrategy == O7.SharingStrategy,
+            SharingStrategy == O8.SharingStrategy {
+        let source = Observable.combineLatest(
+                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable()
+            )
+
+        return SharedSequence(source)
+    }
+}
+
+
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift
similarity index 89%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift
rename to Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift
index e1e8ffd4..8b0b9f61 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift
@@ -133,9 +133,9 @@ extension SharedSequenceConvertibleType {
     - parameter identifier: Identifier that is printed together with event description to standard output.
     - returns: An observable sequence whose events are printed to standard output.
     */
-    public func debug(_ identifier: String? = nil, file: String = #file, line: UInt = #line, function: String = #function) -> SharedSequence {
+    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function) -> SharedSequence {
         let source = self.asObservable()
-            .debug(identifier, file: file, line: line, function: function)
+            .debug(identifier, trimOutput: trimOutput, file: file, line: line, function: function)
         return SharedSequence(source)
     }
 }
@@ -264,7 +264,6 @@ extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType,
     /**
     Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.
     
-    - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.
     - returns: The observable sequence that merges the elements of the observable sequences.
     */
     public func merge() -> SharedSequence {
@@ -277,6 +276,7 @@ extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType,
     /**
     Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.
     
+    - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.
     - returns: The observable sequence that merges the elements of the inner sequences.
     */
     public func merge(maxConcurrent: Int)
@@ -302,10 +302,10 @@ extension SharedSequenceConvertibleType {
      - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.
      - returns: The throttled sequence.
     */
-    public func throttle(_ dueTime: RxTimeInterval)
+    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true)
         -> SharedSequence {
         let source = self.asObservable()
-            .throttle(dueTime, scheduler: SharingStrategy.scheduler)
+            .throttle(dueTime, latest: latest, scheduler: SharingStrategy.scheduler)
 
         return SharedSequence(source)
     }
@@ -384,6 +384,17 @@ extension SharedSequence {
         let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() }, resultSelector)
         return SharedSequence(source)
     }
+
+    /**
+     Merges the specified observable sequences into one observable sequence all of the observable sequences have produced an element at a corresponding index.
+
+     - returns: An observable sequence containing the result of combining elements of the sources.
+     */
+    public static func zip(_ collection: C) -> SharedSequence
+        where C.Iterator.Element == SharedSequence {
+            let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() })
+            return SharedSequence(source)
+    }
 }
 
 // MARK: combineLatest
@@ -400,6 +411,17 @@ extension SharedSequence {
         let source = Observable.combineLatest(collection.map { $0.asObservable() }, resultSelector)
         return SharedSequence(source)
     }
+
+    /**
+     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.
+
+     - returns: An observable sequence containing the result of combining elements of the sources.
+     */
+    public static func combineLatest(_ collection: C) -> SharedSequence
+        where C.Iterator.Element == SharedSequence {
+        let source = Observable.combineLatest(collection.map { $0.asObservable() })
+        return SharedSequence(source)
+    }
 }
 
 // MARK: withLatestFrom
@@ -471,3 +493,24 @@ extension SharedSequenceConvertibleType {
         return SharedSequence(source)
     }
 }
+
+// MARK: delay
+extension SharedSequenceConvertibleType {
+
+    /**
+     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.
+
+     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)
+
+     - parameter dueTime: Relative time shift of the source by.
+     - parameter scheduler: Scheduler to run the subscription delay timer on.
+     - returns: the source Observable shifted in time by the specified delay.
+     */
+    public func delay(_ dueTime: RxTimeInterval)
+        -> SharedSequence {
+        let source = self.asObservable()
+            .delay(dueTime, scheduler: SharingStrategy.scheduler)
+
+        return SharedSequence(source)
+    }
+}
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift
similarity index 78%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift
rename to Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift
index 559dcdfd..1233faa2 100644
--- a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift
+++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift
@@ -11,7 +11,7 @@
 #endif
 
 /**
-    Unit that represents observable sequence that shares computation resources with following properties:
+    Trait that represents observable sequence that shares computation resources with following properties:
 
     - it never fails
     - it delivers events on `SharingStrategy.scheduler`
@@ -19,7 +19,7 @@
 
     `SharedSequence` can be considered a builder pattern for observable sequences that share computation resources.
 
-    To find out more about units and how to use them, please visit `Documentation/Units.md`.
+    To find out more about units and how to use them, please visit `Documentation/Traits.md`.
 */
 public struct SharedSequence : SharedSequenceConvertibleType {
     public typealias E = Element
@@ -155,6 +155,47 @@ extension SharedSequence {
     }
 }
 
+extension SharedSequence {
+    
+    /**
+    This method converts an array to an observable sequence.
+     
+    - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+     
+    - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
+     */
+    public static func from(_ array: [E]) -> SharedSequence {
+        let source = Observable.from(array, scheduler: S.scheduler)
+        return SharedSequence(raw: source)
+    }
+    
+    /**
+     This method converts a sequence to an observable sequence.
+     
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+     
+     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
+    */
+    public static func from(_ sequence: S) -> SharedSequence where S.Iterator.Element == E {
+        let source = Observable.from(sequence, scheduler: SharingStrategy.scheduler)
+        return SharedSequence(raw: source)
+    }
+    
+    /**
+     This method converts a optional to an observable sequence.
+     
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+     
+     - parameter optional: Optional element in the resulting observable sequence.
+     
+     - returns: An observable sequence containing the wrapped value or not from given optional.
+     */
+    public static func from(optional: E?) -> SharedSequence {
+        let source = Observable.from(optional: optional, scheduler: S.scheduler)
+        return SharedSequence(raw: source)
+    }
+}
+
 extension SharedSequence where Element : SignedInteger {
     /**
      Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift
similarity index 100%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift
rename to Pods/RxCocoa/RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift
diff --git a/Pods/RxCocoa/RxCocoa/CocoaUnits/UIBindingObserver.swift b/Pods/RxCocoa/RxCocoa/Traits/UIBindingObserver.swift
similarity index 100%
rename from Pods/RxCocoa/RxCocoa/CocoaUnits/UIBindingObserver.swift
rename to Pods/RxCocoa/RxCocoa/Traits/UIBindingObserver.swift
diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift
index 6b066924..32ecaa5f 100644
--- a/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift
+++ b/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift
@@ -44,7 +44,7 @@ extension Reactive where Base: NSControl {
 
     /// You might be wondering why the ugly `as!` casts etc, well, for some reason if
     /// Swift compiler knows C is UIControl type and optimizations are turned on, it will crash.
-    static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty {
+    static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty {
         MainScheduler.ensureExecutingOnScheduler()
 
         let source = (control as! NSObject).rx.lazyInstanceObservable(&rx_value_key) { () -> Observable in
@@ -64,7 +64,6 @@ extension Reactive where Base: NSControl {
                 
                 return observer
             }
-            .distinctUntilChanged()
             .takeUntil((control as! NSObject).rx.deallocated)
         }
 
diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift
index dc52d736..df46a50c 100644
--- a/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift
+++ b/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift
@@ -40,6 +40,7 @@ public class RxTextFieldDelegateProxy
         let textField: NSTextField = castOrFatalError(notification.object)
         let nextValue = textField.stringValue
         self.textSubject.on(.next(nextValue))
+        _forwardToDelegate?.controlTextDidChange(notification)
     }
 
     // MARK: Delegate proxy methods
diff --git a/Pods/RxSwift/Platform/RecursiveLock.swift b/Pods/RxSwift/Platform/RecursiveLock.swift
index 10b9bbb0..c03471d5 100644
--- a/Pods/RxSwift/Platform/RecursiveLock.swift
+++ b/Pods/RxSwift/Platform/RecursiveLock.swift
@@ -6,7 +6,7 @@
 //  Copyright © 2016 Krunoslav Zaher. All rights reserved.
 //
 
-import Foundation
+import class Foundation.NSRecursiveLock
 
 #if TRACE_RESOURCES
     class RecursiveLock: NSRecursiveLock {
diff --git a/Pods/RxSwift/README.md b/Pods/RxSwift/README.md
index dce9a230..bdf8a2ba 100644
--- a/Pods/RxSwift/README.md
+++ b/Pods/RxSwift/README.md
@@ -3,12 +3,6 @@
 
 [![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager)
 
-## About Rx
-
-**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0.**
-
-**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch.**
-
 Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable` interface.
 
 This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET).
@@ -27,7 +21,7 @@ KVO observing, async operations and streams are all unified under [abstraction o
 
 * [why use rx?](Documentation/Why.md)
 * [the basics, getting started with RxSwift](Documentation/GettingStarted.md)
-* [units](Documentation/Units.md) - what is `Driver`, `ControlProperty`, and `Variable` ... and why do they exist?
+* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, `ControlProperty`, and `Variable` ... and why do they exist?
 * [testing](Documentation/UnitTests.md)
 * [tips and common errors](Documentation/Tips.md)
 * [debugging](Documentation/GettingStarted.md#debugging)
@@ -81,11 +75,10 @@ KVO observing, async operations and streams are all unified under [abstraction o
 let searchResults = searchBar.rx.text.orEmpty
     .throttle(0.3, scheduler: MainScheduler.instance)
     .distinctUntilChanged()
-    .flatMapLatest { query -> Observable<[Repository]> in
+    .flatMapLatest { query -> Observable<[Repository]> in
         if query.isEmpty {
             return .just([])
         }
-
         return searchGitHub(query)
             .catchErrorJustReturn([])
     }
@@ -97,7 +90,7 @@ let searchResults = searchBar.rx.text.orEmpty
   
     
 searchResults
-    .bindTo(tableView.rx.items(cellIdentifier: "Cell")) {
+    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) {
         (index, repository: Repository, cell) in
         cell.textLabel?.text = repository.name
         cell.detailTextLabel?.text = repository.url
@@ -111,6 +104,7 @@ searchResults
 
 * Xcode 8.0
 * Swift 3.0
+* Swift 2.3 ([use `rxswift-2.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) instead)
 
 ## Installation
 
@@ -184,6 +178,12 @@ let package = Package(
 $ swift build
 ```
 
+To build or test a module with RxTest dependency, set `TEST=1`. ([RxSwift >= 3.4.2](https://github.com/ReactiveX/RxSwift/releases/tag/3.4.2))
+
+```bash
+$ TEST=1 swift test
+```
+
 ### Manually using git submodules
 
 * Add RxSwift as a submodule
@@ -200,6 +200,8 @@ $ git submodule add git@github.com:ReactiveX/RxSwift.git
 
 * [http://reactivex.io/](http://reactivex.io/)
 * [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)
+* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift)
+* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)
 * [Erik Meijer (Wikipedia)](http://en.wikipedia.org/wiki/Erik_Meijer_%28computer_scientist%29)
 * [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)
 * [Reactive Programming Overview (Jafar Husain from Netflix)](https://www.youtube.com/watch?v=dwP1TNXE6fc)
diff --git a/Pods/RxSwift/RxSwift/Deprecated.swift b/Pods/RxSwift/RxSwift/Deprecated.swift
index bd3f2f9c..8ebfb0a6 100644
--- a/Pods/RxSwift/RxSwift/Deprecated.swift
+++ b/Pods/RxSwift/RxSwift/Deprecated.swift
@@ -17,7 +17,7 @@ extension Observable {
      */
     @available(*, deprecated, message: "Implicit conversions from any type to optional type are allowed and that is causing issues with `from` operator overloading.", renamed: "from(optional:)")
     public static func from(_ optional: E?) -> Observable {
-        return ObservableOptional(optional: optional)
+        return Observable.from(optional: optional)
     }
 
     /**
@@ -31,7 +31,7 @@ extension Observable {
      */
     @available(*, deprecated, message: "Implicit conversions from any type to optional type are allowed and that is causing issues with `from` operator overloading.", renamed: "from(optional:scheduler:)")
     public static func from(_ optional: E?, scheduler: ImmediateSchedulerType) -> Observable {
-        return ObservableOptionalScheduled(optional: optional, scheduler: scheduler)
+        return Observable.from(optional: optional, scheduler: scheduler)
     }
 }
 
diff --git a/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift b/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift
index 8c59242a..efae55e4 100644
--- a/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift
+++ b/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift
@@ -7,7 +7,7 @@
 //
 
 /// Represents a disposable resource that can be checked for disposal status.
-public final class BooleanDisposable : Disposable, Cancelable {
+public final class BooleanDisposable : Cancelable {
 
     internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true)
     private var _isDisposed = false
diff --git a/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift b/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift
index d0e3b3dc..b0578172 100644
--- a/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift
+++ b/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift
@@ -7,7 +7,7 @@
 //
 
 /// Represents a group of disposable resources that are disposed together.
-public final class CompositeDisposable : DisposeBase, Disposable, Cancelable {
+public final class CompositeDisposable : DisposeBase, Cancelable {
     /// Key used to remove disposable from composite disposable
     public struct DisposeKey {
         fileprivate let key: BagKey
diff --git a/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift b/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift
index cf6d5b12..e8ef67dc 100644
--- a/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift
+++ b/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift
@@ -11,7 +11,7 @@ Represents a disposable resource which only allows a single assignment of its un
 
 If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an exception.
 */
-public final class SingleAssignmentDisposable : DisposeBase, Disposable, Cancelable {
+public final class SingleAssignmentDisposable : DisposeBase, Cancelable {
 
     fileprivate enum DisposeState: UInt32 {
         case disposed = 1
diff --git a/Pods/RxSwift/RxSwift/Errors.swift b/Pods/RxSwift/RxSwift/Errors.swift
index a00a3dea..f17b52d8 100644
--- a/Pods/RxSwift/RxSwift/Errors.swift
+++ b/Pods/RxSwift/RxSwift/Errors.swift
@@ -13,7 +13,7 @@ let RxCompositeFailures = "RxCompositeFailures"
 public enum RxError
     : Swift.Error
     , CustomDebugStringConvertible {
-    /// Unknown error occured.
+    /// Unknown error occurred.
     case unknown
     /// Performing an action on disposed object.
     case disposed(object: AnyObject)
@@ -34,11 +34,11 @@ extension RxError {
     public var debugDescription: String {
         switch self {
         case .unknown:
-            return "Unknown error occured."
+            return "Unknown error occurred."
         case .disposed(let object):
             return "Object `\(object)` was already disposed."
         case .overflow:
-            return "Arithmetic overflow occured."
+            return "Arithmetic overflow occurred."
         case .argumentOutOfRange:
             return "Argument out of range."
         case .noElements:
diff --git a/Pods/RxSwift/RxSwift/Event.swift b/Pods/RxSwift/RxSwift/Event.swift
index 498c6445..377877b6 100644
--- a/Pods/RxSwift/RxSwift/Event.swift
+++ b/Pods/RxSwift/RxSwift/Event.swift
@@ -36,7 +36,7 @@ extension Event : CustomDebugStringConvertible {
 }
 
 extension Event {
-    /// Is `Completed` or `Error` event.
+    /// Is `completed` or `error` event.
     public var isStopEvent: Bool {
         switch self {
         case .next: return false
@@ -44,7 +44,7 @@ extension Event {
         }
     }
 
-    /// If `Next` event, returns element value.
+    /// If `next` event, returns element value.
     public var element: Element? {
         if case .next(let value) = self {
             return value
@@ -52,13 +52,21 @@ extension Event {
         return nil
     }
 
-    /// If `Error` event, returns error.
+    /// If `error` event, returns error.
     public var error: Swift.Error? {
         if case .error(let error) = self {
             return error
         }
         return nil
     }
+
+    /// If `completed` event, returns true.
+    public var isCompleted: Bool {
+        if case .completed = self {
+            return true
+        }
+        return false
+    }
 }
 
 extension Event {
@@ -80,3 +88,19 @@ extension Event {
         }
     }
 }
+
+/// A type that can be converted to `Event`.
+public protocol EventConvertible {
+    /// Type of element in event
+    associatedtype ElementType
+
+    /// Event representation of this instance
+    var event: Event { get }
+}
+
+extension Event : EventConvertible {
+    /// Event representation of this instance
+    public var event: Event {
+        return self
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift b/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift
index 0c5418f5..8dc2a85c 100644
--- a/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift
+++ b/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift
@@ -9,7 +9,7 @@
 /// Represents an object that immediately schedules units of work.
 public protocol ImmediateSchedulerType {
     /**
-    Schedules an action to be executed immediatelly.
+    Schedules an action to be executed immediately.
     
     - parameter state: State passed to the action to be executed.
     - parameter action: Action to be executed.
diff --git a/Pods/RxSwift/RxSwift/Observable.swift b/Pods/RxSwift/RxSwift/Observable.swift
index 44aa1deb..f0c55af7 100644
--- a/Pods/RxSwift/RxSwift/Observable.swift
+++ b/Pods/RxSwift/RxSwift/Observable.swift
@@ -37,8 +37,8 @@ public class Observable : ObservableType {
     // Swift compiler reports "Not supported yet" when trying to override protocol extensions, so ¯\_(ツ)_/¯
 
     /// Optimizations for map operator
-    internal func composeMap(_ selector: @escaping (Element) throws -> R) -> Observable {
-        return Map(source: self, transform: selector)
+    internal func composeMap(_ transform: @escaping (Element) throws -> R) -> Observable {
+        return _map(source: self, transform: transform)
     }
 }
 
diff --git a/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift b/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift
index 72cfb1ac..d89c5aa7 100644
--- a/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift
+++ b/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift
@@ -6,7 +6,7 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-/// Type that can be converted to observable sequence (`Observer`).
+/// Type that can be converted to observable sequence (`Observable`).
 public protocol ObservableConvertibleType {
     /// Type of elements in sequence.
     associatedtype E
diff --git a/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift b/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift
index 1603d39a..ad6fed65 100644
--- a/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift
+++ b/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift
@@ -22,90 +22,99 @@ extension ObservableType {
     }
 
     #if DEBUG
-    /**
-    Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.
+        /**
+        Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.
 
-    - parameter onNext: Action to invoke for each element in the observable sequence.
-    - parameter onError: Action to invoke upon errored termination of the observable sequence.
-    - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
-    - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
-        gracefully completed, errored, or if the generation is cancelled by disposing subscription).
-    - returns: Subscription object used to unsubscribe from the observable sequence.
-    */
-    public func subscribe(file: String = #file, line: UInt = #line, function: String = #function, onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
-        -> Disposable {
+        - parameter onNext: Action to invoke for each element in the observable sequence.
+        - parameter onError: Action to invoke upon errored termination of the observable sequence.
+        - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
+        - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
+            gracefully completed, errored, or if the generation is canceled by disposing subscription).
+        - returns: Subscription object used to unsubscribe from the observable sequence.
+        */
+        public func subscribe(file: String = #file, line: UInt = #line, function: String = #function, onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
+            -> Disposable {
 
-        let disposable: Disposable
+            let disposable: Disposable
 
-        if let disposed = onDisposed {
-            disposable = Disposables.create(with: disposed)
-        }
-        else {
-            disposable = Disposables.create()
-        }
+            if let disposed = onDisposed {
+                disposable = Disposables.create(with: disposed)
+            }
+            else {
+                disposable = Disposables.create()
+            }
 
-        let observer = AnonymousObserver { e in
-            switch e {
-            case .next(let value):
-                onNext?(value)
-            case .error(let e):
-                if let onError = onError {
-                    onError(e)
-                }
-                else {
-                    print("Received unhandled error: \(file):\(line):\(function) -> \(e)")
+            #if DEBUG
+                let _synchronizationTracker = SynchronizationTracker()
+            #endif
+
+            let observer = AnonymousObserver { e in
+                #if DEBUG
+                    _synchronizationTracker.register(synchronizationErrorMessage: .default)
+                    defer { _synchronizationTracker.unregister() }
+                #endif
+
+                switch e {
+                case .next(let value):
+                    onNext?(value)
+                case .error(let e):
+                    if let onError = onError {
+                        onError(e)
+                    }
+                    else {
+                        print("Received unhandled error: \(file):\(line):\(function) -> \(e)")
+                    }
+                    disposable.dispose()
+                case .completed:
+                    onCompleted?()
+                    disposable.dispose()
                 }
-                disposable.dispose()
-            case .completed:
-                onCompleted?()
-                disposable.dispose()
             }
+            return Disposables.create(
+                self.subscribeSafe(observer),
+                disposable
+            )
         }
-        return Disposables.create(
-            self.subscribeSafe(observer),
-            disposable
-        )
-    }
     #else
-    /**
-    Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.
+        /**
+        Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.
 
-    - parameter onNext: Action to invoke for each element in the observable sequence.
-    - parameter onError: Action to invoke upon errored termination of the observable sequence.
-    - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
-    - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
-        gracefully completed, errored, or if the generation is cancelled by disposing subscription).
-    - returns: Subscription object used to unsubscribe from the observable sequence.
-    */
-    public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
-        -> Disposable {
+        - parameter onNext: Action to invoke for each element in the observable sequence.
+        - parameter onError: Action to invoke upon errored termination of the observable sequence.
+        - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
+        - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has
+            gracefully completed, errored, or if the generation is canceled by disposing subscription).
+        - returns: Subscription object used to unsubscribe from the observable sequence.
+        */
+        public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
+            -> Disposable {
 
-        let disposable: Disposable
+            let disposable: Disposable
 
-        if let disposed = onDisposed {
-            disposable = Disposables.create(with: disposed)
-        }
-        else {
-            disposable = Disposables.create()
-        }
+            if let disposed = onDisposed {
+                disposable = Disposables.create(with: disposed)
+            }
+            else {
+                disposable = Disposables.create()
+            }
 
-        let observer = AnonymousObserver { e in
-            switch e {
-            case .next(let value):
-                onNext?(value)
-            case .error(let e):
-                onError?(e)
-                disposable.dispose()
-            case .completed:
-                onCompleted?()
-                disposable.dispose()
+            let observer = AnonymousObserver { e in
+                switch e {
+                case .next(let value):
+                    onNext?(value)
+                case .error(let e):
+                    onError?(e)
+                    disposable.dispose()
+                case .completed:
+                    onCompleted?()
+                    disposable.dispose()
+                }
             }
+            return Disposables.create(
+                self.subscribeSafe(observer),
+                disposable
+            )
         }
-        return Disposables.create(
-            self.subscribeSafe(observer),
-            disposable
-        )
-    }
     #endif
 }
 
diff --git a/Pods/RxSwift/RxSwift/ObservableType.swift b/Pods/RxSwift/RxSwift/ObservableType.swift
index 6331dc87..1fa3a336 100644
--- a/Pods/RxSwift/RxSwift/ObservableType.swift
+++ b/Pods/RxSwift/RxSwift/ObservableType.swift
@@ -29,7 +29,7 @@ public protocol ObservableType : ObservableConvertibleType {
     When sequence sends `Complete` or `Error` event all internal resources that compute sequence elements
     will be freed.
     
-    To cancel production of sequence elements and free resources immediatelly, call `dispose` on returned
+    To cancel production of sequence elements and free resources immediately, call `dispose` on returned
     subscription.
     
     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/AddRef.swift b/Pods/RxSwift/RxSwift/Observables/AddRef.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/AddRef.swift
rename to Pods/RxSwift/RxSwift/Observables/AddRef.swift
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift b/Pods/RxSwift/RxSwift/Observables/Amb.swift
similarity index 71%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift
rename to Pods/RxSwift/RxSwift/Observables/Amb.swift
index 040d8c8e..69d39ba8 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Amb.swift
@@ -6,13 +6,46 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-enum AmbState {
+extension Observable {
+    /**
+     Propagates the observable sequence that reacts first.
+
+     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)
+
+     - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first.
+     */
+    public static func amb(_ sequence: S) -> Observable
+        where S.Iterator.Element == Observable {
+            return sequence.reduce(Observable.never()) { a, o in
+                return a.amb(o.asObservable())
+            }
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Propagates the observable sequence that reacts first.
+
+     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)
+
+     - parameter right: Second observable sequence.
+     - returns: An observable sequence that surfaces either of the given sequences, whichever reacted first.
+     */
+    public func amb
+        (_ right: O2)
+        -> Observable where O2.E == E {
+        return Amb(left: asObservable(), right: right.asObservable())
+    }
+}
+
+fileprivate enum AmbState {
     case neither
     case left
     case right
 }
 
-final class AmbObserver : ObserverType {
+final fileprivate class AmbObserver : ObserverType {
     typealias Element = O.E
     typealias Parent = AmbSink
     typealias This = AmbObserver
@@ -46,7 +79,7 @@ final class AmbObserver : ObserverType {
     }
 }
 
-final class AmbSink : Sink {
+final fileprivate class AmbSink : Sink {
     typealias ElementType = O.E
     typealias Parent = Amb
     typealias AmbObserverType = AmbObserver
@@ -107,7 +140,7 @@ final class AmbSink : Sink {
     }
 }
 
-final class Amb: Producer {
+final fileprivate class Amb: Producer {
     fileprivate let _left: Observable
     fileprivate let _right: Observable
     
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/AsMaybe.swift b/Pods/RxSwift/RxSwift/Observables/AsMaybe.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/AsMaybe.swift
rename to Pods/RxSwift/RxSwift/Observables/AsMaybe.swift
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/AsSingle.swift b/Pods/RxSwift/RxSwift/Observables/AsSingle.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/AsSingle.swift
rename to Pods/RxSwift/RxSwift/Observables/AsSingle.swift
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift b/Pods/RxSwift/RxSwift/Observables/Buffer.swift
similarity index 73%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift
rename to Pods/RxSwift/RxSwift/Observables/Buffer.swift
index 7c6c5235..b8c33ae8 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Buffer.swift
@@ -6,7 +6,27 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class BufferTimeCount : Producer<[Element]> {
+extension ObservableType {
+
+    /**
+     Projects each element of an observable sequence into a buffer that's sent out when either it's full or a given amount of time has elapsed, using the specified scheduler to run timers.
+
+     A useful real-world analogy of this overload is the behavior of a ferry leaving the dock when all seats are taken, or at the scheduled time of departure, whichever event occurs first.
+
+     - seealso: [buffer operator on reactivex.io](http://reactivex.io/documentation/operators/buffer.html)
+
+     - parameter timeSpan: Maximum time length of a buffer.
+     - parameter count: Maximum element count of a buffer.
+     - parameter scheduler: Scheduler to run buffering timers on.
+     - returns: An observable sequence of buffers.
+     */
+    public func buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)
+        -> Observable<[E]> {
+        return BufferTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)
+    }
+}
+
+final fileprivate class BufferTimeCount : Producer<[Element]> {
     
     fileprivate let _timeSpan: RxTimeInterval
     fileprivate let _count: Int
@@ -27,7 +47,7 @@ final class BufferTimeCount : Producer<[Element]> {
     }
 }
 
-final class BufferTimeCountSink
+final fileprivate class BufferTimeCountSink
     : Sink
     , LockOwnerType
     , ObserverType
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift b/Pods/RxSwift/RxSwift/Observables/Catch.swift
similarity index 52%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift
rename to Pods/RxSwift/RxSwift/Observables/Catch.swift
index 3a7484bd..0c534fbe 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Catch.swift
@@ -6,9 +6,84 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
+extension ObservableType {
+
+    /**
+     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.
+
+     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)
+
+     - parameter handler: Error handler function, producing another observable sequence.
+     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.
+     */
+    public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable)
+        -> Observable {
+        return Catch(source: asObservable(), handler: handler)
+    }
+
+    /**
+     Continues an observable sequence that is terminated by an error with a single element.
+
+     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)
+
+     - parameter element: Last element in an observable sequence in case error occurs.
+     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.
+     */
+    public func catchErrorJustReturn(_ element: E)
+        -> Observable {
+        return Catch(source: asObservable(), handler: { _ in Observable.just(element) })
+    }
+    
+}
+
+extension Observable {
+    /**
+     Continues an observable sequence that is terminated by an error with the next observable sequence.
+
+     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)
+
+     - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.
+     */
+    public static func catchError(_ sequence: S) -> Observable
+        where S.Iterator.Element == Observable {
+        return CatchSequence(sources: sequence)
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Repeats the source observable sequence until it successfully terminates.
+
+     **This could potentially create an infinite sequence.**
+
+     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
+
+     - returns: Observable sequence to repeat until it successfully terminates.
+     */
+    public func retry() -> Observable {
+        return CatchSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()))
+    }
+
+    /**
+     Repeats the source observable sequence the specified number of times in case of an error or until it successfully terminates.
+
+     If you encounter an error and want it to retry once, then you must use `retry(2)`
+
+     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
+
+     - parameter maxAttemptCount: Maximum number of times to repeat the sequence.
+     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.
+     */
+    public func retry(_ maxAttemptCount: Int)
+        -> Observable {
+            return CatchSequence(sources: repeatElement(self.asObservable(), count: maxAttemptCount))
+    }
+}
+
 // catch with callback
 
-final class CatchSinkProxy : ObserverType {
+final fileprivate class CatchSinkProxy : ObserverType {
     typealias E = O.E
     typealias Parent = CatchSink
     
@@ -30,7 +105,7 @@ final class CatchSinkProxy : ObserverType {
     }
 }
 
-final class CatchSink : Sink, ObserverType {
+final fileprivate class CatchSink : Sink, ObserverType {
     typealias E = O.E
     typealias Parent = Catch
     
@@ -73,7 +148,7 @@ final class CatchSink : Sink, ObserverType {
     }
 }
 
-final class Catch : Producer {
+final fileprivate class Catch : Producer {
     typealias Handler = (Swift.Error) throws -> Observable
     
     fileprivate let _source: Observable
@@ -93,7 +168,7 @@ final class Catch : Producer {
 
 // catch enumerable
 
-final class CatchSequenceSink
+final fileprivate class CatchSequenceSink
     : TailRecursiveSink
     , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E {
     typealias Element = O.E
@@ -143,7 +218,7 @@ final class CatchSequenceSink
     }
 }
 
-final class CatchSequence : Producer where S.Iterator.Element : ObservableConvertibleType {
+final fileprivate class CatchSequence : Producer where S.Iterator.Element : ObservableConvertibleType {
     typealias Element = S.Iterator.Element.E
     
     let sources: S
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+Collection.swift b/Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift
similarity index 68%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+Collection.swift
rename to Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift
index 35873090..9f713f6f 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+Collection.swift
+++ b/Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift
@@ -6,7 +6,34 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class CombineLatestCollectionTypeSink
+extension Observable {
+    /**
+     Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
+
+     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
+
+     - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
+     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+     */
+    public static func combineLatest(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable
+        where C.Iterator.Element: ObservableType {
+        return CombineLatestCollectionType(sources: collection, resultSelector: resultSelector)
+    }
+
+    /**
+     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.
+
+     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
+
+     - returns: An observable sequence containing the result of combining elements of the sources.
+     */
+    public static func combineLatest(_ collection: C) -> Observable<[Element]>
+        where C.Iterator.Element: ObservableType, C.Iterator.Element.E == Element {
+        return CombineLatestCollectionType(sources: collection, resultSelector: { $0 })
+    }
+}
+
+final fileprivate class CombineLatestCollectionTypeSink
     : Sink where C.Iterator.Element : ObservableConvertibleType {
     typealias R = O.E
     typealias Parent = CombineLatestCollectionType
@@ -100,12 +127,16 @@ final class CombineLatestCollectionTypeSink
             
             j += 1
         }
+
+        if _parent._sources.isEmpty {
+            self.forwardOn(.completed)
+        }
         
         return Disposables.create(_subscriptions)
     }
 }
 
-final class CombineLatestCollectionType : Producer where C.Iterator.Element : ObservableConvertibleType {
+final fileprivate class CombineLatestCollectionType : Producer where C.Iterator.Element : ObservableConvertibleType {
     typealias ResultSelector = ([C.Iterator.Element.E]) throws -> R
     
     let _sources: C
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift b/Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift
similarity index 98%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift
rename to Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift
index 86da43a5..aac43a70 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift
+++ b/Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift
@@ -36,7 +36,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2)
@@ -134,7 +134,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2, _ source3: O3)
@@ -239,7 +239,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)
@@ -351,7 +351,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)
@@ -470,7 +470,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)
@@ -596,7 +596,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)
@@ -729,7 +729,7 @@ extension ObservableType where E == Any {
 
     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func combineLatest
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest.swift b/Pods/RxSwift/RxSwift/Observables/CombineLatest.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest.swift
rename to Pods/RxSwift/RxSwift/Observables/CombineLatest.swift
diff --git a/Pods/RxSwift/RxSwift/Observables/Concat.swift b/Pods/RxSwift/RxSwift/Observables/Concat.swift
new file mode 100644
index 00000000..cc4174b8
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Concat.swift
@@ -0,0 +1,131 @@
+//
+//  Concat.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 3/21/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType {
+
+    /**
+     Concatenates the second observable sequence to `self` upon successful termination of `self`.
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - parameter second: Second observable sequence.
+     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
+     */
+    public func concat(_ second: O) -> Observable where O.E == E {
+        return Observable.concat([self.asObservable(), second.asObservable()])
+    }
+}
+
+extension Observable {
+    /**
+     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
+
+     This operator has tail recursive optimizations that will prevent stack overflow.
+
+     Optimizations will be performed in cases equivalent to following:
+
+     [1, [2, [3, .....].concat()].concat].concat()
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
+     */
+    public static func concat(_ sequence: S) -> Observable
+        where S.Iterator.Element == Observable {
+            return Concat(sources: sequence, count: nil)
+    }
+
+    /**
+     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.
+
+     This operator has tail recursive optimizations that will prevent stack overflow.
+
+     Optimizations will be performed in cases equivalent to following:
+
+     [1, [2, [3, .....].concat()].concat].concat()
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
+     */
+    public static func concat(_ collection: S) -> Observable
+        where S.Iterator.Element == Observable {
+            return Concat(sources: collection, count: collection.count.toIntMax())
+    }
+
+    /**
+     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.
+
+     This operator has tail recursive optimizations that will prevent stack overflow.
+
+     Optimizations will be performed in cases equivalent to following:
+
+     [1, [2, [3, .....].concat()].concat].concat()
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
+     */
+    public static func concat(_ sources: Observable ...) -> Observable {
+        return Concat(sources: sources, count: sources.count.toIntMax())
+    }
+}
+
+final fileprivate class ConcatSink
+    : TailRecursiveSink
+    , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E {
+    typealias Element = O.E
+    
+    override init(observer: O, cancel: Cancelable) {
+        super.init(observer: observer, cancel: cancel)
+    }
+    
+    func on(_ event: Event){
+        switch event {
+        case .next:
+            forwardOn(event)
+        case .error:
+            forwardOn(event)
+            dispose()
+        case .completed:
+            schedule(.moveNext)
+        }
+    }
+
+    override func subscribeToNext(_ source: Observable) -> Disposable {
+        return source.subscribe(self)
+    }
+    
+    override func extract(_ observable: Observable) -> SequenceGenerator? {
+        if let source = observable as? Concat {
+            return (source._sources.makeIterator(), source._count)
+        }
+        else {
+            return nil
+        }
+    }
+}
+
+final fileprivate class Concat : Producer where S.Iterator.Element : ObservableConvertibleType {
+    typealias Element = S.Iterator.Element.E
+    
+    fileprivate let _sources: S
+    fileprivate let _count: IntMax?
+
+    init(sources: S, count: IntMax?) {
+        _sources = sources
+        _count = count
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
+        let sink = ConcatSink(observer: observer, cancel: cancel)
+        let subscription = sink.run((_sources.makeIterator(), _count))
+        return (sink: sink, subscription: subscription)
+    }
+}
+
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift b/Pods/RxSwift/RxSwift/Observables/Create.swift
similarity index 58%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift
rename to Pods/RxSwift/RxSwift/Observables/Create.swift
index c1b9a80d..664daa1e 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Create.swift
@@ -1,12 +1,28 @@
 //
-//  AnonymousObservable.swift
+//  Create.swift
 //  RxSwift
 //
 //  Created by Krunoslav Zaher on 2/8/15.
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class AnonymousObservableSink : Sink, ObserverType {
+extension Observable {
+    // MARK: create
+
+    /**
+     Creates an observable sequence from a specified subscribe method implementation.
+
+     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
+
+     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
+     - returns: The observable sequence with the specified implementation for the `subscribe` method.
+     */
+    public static func create(_ subscribe: @escaping (AnyObserver) -> Disposable) -> Observable {
+        return AnonymousObservable(subscribe)
+    }
+}
+
+final fileprivate class AnonymousObservableSink : Sink, ObserverType {
     typealias E = O.E
     typealias Parent = AnonymousObservable
 
@@ -14,7 +30,7 @@ final class AnonymousObservableSink : Sink, ObserverType {
     private var _isStopped: AtomicInt = 0
 
     #if DEBUG
-        fileprivate var _numberOfConcurrentCalls: AtomicInt = 0
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
     #endif
 
     override init(observer: O, cancel: Cancelable) {
@@ -23,13 +39,8 @@ final class AnonymousObservableSink : Sink, ObserverType {
 
     func on(_ event: Event) {
         #if DEBUG
-            if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
-                rxFatalError("Warning: Recursive call or synchronization error!")
-            }
-
-            defer {
-                _ = AtomicDecrement(&_numberOfConcurrentCalls)
-        }
+            _synchronizationTracker.register(synchronizationErrorMessage: .default)
+            defer { _synchronizationTracker.unregister() }
         #endif
         switch event {
         case .next:
@@ -50,7 +61,7 @@ final class AnonymousObservableSink : Sink, ObserverType {
     }
 }
 
-final class AnonymousObservable : Producer {
+final fileprivate class AnonymousObservable : Producer {
     typealias SubscribeHandler = (AnyObserver) -> Disposable
 
     let _subscribeHandler: SubscribeHandler
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Debounce.swift b/Pods/RxSwift/RxSwift/Observables/Debounce.swift
similarity index 75%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Debounce.swift
rename to Pods/RxSwift/RxSwift/Observables/Debounce.swift
index 0a8d7cc9..866427a0 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Debounce.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Debounce.swift
@@ -6,7 +6,24 @@
 //  Copyright © 2016 Krunoslav Zaher. All rights reserved.
 //
 
-final class DebounceSink
+extension ObservableType {
+
+    /**
+     Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.
+
+     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)
+
+     - parameter dueTime: Throttling duration for each element.
+     - parameter scheduler: Scheduler to run the throttle timers on.
+     - returns: The throttled sequence.
+     */
+    public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+            return Debounce(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
+    }
+}
+
+final fileprivate class DebounceSink
     : Sink
     , ObserverType
     , LockOwnerType
@@ -81,7 +98,7 @@ final class DebounceSink
     }
 }
 
-final class Debounce : Producer {
+final fileprivate class Debounce : Producer {
 
     fileprivate let _source: Observable
     fileprivate let _dueTime: RxTimeInterval
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift b/Pods/RxSwift/RxSwift/Observables/Debug.swift
similarity index 69%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift
rename to Pods/RxSwift/RxSwift/Observables/Debug.swift
index a90962ee..1b7d2623 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Debug.swift
@@ -9,13 +9,30 @@
 import struct Foundation.Date
 import class Foundation.DateFormatter
 
-let dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
+extension ObservableType {
 
-func logEvent(_ identifier: String, dateFormat: DateFormatter, content: String) {
+    /**
+     Prints received events for all observers on standard output.
+
+     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)
+
+     - parameter identifier: Identifier that is printed together with event description to standard output.
+     - parameter trimOutput: Should output be trimmed to max 40 characters.
+     - returns: An observable sequence whose events are printed to standard output.
+     */
+    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)
+        -> Observable {
+            return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function)
+    }
+}
+
+fileprivate let dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
+
+fileprivate func logEvent(_ identifier: String, dateFormat: DateFormatter, content: String) {
     print("\(dateFormat.string(from: Date())): \(identifier) -> \(content)")
 }
 
-final class DebugSink : Sink, ObserverType where O.E == Source.E {
+final fileprivate class DebugSink : Sink, ObserverType where O.E == Source.E {
     typealias Element = O.E
     typealias Parent = Debug
     
@@ -55,7 +72,7 @@ final class DebugSink : Sink, Observ
     }
 }
 
-final class Debug : Producer {
+final fileprivate class Debug : Producer {
     fileprivate let _identifier: String
     fileprivate let _trimOutput: Bool
     fileprivate let _source: Source
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/DefaultIfEmpty.swift b/Pods/RxSwift/RxSwift/Observables/DefaultIfEmpty.swift
similarity index 62%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/DefaultIfEmpty.swift
rename to Pods/RxSwift/RxSwift/Observables/DefaultIfEmpty.swift
index ea967b4e..696361fd 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/DefaultIfEmpty.swift
+++ b/Pods/RxSwift/RxSwift/Observables/DefaultIfEmpty.swift
@@ -6,7 +6,22 @@
 //  Copyright © 2016 Krunoslav Zaher. All rights reserved.
 //
 
-final class DefaultIfEmptySink: Sink, ObserverType {
+extension ObservableType {
+
+    /**
+     Emits elements from the source observable sequence, or a default element if the source observable sequence is empty.
+
+     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)
+
+     - parameter default: Default element to be sent if the source does not emit any elements
+     - returns: An observable sequence which emits default element end completes in case the original sequence is empty
+     */
+    public func ifEmpty(default: E) -> Observable {
+        return DefaultIfEmpty(source: self.asObservable(), default: `default`)
+    }
+}
+
+final fileprivate class DefaultIfEmptySink: Sink, ObserverType {
     typealias E = O.E
     private let _default: E
     private var _isEmpty = true
@@ -34,7 +49,7 @@ final class DefaultIfEmptySink: Sink, ObserverType {
     }
 }
 
-final class DefaultIfEmpty: Producer {
+final fileprivate class DefaultIfEmpty: Producer {
     private let _source: Observable
     private let _default: SourceType
     
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift b/Pods/RxSwift/RxSwift/Observables/Deferred.swift
similarity index 62%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift
rename to Pods/RxSwift/RxSwift/Observables/Deferred.swift
index 15d6695e..6a0b2443 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Deferred.swift
@@ -6,7 +6,22 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class DeferredSink : Sink, ObserverType where S.E == O.E {
+extension Observable {
+    /**
+     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.
+
+     - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)
+
+     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.
+     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.
+     */
+    public static func deferred(_ observableFactory: @escaping () throws -> Observable)
+        -> Observable {
+        return Deferred(observableFactory: observableFactory)
+    }
+}
+
+final fileprivate class DeferredSink : Sink, ObserverType where S.E == O.E {
     typealias E = O.E
 
     private let _observableFactory: () throws -> S
@@ -42,7 +57,7 @@ final class DeferredSink : Sink, Observer
     }
 }
 
-final class Deferred : Producer {
+final fileprivate class Deferred : Producer {
     typealias Factory = () throws -> S
     
     private let _observableFactory : Factory
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift b/Pods/RxSwift/RxSwift/Observables/Delay.swift
similarity index 85%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift
rename to Pods/RxSwift/RxSwift/Observables/Delay.swift
index c5c04b49..b13ee9cc 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Delay.swift
@@ -8,7 +8,24 @@
 
 import struct Foundation.Date
 
-final class DelaySink
+extension ObservableType {
+
+    /**
+     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.
+
+     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)
+
+     - parameter dueTime: Relative time shift of the source by.
+     - parameter scheduler: Scheduler to run the subscription delay timer on.
+     - returns: the source Observable shifted in time by the specified delay.
+     */
+    public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+            return Delay(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
+    }
+}
+
+final fileprivate class DelaySink
     : Sink
     , ObserverType {
     typealias E = O.E
@@ -40,7 +57,7 @@ final class DelaySink
     }
 
     // All of these complications in this method are caused by the fact that 
-    // error should be propagated immediatelly. Error can bepotentially received on different
+    // error should be propagated immediately. Error can be potentially received on different
     // scheduler so this process needs to be synchronized somehow.
     //
     // Another complication is that scheduler is potentially concurrent so internal queue is used.
@@ -145,7 +162,7 @@ final class DelaySink
     }
 }
 
-final class Delay: Producer {
+final fileprivate class Delay: Producer {
     private let _source: Observable
     private let _dueTime: RxTimeInterval
     private let _scheduler: SchedulerType
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift b/Pods/RxSwift/RxSwift/Observables/DelaySubscription.swift
similarity index 61%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift
rename to Pods/RxSwift/RxSwift/Observables/DelaySubscription.swift
index d4e8c659..9225a196 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift
+++ b/Pods/RxSwift/RxSwift/Observables/DelaySubscription.swift
@@ -6,7 +6,24 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class DelaySubscriptionSink
+extension ObservableType {
+
+    /**
+     Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.
+
+     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)
+
+     - parameter dueTime: Relative time shift of the subscription.
+     - parameter scheduler: Scheduler to run the subscription delay timer on.
+     - returns: Time-shifted sequence.
+     */
+    public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+        return DelaySubscription(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
+    }
+}
+
+final fileprivate class DelaySubscriptionSink
     : Sink, ObserverType {
     typealias E = O.E
     typealias Parent = DelaySubscription
@@ -27,7 +44,7 @@ final class DelaySubscriptionSink
     
 }
 
-final class DelaySubscription: Producer {
+final fileprivate class DelaySubscription: Producer {
     private let _source: Observable
     private let _dueTime: RxTimeInterval
     private let _scheduler: SchedulerType
diff --git a/Pods/RxSwift/RxSwift/Observables/Dematerialize.swift b/Pods/RxSwift/RxSwift/Observables/Dematerialize.swift
new file mode 100644
index 00000000..d142249a
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Dematerialize.swift
@@ -0,0 +1,51 @@
+//
+//  Dematerialize.swift
+//  RxSwift
+//
+//  Created by Jamie Pinkham on 3/13/17.
+//  Copyright © 2017 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType where E: EventConvertible {
+    /**
+     Convert any previously materialized Observable into it's original form.
+     - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)
+     - returns: The dematerialized observable sequence.
+     */
+    public func dematerialize() -> Observable {
+        return Dematerialize(source: self.asObservable())
+    }
+
+}
+
+fileprivate final class DematerializeSink: Sink, ObserverType where O.E == Element.ElementType {
+    fileprivate func on(_ event: Event) {
+        switch event {
+        case .next(let element):
+            forwardOn(element.event)
+            if element.event.isStopEvent {
+                dispose()
+            }
+        case .completed:
+            forwardOn(.completed)
+            dispose()
+        case .error(let error):
+            forwardOn(.error(error))
+            dispose()
+        }
+    }
+}
+
+final fileprivate class Dematerialize: Producer  {
+    private let _source: Observable
+    
+    init(source: Observable) {
+        _source = source
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element.ElementType {
+        let sink = DematerializeSink(observer: observer, cancel: cancel)
+        let subscription = _source.subscribe(sink)
+        return (sink: sink, subscription: subscription)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/DistinctUntilChanged.swift b/Pods/RxSwift/RxSwift/Observables/DistinctUntilChanged.swift
new file mode 100644
index 00000000..f72f5201
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/DistinctUntilChanged.swift
@@ -0,0 +1,125 @@
+//
+//  DistinctUntilChanged.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 3/15/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType where E: Equatable {
+
+    /**
+     Returns an observable sequence that contains only distinct contiguous elements according to equality operator.
+
+     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
+
+     - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.
+     */
+    public func distinctUntilChanged()
+        -> Observable {
+            return self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })
+    }
+}
+
+extension ObservableType {
+    /**
+     Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.
+
+     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
+
+     - parameter keySelector: A function to compute the comparison key for each element.
+     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.
+     */
+    public func distinctUntilChanged(_ keySelector: @escaping (E) throws -> K)
+        -> Observable {
+            return self.distinctUntilChanged(keySelector, comparer: { $0 == $1 })
+    }
+
+    /**
+     Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.
+
+     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
+
+     - parameter comparer: Equality comparer for computed key values.
+     - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.
+     */
+    public func distinctUntilChanged(_ comparer: @escaping (E, E) throws -> Bool)
+        -> Observable {
+            return self.distinctUntilChanged({ $0 }, comparer: comparer)
+    }
+
+    /**
+     Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.
+
+     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
+
+     - parameter keySelector: A function to compute the comparison key for each element.
+     - parameter comparer: Equality comparer for computed key values.
+     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.
+     */
+    public func distinctUntilChanged(_ keySelector: @escaping (E) throws -> K, comparer: @escaping (K, K) throws -> Bool)
+        -> Observable {
+            return DistinctUntilChanged(source: self.asObservable(), selector: keySelector, comparer: comparer)
+    }
+}
+
+final fileprivate class DistinctUntilChangedSink: Sink, ObserverType {
+    typealias E = O.E
+    
+    private let _parent: DistinctUntilChanged
+    private var _currentKey: Key? = nil
+    
+    init(parent: DistinctUntilChanged, observer: O, cancel: Cancelable) {
+        _parent = parent
+        super.init(observer: observer, cancel: cancel)
+    }
+    
+    func on(_ event: Event) {
+        switch event {
+        case .next(let value):
+            do {
+                let key = try _parent._selector(value)
+                var areEqual = false
+                if let currentKey = _currentKey {
+                    areEqual = try _parent._comparer(currentKey, key)
+                }
+                
+                if areEqual {
+                    return
+                }
+                
+                _currentKey = key
+                
+                forwardOn(event)
+            }
+            catch let error {
+                forwardOn(.error(error))
+                dispose()
+            }
+        case .error, .completed:
+            forwardOn(event)
+            dispose()
+        }
+    }
+}
+
+final fileprivate class DistinctUntilChanged: Producer {
+    typealias KeySelector = (Element) throws -> Key
+    typealias EqualityComparer = (Key, Key) throws -> Bool
+    
+    fileprivate let _source: Observable
+    fileprivate let _selector: KeySelector
+    fileprivate let _comparer: EqualityComparer
+    
+    init(source: Observable, selector: @escaping KeySelector, comparer: @escaping EqualityComparer) {
+        _source = source
+        _selector = selector
+        _comparer = comparer
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
+        let sink = DistinctUntilChangedSink(parent: self, observer: observer, cancel: cancel)
+        let subscription = _source.subscribe(sink)
+        return (sink: sink, subscription: subscription)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Do.swift b/Pods/RxSwift/RxSwift/Observables/Do.swift
new file mode 100644
index 00000000..2be6d583
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Do.swift
@@ -0,0 +1,93 @@
+//
+//  Do.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 2/21/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType {
+    /**
+     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.
+
+     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)
+
+     - parameter onNext: Action to invoke for each element in the observable sequence.
+     - parameter onError: Action to invoke upon errored termination of the observable sequence.
+     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
+     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.
+     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.
+     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.
+     - returns: The source sequence with the side-effecting behavior applied.
+     */
+    public func `do`(onNext: ((E) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> ())? = nil, onSubscribed: (() -> ())? = nil, onDispose: (() -> ())? = nil)
+        -> Observable {
+            return Do(source: self.asObservable(), eventHandler: { e in
+                switch e {
+                case .next(let element):
+                    try onNext?(element)
+                case .error(let e):
+                    try onError?(e)
+                case .completed:
+                    try onCompleted?()
+                }
+            }, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose)
+    }
+}
+
+final fileprivate class DoSink : Sink, ObserverType {
+    typealias Element = O.E
+    typealias EventHandler = (Event) throws -> Void
+    
+    private let _eventHandler: EventHandler
+    
+    init(eventHandler: @escaping EventHandler, observer: O, cancel: Cancelable) {
+        _eventHandler = eventHandler
+        super.init(observer: observer, cancel: cancel)
+    }
+    
+    func on(_ event: Event) {
+        do {
+            try _eventHandler(event)
+            forwardOn(event)
+            if event.isStopEvent {
+                dispose()
+            }
+        }
+        catch let error {
+            forwardOn(.error(error))
+            dispose()
+        }
+    }
+}
+
+final fileprivate class Do : Producer {
+    typealias EventHandler = (Event) throws -> Void
+    
+    fileprivate let _source: Observable
+    fileprivate let _eventHandler: EventHandler
+    fileprivate let _onSubscribe: (() -> ())?
+    fileprivate let _onSubscribed: (() -> ())?
+    fileprivate let _onDispose: (() -> ())?
+    
+    init(source: Observable, eventHandler: @escaping EventHandler, onSubscribe: (() -> ())?, onSubscribed: (() -> ())?, onDispose: (() -> ())?) {
+        _source = source
+        _eventHandler = eventHandler
+        _onSubscribe = onSubscribe
+        _onSubscribed = onSubscribed
+        _onDispose = onDispose
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
+        _onSubscribe?()
+        let sink = DoSink(eventHandler: _eventHandler, observer: observer, cancel: cancel)
+        let subscription = _source.subscribe(sink)
+        _onSubscribed?()
+        let onDispose = _onDispose
+        let allSubscriptions = Disposables.create {
+            subscription.dispose()
+            onDispose?()
+        }
+        return (sink: sink, subscription: allSubscriptions)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift b/Pods/RxSwift/RxSwift/Observables/ElementAt.swift
similarity index 73%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift
rename to Pods/RxSwift/RxSwift/Observables/ElementAt.swift
index 0d774e3c..500a0442 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift
+++ b/Pods/RxSwift/RxSwift/Observables/ElementAt.swift
@@ -6,8 +6,23 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
+extension ObservableType {
 
-final class ElementAtSink : Sink, ObserverType {
+    /**
+     Returns a sequence emitting only element _n_ emitted by an Observable
+
+     - seealso: [elementAt operator on reactivex.io](http://reactivex.io/documentation/operators/elementat.html)
+
+     - parameter index: The index of the required element (starting from 0).
+     - returns: An observable sequence that emits the desired element as its own sole emission.
+     */
+    public func elementAt(_ index: Int)
+        -> Observable {
+        return ElementAt(source: asObservable(), index: index, throwOnEmpty: true)
+    }
+}
+
+final fileprivate class ElementAtSink : Sink, ObserverType {
     typealias SourceType = O.E
     typealias Parent = ElementAt
     
@@ -54,7 +69,7 @@ final class ElementAtSink : Sink, ObserverType {
     }
 }
 
-final class ElementAt : Producer {
+final fileprivate class ElementAt : Producer {
     
     let _source: Observable
     let _throwOnEmpty: Bool
diff --git a/Pods/RxSwift/RxSwift/Observables/Empty.swift b/Pods/RxSwift/RxSwift/Observables/Empty.swift
new file mode 100644
index 00000000..1511a946
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Empty.swift
@@ -0,0 +1,27 @@
+//
+//  Empty.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 8/30/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension Observable {
+    /**
+     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.
+
+     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
+
+     - returns: An observable sequence with no elements.
+     */
+    public static func empty() -> Observable {
+        return EmptyProducer()
+    }
+}
+
+final fileprivate class EmptyProducer : Producer {
+    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
+        observer.on(.completed)
+        return Disposables.create()
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Error.swift b/Pods/RxSwift/RxSwift/Observables/Error.swift
new file mode 100644
index 00000000..c76068f0
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Error.swift
@@ -0,0 +1,33 @@
+//
+//  Error.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 8/30/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension Observable {
+    /**
+     Returns an observable sequence that terminates with an `error`.
+
+     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
+
+     - returns: The observable sequence that terminates with specified error.
+     */
+    public static func error(_ error: Swift.Error) -> Observable {
+        return ErrorProducer(error: error)
+    }
+}
+
+final fileprivate class ErrorProducer : Producer {
+    private let _error: Swift.Error
+    
+    init(error: Swift.Error) {
+        _error = error
+    }
+    
+    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
+        observer.on(.error(_error))
+        return Disposables.create()
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift b/Pods/RxSwift/RxSwift/Observables/Filter.swift
similarity index 55%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift
rename to Pods/RxSwift/RxSwift/Observables/Filter.swift
index c9ef2d3c..8cf8c0d5 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Filter.swift
@@ -6,7 +6,40 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class FilterSink: Sink, ObserverType {
+extension ObservableType {
+
+    /**
+     Filters the elements of an observable sequence based on a predicate.
+
+     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)
+
+     - parameter predicate: A function to test each source element for a condition.
+     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.
+     */
+    public func filter(_ predicate: @escaping (E) throws -> Bool)
+        -> Observable {
+        return Filter(source: asObservable(), predicate: predicate)
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Skips elements and completes (or errors) when the receiver completes (or errors). Equivalent to filter that always returns false.
+
+     - seealso: [ignoreElements operator on reactivex.io](http://reactivex.io/documentation/operators/ignoreelements.html)
+
+     - returns: An observable sequence that skips all elements of the source sequence.
+     */
+    public func ignoreElements()
+        -> Observable {
+            return filter { _ -> Bool in
+                return false
+            }
+    }
+}
+
+final fileprivate class FilterSink: Sink, ObserverType {
     typealias Predicate = (Element) throws -> Bool
     typealias Element = O.E
     
@@ -37,7 +70,7 @@ final class FilterSink: Sink, ObserverType {
     }
 }
 
-final class Filter : Producer {
+final fileprivate class Filter : Producer {
     typealias Predicate = (Element) throws -> Bool
     
     private let _source: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift b/Pods/RxSwift/RxSwift/Observables/Generate.swift
similarity index 66%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift
rename to Pods/RxSwift/RxSwift/Observables/Generate.swift
index a58b37aa..db5b6488 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Generate.swift
@@ -6,7 +6,25 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class GenerateSink : Sink {
+extension Observable {
+    /**
+     Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler
+     to run the loop send out observer messages.
+
+     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
+
+     - parameter initialState: Initial state.
+     - parameter condition: Condition to terminate generation (upon returning `false`).
+     - parameter iterate: Iteration step function.
+     - parameter scheduler: Scheduler on which to run the generator loop.
+     - returns: The generated sequence.
+     */
+    public static func generate(initialState: E, condition: @escaping (E) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (E) throws -> E) -> Observable {
+        return Generate(initialState: initialState, condition: condition, iterate: iterate, resultSelector: { $0 }, scheduler: scheduler)
+    }
+}
+
+final fileprivate class GenerateSink : Sink {
     typealias Parent = Generate
     
     private let _parent: Parent
@@ -45,7 +63,7 @@ final class GenerateSink : Sink {
     }
 }
 
-final class Generate : Producer {
+final fileprivate class Generate : Producer {
     fileprivate let _initialState: S
     fileprivate let _condition: (S) throws -> Bool
     fileprivate let _iterate: (S) throws -> S
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/GroupBy.swift b/Pods/RxSwift/RxSwift/Observables/GroupBy.swift
similarity index 78%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/GroupBy.swift
rename to Pods/RxSwift/RxSwift/Observables/GroupBy.swift
index fe7a4c05..a8a0e78a 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/GroupBy.swift
+++ b/Pods/RxSwift/RxSwift/Observables/GroupBy.swift
@@ -6,7 +6,22 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class GroupedObservableImpl : Observable {
+extension ObservableType {
+    /*
+     Groups the elements of an observable sequence according to a specified key selector function.
+
+     - seealso: [groupBy operator on reactivex.io](http://reactivex.io/documentation/operators/groupby.html)
+
+     - parameter keySelector: A function to extract the key for each element.
+     - returns: A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+     */
+    public func groupBy(keySelector: @escaping (E) throws -> K)
+        -> Observable> {
+        return GroupBy(source: self.asObservable(), selector: keySelector)
+    }
+}
+
+final fileprivate class GroupedObservableImpl : Observable {
     private var _subject: PublishSubject
     private var _refCount: RefCountDisposable
     
@@ -23,7 +38,7 @@ final class GroupedObservableImpl : Observable {
 }
 
 
-final class GroupBySink
+final fileprivate class GroupBySink
     : Sink
     , ObserverType where O.E == GroupedObservable {
     typealias E = Element
@@ -101,7 +116,7 @@ final class GroupBySink
     }
 }
 
-final class GroupBy: Producer> {
+final fileprivate class GroupBy: Producer> {
     typealias KeySelector = (Element) throws -> Key
 
     fileprivate let _source: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift
deleted file mode 100644
index 527a68a6..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-//  Concat.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/21/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-
-final class ConcatSink
-    : TailRecursiveSink
-    , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E {
-    typealias Element = O.E
-    
-    override init(observer: O, cancel: Cancelable) {
-        super.init(observer: observer, cancel: cancel)
-    }
-    
-    func on(_ event: Event){
-        switch event {
-        case .next:
-            forwardOn(event)
-        case .error:
-            forwardOn(event)
-            dispose()
-        case .completed:
-            schedule(.moveNext)
-        }
-    }
-
-    override func subscribeToNext(_ source: Observable) -> Disposable {
-        return source.subscribe(self)
-    }
-    
-    override func extract(_ observable: Observable) -> SequenceGenerator? {
-        if let source = observable as? Concat {
-            return (source._sources.makeIterator(), source._count)
-        }
-        else {
-            return nil
-        }
-    }
-}
-
-final class Concat : Producer where S.Iterator.Element : ObservableConvertibleType {
-    typealias Element = S.Iterator.Element.E
-    
-    fileprivate let _sources: S
-    fileprivate let _count: IntMax?
-
-    init(sources: S, count: IntMax?) {
-        _sources = sources
-        _count = count
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
-        let sink = ConcatSink(observer: observer, cancel: cancel)
-        let subscription = sink.run((_sources.makeIterator(), _count))
-        return (sink: sink, subscription: subscription)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift
deleted file mode 100644
index 5557a897..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-//  ConnectableObservable.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/1/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-/**
- Represents an observable wrapper that can be connected and disconnected from its underlying observable sequence.
-*/
-public class ConnectableObservable
-    : Observable
-    , ConnectableObservableType {
-
-    /**
-     Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.
-     
-     - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.
-    */
-    public func connect() -> Disposable {
-        rxAbstractMethod()
-    }
-}
-
-final class Connection : ObserverType, Disposable {
-    typealias E = S.SubjectObserverType.E
-
-    private var _lock: RecursiveLock
-    // state
-    private var _parent: ConnectableObservableAdapter?
-    private var _subscription : Disposable?
-    private var _subjectObserver: S.SubjectObserverType
-
-    private var _disposed: Bool = false
-
-    init(parent: ConnectableObservableAdapter, subjectObserver: S.SubjectObserverType, lock: RecursiveLock, subscription: Disposable) {
-        _parent = parent
-        _subscription = subscription
-        _lock = lock
-        _subjectObserver = subjectObserver
-    }
-
-    func on(_ event: Event) {
-        if _disposed {
-            return
-        }
-        _subjectObserver.on(event)
-        if event.isStopEvent {
-            self.dispose()
-        }
-    }
-    
-    func dispose() {
-        _lock.lock(); defer { _lock.unlock() } // {
-            _disposed = true
-            guard let parent = _parent else {
-                return
-            }
-        
-            if parent._connection === self {
-                parent._connection = nil
-            }
-            _parent = nil
-
-            _subscription?.dispose()
-            _subscription = nil
-        // }
-    }
-}
-
-final class ConnectableObservableAdapter
-    : ConnectableObservable {
-    typealias ConnectionType = Connection
-    
-    fileprivate let _subject: S
-    fileprivate let _source: Observable
-    
-    fileprivate let _lock = RecursiveLock()
-    
-    // state
-    fileprivate var _connection: ConnectionType?
-    
-    init(source: Observable, subject: S) {
-        _source = source
-        _subject = subject
-        _connection = nil
-    }
-    
-    override func connect() -> Disposable {
-        return _lock.calculateLocked {
-            if let connection = _connection {
-                return connection
-            }
-
-            let singleAssignmentDisposable = SingleAssignmentDisposable()
-            let connection = Connection(parent: self, subjectObserver: _subject.asObserver(), lock: _lock, subscription: singleAssignmentDisposable)
-            _connection = connection
-            let subscription = _source.subscribe(connection)
-            singleAssignmentDisposable.setDisposable(subscription)
-            return connection
-        }
-    }
-    
-    override func subscribe(_ observer: O) -> Disposable where O.E == S.E {
-        return _subject.subscribe(observer)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift
deleted file mode 100644
index a9a482a2..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-//  DistinctUntilChanged.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/15/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class DistinctUntilChangedSink: Sink, ObserverType {
-    typealias E = O.E
-    
-    private let _parent: DistinctUntilChanged
-    private var _currentKey: Key? = nil
-    
-    init(parent: DistinctUntilChanged, observer: O, cancel: Cancelable) {
-        _parent = parent
-        super.init(observer: observer, cancel: cancel)
-    }
-    
-    func on(_ event: Event) {
-        switch event {
-        case .next(let value):
-            do {
-                let key = try _parent._selector(value)
-                var areEqual = false
-                if let currentKey = _currentKey {
-                    areEqual = try _parent._comparer(currentKey, key)
-                }
-                
-                if areEqual {
-                    return
-                }
-                
-                _currentKey = key
-                
-                forwardOn(event)
-            }
-            catch let error {
-                forwardOn(.error(error))
-                dispose()
-            }
-        case .error, .completed:
-            forwardOn(event)
-            dispose()
-        }
-    }
-}
-
-final class DistinctUntilChanged: Producer {
-    typealias KeySelector = (Element) throws -> Key
-    typealias EqualityComparer = (Key, Key) throws -> Bool
-    
-    fileprivate let _source: Observable
-    fileprivate let _selector: KeySelector
-    fileprivate let _comparer: EqualityComparer
-    
-    init(source: Observable, selector: @escaping KeySelector, comparer: @escaping EqualityComparer) {
-        _source = source
-        _selector = selector
-        _comparer = comparer
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
-        let sink = DistinctUntilChangedSink(parent: self, observer: observer, cancel: cancel)
-        let subscription = _source.subscribe(sink)
-        return (sink: sink, subscription: subscription)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift
deleted file mode 100644
index db33ebaa..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-//  Do.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 2/21/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class DoSink : Sink, ObserverType {
-    typealias Element = O.E
-    typealias Parent = Do
-    
-    private let _parent: Parent
-    
-    init(parent: Parent, observer: O, cancel: Cancelable) {
-        _parent = parent
-        super.init(observer: observer, cancel: cancel)
-    }
-    
-    func on(_ event: Event) {
-        do {
-            try _parent._eventHandler(event)
-            forwardOn(event)
-            if event.isStopEvent {
-                dispose()
-            }
-        }
-        catch let error {
-            forwardOn(.error(error))
-            dispose()
-        }
-    }
-}
-
-final class Do : Producer {
-    typealias EventHandler = (Event) throws -> Void
-    
-    fileprivate let _source: Observable
-    fileprivate let _eventHandler: EventHandler
-    fileprivate let _onSubscribe: (() -> ())?
-    fileprivate let _onSubscribed: (() -> ())?
-    fileprivate let _onDispose: (() -> ())?
-    
-    init(source: Observable, eventHandler: @escaping EventHandler, onSubscribe: (() -> ())?, onSubscribed: (() -> ())?, onDispose: (() -> ())?) {
-        _source = source
-        _eventHandler = eventHandler
-        _onSubscribe = onSubscribe
-        _onSubscribed = onSubscribed
-        _onDispose = onDispose
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
-        _onSubscribe?()
-        let sink = DoSink(parent: self, observer: observer, cancel: cancel)
-        let subscription = _source.subscribe(sink)
-        _onSubscribed?()
-        let onDispose = _onDispose
-        let allSubscriptions = Disposables.create {
-            subscription.dispose()
-            onDispose?()
-        }
-        return (sink: sink, subscription: allSubscriptions)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift
deleted file mode 100644
index 366adec0..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-//  Empty.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 8/30/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class EmptyProducer : Producer {
-    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
-        observer.on(.completed)
-        return Disposables.create()
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift
deleted file mode 100644
index 6ef7be7f..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-//  Error.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 8/30/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class ErrorProducer : Producer {
-    private let _error: Swift.Error
-    
-    init(error: Swift.Error) {
-        _error = error
-    }
-    
-    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
-        observer.on(.error(_error))
-        return Disposables.create()
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift
deleted file mode 100644
index 186a58e7..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift
+++ /dev/null
@@ -1,437 +0,0 @@
-//
-//  Merge.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/28/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: Limited concurrency version
-
-fileprivate final class MergeLimitedSinkIter
-    : ObserverType
-    , LockOwnerType
-    , SynchronizedOnType where S.E == O.E {
-    typealias E = O.E
-    typealias DisposeKey = CompositeDisposable.DisposeKey
-    typealias Parent = MergeLimitedSink
-    
-    private let _parent: Parent
-    private let _disposeKey: DisposeKey
-
-    var _lock: RecursiveLock {
-        return _parent._lock
-    }
-    
-    init(parent: Parent, disposeKey: DisposeKey) {
-        _parent = parent
-        _disposeKey = disposeKey
-    }
-    
-    func on(_ event: Event) {
-        synchronizedOn(event)
-    }
-
-    func _synchronized_on(_ event: Event) {
-        switch event {
-        case .next:
-            _parent.forwardOn(event)
-        case .error:
-            _parent.forwardOn(event)
-            _parent.dispose()
-        case .completed:
-            _parent._group.remove(for: _disposeKey)
-            if let next = _parent._queue.dequeue() {
-                _parent.subscribe(next, group: _parent._group)
-            }
-            else {
-                _parent._activeCount = _parent._activeCount - 1
-                
-                if _parent._stopped && _parent._activeCount == 0 {
-                    _parent.forwardOn(.completed)
-                    _parent.dispose()
-                }
-            }
-        }
-    }
-}
-
-fileprivate final class MergeLimitedSink
-    : Sink
-    , ObserverType
-    , LockOwnerType
-    , SynchronizedOnType where S.E == O.E {
-    typealias E = S
-    typealias QueueType = Queue
-
-    let _maxConcurrent: Int
-
-    let _lock = RecursiveLock()
-
-    // state
-    var _stopped = false
-    var _activeCount = 0
-    var _queue = QueueType(capacity: 2)
-    
-    let _sourceSubscription = SingleAssignmentDisposable()
-    let _group = CompositeDisposable()
-    
-    init(maxConcurrent: Int, observer: O, cancel: Cancelable) {
-        _maxConcurrent = maxConcurrent
-        
-        let _ = _group.insert(_sourceSubscription)
-        super.init(observer: observer, cancel: cancel)
-    }
-    
-    func run(_ source: Observable) -> Disposable {
-        let _ = _group.insert(_sourceSubscription)
-        
-        let disposable = source.subscribe(self)
-        _sourceSubscription.setDisposable(disposable)
-        return _group
-    }
-    
-    func subscribe(_ innerSource: E, group: CompositeDisposable) {
-        let subscription = SingleAssignmentDisposable()
-        
-        let key = group.insert(subscription)
-        
-        if let key = key {
-            let observer = MergeLimitedSinkIter(parent: self, disposeKey: key)
-            
-            let disposable = innerSource.asObservable().subscribe(observer)
-            subscription.setDisposable(disposable)
-        }
-    }
-    
-    func on(_ event: Event) {
-        synchronizedOn(event)
-    }
-
-    func _synchronized_on(_ event: Event) {
-        switch event {
-        case .next(let value):
-            let subscribe: Bool
-            if _activeCount < _maxConcurrent {
-                _activeCount += 1
-                subscribe = true
-            }
-            else {
-                _queue.enqueue(value)
-                subscribe = false
-            }
-
-            if subscribe {
-                self.subscribe(value, group: _group)
-            }
-        case .error(let error):
-            forwardOn(.error(error))
-            dispose()
-        case .completed:
-            if _activeCount == 0 {
-                forwardOn(.completed)
-                dispose()
-            }
-            else {
-                _sourceSubscription.dispose()
-            }
-
-            _stopped = true
-        }
-    }
-}
-
-final class MergeLimited : Producer {
-    private let _source: Observable
-    private let _maxConcurrent: Int
-    
-    init(source: Observable, maxConcurrent: Int) {
-        _source = source
-        _maxConcurrent = maxConcurrent
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
-        let sink = MergeLimitedSink(maxConcurrent: _maxConcurrent, observer: observer, cancel: cancel)
-        let subscription = sink.run(_source)
-        return (sink: sink, subscription: subscription)
-    }
-}
-
-// MARK: Merge
-
-fileprivate final class MergeBasicSink : MergeSink where O.E == S.E {
-    override init(observer: O, cancel: Cancelable) {
-        super.init(observer: observer, cancel: cancel)
-    }
-
-    override func performMap(_ element: S) throws -> S {
-        return element
-    }
-}
-
-// MARK: flatMap
-
-fileprivate final class FlatMapSink : MergeSink where O.E == S.E {
-    typealias Selector = (SourceType) throws -> S
-
-    private let _selector: Selector
-
-    init(selector: @escaping Selector, observer: O, cancel: Cancelable) {
-        _selector = selector
-        super.init(observer: observer, cancel: cancel)
-    }
-
-    override func performMap(_ element: SourceType) throws -> S {
-        return try _selector(element)
-    }
-}
-
-fileprivate final class FlatMapWithIndexSink : MergeSink where O.E == S.E {
-    typealias Selector = (SourceType, Int) throws -> S
-
-    private var _index = 0
-    private let _selector: Selector
-
-    init(selector: @escaping Selector, observer: O, cancel: Cancelable) {
-        _selector = selector
-        super.init(observer: observer, cancel: cancel)
-    }
-
-    override func performMap(_ element: SourceType) throws -> S {
-        return try _selector(element, try incrementChecked(&_index))
-    }
-}
-
-// MARK: FlatMapFirst
-
-fileprivate final class FlatMapFirstSink : MergeSink where O.E == S.E {
-    typealias Selector = (SourceType) throws -> S
-
-    private let _selector: Selector
-
-    override var subscribeNext: Bool {
-        return _activeCount == 0
-    }
-
-    init(selector: @escaping Selector, observer: O, cancel: Cancelable) {
-        _selector = selector
-        super.init(observer: observer, cancel: cancel)
-    }
-
-    override func performMap(_ element: SourceType) throws -> S {
-        return try _selector(element)
-    }
-}
-
-fileprivate final class MergeSinkIter : ObserverType where O.E == S.E {
-    typealias Parent = MergeSink
-    typealias DisposeKey = CompositeDisposable.DisposeKey
-    typealias E = O.E
-    
-    private let _parent: Parent
-    private let _disposeKey: DisposeKey
-
-    init(parent: Parent, disposeKey: DisposeKey) {
-        _parent = parent
-        _disposeKey = disposeKey
-    }
-    
-    func on(_ event: Event) {
-        _parent._lock.lock(); defer { _parent._lock.unlock() } // lock {
-            switch event {
-            case .next(let value):
-                _parent.forwardOn(.next(value))
-            case .error(let error):
-                _parent.forwardOn(.error(error))
-                _parent.dispose()
-            case .completed:
-                _parent._group.remove(for: _disposeKey)
-                _parent._activeCount -= 1
-                _parent.checkCompleted()
-            }
-        // }
-    }
-}
-
-
-fileprivate class MergeSink
-    : Sink
-    , ObserverType where O.E == S.E {
-    typealias ResultType = O.E
-    typealias Element = SourceType
-
-    let _lock = RecursiveLock()
-
-    var subscribeNext: Bool {
-        return true
-    }
-
-    // state
-    let _group = CompositeDisposable()
-    let _sourceSubscription = SingleAssignmentDisposable()
-
-    var _activeCount = 0
-    var _stopped = false
-
-    override init(observer: O, cancel: Cancelable) {
-        super.init(observer: observer, cancel: cancel)
-    }
-
-    func performMap(_ element: SourceType) throws -> S {
-        rxAbstractMethod()
-    }
-    
-    func on(_ event: Event) {
-        _lock.lock(); defer { _lock.unlock() } // lock {
-            switch event {
-            case .next(let element):
-                if !subscribeNext {
-                    return
-                }
-                do {
-                    let value = try performMap(element)
-                    subscribeInner(value.asObservable())
-                }
-                catch let e {
-                    forwardOn(.error(e))
-                    dispose()
-                }
-            case .error(let error):
-                forwardOn(.error(error))
-                dispose()
-            case .completed:
-                _stopped = true
-                _sourceSubscription.dispose()
-                checkCompleted()
-            }
-        //}
-    }
-
-    func subscribeInner(_ source: Observable) {
-        let iterDisposable = SingleAssignmentDisposable()
-        if let disposeKey = _group.insert(iterDisposable) {
-            _activeCount += 1
-            let iter = MergeSinkIter(parent: self, disposeKey: disposeKey)
-            let subscription = source.subscribe(iter)
-            iterDisposable.setDisposable(subscription)
-        }
-    }
-
-    func run(_ sources: [SourceType]) -> Disposable {
-        let _ = _group.insert(_sourceSubscription)
-        _stopped = true
-
-        for source in sources {
-            self.on(.next(source))
-        }
-
-        checkCompleted()
-
-        return _group
-    }
-
-    @inline(__always)
-    func checkCompleted() {
-        if _stopped && _activeCount == 0 {
-            self.forwardOn(.completed)
-            self.dispose()
-        }
-    }
-    
-    func run(_ source: Observable) -> Disposable {
-        let _ = _group.insert(_sourceSubscription)
-
-        let subscription = source.subscribe(self)
-        _sourceSubscription.setDisposable(subscription)
-        
-        return _group
-    }
-}
-
-// MARK: Producers
-
-final class FlatMap: Producer {
-    typealias Selector = (SourceType) throws -> S
-
-    private let _source: Observable
-    
-    private let _selector: Selector
-
-    init(source: Observable, selector: @escaping Selector) {
-        _source = source
-        _selector = selector
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
-        let sink = FlatMapSink(selector: _selector, observer: observer, cancel: cancel)
-        let subscription = sink.run(_source)
-        return (sink: sink, subscription: subscription)
-    }
-}
-
-final class FlatMapWithIndex: Producer {
-    typealias Selector = (SourceType, Int) throws -> S
-
-    private let _source: Observable
-    
-    private let _selector: Selector
-
-    init(source: Observable, selector: @escaping Selector) {
-        _source = source
-        _selector = selector
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
-        let sink = FlatMapWithIndexSink(selector: _selector, observer: observer, cancel: cancel)
-        let subscription = sink.run(_source)
-        return (sink: sink, subscription: subscription)
-    }
-
-}
-
-final class FlatMapFirst: Producer {
-    typealias Selector = (SourceType) throws -> S
-
-    private let _source: Observable
-
-    private let _selector: Selector
-
-    init(source: Observable, selector: @escaping Selector) {
-        _source = source
-        _selector = selector
-    }
-
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
-        let sink = FlatMapFirstSink(selector: _selector, observer: observer, cancel: cancel)
-        let subscription = sink.run(_source)
-        return (sink: sink, subscription: subscription)
-    }
-}
-
-final class Merge : Producer {
-    private let _source: Observable
-
-    init(source: Observable) {
-        _source = source
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
-        let sink = MergeBasicSink(observer: observer, cancel: cancel)
-        let subscription = sink.run(_source)
-        return (sink: sink, subscription: subscription)
-    }
-}
-
-final class MergeArray : Producer {
-    private let _sources: [Observable]
-
-    init(sources: [Observable]) {
-        _sources = sources
-    }
-
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
-        let sink = MergeBasicSink, O>(observer: observer, cancel: cancel)
-        let subscription = sink.run(_sources)
-        return (sink: sink, subscription: subscription)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift
deleted file mode 100644
index 51e36890..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-//  Multicast.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 2/27/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class MulticastSink: Sink, ObserverType {
-    typealias Element = O.E
-    typealias ResultType = Element
-    typealias MutlicastType = Multicast
-    
-    private let _parent: MutlicastType
-    
-    init(parent: MutlicastType, observer: O, cancel: Cancelable) {
-        _parent = parent
-        super.init(observer: observer, cancel: cancel)
-    }
-    
-    func run() -> Disposable {
-        do {
-            let subject = try _parent._subjectSelector()
-            let connectable = ConnectableObservableAdapter(source: _parent._source, subject: subject)
-            
-            let observable = try _parent._selector(connectable)
-            
-            let subscription = observable.subscribe(self)
-            let connection = connectable.connect()
-                
-            return Disposables.create(subscription, connection)
-        }
-        catch let e {
-            forwardOn(.error(e))
-            dispose()
-            return Disposables.create()
-        }
-    }
-    
-    func on(_ event: Event) {
-        forwardOn(event)
-        switch event {
-            case .next: break
-            case .error, .completed:
-                dispose()
-        }
-    }
-}
-
-final class Multicast: Producer {
-    typealias SubjectSelectorType = () throws -> S
-    typealias SelectorType = (Observable) throws -> Observable
-    
-    fileprivate let _source: Observable
-    fileprivate let _subjectSelector: SubjectSelectorType
-    fileprivate let _selector: SelectorType
-    
-    init(source: Observable, subjectSelector: @escaping SubjectSelectorType, selector: @escaping SelectorType) {
-        _source = source
-        _subjectSelector = subjectSelector
-        _selector = selector
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {
-        let sink = MulticastSink(parent: self, observer: observer, cancel: cancel)
-        let subscription = sink.run()
-        return (sink: sink, subscription: subscription)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift
deleted file mode 100644
index 309d35b5..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-//
-//  Never.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 8/30/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class NeverProducer : Producer {
-    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
-        return Disposables.create()
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift
deleted file mode 100644
index a5b901df..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-//  ObserveOn.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 7/25/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class ObserveOn : Producer {
-    let scheduler: ImmediateSchedulerType
-    let source: Observable
-    
-    init(source: Observable, scheduler: ImmediateSchedulerType) {
-        self.scheduler = scheduler
-        self.source = source
-        
-#if TRACE_RESOURCES
-        let _ = Resources.incrementTotal()
-#endif
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
-        let sink = ObserveOnSink(scheduler: scheduler, observer: observer, cancel: cancel)
-        let subscription = source.subscribe(sink)
-        return (sink: sink, subscription: subscription)
-    }
-    
-#if TRACE_RESOURCES
-    deinit {
-        let _ = Resources.decrementTotal()
-    }
-#endif
-}
-
-enum ObserveOnState : Int32 {
-    // pump is not running
-    case stopped = 0
-    // pump is running
-    case running = 1
-}
-
-final class ObserveOnSink : ObserverBase {
-    typealias E = O.E
-    
-    let _scheduler: ImmediateSchedulerType
-
-    var _lock = SpinLock()
-    let _observer: O
-
-    // state
-    var _state = ObserveOnState.stopped
-    var _queue = Queue>(capacity: 10)
-
-    let _scheduleDisposable = SerialDisposable()
-    let _cancel: Cancelable
-
-    init(scheduler: ImmediateSchedulerType, observer: O, cancel: Cancelable) {
-        _scheduler = scheduler
-        _observer = observer
-        _cancel = cancel
-    }
-
-    override func onCore(_ event: Event) {
-        let shouldStart = _lock.calculateLocked { () -> Bool in
-            self._queue.enqueue(event)
-            
-            switch self._state {
-            case .stopped:
-                self._state = .running
-                return true
-            case .running:
-                return false
-            }
-        }
-        
-        if shouldStart {
-            _scheduleDisposable.disposable = self._scheduler.scheduleRecursive((), action: self.run)
-        }
-    }
-    
-    func run(_ state: Void, recurse: (Void) -> Void) {
-        let (nextEvent, observer) = self._lock.calculateLocked { () -> (Event?, O) in
-            if self._queue.count > 0 {
-                return (self._queue.dequeue(), self._observer)
-            }
-            else {
-                self._state = .stopped
-                return (nil, self._observer)
-            }
-        }
-        
-        if let nextEvent = nextEvent, !_cancel.isDisposed {
-            observer.on(nextEvent)
-            if nextEvent.isStopEvent {
-                dispose()
-            }
-        }
-        else {
-            return
-        }
-        
-        let shouldContinue = _shouldContinue_synchronized()
-        
-        if shouldContinue {
-            recurse()
-        }
-    }
-
-    func _shouldContinue_synchronized() -> Bool {
-        _lock.lock(); defer { _lock.unlock() } // {
-            if self._queue.count > 0 {
-                return true
-            }
-            else {
-                self._state = .stopped
-                return false
-            }
-        // }
-    }
-    
-    override func dispose() {
-        super.dispose()
-
-        _cancel.dispose()
-        _scheduleDisposable.dispose()
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift
deleted file mode 100644
index 252a0e26..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-//  ObserveOnSerialDispatchQueue.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 5/31/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-#if TRACE_RESOURCES
-    fileprivate var _numberOfSerialDispatchQueueObservables: AtomicInt = 0
-    extension Resources {
-        /**
-        Counts number of `SerialDispatchQueueObservables`.
-
-        Purposed for unit tests.
-        */
-        public static var numberOfSerialDispatchQueueObservables: Int32 {
-            return _numberOfSerialDispatchQueueObservables.valueSnapshot()
-        }
-    }
-#endif
-
-final class ObserveOnSerialDispatchQueueSink : ObserverBase {
-    let scheduler: SerialDispatchQueueScheduler
-    let observer: O
-    
-    let cancel: Cancelable
-
-    var cachedScheduleLambda: ((ObserveOnSerialDispatchQueueSink, Event) -> Disposable)!
-
-    init(scheduler: SerialDispatchQueueScheduler, observer: O, cancel: Cancelable) {
-        self.scheduler = scheduler
-        self.observer = observer
-        self.cancel = cancel
-        super.init()
-
-        cachedScheduleLambda = { sink, event in
-            sink.observer.on(event)
-
-            if event.isStopEvent {
-                sink.dispose()
-            }
-
-            return Disposables.create()
-        }
-    }
-
-    override func onCore(_ event: Event) {
-        let _ = self.scheduler.schedule((self, event), action: cachedScheduleLambda)
-    }
-   
-    override func dispose() {
-        super.dispose()
-
-        cancel.dispose()
-    }
-}
-    
-final class ObserveOnSerialDispatchQueue : Producer {
-    let scheduler: SerialDispatchQueueScheduler
-    let source: Observable
-    
-    init(source: Observable, scheduler: SerialDispatchQueueScheduler) {
-        self.scheduler = scheduler
-        self.source = source
-        
-#if TRACE_RESOURCES
-        let _ = Resources.incrementTotal()
-        let _ = AtomicIncrement(&_numberOfSerialDispatchQueueObservables)
-#endif
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
-        let sink = ObserveOnSerialDispatchQueueSink(scheduler: scheduler, observer: observer, cancel: cancel)
-        let subscription = source.subscribe(sink)
-        return (sink: sink, subscription: subscription)
-    }
-    
-#if TRACE_RESOURCES
-    deinit {
-        let _ = Resources.decrementTotal()
-        let _ = AtomicDecrement(&_numberOfSerialDispatchQueueObservables)
-    }
-#endif
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift
deleted file mode 100644
index 7b3de82e..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-//  RefCount.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/5/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class RefCountSink
-    : Sink
-    , ObserverType where CO.E == O.E {
-    typealias Element = O.E
-    typealias Parent = RefCount
-    
-    private let _parent: Parent
-
-    init(parent: Parent, observer: O, cancel: Cancelable) {
-        _parent = parent
-        super.init(observer: observer, cancel: cancel)
-    }
-    
-    func run() -> Disposable {
-        let subscription = _parent._source.subscribe(self)
-        
-        _parent._lock.lock(); defer { _parent._lock.unlock() } // {
-            if _parent._count == 0 {
-                _parent._count = 1
-                _parent._connectableSubscription = _parent._source.connect()
-            }
-            else {
-                _parent._count = _parent._count + 1
-            }
-        // }
-        
-        return Disposables.create {
-            subscription.dispose()
-            self._parent._lock.lock(); defer { self._parent._lock.unlock() } // {
-                if self._parent._count == 1 {
-                    self._parent._count = 0
-                    guard let connectableSubscription = self._parent._connectableSubscription else {
-                        return
-                    }
-
-                    connectableSubscription.dispose()
-                    self._parent._connectableSubscription = nil
-                }
-                else if self._parent._count > 1 {
-                    self._parent._count = self._parent._count - 1
-                }
-                else {
-                    rxFatalError("Something went wrong with RefCount disposing mechanism")
-                }
-            // }
-        }
-    }
-
-    func on(_ event: Event) {
-        switch event {
-        case .next:
-            forwardOn(event)
-        case .error, .completed:
-            forwardOn(event)
-            dispose()
-        }
-    }
-}
-
-final class RefCount: Producer {
-    fileprivate let _lock = RecursiveLock()
-    
-    // state
-    fileprivate var _count = 0
-    fileprivate var _connectableSubscription = nil as Disposable?
-    
-    fileprivate let _source: CO
-    
-    init(source: CO) {
-        _source = source
-    }
-    
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == CO.E {
-        let sink = RefCountSink(parent: self, observer: observer, cancel: cancel)
-        let subscription = sink.run()
-        return (sink: sink, subscription: subscription)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift
deleted file mode 100644
index e25825a4..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-//  Sequence.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 11/14/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-final class ObservableSequenceSink : Sink where S.Iterator.Element == O.E {
-    typealias Parent = ObservableSequence
-
-    private let _parent: Parent
-
-    init(parent: Parent, observer: O, cancel: Cancelable) {
-        _parent = parent
-        super.init(observer: observer, cancel: cancel)
-    }
-
-    func run() -> Disposable {
-        return _parent._scheduler.scheduleRecursive((_parent._elements.makeIterator(), _parent._elements)) { (iterator, recurse) in
-            var mutableIterator = iterator
-            if let next = mutableIterator.0.next() {
-                self.forwardOn(.next(next))
-                recurse(mutableIterator)
-            }
-            else {
-                self.forwardOn(.completed)
-                self.dispose()
-            }
-        }
-    }
-}
-
-final class ObservableSequence : Producer {
-    fileprivate let _elements: S
-    fileprivate let _scheduler: ImmediateSchedulerType
-
-    init(elements: S, scheduler: ImmediateSchedulerType) {
-        _elements = elements
-        _scheduler = scheduler
-    }
-
-    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
-        let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel)
-        let subscription = sink.run()
-        return (sink: sink, subscription: subscription)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift
deleted file mode 100644
index c874708d..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-//  ShareReplay1.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 10/10/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// optimized version of share replay for most common case
-final class ShareReplay1
-    : Observable
-    , ObserverType
-    , SynchronizedUnsubscribeType {
-
-    typealias Observers = AnyObserver.s
-    typealias DisposeKey = Observers.KeyType
-
-    private let _source: Observable
-
-    private let _lock = RecursiveLock()
-
-    private var _connection: SingleAssignmentDisposable?
-    private var _element: Element?
-    private var _stopped = false
-    private var _stopEvent = nil as Event?
-    private var _observers = Observers()
-
-    init(source: Observable) {
-        self._source = source
-    }
-
-    override func subscribe(_ observer: O) -> Disposable where O.E == E {
-        _lock.lock()
-        let result = _synchronized_subscribe(observer)
-        _lock.unlock()
-        return result
-    }
-
-    func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == E {
-        if let element = self._element {
-            observer.on(.next(element))
-        }
-
-        if let stopEvent = self._stopEvent {
-            observer.on(stopEvent)
-            return Disposables.create()
-        }
-
-        let initialCount = self._observers.count
-
-        let disposeKey = self._observers.insert(observer.on)
-
-        if initialCount == 0 {
-            let connection = SingleAssignmentDisposable()
-            _connection = connection
-
-            connection.setDisposable(self._source.subscribe(self))
-        }
-
-        return SubscriptionDisposable(owner: self, key: disposeKey)
-    }
-
-    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {
-        _lock.lock()
-        _synchronized_unsubscribe(disposeKey)
-        _lock.unlock()
-    }
-
-    func _synchronized_unsubscribe(_ disposeKey: DisposeKey) {
-        // if already unsubscribed, just return
-        if self._observers.removeKey(disposeKey) == nil {
-            return
-        }
-
-        if _observers.count == 0 {
-            _connection?.dispose()
-            _connection = nil
-        }
-    }
-
-    func on(_ event: Event) {
-        dispatch(_synchronized_on(event), event)
-    }
-
-    func _synchronized_on(_ event: Event) -> Observers {
-        _lock.lock(); defer { _lock.unlock() }
-        if _stopped {
-            return Observers()
-        }
-
-        switch event {
-        case .next(let element):
-            _element = element
-        case .error, .completed:
-            _stopEvent = event
-            _stopped = true
-            _connection?.dispose()
-            _connection = nil
-        }
-        
-        return _observers
-    }
-    
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift b/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift
deleted file mode 100644
index bd8d026c..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift
+++ /dev/null
@@ -1,155 +0,0 @@
-//
-//  ShareReplay1WhileConnected.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 12/6/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-fileprivate final class ShareReplay1WhileConnectedConnection
-    : ObserverType
-    , SynchronizedUnsubscribeType {
-    typealias E = Element
-    typealias Observers = AnyObserver.s
-    typealias DisposeKey = Observers.KeyType
-
-    typealias Parent = ShareReplay1WhileConnected
-    private let _parent: Parent
-    private let _subscription = SingleAssignmentDisposable()
-
-    private let _lock: RecursiveLock
-    private var _disposed: Bool = false
-    fileprivate var _observers = Observers()
-    fileprivate var _element: Element?
-
-    init(parent: Parent, lock: RecursiveLock) {
-        _parent = parent
-        _lock = lock
-
-        #if TRACE_RESOURCES
-            _ = Resources.incrementTotal()
-        #endif
-    }
-
-    final func on(_ event: Event) {
-        _lock.lock()
-        let observers = _synchronized_on(event)
-        _lock.unlock()
-        dispatch(observers, event)
-    }
-
-    final private func _synchronized_on(_ event: Event) -> Observers {
-        if _disposed {
-            return Observers()
-        }
-
-        switch event {
-        case .next(let element):
-            _element = element
-            return _observers
-        case .error, .completed:
-            let observers = _observers
-            self._synchronized_dispose()
-            return observers
-        }
-    }
-
-    final func connect() {
-        _subscription.setDisposable(_parent._source.subscribe(self))
-    }
-
-    final func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == Element {
-        _lock.lock(); defer { _lock.unlock() }
-        if let element = _element {
-            observer.on(.next(element))
-        }
-
-        let disposeKey = _observers.insert(observer.on)
-
-        return SubscriptionDisposable(owner: self, key: disposeKey)
-    }
-
-    final private func _synchronized_dispose() {
-        _disposed = true
-        if _parent._connection === self {
-            _parent._connection = nil
-        }
-        _observers = Observers()
-        _subscription.dispose()
-    }
-
-    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {
-        _lock.lock()
-        _synchronized_unsubscribe(disposeKey)
-        _lock.unlock()
-    }
-
-    @inline(__always)
-    final private func _synchronized_unsubscribe(_ disposeKey: DisposeKey) {
-        // if already unsubscribed, just return
-        if self._observers.removeKey(disposeKey) == nil {
-            return
-        }
-
-        if _observers.count == 0 {
-            _synchronized_dispose()
-        }
-    }
-
-    #if TRACE_RESOURCES
-        deinit {
-            _ = Resources.decrementTotal()
-        }
-    #endif
-}
-
-// optimized version of share replay for most common case
-final class ShareReplay1WhileConnected
-    : Observable {
-
-    fileprivate typealias Connection = ShareReplay1WhileConnectedConnection
-
-    fileprivate let _source: Observable
-
-    fileprivate let _lock = RecursiveLock()
-
-    fileprivate var _connection: Connection?
-
-    init(source: Observable) {
-        self._source = source
-    }
-
-    override func subscribe(_ observer: O) -> Disposable where O.E == E {
-        _lock.lock()
-
-        let connection = _synchronized_subscribe(observer)
-        let count = connection._observers.count
-
-        let disposable = connection._synchronized_subscribe(observer)
-        
-        if count == 0 {
-            connection.connect()
-        }
-
-        _lock.unlock()
-
-        return disposable
-    }
-
-    @inline(__always)
-    private func _synchronized_subscribe(_ observer: O) -> Connection where O.E == E {
-        let connection: Connection
-
-        if let existingConnection = _connection {
-            connection = existingConnection
-        }
-        else {
-            connection = ShareReplay1WhileConnectedConnection(
-                parent: self,
-                lock: _lock)
-            _connection = connection
-        }
-
-        return connection
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift b/Pods/RxSwift/RxSwift/Observables/Just.swift
similarity index 56%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift
rename to Pods/RxSwift/RxSwift/Observables/Just.swift
index 98f0ada2..3beb04b9 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Just.swift
@@ -6,7 +6,34 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class JustScheduledSink : Sink {
+extension Observable {
+    /**
+     Returns an observable sequence that contains a single element.
+
+     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)
+
+     - parameter element: Single element in the resulting observable sequence.
+     - returns: An observable sequence containing the single specified element.
+     */
+    public static func just(_ element: E) -> Observable {
+        return Just(element: element)
+    }
+
+    /**
+     Returns an observable sequence that contains a single element.
+
+     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)
+
+     - parameter element: Single element in the resulting observable sequence.
+     - parameter: Scheduler to send the single element on.
+     - returns: An observable sequence containing the single specified element.
+     */
+    public static func just(_ element: E, scheduler: ImmediateSchedulerType) -> Observable {
+        return JustScheduled(element: element, scheduler: scheduler)
+    }
+}
+
+final fileprivate class JustScheduledSink : Sink {
     typealias Parent = JustScheduled
 
     private let _parent: Parent
@@ -29,7 +56,7 @@ final class JustScheduledSink : Sink {
     }
 }
 
-final class JustScheduled : Producer {
+final fileprivate class JustScheduled : Producer {
     fileprivate let _scheduler: ImmediateSchedulerType
     fileprivate let _element: Element
 
@@ -45,7 +72,7 @@ final class JustScheduled : Producer {
     }
 }
 
-final class Just : Producer {
+final fileprivate class Just : Producer {
     private let _element: Element
     
     init(element: Element) {
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift b/Pods/RxSwift/RxSwift/Observables/Map.swift
similarity index 68%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift
rename to Pods/RxSwift/RxSwift/Observables/Map.swift
index b4e23001..d743c26c 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Map.swift
@@ -6,7 +6,37 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class MapSink : Sink, ObserverType {
+extension ObservableType {
+
+    /**
+     Projects each element of an observable sequence into a new form.
+
+     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
+
+     - parameter transform: A transform function to apply to each source element.
+     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
+
+     */
+    public func map(_ transform: @escaping (E) throws -> R)
+        -> Observable {
+        return self.asObservable().composeMap(transform)
+    }
+
+    /**
+     Projects each element of an observable sequence into a new form by incorporating the element's index.
+
+     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
+
+     - parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element.
+     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
+     */
+    public func mapWithIndex(_ selector: @escaping (E, Int) throws -> R)
+        -> Observable {
+        return MapWithIndex(source: asObservable(), selector: selector)
+    }
+}
+
+final fileprivate class MapSink : Sink, ObserverType {
     typealias Transform = (SourceType) throws -> ResultType
 
     typealias ResultType = O.E
@@ -40,7 +70,7 @@ final class MapSink : Sink, ObserverType {
     }
 }
 
-final class MapWithIndexSink : Sink, ObserverType {
+final fileprivate class MapWithIndexSink : Sink, ObserverType {
     typealias Selector = (SourceType, Int) throws -> ResultType
 
     typealias ResultType = O.E
@@ -77,7 +107,7 @@ final class MapWithIndexSink : Sink, ObserverTy
     }
 }
 
-final class MapWithIndex : Producer {
+final fileprivate class MapWithIndex : Producer {
     typealias Selector = (SourceType, Int) throws -> ResultType
 
     private let _source: Observable
@@ -97,7 +127,7 @@ final class MapWithIndex : Producer {
 }
 
 #if TRACE_RESOURCES
-    var _numberOfMapOperators: AtomicInt = 0
+    fileprivate var _numberOfMapOperators: AtomicInt = 0
     extension Resources {
         public static var numberOfMapOperators: Int32 {
             return _numberOfMapOperators.valueSnapshot()
@@ -105,7 +135,11 @@ final class MapWithIndex : Producer {
     }
 #endif
 
-final class Map: Producer {
+internal func _map(source: Observable, transform: @escaping (Element) throws -> R) -> Observable {
+    return Map(source: source, transform: transform)
+}
+
+final fileprivate class Map: Producer {
     typealias Transform = (SourceType) throws -> ResultType
 
     private let _source: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Materialize.swift b/Pods/RxSwift/RxSwift/Observables/Materialize.swift
new file mode 100644
index 00000000..cf19b6da
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Materialize.swift
@@ -0,0 +1,44 @@
+//
+//  Materialize.swift
+//  RxSwift
+//
+//  Created by sergdort on 08/03/2017.
+//  Copyright © 2017 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType {
+    /**
+     Convert any Observable into an Observable of its events.
+     - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)
+     - returns: An observable sequence that wraps events in an Event. The returned Observable never errors, but it does complete after observing all of the events of the underlying Observable.
+     */
+    public func materialize() -> Observable> {
+        return Materialize(source: self.asObservable())
+    }
+}
+
+fileprivate final class MaterializeSink: Sink, ObserverType where O.E == Event {
+    
+    func on(_ event: Event) {
+        forwardOn(.next(event))
+        if event.isStopEvent {
+            forwardOn(.completed)
+            dispose()
+        }
+    }
+}
+
+final fileprivate class Materialize: Producer> {
+    private let _source: Observable
+    
+    init(source: Observable) {
+        _source = source
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
+        let sink = MaterializeSink(observer: observer, cancel: cancel)
+        let subscription = _source.subscribe(sink)
+
+        return (sink: sink, subscription: subscription)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Merge.swift b/Pods/RxSwift/RxSwift/Observables/Merge.swift
new file mode 100644
index 00000000..317babc7
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Merge.swift
@@ -0,0 +1,648 @@
+//
+//  Merge.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 3/28/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType {
+
+    /**
+     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+
+     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
+
+     - parameter selector: A transform function to apply to each element.
+     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.
+     */
+    public func flatMap(_ selector: @escaping (E) throws -> O)
+        -> Observable {
+            return FlatMap(source: asObservable(), selector: selector)
+    }
+
+    /**
+     Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
+
+     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
+
+     - parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element.
+     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.
+     */
+    public func flatMapWithIndex(_ selector: @escaping (E, Int) throws -> O)
+        -> Observable {
+            return FlatMapWithIndex(source: asObservable(), selector: selector)
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+     If element is received while there is some projected observable sequence being merged it will simply be ignored.
+
+     - seealso: [flatMapFirst operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
+
+     - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.
+     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.
+     */
+    public func flatMapFirst(_ selector: @escaping (E) throws -> O)
+        -> Observable {
+            return FlatMapFirst(source: asObservable(), selector: selector)
+    }
+}
+
+extension ObservableType where E : ObservableConvertibleType {
+
+    /**
+     Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.
+
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public func merge() -> Observable {
+        return Merge(source: asObservable())
+    }
+
+    /**
+     Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.
+
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+
+     - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.
+     - returns: The observable sequence that merges the elements of the inner sequences.
+     */
+    public func merge(maxConcurrent: Int)
+        -> Observable {
+        return MergeLimited(source: asObservable(), maxConcurrent: maxConcurrent)
+    }
+}
+
+extension ObservableType where E : ObservableConvertibleType {
+
+    /**
+     Concatenates all inner observable sequences, as long as the previous observable sequence terminated successfully.
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.
+     */
+    public func concat() -> Observable {
+        return merge(maxConcurrent: 1)
+    }
+}
+
+extension Observable {
+    /**
+     Merges elements from all observable sequences from collection into a single observable sequence.
+
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+
+     - parameter sources: Collection of observable sequences to merge.
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public static func merge(_ sources: C) -> Observable where C.Iterator.Element == Observable {
+        return MergeArray(sources: Array(sources))
+    }
+
+    /**
+     Merges elements from all observable sequences from array into a single observable sequence.
+
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+
+     - parameter sources: Array of observable sequences to merge.
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public static func merge(_ sources: [Observable]) -> Observable {
+        return MergeArray(sources: sources)
+    }
+
+    /**
+     Merges elements from all observable sequences into a single observable sequence.
+
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+
+     - parameter sources: Collection of observable sequences to merge.
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public static func merge(_ sources: Observable...) -> Observable {
+        return MergeArray(sources: sources)
+    }
+}
+
+// MARK: concatMap
+
+extension ObservableType {
+    /**
+     Projects each element of an observable sequence to an observable sequence and concatenates the resulting observable sequences into one observable sequence.
+     
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+     
+     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.
+     */
+    
+    public func concatMap(_ selector: @escaping (E) throws -> O)
+        -> Observable {
+            return ConcatMap(source: asObservable(), selector: selector)
+    }
+}
+
+fileprivate final class MergeLimitedSinkIter
+    : ObserverType
+    , LockOwnerType
+    , SynchronizedOnType where SourceSequence.E == Observer.E {
+    typealias E = Observer.E
+    typealias DisposeKey = CompositeDisposable.DisposeKey
+    typealias Parent = MergeLimitedSink
+    
+    private let _parent: Parent
+    private let _disposeKey: DisposeKey
+
+    var _lock: RecursiveLock {
+        return _parent._lock
+    }
+    
+    init(parent: Parent, disposeKey: DisposeKey) {
+        _parent = parent
+        _disposeKey = disposeKey
+    }
+    
+    func on(_ event: Event) {
+        synchronizedOn(event)
+    }
+
+    func _synchronized_on(_ event: Event) {
+        switch event {
+        case .next:
+            _parent.forwardOn(event)
+        case .error:
+            _parent.forwardOn(event)
+            _parent.dispose()
+        case .completed:
+            _parent._group.remove(for: _disposeKey)
+            if let next = _parent._queue.dequeue() {
+                _parent.subscribe(next, group: _parent._group)
+            }
+            else {
+                _parent._activeCount = _parent._activeCount - 1
+                
+                if _parent._stopped && _parent._activeCount == 0 {
+                    _parent.forwardOn(.completed)
+                    _parent.dispose()
+                }
+            }
+        }
+    }
+}
+
+fileprivate final class ConcatMapSink: MergeLimitedSink where Observer.E == SourceSequence.E {
+    typealias Selector = (SourceElement) throws -> SourceSequence
+    
+    private let _selector: Selector
+    
+    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {
+        _selector = selector
+        super.init(maxConcurrent: 1, observer: observer, cancel: cancel)
+    }
+    
+    override func performMap(_ element: SourceElement) throws -> SourceSequence {
+        return try _selector(element)
+    }
+}
+
+fileprivate final class MergeLimitedBasicSink: MergeLimitedSink where Observer.E == SourceSequence.E {
+    
+    override func performMap(_ element: SourceSequence) throws -> SourceSequence {
+        return element
+    }
+}
+
+fileprivate class MergeLimitedSink
+    : Sink
+    , ObserverType where Observer.E == SourceSequence.E  {
+    typealias QueueType = Queue
+
+    let _maxConcurrent: Int
+
+    let _lock = RecursiveLock()
+
+    // state
+    var _stopped = false
+    var _activeCount = 0
+    var _queue = QueueType(capacity: 2)
+    
+    let _sourceSubscription = SingleAssignmentDisposable()
+    let _group = CompositeDisposable()
+    
+    init(maxConcurrent: Int, observer: Observer, cancel: Cancelable) {
+        _maxConcurrent = maxConcurrent
+        
+        let _ = _group.insert(_sourceSubscription)
+        super.init(observer: observer, cancel: cancel)
+    }
+    
+    func run(_ source: Observable) -> Disposable {
+        let _ = _group.insert(_sourceSubscription)
+        
+        let disposable = source.subscribe(self)
+        _sourceSubscription.setDisposable(disposable)
+        return _group
+    }
+    
+    func subscribe(_ innerSource: SourceSequence, group: CompositeDisposable) {
+        let subscription = SingleAssignmentDisposable()
+        
+        let key = group.insert(subscription)
+        
+        if let key = key {
+            let observer = MergeLimitedSinkIter(parent: self, disposeKey: key)
+            
+            let disposable = innerSource.asObservable().subscribe(observer)
+            subscription.setDisposable(disposable)
+        }
+    }
+    
+    func performMap(_ element: SourceElement) throws -> SourceSequence {
+        rxAbstractMethod()
+    }
+
+    @inline(__always)
+    final private func nextElementArrived(element: SourceElement) -> SourceSequence? {
+        _lock.lock(); defer { _lock.unlock() } // {
+            let subscribe: Bool
+            if _activeCount < _maxConcurrent {
+                _activeCount += 1
+                subscribe = true
+            }
+            else {
+                do {
+                    let value = try performMap(element)
+                    _queue.enqueue(value)
+                } catch {
+                    forwardOn(.error(error))
+                    dispose()
+                }
+                subscribe = false
+            }
+
+            if subscribe {
+                do {
+                    return try performMap(element)
+                } catch {
+                    forwardOn(.error(error))
+                    dispose()
+                }
+            }
+
+            return nil
+        // }
+    }
+
+    func on(_ event: Event) {
+        switch event {
+        case .next(let element):
+            if let sequence = self.nextElementArrived(element: element) {
+                self.subscribe(sequence, group: _group)
+            }
+        case .error(let error):
+            _lock.lock(); defer { _lock.unlock() }
+
+            forwardOn(.error(error))
+            dispose()
+        case .completed:
+            _lock.lock(); defer { _lock.unlock() }
+
+            if _activeCount == 0 {
+                forwardOn(.completed)
+                dispose()
+            }
+            else {
+                _sourceSubscription.dispose()
+            }
+
+            _stopped = true
+        }
+    }
+}
+
+final fileprivate class MergeLimited : Producer {
+    private let _source: Observable
+    private let _maxConcurrent: Int
+    
+    init(source: Observable, maxConcurrent: Int) {
+        _source = source
+        _maxConcurrent = maxConcurrent
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {
+        let sink = MergeLimitedBasicSink(maxConcurrent: _maxConcurrent, observer: observer, cancel: cancel)
+        let subscription = sink.run(_source)
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+// MARK: Merge
+
+fileprivate final class MergeBasicSink : MergeSink where O.E == S.E {
+    override func performMap(_ element: S) throws -> S {
+        return element
+    }
+}
+
+// MARK: flatMap
+
+fileprivate final class FlatMapSink : MergeSink where Observer.E == SourceSequence.E {
+    typealias Selector = (SourceElement) throws -> SourceSequence
+
+    private let _selector: Selector
+
+    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {
+        _selector = selector
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    override func performMap(_ element: SourceElement) throws -> SourceSequence {
+        return try _selector(element)
+    }
+}
+
+fileprivate final class FlatMapWithIndexSink : MergeSink where Observer.E == SourceSequence.E {
+    typealias Selector = (SourceElement, Int) throws -> SourceSequence
+
+    private var _index = 0
+    private let _selector: Selector
+
+    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {
+        _selector = selector
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    override func performMap(_ element: SourceElement) throws -> SourceSequence {
+        return try _selector(element, try incrementChecked(&_index))
+    }
+}
+
+// MARK: FlatMapFirst
+
+fileprivate final class FlatMapFirstSink : MergeSink where Observer.E == SourceSequence.E {
+    typealias Selector = (SourceElement) throws -> SourceSequence
+
+    private let _selector: Selector
+
+    override var subscribeNext: Bool {
+        return _activeCount == 0
+    }
+
+    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {
+        _selector = selector
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    override func performMap(_ element: SourceElement) throws -> SourceSequence {
+        return try _selector(element)
+    }
+}
+
+fileprivate final class MergeSinkIter : ObserverType where Observer.E == SourceSequence.E {
+    typealias Parent = MergeSink
+    typealias DisposeKey = CompositeDisposable.DisposeKey
+    typealias E = Observer.E
+    
+    private let _parent: Parent
+    private let _disposeKey: DisposeKey
+
+    init(parent: Parent, disposeKey: DisposeKey) {
+        _parent = parent
+        _disposeKey = disposeKey
+    }
+    
+    func on(_ event: Event) {
+        _parent._lock.lock(); defer { _parent._lock.unlock() } // lock {
+            switch event {
+            case .next(let value):
+                _parent.forwardOn(.next(value))
+            case .error(let error):
+                _parent.forwardOn(.error(error))
+                _parent.dispose()
+            case .completed:
+                _parent._group.remove(for: _disposeKey)
+                _parent._activeCount -= 1
+                _parent.checkCompleted()
+            }
+        // }
+    }
+}
+
+
+fileprivate class MergeSink
+    : Sink
+    , ObserverType where Observer.E == SourceSequence.E {
+    typealias ResultType = Observer.E
+    typealias Element = SourceElement
+
+    let _lock = RecursiveLock()
+
+    var subscribeNext: Bool {
+        return true
+    }
+
+    // state
+    let _group = CompositeDisposable()
+    let _sourceSubscription = SingleAssignmentDisposable()
+
+    var _activeCount = 0
+    var _stopped = false
+
+    override init(observer: Observer, cancel: Cancelable) {
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    func performMap(_ element: SourceElement) throws -> SourceSequence {
+        rxAbstractMethod()
+    }
+
+    @inline(__always)
+    final private func nextElementArrived(element: SourceElement) -> SourceSequence? {
+        _lock.lock(); defer { _lock.unlock() } // {
+            if !subscribeNext {
+                return nil
+            }
+
+            do {
+                let value = try performMap(element)
+                _activeCount += 1
+                return value
+            }
+            catch let e {
+                forwardOn(.error(e))
+                dispose()
+                return nil
+            }
+        // }
+    }
+    
+    func on(_ event: Event) {
+        switch event {
+        case .next(let element):
+            if let value = nextElementArrived(element: element) {
+                subscribeInner(value.asObservable())
+            }
+        case .error(let error):
+            _lock.lock(); defer { _lock.unlock() }
+            forwardOn(.error(error))
+            dispose()
+        case .completed:
+            _lock.lock(); defer { _lock.unlock() }
+            _stopped = true
+            _sourceSubscription.dispose()
+            checkCompleted()
+        }
+    }
+
+    func subscribeInner(_ source: Observable) {
+        let iterDisposable = SingleAssignmentDisposable()
+        if let disposeKey = _group.insert(iterDisposable) {
+            let iter = MergeSinkIter(parent: self, disposeKey: disposeKey)
+            let subscription = source.subscribe(iter)
+            iterDisposable.setDisposable(subscription)
+        }
+    }
+
+    func run(_ sources: [Observable]) -> Disposable {
+        _activeCount += sources.count
+
+        for source in sources {
+            subscribeInner(source)
+        }
+
+        _stopped = true
+
+        checkCompleted()
+
+        return _group
+    }
+
+    @inline(__always)
+    func checkCompleted() {
+        if _stopped && _activeCount == 0 {
+            self.forwardOn(.completed)
+            self.dispose()
+        }
+    }
+    
+    func run(_ source: Observable) -> Disposable {
+        let _ = _group.insert(_sourceSubscription)
+
+        let subscription = source.subscribe(self)
+        _sourceSubscription.setDisposable(subscription)
+        
+        return _group
+    }
+}
+
+// MARK: Producers
+
+final fileprivate class FlatMap: Producer {
+    typealias Selector = (SourceElement) throws -> SourceSequence
+
+    private let _source: Observable
+    
+    private let _selector: Selector
+
+    init(source: Observable, selector: @escaping Selector) {
+        _source = source
+        _selector = selector
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {
+        let sink = FlatMapSink(selector: _selector, observer: observer, cancel: cancel)
+        let subscription = sink.run(_source)
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+final fileprivate class FlatMapWithIndex: Producer {
+    typealias Selector = (SourceElement, Int) throws -> SourceSequence
+
+    private let _source: Observable
+    
+    private let _selector: Selector
+
+    init(source: Observable, selector: @escaping Selector) {
+        _source = source
+        _selector = selector
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {
+        let sink = FlatMapWithIndexSink(selector: _selector, observer: observer, cancel: cancel)
+        let subscription = sink.run(_source)
+        return (sink: sink, subscription: subscription)
+    }
+
+}
+
+final fileprivate class FlatMapFirst: Producer {
+    typealias Selector = (SourceElement) throws -> SourceSequence
+
+    private let _source: Observable
+
+    private let _selector: Selector
+
+    init(source: Observable, selector: @escaping Selector) {
+        _source = source
+        _selector = selector
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {
+        let sink = FlatMapFirstSink(selector: _selector, observer: observer, cancel: cancel)
+        let subscription = sink.run(_source)
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+final class ConcatMap: Producer {
+    typealias Selector = (SourceElement) throws -> SourceSequence
+    
+    private let _source: Observable
+    private let _selector: Selector
+    
+    init(source: Observable, selector: @escaping Selector) {
+        _source = source
+        _selector = selector
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {
+        let sink = ConcatMapSink(selector: _selector, observer: observer, cancel: cancel)
+        let subscription = sink.run(_source)
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+final class Merge : Producer {
+    private let _source: Observable
+
+    init(source: Observable) {
+        _source = source
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {
+        let sink = MergeBasicSink(observer: observer, cancel: cancel)
+        let subscription = sink.run(_source)
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+final fileprivate class MergeArray : Producer {
+    private let _sources: [Observable]
+
+    init(sources: [Observable]) {
+        _sources = sources
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
+        let sink = MergeBasicSink, O>(observer: observer, cancel: cancel)
+        let subscription = sink.run(_sources)
+        return (sink: sink, subscription: subscription)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Multicast.swift b/Pods/RxSwift/RxSwift/Observables/Multicast.swift
new file mode 100644
index 00000000..525f24ef
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Multicast.swift
@@ -0,0 +1,424 @@
+//
+//  Multicast.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 2/27/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+/**
+ Represents an observable wrapper that can be connected and disconnected from its underlying observable sequence.
+ */
+public class ConnectableObservable
+    : Observable
+    , ConnectableObservableType {
+
+    /**
+     Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.
+
+     - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.
+     */
+    public func connect() -> Disposable {
+        rxAbstractMethod()
+    }
+}
+
+extension ObservableType {
+    
+    /**
+    Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. 
+    
+    Each subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's invocation.
+
+    For specializations with fixed subject types, see `publish` and `replay`.
+
+    - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
+    
+    - parameter subjectSelector: Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.
+    - parameter selector: Selector function which can use the multicasted source sequence subject to the policies enforced by the created subject.
+    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.
+    */
+    public func multicast(_ subjectSelector: @escaping () throws -> S, selector: @escaping (Observable) throws -> Observable)
+        -> Observable where S.SubjectObserverType.E == E {
+        return Multicast(
+            source: self.asObservable(),
+            subjectSelector: subjectSelector,
+            selector: selector
+        )
+    }
+}
+
+extension ObservableType {
+    
+    /**
+    Returns a connectable observable sequence that shares a single subscription to the underlying sequence. 
+    
+    This operator is a specialization of `multicast` using a `PublishSubject`.
+
+    - seealso: [publish operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
+    
+    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
+    */
+    public func publish() -> ConnectableObservable {
+        return self.multicast(PublishSubject())
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying bufferSize elements.
+
+     This operator is a specialization of `multicast` using a `ReplaySubject`.
+
+     - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
+
+     - parameter bufferSize: Maximum element count of the replay buffer.
+     - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
+     */
+    public func replay(_ bufferSize: Int)
+        -> ConnectableObservable {
+        return self.multicast(ReplaySubject.create(bufferSize: bufferSize))
+    }
+
+    /**
+     Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying all elements.
+
+     This operator is a specialization of `multicast` using a `ReplaySubject`.
+
+     - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
+
+     - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
+     */
+    public func replayAll()
+        -> ConnectableObservable {
+        return self.multicast(ReplaySubject.createUnbounded())
+    }
+}
+
+extension ConnectableObservableType {
+    
+    /**
+    Returns an observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.
+
+    - seealso: [refCount operator on reactivex.io](http://reactivex.io/documentation/operators/refCount.html)
+    
+    - returns: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.
+    */
+    public func refCount() -> Observable {
+        return RefCount(source: self)
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Returns an observable sequence that shares a single subscription to the underlying sequence.
+
+     This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.
+
+     - seealso: [share operator on reactivex.io](http://reactivex.io/documentation/operators/refcount.html)
+
+     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
+     */
+    public func share() -> Observable {
+        return self.publish().refCount()
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Multicasts the source sequence notifications through the specified subject to the resulting connectable observable.
+
+     Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.
+
+     For specializations with fixed subject types, see `publish` and `replay`.
+
+     - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
+
+     - parameter subject: Subject to push source elements into.
+     - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.
+     */
+    public func multicast(_ subject: S)
+        -> ConnectableObservable where S.SubjectObserverType.E == E {
+        return ConnectableObservableAdapter(source: self.asObservable(), makeSubject: { subject })
+    }
+
+    /**
+     Multicasts the source sequence notifications through an instantiated subject to the resulting connectable observable.
+
+     Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.
+     
+     Subject is cleared on connection disposal or in case source sequence produces terminal event.
+
+     - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
+
+     - parameter makeSubject: Factory function used to instantiate a subject for each connection.
+     - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.
+     */
+    public func multicast(makeSubject: @escaping () -> S)
+        -> ConnectableObservable where S.SubjectObserverType.E == E {
+        return ConnectableObservableAdapter(source: self.asObservable(), makeSubject: makeSubject)
+    }
+}
+
+final fileprivate class Connection : ObserverType, Disposable {
+    typealias E = S.SubjectObserverType.E
+
+    private var _lock: RecursiveLock
+    // state
+    private var _parent: ConnectableObservableAdapter?
+    private var _subscription : Disposable?
+    private var _subjectObserver: S.SubjectObserverType
+
+    private var _disposed: Bool = false
+
+    init(parent: ConnectableObservableAdapter, subjectObserver: S.SubjectObserverType, lock: RecursiveLock, subscription: Disposable) {
+        _parent = parent
+        _subscription = subscription
+        _lock = lock
+        _subjectObserver = subjectObserver
+    }
+
+    func on(_ event: Event) {
+        if _disposed {
+            return
+        }
+        if event.isStopEvent {
+            self.dispose()
+        }
+        _subjectObserver.on(event)
+    }
+
+    func dispose() {
+        _lock.lock(); defer { _lock.unlock() } // {
+        _disposed = true
+        guard let parent = _parent else {
+            return
+        }
+
+        if parent._connection === self {
+            parent._connection = nil
+            parent._subject = nil
+        }
+        _parent = nil
+
+        _subscription?.dispose()
+        _subscription = nil
+        // }
+    }
+}
+
+final fileprivate class ConnectableObservableAdapter
+    : ConnectableObservable {
+    typealias ConnectionType = Connection
+
+    fileprivate let _source: Observable
+    fileprivate let _makeSubject: () -> S
+
+    fileprivate let _lock = RecursiveLock()
+    fileprivate var _subject: S?
+
+    // state
+    fileprivate var _connection: ConnectionType?
+
+    init(source: Observable, makeSubject: @escaping () -> S) {
+        _source = source
+        _makeSubject = makeSubject
+        _subject = nil
+        _connection = nil
+    }
+
+    override func connect() -> Disposable {
+        return _lock.calculateLocked {
+            if let connection = _connection {
+                return connection
+            }
+
+            let singleAssignmentDisposable = SingleAssignmentDisposable()
+            let connection = Connection(parent: self, subjectObserver: self.lazySubject.asObserver(), lock: _lock, subscription: singleAssignmentDisposable)
+            _connection = connection
+            let subscription = _source.subscribe(connection)
+            singleAssignmentDisposable.setDisposable(subscription)
+            return connection
+        }
+    }
+
+    fileprivate var lazySubject: S {
+        if let subject = self._subject {
+            return subject
+        }
+
+        let subject = _makeSubject()
+        self._subject = subject
+        return subject
+    }
+
+    override func subscribe(_ observer: O) -> Disposable where O.E == S.E {
+        return self.lazySubject.subscribe(observer)
+    }
+}
+
+final fileprivate class RefCountSink
+    : Sink
+    , ObserverType where CO.E == O.E {
+    typealias Element = O.E
+    typealias Parent = RefCount
+
+    private let _parent: Parent
+
+    private var _connectionIdSnapshot: Int64 = -1
+
+    init(parent: Parent, observer: O, cancel: Cancelable) {
+        _parent = parent
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    func run() -> Disposable {
+        let subscription = _parent._source.subscribe(self)
+        _parent._lock.lock(); defer { _parent._lock.unlock() } // {
+
+        _connectionIdSnapshot = _parent._connectionId
+
+        if self.disposed {
+            return Disposables.create()
+        }
+
+        if _parent._count == 0 {
+            _parent._count = 1
+            _parent._connectableSubscription = _parent._source.connect()
+        }
+        else {
+            _parent._count = _parent._count + 1
+        }
+        // }
+
+        return Disposables.create {
+            subscription.dispose()
+            self._parent._lock.lock(); defer { self._parent._lock.unlock() } // {
+            if self._parent._connectionId != self._connectionIdSnapshot {
+                return
+            }
+            if self._parent._count == 1 {
+                self._parent._count = 0
+                guard let connectableSubscription = self._parent._connectableSubscription else {
+                    return
+                }
+
+                connectableSubscription.dispose()
+                self._parent._connectableSubscription = nil
+            }
+            else if self._parent._count > 1 {
+                self._parent._count = self._parent._count - 1
+            }
+            else {
+                rxFatalError("Something went wrong with RefCount disposing mechanism")
+            }
+            // }
+        }
+    }
+
+    func on(_ event: Event) {
+        switch event {
+        case .next:
+            forwardOn(event)
+        case .error, .completed:
+            _parent._lock.lock() // {
+                if _parent._connectionId == self._connectionIdSnapshot {
+                    let connection = _parent._connectableSubscription
+                    defer { connection?.dispose() }
+                    _parent._count = 0
+                    _parent._connectionId = _parent._connectionId &+ 1
+                    _parent._connectableSubscription = nil
+                }
+            // }
+            _parent._lock.unlock()
+            forwardOn(event)
+            dispose()
+        }
+    }
+}
+
+final fileprivate class RefCount: Producer {
+    fileprivate let _lock = RecursiveLock()
+
+    // state
+    fileprivate var _count = 0
+    fileprivate var _connectionId: Int64 = 0
+    fileprivate var _connectableSubscription = nil as Disposable?
+
+    fileprivate let _source: CO
+
+    init(source: CO) {
+        _source = source
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == CO.E {
+        let sink = RefCountSink(parent: self, observer: observer, cancel: cancel)
+        let subscription = sink.run()
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+final fileprivate class MulticastSink: Sink, ObserverType {
+    typealias Element = O.E
+    typealias ResultType = Element
+    typealias MutlicastType = Multicast
+    
+    private let _parent: MutlicastType
+    
+    init(parent: MutlicastType, observer: O, cancel: Cancelable) {
+        _parent = parent
+        super.init(observer: observer, cancel: cancel)
+    }
+    
+    func run() -> Disposable {
+        do {
+            let subject = try _parent._subjectSelector()
+            let connectable = ConnectableObservableAdapter(source: _parent._source, makeSubject: { subject })
+            
+            let observable = try _parent._selector(connectable)
+            
+            let subscription = observable.subscribe(self)
+            let connection = connectable.connect()
+                
+            return Disposables.create(subscription, connection)
+        }
+        catch let e {
+            forwardOn(.error(e))
+            dispose()
+            return Disposables.create()
+        }
+    }
+    
+    func on(_ event: Event) {
+        forwardOn(event)
+        switch event {
+            case .next: break
+            case .error, .completed:
+                dispose()
+        }
+    }
+}
+
+final fileprivate class Multicast: Producer {
+    typealias SubjectSelectorType = () throws -> S
+    typealias SelectorType = (Observable) throws -> Observable
+    
+    fileprivate let _source: Observable
+    fileprivate let _subjectSelector: SubjectSelectorType
+    fileprivate let _selector: SelectorType
+    
+    init(source: Observable, subjectSelector: @escaping SubjectSelectorType, selector: @escaping SelectorType) {
+        _source = source
+        _subjectSelector = subjectSelector
+        _selector = selector
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {
+        let sink = MulticastSink(parent: self, observer: observer, cancel: cancel)
+        let subscription = sink.run()
+        return (sink: sink, subscription: subscription)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Never.swift b/Pods/RxSwift/RxSwift/Observables/Never.swift
new file mode 100644
index 00000000..4cb9b87b
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Never.swift
@@ -0,0 +1,27 @@
+//
+//  Never.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 8/30/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension Observable {
+
+    /**
+     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.
+
+     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
+
+     - returns: An observable sequence whose observers will never get called.
+     */
+    public static func never() -> Observable {
+        return NeverProducer()
+    }
+}
+
+final fileprivate class NeverProducer : Producer {
+    override func subscribe(_ observer: O) -> Disposable where O.E == Element {
+        return Disposables.create()
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift
deleted file mode 100644
index a25aa090..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-//  Observable+Aggregate.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/22/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: reduce
-
-extension ObservableType {
-    
-    /**
-    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.
-
-    For aggregation behavior with incremental intermediate results, see `scan`.
-
-    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)
-
-    - parameter seed: The initial accumulator value.
-    - parameter accumulator: A accumulator function to be invoked on each element.
-    - parameter mapResult: A function to transform the final accumulator value into the result value.
-    - returns: An observable sequence containing a single element with the final accumulator value.
-    */
-    public func reduce(_ seed: A, accumulator: @escaping (A, E) throws -> A, mapResult: @escaping (A) throws -> R)
-        -> Observable {
-        return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: mapResult)
-    }
-
-    /**
-    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.
-    
-    For aggregation behavior with incremental intermediate results, see `scan`.
-
-    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)
-    
-    - parameter seed: The initial accumulator value.
-    - parameter accumulator: A accumulator function to be invoked on each element.
-    - returns: An observable sequence containing a single element with the final accumulator value.
-    */
-    public func reduce(_ seed: A, accumulator: @escaping (A, E) throws -> A)
-        -> Observable {
-        return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: { $0 })
-    }
-
-    /**
-    Converts an Observable into another Observable that emits the whole sequence as a single array and then terminates.
-    
-    For aggregation behavior see `reduce`.
-
-    - seealso: [toArray operator on reactivex.io](http://reactivex.io/documentation/operators/to.html)
-    
-    - returns: An observable sequence containing all the emitted elements as array.
-    */
-    public func toArray()
-        -> Observable<[E]> {
-            return ToArray(source: self.asObservable())
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift
deleted file mode 100644
index 05d6b4df..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift
+++ /dev/null
@@ -1,179 +0,0 @@
-//
-//  Observable+Binding.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/1/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: multicast
-
-extension ObservableType {
-    
-    /**
-    Multicasts the source sequence notifications through the specified subject to the resulting connectable observable. 
-    
-    Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.
-    
-    For specializations with fixed subject types, see `publish` and `replay`.
-
-    - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
-    
-    - parameter subject: Subject to push source elements into.
-    - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.
-    */
-    public func multicast(_ subject: S)
-        -> ConnectableObservable where S.SubjectObserverType.E == E {
-        return ConnectableObservableAdapter(source: self.asObservable(), subject: subject)
-    }
-
-    /**
-    Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. 
-    
-    Each subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's invocation.
-
-    For specializations with fixed subject types, see `publish` and `replay`.
-
-    - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
-    
-    - parameter subjectSelector: Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.
-    - parameter selector: Selector function which can use the multicasted source sequence subject to the policies enforced by the created subject.
-    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.
-    */
-    public func multicast(_ subjectSelector: @escaping () throws -> S, selector: @escaping (Observable) throws -> Observable)
-        -> Observable where S.SubjectObserverType.E == E {
-        return Multicast(
-            source: self.asObservable(),
-            subjectSelector: subjectSelector,
-            selector: selector
-        )
-    }
-}
-
-// MARK: publish
-
-extension ObservableType {
-    
-    /**
-    Returns a connectable observable sequence that shares a single subscription to the underlying sequence. 
-    
-    This operator is a specialization of `multicast` using a `PublishSubject`.
-
-    - seealso: [publish operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)
-    
-    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
-    */
-    public func publish() -> ConnectableObservable {
-        return self.multicast(PublishSubject())
-    }
-}
-
-// MARK: replay
-
-extension ObservableType {
-    
-    /**
-    Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying bufferSize elements.
-
-    This operator is a specialization of `multicast` using a `ReplaySubject`.
-
-    - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
-    
-    - parameter bufferSize: Maximum element count of the replay buffer.
-    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
-    */
-    public func replay(_ bufferSize: Int)
-        -> ConnectableObservable {
-        return self.multicast(ReplaySubject.create(bufferSize: bufferSize))
-    }
-
-    /**
-    Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying all elements.
-
-    This operator is a specialization of `multicast` using a `ReplaySubject`.
-
-    - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
-
-    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.
-    */
-    public func replayAll()
-        -> ConnectableObservable {
-        return self.multicast(ReplaySubject.createUnbounded())
-    }
-}
-
-// MARK: refcount
-
-extension ConnectableObservableType {
-    
-    /**
-    Returns an observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.
-
-    - seealso: [refCount operator on reactivex.io](http://reactivex.io/documentation/operators/refCount.html)
-    
-    - returns: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.
-    */
-    public func refCount() -> Observable {
-        return RefCount(source: self)
-    }
-}
-
-// MARK: share
-
-extension ObservableType {
-    
-    /**
-    Returns an observable sequence that shares a single subscription to the underlying sequence.
-    
-    This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.
-
-    - seealso: [share operator on reactivex.io](http://reactivex.io/documentation/operators/refcount.html)
-
-    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
-    */
-    public func share() -> Observable {
-        return self.publish().refCount()
-    }
-}
-
-// MARK: shareReplay
-
-extension ObservableType {
-    
-    /**
-    Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays maximum number of elements in buffer.
-    
-    This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.
-
-    - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
-    
-    - parameter bufferSize: Maximum element count of the replay buffer.
-    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
-    */
-    public func shareReplay(_ bufferSize: Int)
-        -> Observable {
-        if bufferSize == 1 {
-            return ShareReplay1(source: self.asObservable())
-        }
-        else {
-            return self.replay(bufferSize).refCount()
-        }
-    }
-
-    /**
-    Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays latest element in buffer.
-
-    This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.
-     
-    Unlike `shareReplay(bufferSize: Int)`, this operator will clear latest element from replay buffer in case number of subscribers drops from one to zero. In case sequence
-    completes or errors out replay buffer is also cleared.
-
-    - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
-    
-    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
-    */
-    public func shareReplayLatestWhileConnected()
-        -> Observable {
-        return ShareReplay1WhileConnected(source: self.asObservable())
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift
deleted file mode 100644
index 1dbab633..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-//  Observable+Concurrency.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/15/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: observeOn
-
-extension ObservableType {
-    
-    /**
-    Wraps the source sequence in order to run its observer callbacks on the specified scheduler.
-    
-    This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription
-    actions have side-effects that require to be run on a scheduler, use `subscribeOn`.
-
-    - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)
-    
-    - parameter scheduler: Scheduler to notify observers on.
-    - returns: The source sequence whose observations happen on the specified scheduler.
-    */
-    public func observeOn(_ scheduler: ImmediateSchedulerType)
-        -> Observable {
-        if let scheduler = scheduler as? SerialDispatchQueueScheduler {
-            return ObserveOnSerialDispatchQueue(source: self.asObservable(), scheduler: scheduler)
-        }
-        else {
-            return ObserveOn(source: self.asObservable(), scheduler: scheduler)
-        }
-    }
-}
-
-// MARK: subscribeOn
-
-extension ObservableType {
-    
-    /**
-    Wraps the source sequence in order to run its subscription and unsubscription logic on the specified 
-    scheduler. 
-    
-    This operation is not commonly used.
-    
-    This only performs the side-effects of subscription and unsubscription on the specified scheduler. 
-    
-    In order to invoke observer callbacks on a `scheduler`, use `observeOn`.
-
-    - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)
-    
-    - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.
-    - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.
-    */
-    public func subscribeOn(_ scheduler: ImmediateSchedulerType)
-        -> Observable {
-        return SubscribeOn(source: self, scheduler: scheduler)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift
deleted file mode 100644
index b45a44e1..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift
+++ /dev/null
@@ -1,226 +0,0 @@
-//
-//  Observable+Creation.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/21/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-extension Observable {
-    // MARK: create
-
-    /**
-    Creates an observable sequence from a specified subscribe method implementation.
-
-    - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
-
-    - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
-    - returns: The observable sequence with the specified implementation for the `subscribe` method.
-    */
-    public static func create(_ subscribe: @escaping (AnyObserver) -> Disposable) -> Observable {
-        return AnonymousObservable(subscribe)
-    }
-
-    // MARK: empty
-
-    /**
-    Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.
-
-    - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
-
-    - returns: An observable sequence with no elements.
-    */
-    public static func empty() -> Observable {
-        return EmptyProducer()
-    }
-
-    // MARK: never
-
-    /**
-    Returns a non-terminating observable sequence, which can be used to denote an infinite duration.
-
-    - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
-
-    - returns: An observable sequence whose observers will never get called.
-    */
-    public static func never() -> Observable {
-        return NeverProducer()
-    }
-
-    // MARK: just
-
-    /**
-    Returns an observable sequence that contains a single element.
-
-    - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)
-
-    - parameter element: Single element in the resulting observable sequence.
-    - returns: An observable sequence containing the single specified element.
-    */
-    public static func just(_ element: E) -> Observable {
-        return Just(element: element)
-    }
-
-    /**
-     Returns an observable sequence that contains a single element.
-
-     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)
-
-     - parameter element: Single element in the resulting observable sequence.
-     - parameter: Scheduler to send the single element on.
-     - returns: An observable sequence containing the single specified element.
-     */
-    public static func just(_ element: E, scheduler: ImmediateSchedulerType) -> Observable {
-        return JustScheduled(element: element, scheduler: scheduler)
-    }
-
-    // MARK: fail
-
-    /**
-    Returns an observable sequence that terminates with an `error`.
-
-    - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
-
-    - returns: The observable sequence that terminates with specified error.
-    */
-    public static func error(_ error: Swift.Error) -> Observable {
-        return ErrorProducer(error: error)
-    }
-
-    // MARK: of
-
-    /**
-    This method creates a new Observable instance with a variable number of elements.
-
-    - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
-
-    - parameter elements: Elements to generate.
-    - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediatelly on subscription.
-    - returns: The observable sequence whose elements are pulled from the given arguments.
-    */
-    public static func of(_ elements: E ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
-        return ObservableSequence(elements: elements, scheduler: scheduler)
-    }
-
-    // MARK: defer
-
-    /**
-    Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.
-
-    - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)
-
-    - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.
-    - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.
-    */
-    public static func deferred(_ observableFactory: @escaping () throws -> Observable)
-        -> Observable {
-        return Deferred(observableFactory: observableFactory)
-    }
-
-    /**
-    Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler
-    to run the loop send out observer messages.
-
-    - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
-
-    - parameter initialState: Initial state.
-    - parameter condition: Condition to terminate generation (upon returning `false`).
-    - parameter iterate: Iteration step function.
-    - parameter scheduler: Scheduler on which to run the generator loop.
-    - returns: The generated sequence.
-    */
-    public static func generate(initialState: E, condition: @escaping (E) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (E) throws -> E) -> Observable {
-        return Generate(initialState: initialState, condition: condition, iterate: iterate, resultSelector: { $0 }, scheduler: scheduler)
-    }
-
-    /**
-    Generates an observable sequence that repeats the given element infinitely, using the specified scheduler to send out observer messages.
-
-    - seealso: [repeat operator on reactivex.io](http://reactivex.io/documentation/operators/repeat.html)
-
-    - parameter element: Element to repeat.
-    - parameter scheduler: Scheduler to run the producer loop on.
-    - returns: An observable sequence that repeats the given element infinitely.
-    */
-    public static func repeatElement(_ element: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
-        return RepeatElement(element: element, scheduler: scheduler)
-    }
-
-    /**
-    Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.
-
-    - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)
-     
-    - parameter resourceFactory: Factory function to obtain a resource object.
-    - parameter observableFactory: Factory function to obtain an observable sequence that depends on the obtained resource.
-    - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.
-    */
-    public static func using(_ resourceFactory: @escaping () throws -> R, observableFactory: @escaping (R) throws -> Observable) -> Observable {
-        return Using(resourceFactory: resourceFactory, observableFactory: observableFactory)
-    }
-}
-
-extension Observable where Element : SignedInteger {
-    /**
-    Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to generate and send out observer messages.
-
-    - seealso: [range operator on reactivex.io](http://reactivex.io/documentation/operators/range.html)
-
-    - parameter start: The value of the first integer in the sequence.
-    - parameter count: The number of sequential integers to generate.
-    - parameter scheduler: Scheduler to run the generator loop on.
-    - returns: An observable sequence that contains a range of sequential integral numbers.
-    */
-    public static func range(start: E, count: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
-        return RangeProducer(start: start, count: count, scheduler: scheduler)
-    }
-}
-
-extension Observable {
-    /**
-     Converts an array to an observable sequence.
-
-     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
-
-     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
-     */
-    public static func from(_ array: [E], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
-        return ObservableSequence(elements: array, scheduler: scheduler)
-    }
-
-    /**
-     Converts a sequence to an observable sequence.
-
-     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
-
-     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
-     */
-    public static func from(_ sequence: S, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable where S.Iterator.Element == E {
-        return ObservableSequence(elements: sequence, scheduler: scheduler)
-    }
-    
-    /**
-     Converts a optional to an observable sequence.
-
-     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
-
-     - parameter optional: Optional element in the resulting observable sequence.
-     - returns: An observable sequence containing the wrapped value or not from given optional.
-     */
-    public static func from(optional: E?) -> Observable {
-        return ObservableOptional(optional: optional)
-    }
-    
-    /**
-     Converts a optional to an observable sequence.
-     
-     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
-     
-     - parameter optional: Optional element in the resulting observable sequence.
-     - parameter: Scheduler to send the optional element on.
-     - returns: An observable sequence containing the wrapped value or not from given optional.
-     */
-    public static func from(optional: E?, scheduler: ImmediateSchedulerType) -> Observable {
-        return ObservableOptionalScheduled(optional: optional, scheduler: scheduler)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift
deleted file mode 100644
index 8b3cc414..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-//  Observable+Debug.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 5/2/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: debug
-
-extension ObservableType {
-    
-    /**
-    Prints received events for all observers on standard output.
-
-    - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)
-    
-    - parameter identifier: Identifier that is printed together with event description to standard output.
-    - parameter trimOutput: Should output be trimmed to max 40 characters.
-    - returns: An observable sequence whose events are printed to standard output.
-    */
-    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)
-        -> Observable {
-        return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift
deleted file mode 100644
index 7c30641e..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift
+++ /dev/null
@@ -1,402 +0,0 @@
-//
-//  Observable+Multiple.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/12/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: combineLatest
-
-extension Observable {
-    /**
-     Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
-
-     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
-
-     - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
-     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-     */
-    public static func combineLatest(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable
-        where C.Iterator.Element: ObservableType {
-        return CombineLatestCollectionType(sources: collection, resultSelector: resultSelector)
-    }
-
-    /**
-     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.
-
-     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
-
-     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-     */
-    public static func combineLatest(_ collection: C) -> Observable<[Element]>
-        where C.Iterator.Element: ObservableType, C.Iterator.Element.E == Element {
-        return CombineLatestCollectionType(sources: collection, resultSelector: { $0 })
-    }
-}
-
-// MARK: zip
-
-extension Observable {
-    /**
-     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
-
-     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
-
-     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
-     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-     */
-    public static func zip(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable
-        where C.Iterator.Element: ObservableType {
-            return ZipCollectionType(sources: collection, resultSelector: resultSelector)
-    }
-
-    /**
-     Merges the specified observable sequences into one observable sequence whenever all of the observable sequences have produced an element at a corresponding index.
-
-     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
-
-     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
-     */
-    public static func zip(_ collection: C) -> Observable<[Element]>
-        where C.Iterator.Element: ObservableType, C.Iterator.Element.E == Element {
-            return ZipCollectionType(sources: collection, resultSelector: { $0 })
-    }
-
-}
-
-// MARK: switch
-
-extension ObservableType where E : ObservableConvertibleType {
-    
-    /**
-    Transforms an observable sequence of observable sequences into an observable sequence
-    producing values only from the most recent observable sequence.
-    
-    Each time a new inner observable sequence is received, unsubscribe from the
-    previous inner observable sequence.
-
-    - seealso: [switch operator on reactivex.io](http://reactivex.io/documentation/operators/switch.html)
-
-    - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.
-    */
-    public func switchLatest() -> Observable {
-        return Switch(source: asObservable())
-    }
-}
-
-// switchIfEmpty
-
-extension ObservableType {
-    /**
-     Returns the elements of the specified sequence or `switchTo` sequence if the sequence is empty.
-     
-     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)
-
-     - parameter switchTo: Observable sequence being returned when source sequence is empty.
-     - returns: Observable sequence that contains elements from switchTo sequence if source is empty, otherwise returns source sequence elements.
-     */
-    public func ifEmpty(switchTo other: Observable) -> Observable {
-        return SwitchIfEmpty(source: asObservable(), ifEmpty: other)
-    }
-}
-
-// MARK: concat
-
-extension ObservableType {
-
-    /**
-    Concatenates the second observable sequence to `self` upon successful termination of `self`.
-
-    - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
-    
-    - parameter second: Second observable sequence.
-    - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
-    */
-    public func concat(_ second: O) -> Observable where O.E == E {
-        return Observable.concat([self.asObservable(), second.asObservable()])
-    }
-}
-
-extension Observable {
-    /**
-     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
-
-     This operator has tail recursive optimizations that will prevent stack overflow.
-
-     Optimizations will be performed in cases equivalent to following:
-
-     [1, [2, [3, .....].concat()].concat].concat()
-
-     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
-
-     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
-     */
-    public static func concat(_ sequence: S) -> Observable
-        where S.Iterator.Element == Observable {
-            return Concat(sources: sequence, count: nil)
-    }
-
-    /**
-     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.
-
-     This operator has tail recursive optimizations that will prevent stack overflow.
-
-     Optimizations will be performed in cases equivalent to following:
-
-     [1, [2, [3, .....].concat()].concat].concat()
-
-     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
-
-     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
-     */
-    public static func concat(_ collection: S) -> Observable
-        where S.Iterator.Element == Observable {
-            return Concat(sources: collection, count: collection.count.toIntMax())
-    }
-
-    /**
-     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.
-
-     This operator has tail recursive optimizations that will prevent stack overflow.
-
-     Optimizations will be performed in cases equivalent to following:
-
-     [1, [2, [3, .....].concat()].concat].concat()
-
-     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
-
-     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
-     */
-    public static func concat(_ sources: Observable ...) -> Observable {
-        return Concat(sources: sources, count: sources.count.toIntMax())
-    }
-}
-
-extension ObservableType where E : ObservableConvertibleType {
-    
-    /**
-    Concatenates all inner observable sequences, as long as the previous observable sequence terminated successfully.
-
-    - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
-    
-    - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.
-    */
-    public func concat() -> Observable {
-        return merge(maxConcurrent: 1)
-    }
-}
-
-// MARK: merge
-
-extension Observable {
-    /**
-     Merges elements from all observable sequences from collection into a single observable sequence.
-
-     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
-
-     - parameter sources: Collection of observable sequences to merge.
-     - returns: The observable sequence that merges the elements of the observable sequences.
-     */
-    public static func merge(_ sources: C) -> Observable where C.Iterator.Element == Observable {
-        return MergeArray(sources: Array(sources))
-    }
-
-    /**
-     Merges elements from all observable sequences from array into a single observable sequence.
-
-     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
-
-     - parameter sources: Array of observable sequences to merge.
-     - returns: The observable sequence that merges the elements of the observable sequences.
-     */
-    public static func merge(_ sources: [Observable]) -> Observable {
-        return MergeArray(sources: sources)
-    }
-
-    /**
-     Merges elements from all observable sequences into a single observable sequence.
-
-     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
-
-     - parameter sources: Collection of observable sequences to merge.
-     - returns: The observable sequence that merges the elements of the observable sequences.
-     */
-    public static func merge(_ sources: Observable...) -> Observable {
-        return MergeArray(sources: sources)
-    }
-}
-
-extension ObservableType where E : ObservableConvertibleType {
-    
-    /**
-    Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.
-
-    - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
-    
-    - returns: The observable sequence that merges the elements of the observable sequences.
-    */
-    public func merge() -> Observable {
-        return Merge(source: asObservable())
-    }
-
-    /**
-    Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.
-
-    - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
-
-    - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.
-    - returns: The observable sequence that merges the elements of the inner sequences.
-    */
-    public func merge(maxConcurrent: Int)
-        -> Observable {
-        return MergeLimited(source: asObservable(), maxConcurrent: maxConcurrent)
-    }
-}
-
-// MARK: catch
-
-extension ObservableType {
-    
-    /**
-    Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.
-
-    - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)
-    
-    - parameter handler: Error handler function, producing another observable sequence.
-    - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.
-    */
-    public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable)
-        -> Observable {
-        return Catch(source: asObservable(), handler: handler)
-    }
-
-    /**
-    Continues an observable sequence that is terminated by an error with a single element.
-
-    - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)
-    
-    - parameter element: Last element in an observable sequence in case error occurs.
-    - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.
-    */
-    public func catchErrorJustReturn(_ element: E)
-        -> Observable {
-        return Catch(source: asObservable(), handler: { _ in Observable.just(element) })
-    }
-    
-}
-
-extension Observable {
-    /**
-     Continues an observable sequence that is terminated by an error with the next observable sequence.
-
-     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)
-
-     - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.
-     */
-    public static func catchError(_ sequence: S) -> Observable
-        where S.Iterator.Element == Observable {
-        return CatchSequence(sources: sequence)
-    }
-}
-
-// MARK: takeUntil
-
-extension ObservableType {
-    
-    /**
-    Returns the elements from the source observable sequence until the other observable sequence produces an element.
-
-    - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)
-    
-    - parameter other: Observable sequence that terminates propagation of elements of the source sequence.
-    - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.
-    */
-    public func takeUntil(_ other: O)
-        -> Observable {
-        return TakeUntil(source: asObservable(), other: other.asObservable())
-    }
-}
-
-// MARK: skipUntil
-
-extension ObservableType {
-    
-    /**
-    Returns the elements from the source observable sequence that are emitted after the other observable sequence produces an element.
-
-    - seealso: [skipUntil operator on reactivex.io](http://reactivex.io/documentation/operators/skipuntil.html)
-    
-    - parameter other: Observable sequence that starts propagation of elements of the source sequence.
-    - returns: An observable sequence containing the elements of the source sequence that are emitted after the other sequence emits an item.
-    */
-    public func skipUntil(_ other: O)
-        -> Observable {
-        return SkipUntil(source: asObservable(), other: other.asObservable())
-    }
-}
-
-// MARK: amb
-
-extension ObservableType {
-    
-    /**
-    Propagates the observable sequence that reacts first.
-
-    - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)
-    
-    - parameter right: Second observable sequence.
-    - returns: An observable sequence that surfaces either of the given sequences, whichever reacted first.
-    */
-    public func amb
-        (_ right: O2)
-        -> Observable where O2.E == E {
-        return Amb(left: asObservable(), right: right.asObservable())
-    }
-}
-
-extension Observable {
-    /**
-     Propagates the observable sequence that reacts first.
-
-     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)
-
-     - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first.
-     */
-    public static func amb(_ sequence: S) -> Observable
-        where S.Iterator.Element == Observable {
-        return sequence.reduce(Observable.never()) { a, o in
-            return a.amb(o.asObservable())
-        }
-    }
-}
-
-// withLatestFrom
-
-extension ObservableType {
-    
-    /**
-    Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.
-
-    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
-     
-    - parameter second: Second observable source.
-    - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.
-    - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.
-    */
-    public func withLatestFrom(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) throws -> ResultType) -> Observable {
-        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: resultSelector)
-    }
-
-    /**
-    Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emitts an element.
-
-    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
-     
-    - parameter second: Second observable source.
-    - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.
-    */
-    public func withLatestFrom(_ second: SecondO) -> Observable {
-        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: { $1 })
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift
deleted file mode 100644
index 50f60a3a..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift
+++ /dev/null
@@ -1,231 +0,0 @@
-//
-//  Observable+Single.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 2/14/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: distinct until changed
-
-extension ObservableType where E: Equatable {
-    
-    /**
-    Returns an observable sequence that contains only distinct contiguous elements according to equality operator.
-
-    - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
-    
-    - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.
-    */
-    public func distinctUntilChanged()
-        -> Observable {
-        return self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })
-    }
-}
-
-extension ObservableType {
-    /**
-    Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.
-
-    - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
-    
-    - parameter keySelector: A function to compute the comparison key for each element.
-    - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.
-    */
-    public func distinctUntilChanged(_ keySelector: @escaping (E) throws -> K)
-        -> Observable {
-        return self.distinctUntilChanged(keySelector, comparer: { $0 == $1 })
-    }
-
-    /**
-    Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.
-
-    - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
-    
-    - parameter comparer: Equality comparer for computed key values.
-    - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.
-    */
-    public func distinctUntilChanged(_ comparer: @escaping (E, E) throws -> Bool)
-        -> Observable {
-        return self.distinctUntilChanged({ $0 }, comparer: comparer)
-    }
-    
-    /**
-    Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.
-
-    - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)
-    
-    - parameter keySelector: A function to compute the comparison key for each element.
-    - parameter comparer: Equality comparer for computed key values.
-    - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.
-    */
-    public func distinctUntilChanged(_ keySelector: @escaping (E) throws -> K, comparer: @escaping (K, K) throws -> Bool)
-        -> Observable {
-        return DistinctUntilChanged(source: self.asObservable(), selector: keySelector, comparer: comparer)
-    }
-}
-
-// MARK: doOn
-
-extension ObservableType {
-    /**
-     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.
-
-     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)
-
-     - parameter onNext: Action to invoke for each element in the observable sequence.
-     - parameter onError: Action to invoke upon errored termination of the observable sequence.
-     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
-     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.
-     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.
-     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.
-    - returns: The source sequence with the side-effecting behavior applied.
-     */
-    public func `do`(onNext: ((E) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> ())? = nil, onSubscribed: (() -> ())? = nil, onDispose: (() -> ())? = nil)
-        -> Observable {
-            return Do(source: self.asObservable(), eventHandler: { e in
-                switch e {
-                case .next(let element):
-                    try onNext?(element)
-                case .error(let e):
-                    try onError?(e)
-                case .completed:
-                    try onCompleted?()
-                }
-            }, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose)
-    }
-}
-
-// MARK: startWith
-
-extension ObservableType {
-    
-    /**
-    Prepends a sequence of values to an observable sequence.
-
-    - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)
-    
-    - parameter elements: Elements to prepend to the specified sequence.
-    - returns: The source sequence prepended with the specified values.
-    */
-    public func startWith(_ elements: E ...)
-        -> Observable {
-        return StartWith(source: self.asObservable(), elements: elements)
-    }
-}
-
-// MARK: retry
-
-extension ObservableType {
-    
-    /**
-    Repeats the source observable sequence until it successfully terminates.
-    
-    **This could potentially create an infinite sequence.**
-
-    - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
-    
-    - returns: Observable sequence to repeat until it successfully terminates.
-    */
-    public func retry() -> Observable {
-        return CatchSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()))
-    }
-
-    /**
-    Repeats the source observable sequence the specified number of times in case of an error or until it successfully terminates.
-    
-    If you encounter an error and want it to retry once, then you must use `retry(2)`
-
-    - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
-
-    - parameter maxAttemptCount: Maximum number of times to repeat the sequence.
-    - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.
-    */
-    public func retry(_ maxAttemptCount: Int)
-        -> Observable {
-        return CatchSequence(sources: repeatElement(self.asObservable(), count: maxAttemptCount))
-    }
-    
-    /**
-    Repeats the source observable sequence on error when the notifier emits a next value.
-    If the source observable errors and the notifier completes, it will complete the source sequence.
-
-    - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
-    
-    - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.
-    - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.
-    */
-    public func retryWhen(_ notificationHandler: @escaping (Observable) -> TriggerObservable)
-        -> Observable {
-            return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)
-    }
-
-    /**
-    Repeats the source observable sequence on error when the notifier emits a next value.
-    If the source observable errors and the notifier completes, it will complete the source sequence.
-
-    - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
-    
-    - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.
-    - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.
-    */
-    public func retryWhen(_ notificationHandler: @escaping (Observable) -> TriggerObservable)
-        -> Observable {
-            return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)
-    }
-}
-
-// MARK: scan
-
-extension ObservableType {
-    
-    /**
-    Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.
-
-    For aggregation behavior with no intermediate results, see `reduce`.
-
-    - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)
-    
-    - parameter seed: The initial accumulator value.
-    - parameter accumulator: An accumulator function to be invoked on each element.
-    - returns: An observable sequence containing the accumulated values.
-    */
-    public func scan(_ seed: A, accumulator: @escaping (A, E) throws -> A)
-        -> Observable {
-        return Scan(source: self.asObservable(), seed: seed, accumulator: accumulator)
-    }
-}
-
-// MARK: defaultIfEmpty
-
-extension ObservableType {
-    
-    /**
-     Emits elements from the source observable sequence, or a default element if the source observable sequence is empty.
-     
-     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)
-     
-     - parameter default: Default element to be sent if the source does not emit any elements
-     - returns: An observable sequence which emits default element end completes in case the original sequence is empty
-     */
-    public func ifEmpty(default: E) -> Observable {
-        return DefaultIfEmpty(source: self.asObservable(), default: `default`)
-    }
-}
-
-extension ObservableType {
-
-    /**
-     Skips elements and completes (or errors) when the receiver completes (or errors). Equivalent to filter that always returns false.
-
-     - seealso: [ignoreElements operator on reactivex.io](http://reactivex.io/documentation/operators/ignoreelements.html)
-
-     - returns: An observable sequence that skips all elements of the source sequence.
-     */
-    public func ignoreElements()
-        -> Observable {
-        return filter { _ -> Bool in
-            return false
-        }
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift b/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift
deleted file mode 100644
index 49e9cd43..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift
+++ /dev/null
@@ -1,320 +0,0 @@
-//
-//  Observable+StandardSequenceOperators.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 2/17/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: filter aka where
-
-extension ObservableType {
-    
-    /**
-    Filters the elements of an observable sequence based on a predicate.
-
-    - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)
-    
-    - parameter predicate: A function to test each source element for a condition.
-    - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.
-    */
-    public func filter(_ predicate: @escaping (E) throws -> Bool)
-        -> Observable {
-        return Filter(source: asObservable(), predicate: predicate)
-    }
-}
-
-// MARK: takeWhile
-
-extension ObservableType {
-    
-    /**
-    Returns elements from an observable sequence as long as a specified condition is true.
-    
-    - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)
-
-    - parameter predicate: A function to test each element for a condition.
-    - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.
-    */
-    public func takeWhile(_ predicate: @escaping (E) throws -> Bool)
-        -> Observable {
-        return TakeWhile(source: asObservable(), predicate: predicate)
-    }
-
-    /**
-    Returns elements from an observable sequence as long as a specified condition is true. 
-    
-    The element's index is used in the logic of the predicate function.
-   
-    - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)
-
-    - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element.
-    - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.
-    */
-    public func takeWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool)
-        -> Observable {
-        return TakeWhile(source: asObservable(), predicate: predicate)
-    }
-}
-
-// MARK: take
-
-extension ObservableType {
-    
-    /**
-    Returns a specified number of contiguous elements from the start of an observable sequence.
-
-    - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)
-    
-    - parameter count: The number of elements to return.
-    - returns: An observable sequence that contains the specified number of elements from the start of the input sequence.
-    */
-    public func take(_ count: Int)
-        -> Observable {
-        if count == 0 {
-            return Observable.empty()
-        }
-        else {
-            return TakeCount(source: asObservable(), count: count)
-        }
-    }
-}
-
-// MARK: takeLast
-
-extension ObservableType {
-    
-    /**
-    Returns a specified number of contiguous elements from the end of an observable sequence.
-     
-     This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.
-
-     - seealso: [takeLast operator on reactivex.io](http://reactivex.io/documentation/operators/takelast.html)
-     
-     - parameter count: Number of elements to take from the end of the source sequence.
-     - returns: An observable sequence containing the specified number of elements from the end of the source sequence.
-     */
-    public func takeLast(_ count: Int)
-        -> Observable {
-        return TakeLast(source: asObservable(), count: count)
-    }
-}
-
-
-// MARK: skip
-
-extension ObservableType {
-    
-    /**
-    Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.
-
-    - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)
-    
-    - parameter count: The number of elements to skip before returning the remaining elements.
-    - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.
-    */
-    public func skip(_ count: Int)
-        -> Observable {
-        return SkipCount(source: asObservable(), count: count)
-    }
-}
-
-// MARK: SkipWhile
-
-extension ObservableType {
-   
-    /**
-    Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.
-
-    - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)
-    
-    - parameter predicate: A function to test each element for a condition.
-    - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.
-    */
-    public func skipWhile(_ predicate: @escaping (E) throws -> Bool) -> Observable {
-        return SkipWhile(source: asObservable(), predicate: predicate)
-    }
-   
-    /**
-    Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.
-    The element's index is used in the logic of the predicate function.
-
-    - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)
-    
-    - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element.
-    - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.
-    */
-    public func skipWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable {
-        return SkipWhile(source: asObservable(), predicate: predicate)
-    }
-}
-
-// MARK: map aka select
-
-extension ObservableType {
-    
-    /**
-    Projects each element of an observable sequence into a new form.
-    
-    - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
-
-    - parameter transform: A transform function to apply to each source element.
-    - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
-     
-    */
-    public func map(_ transform: @escaping (E) throws -> R)
-        -> Observable {
-        return self.asObservable().composeMap(transform)
-    }
-
-    /**
-    Projects each element of an observable sequence into a new form by incorporating the element's index.
-
-    - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
-    
-    - parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element.
-    - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
-    */
-    public func mapWithIndex(_ selector: @escaping (E, Int) throws -> R)
-        -> Observable {
-        return MapWithIndex(source: asObservable(), selector: selector)
-    }
-}
-    
-// MARK: flatMap
-
-extension ObservableType {
-
-    /**
-    Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
-
-    - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
-    
-    - parameter selector: A transform function to apply to each element.
-    - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.
-    */
-    public func flatMap(_ selector: @escaping (E) throws -> O)
-        -> Observable {
-        return FlatMap(source: asObservable(), selector: selector)
-    }
-
-    /**
-    Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
-
-    - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
-
-    - parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element.
-    - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.
-    */
-    public func flatMapWithIndex(_ selector: @escaping (E, Int) throws -> O)
-        -> Observable {
-        return FlatMapWithIndex(source: asObservable(), selector: selector)
-    }
-}
-
-// MARK: flatMapFirst
-
-extension ObservableType {
-
-    /**
-     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
-     If element is received while there is some projected observable sequence being merged it will simply be ignored.
-
-    - seealso: [flatMapFirst operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
-
-    - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.
-    - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.
-    */
-    public func flatMapFirst(_ selector: @escaping (E) throws -> O)
-        -> Observable {
-        return FlatMapFirst(source: asObservable(), selector: selector)
-    }
-}
-
-// MARK: flatMapLatest
-
-extension ObservableType {
-    /**
-     Projects each element of an observable sequence into a new sequence of observable sequences and then
-     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.
-     
-     It is a combination of `map` + `switchLatest` operator
-
-     - seealso: [flatMapLatest operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
-
-     - parameter selector: A transform function to apply to each element.
-     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an 
-        Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.
-     */
-    public func flatMapLatest(_ selector: @escaping (E) throws -> O)
-        -> Observable {
-            return FlatMapLatest(source: asObservable(), selector: selector)
-    }
-}
-
-// MARK: elementAt
-
-extension ObservableType {
-    
-    /**
-    Returns a sequence emitting only element _n_ emitted by an Observable
-
-    - seealso: [elementAt operator on reactivex.io](http://reactivex.io/documentation/operators/elementat.html)
-    
-    - parameter index: The index of the required element (starting from 0).
-    - returns: An observable sequence that emits the desired element as its own sole emission.
-    */
-    public func elementAt(_ index: Int)
-        -> Observable {
-        return ElementAt(source: asObservable(), index: index, throwOnEmpty: true)
-    }
-}
-
-// MARK: single
-
-extension ObservableType {
-    
-    /**
-    The single operator is similar to first, but throws a `RxError.noElements` or `RxError.moreThanOneElement`
-    if the source Observable does not emit exactly one element before successfully completing.
-
-    - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)
-    
-    - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.
-    */
-    public func single()
-        -> Observable {
-        return SingleAsync(source: asObservable())
-    }
-    
-    /**
-    The single operator is similar to first, but throws a `RxError.NoElements` or `RxError.MoreThanOneElement`
-    if the source Observable does not emit exactly one element before successfully completing.
-
-    - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)
-    
-    - parameter predicate: A function to test each source element for a condition.
-    - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.
-    */
-    public func single(_ predicate: @escaping (E) throws -> Bool)
-        -> Observable {
-        return SingleAsync(source: asObservable(), predicate: predicate)
-    }
-}
-
-// MARK: groupBy 
-
-extension ObservableType {
-    /*
-    Groups the elements of an observable sequence according to a specified key selector function.
-
-    - seealso: [groupBy operator on reactivex.io](http://reactivex.io/documentation/operators/groupby.html)
-     
-    - parameter keySelector: A function to extract the key for each element.
-    - returns: A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
-    */
-    public func groupBy(keySelector: @escaping (E) throws -> K)
-        -> Observable> {
-        return GroupBy(source: self.asObservable(), selector: keySelector)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift b/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift
deleted file mode 100644
index d157d3ec..00000000
--- a/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift
+++ /dev/null
@@ -1,258 +0,0 @@
-//
-//  Observable+Time.swift
-//  RxSwift
-//
-//  Created by Krunoslav Zaher on 3/22/15.
-//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
-//
-
-// MARK: throttle
-extension ObservableType {
-    
-    /**
-    Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.
-    
-    This operator makes sure that no two elements are emitted in less then dueTime.
-     
-    - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)
-    
-    - parameter dueTime: Throttling duration for each element.
-    - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.
-    - parameter scheduler: Scheduler to run the throttle timers on.
-    - returns: The throttled sequence.
-    */
-    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)
-        -> Observable {
-        return Throttle(source: self.asObservable(), dueTime: dueTime, latest: latest, scheduler: scheduler)
-    }
-
-    /**
-    Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.
-    
-    - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)
-    
-    - parameter dueTime: Throttling duration for each element.
-    - parameter scheduler: Scheduler to run the throttle timers on.
-    - returns: The throttled sequence.
-    */
-    public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-        return Debounce(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
-    }
-}
-
-// MARK: sample
-
-extension ObservableType {
-   
-    /**
-    Samples the source observable sequence using a sampler observable sequence producing sampling ticks.
-    
-    Upon each sampling tick, the latest element (if any) in the source sequence during the last sampling interval is sent to the resulting sequence.
-    
-    **In case there were no new elements between sampler ticks, no element is sent to the resulting sequence.**
-
-    - seealso: [sample operator on reactivex.io](http://reactivex.io/documentation/operators/sample.html)
-    
-    - parameter sampler: Sampling tick sequence.
-    - returns: Sampled observable sequence.
-    */
-    public func sample(_ sampler: O)
-        -> Observable {
-        return Sample(source: self.asObservable(), sampler: sampler.asObservable())
-    }
-}
-
-extension Observable where Element : SignedInteger {
-    /**
-    Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.
-
-    - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html)
-
-    - parameter period: Period for producing the values in the resulting sequence.
-    - parameter scheduler: Scheduler to run the timer on.
-    - returns: An observable sequence that produces a value after each period.
-    */
-    public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-        return Timer(dueTime: period,
-            period: period,
-            scheduler: scheduler
-        )
-    }
-}
-
-// MARK: timer
-
-extension Observable where Element: SignedInteger {
-    /**
-    Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.
-
-    - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)
-
-    - parameter dueTime: Relative time at which to produce the first value.
-    - parameter period: Period to produce subsequent values.
-    - parameter scheduler: Scheduler to run timers on.
-    - returns: An observable sequence that produces a value after due time has elapsed and then each period.
-    */
-    public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)
-        -> Observable {
-        return Timer(
-            dueTime: dueTime,
-            period: period,
-            scheduler: scheduler
-        )
-    }
-}
-
-// MARK: take
-
-extension ObservableType {
-
-    /**
-    Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.
-
-    - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)
-    
-    - parameter duration: Duration for taking elements from the start of the sequence.
-    - parameter scheduler: Scheduler to run the timer on.
-    - returns: An observable sequence with the elements taken during the specified duration from the start of the source sequence.
-    */
-    public func take(_ duration: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-        return TakeTime(source: self.asObservable(), duration: duration, scheduler: scheduler)
-    }
-}
-
-// MARK: skip
-
-extension ObservableType {
-    
-    /**
-    Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.
-
-    - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)
-    
-    - parameter duration: Duration for skipping elements from the start of the sequence.
-    - parameter scheduler: Scheduler to run the timer on.
-    - returns: An observable sequence with the elements skipped during the specified duration from the start of the source sequence.
-    */
-    public func skip(_ duration: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-        return SkipTime(source: self.asObservable(), duration: duration, scheduler: scheduler)
-    }
-}
-
-// MARK: delaySubscription
-
-extension ObservableType {
-    
-    /**
-    Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.
-
-    - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)
-    
-    - parameter dueTime: Relative time shift of the subscription.
-    - parameter scheduler: Scheduler to run the subscription delay timer on.
-    - returns: Time-shifted sequence.
-    */
-    public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-        return DelaySubscription(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
-    }
-}
-
-// MARK: buffer
-
-extension ObservableType {
-
-    /**
-    Projects each element of an observable sequence into a buffer that's sent out when either it's full or a given amount of time has elapsed, using the specified scheduler to run timers.
-    
-    A useful real-world analogy of this overload is the behavior of a ferry leaving the dock when all seats are taken, or at the scheduled time of departure, whichever event occurs first.
-
-    - seealso: [buffer operator on reactivex.io](http://reactivex.io/documentation/operators/buffer.html)
-    
-    - parameter timeSpan: Maximum time length of a buffer.
-    - parameter count: Maximum element count of a buffer.
-    - parameter scheduler: Scheduler to run buffering timers on.
-    - returns: An observable sequence of buffers.
-    */
-    public func buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)
-        -> Observable<[E]> {
-        return BufferTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)
-    }
-}
-
-// MARK: window
-
-extension ObservableType {
-    
-    /**
-     Projects each element of an observable sequence into a window that is completed when either it’s full or a given amount of time has elapsed.
-
-     - seealso: [window operator on reactivex.io](http://reactivex.io/documentation/operators/window.html)
-          
-     - parameter timeSpan: Maximum time length of a window.
-     - parameter count: Maximum element count of a window.
-     - parameter scheduler: Scheduler to run windowing timers on.
-     - returns: An observable sequence of windows (instances of `Observable`).
-     */
-    public func window(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)
-        -> Observable> {
-            return WindowTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)
-    }
-}
-
-// MARK: timeout
-
-extension ObservableType {
-    
-    /**
-     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.
-
-     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)
-     
-     - parameter dueTime: Maximum duration between values before a timeout occurs.
-     - parameter scheduler: Scheduler to run the timeout timer on.
-     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.
-     */
-    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-            return Timeout(source: self.asObservable(), dueTime: dueTime, other: Observable.error(RxError.timeout), scheduler: scheduler)
-    }
-
-    /**
-     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.
-
-     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)
-     
-     - parameter dueTime: Maximum duration between values before a timeout occurs.
-     - parameter other: Sequence to return in case of a timeout.
-     - parameter scheduler: Scheduler to run the timeout timer on.
-     - returns: The source sequence switching to the other sequence in case of a timeout.
-     */
-    public func timeout(_ dueTime: RxTimeInterval, other: O, scheduler: SchedulerType)
-        -> Observable where E == O.E {
-            return Timeout(source: self.asObservable(), dueTime: dueTime, other: other.asObservable(), scheduler: scheduler)
-    }
-}
-
-// MARK: delay
-
-extension ObservableType {
-    
-    /**
-     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.
-     
-     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)
-     
-     - parameter dueTime: Relative time shift of the source by.
-     - parameter scheduler: Scheduler to run the subscription delay timer on.
-     - returns: the source Observable shifted in time by the specified delay.
-     */
-    public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
-        -> Observable {
-            return Delay(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
-    }
-}
diff --git a/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift b/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift
new file mode 100644
index 00000000..fd8ce337
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift
@@ -0,0 +1,229 @@
+//
+//  ObserveOn.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 7/25/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension ObservableType {
+
+    /**
+     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.
+
+     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription
+     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.
+
+     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)
+
+     - parameter scheduler: Scheduler to notify observers on.
+     - returns: The source sequence whose observations happen on the specified scheduler.
+     */
+    public func observeOn(_ scheduler: ImmediateSchedulerType)
+        -> Observable {
+            if let scheduler = scheduler as? SerialDispatchQueueScheduler {
+                return ObserveOnSerialDispatchQueue(source: self.asObservable(), scheduler: scheduler)
+            }
+            else {
+                return ObserveOn(source: self.asObservable(), scheduler: scheduler)
+            }
+    }
+}
+
+final fileprivate class ObserveOn : Producer {
+    let scheduler: ImmediateSchedulerType
+    let source: Observable
+    
+    init(source: Observable, scheduler: ImmediateSchedulerType) {
+        self.scheduler = scheduler
+        self.source = source
+        
+#if TRACE_RESOURCES
+        let _ = Resources.incrementTotal()
+#endif
+    }
+    
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
+        let sink = ObserveOnSink(scheduler: scheduler, observer: observer, cancel: cancel)
+        let subscription = source.subscribe(sink)
+        return (sink: sink, subscription: subscription)
+    }
+    
+#if TRACE_RESOURCES
+    deinit {
+        let _ = Resources.decrementTotal()
+    }
+#endif
+}
+
+enum ObserveOnState : Int32 {
+    // pump is not running
+    case stopped = 0
+    // pump is running
+    case running = 1
+}
+
+final fileprivate class ObserveOnSink : ObserverBase {
+    typealias E = O.E
+    
+    let _scheduler: ImmediateSchedulerType
+
+    var _lock = SpinLock()
+    let _observer: O
+
+    // state
+    var _state = ObserveOnState.stopped
+    var _queue = Queue>(capacity: 10)
+
+    let _scheduleDisposable = SerialDisposable()
+    let _cancel: Cancelable
+
+    init(scheduler: ImmediateSchedulerType, observer: O, cancel: Cancelable) {
+        _scheduler = scheduler
+        _observer = observer
+        _cancel = cancel
+    }
+
+    override func onCore(_ event: Event) {
+        let shouldStart = _lock.calculateLocked { () -> Bool in
+            self._queue.enqueue(event)
+            
+            switch self._state {
+            case .stopped:
+                self._state = .running
+                return true
+            case .running:
+                return false
+            }
+        }
+        
+        if shouldStart {
+            _scheduleDisposable.disposable = self._scheduler.scheduleRecursive((), action: self.run)
+        }
+    }
+    
+    func run(_ state: Void, recurse: (Void) -> Void) {
+        let (nextEvent, observer) = self._lock.calculateLocked { () -> (Event?, O) in
+            if self._queue.count > 0 {
+                return (self._queue.dequeue(), self._observer)
+            }
+            else {
+                self._state = .stopped
+                return (nil, self._observer)
+            }
+        }
+        
+        if let nextEvent = nextEvent, !_cancel.isDisposed {
+            observer.on(nextEvent)
+            if nextEvent.isStopEvent {
+                dispose()
+            }
+        }
+        else {
+            return
+        }
+        
+        let shouldContinue = _shouldContinue_synchronized()
+        
+        if shouldContinue {
+            recurse()
+        }
+    }
+
+    func _shouldContinue_synchronized() -> Bool {
+        _lock.lock(); defer { _lock.unlock() } // {
+            if self._queue.count > 0 {
+                return true
+            }
+            else {
+                self._state = .stopped
+                return false
+            }
+        // }
+    }
+    
+    override func dispose() {
+        super.dispose()
+
+        _cancel.dispose()
+        _scheduleDisposable.dispose()
+    }
+}
+
+#if TRACE_RESOURCES
+    fileprivate var _numberOfSerialDispatchQueueObservables: AtomicInt = 0
+    extension Resources {
+        /**
+         Counts number of `SerialDispatchQueueObservables`.
+
+         Purposed for unit tests.
+         */
+        public static var numberOfSerialDispatchQueueObservables: Int32 {
+            return _numberOfSerialDispatchQueueObservables.valueSnapshot()
+        }
+    }
+#endif
+
+final fileprivate class ObserveOnSerialDispatchQueueSink : ObserverBase {
+    let scheduler: SerialDispatchQueueScheduler
+    let observer: O
+
+    let cancel: Cancelable
+
+    var cachedScheduleLambda: ((ObserveOnSerialDispatchQueueSink, Event) -> Disposable)!
+
+    init(scheduler: SerialDispatchQueueScheduler, observer: O, cancel: Cancelable) {
+        self.scheduler = scheduler
+        self.observer = observer
+        self.cancel = cancel
+        super.init()
+
+        cachedScheduleLambda = { sink, event in
+            sink.observer.on(event)
+
+            if event.isStopEvent {
+                sink.dispose()
+            }
+
+            return Disposables.create()
+        }
+    }
+
+    override func onCore(_ event: Event) {
+        let _ = self.scheduler.schedule((self, event), action: cachedScheduleLambda)
+    }
+
+    override func dispose() {
+        super.dispose()
+
+        cancel.dispose()
+    }
+}
+
+final fileprivate class ObserveOnSerialDispatchQueue : Producer {
+    let scheduler: SerialDispatchQueueScheduler
+    let source: Observable
+
+    init(source: Observable, scheduler: SerialDispatchQueueScheduler) {
+        self.scheduler = scheduler
+        self.source = source
+
+        #if TRACE_RESOURCES
+            let _ = Resources.incrementTotal()
+            let _ = AtomicIncrement(&_numberOfSerialDispatchQueueObservables)
+        #endif
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
+        let sink = ObserveOnSerialDispatchQueueSink(scheduler: scheduler, observer: observer, cancel: cancel)
+        let subscription = source.subscribe(sink)
+        return (sink: sink, subscription: subscription)
+    }
+
+    #if TRACE_RESOURCES
+    deinit {
+        let _ = Resources.decrementTotal()
+        let _ = AtomicDecrement(&_numberOfSerialDispatchQueueObservables)
+    }
+    #endif
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Optional.swift b/Pods/RxSwift/RxSwift/Observables/Optional.swift
similarity index 59%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Optional.swift
rename to Pods/RxSwift/RxSwift/Observables/Optional.swift
index 534e2791..fa74c04b 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Optional.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Optional.swift
@@ -6,7 +6,34 @@
 //  Copyright © 2016 Krunoslav Zaher. All rights reserved.
 //
 
-final class ObservableOptionalScheduledSink : Sink {
+extension Observable {
+    /**
+     Converts a optional to an observable sequence.
+
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+
+     - parameter optional: Optional element in the resulting observable sequence.
+     - returns: An observable sequence containing the wrapped value or not from given optional.
+     */
+    public static func from(optional: E?) -> Observable {
+        return ObservableOptional(optional: optional)
+    }
+
+    /**
+     Converts a optional to an observable sequence.
+
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+
+     - parameter optional: Optional element in the resulting observable sequence.
+     - parameter: Scheduler to send the optional element on.
+     - returns: An observable sequence containing the wrapped value or not from given optional.
+     */
+    public static func from(optional: E?, scheduler: ImmediateSchedulerType) -> Observable {
+        return ObservableOptionalScheduled(optional: optional, scheduler: scheduler)
+    }
+}
+
+final fileprivate class ObservableOptionalScheduledSink : Sink {
     typealias E = O.E
     typealias Parent = ObservableOptionalScheduled
 
@@ -35,7 +62,7 @@ final class ObservableOptionalScheduledSink : Sink {
     }
 }
 
-final class ObservableOptionalScheduled : Producer {
+final fileprivate class ObservableOptionalScheduled : Producer {
     fileprivate let _optional: E?
     fileprivate let _scheduler: ImmediateSchedulerType
 
@@ -51,7 +78,7 @@ final class ObservableOptionalScheduled : Producer {
     }
 }
 
-final class ObservableOptional: Producer {
+final fileprivate class ObservableOptional: Producer {
     private let _optional: E?
     
     init(optional: E?) {
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Producer.swift b/Pods/RxSwift/RxSwift/Observables/Producer.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Producer.swift
rename to Pods/RxSwift/RxSwift/Observables/Producer.swift
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift b/Pods/RxSwift/RxSwift/Observables/Range.swift
similarity index 59%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift
rename to Pods/RxSwift/RxSwift/Observables/Range.swift
index c302dd21..2ebaca2e 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Range.swift
@@ -6,7 +6,23 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class RangeProducer : Producer {
+extension Observable where Element : SignedInteger {
+    /**
+     Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to generate and send out observer messages.
+
+     - seealso: [range operator on reactivex.io](http://reactivex.io/documentation/operators/range.html)
+
+     - parameter start: The value of the first integer in the sequence.
+     - parameter count: The number of sequential integers to generate.
+     - parameter scheduler: Scheduler to run the generator loop on.
+     - returns: An observable sequence that contains a range of sequential integral numbers.
+     */
+    public static func range(start: E, count: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
+        return RangeProducer(start: start, count: count, scheduler: scheduler)
+    }
+}
+
+final fileprivate class RangeProducer : Producer {
     fileprivate let _start: E
     fileprivate let _count: E
     fileprivate let _scheduler: ImmediateSchedulerType
@@ -32,7 +48,7 @@ final class RangeProducer : Producer {
     }
 }
 
-final class RangeSink : Sink where O.E: SignedInteger {
+final fileprivate class RangeSink : Sink where O.E: SignedInteger {
     typealias Parent = RangeProducer
     
     private let _parent: Parent
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift b/Pods/RxSwift/RxSwift/Observables/Reduce.swift
similarity index 51%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift
rename to Pods/RxSwift/RxSwift/Observables/Reduce.swift
index 17d241f5..3e4a7b9d 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Reduce.swift
@@ -6,7 +6,43 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class ReduceSink : Sink, ObserverType {
+
+extension ObservableType {
+    /**
+    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.
+
+    For aggregation behavior with incremental intermediate results, see `scan`.
+
+    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)
+
+    - parameter seed: The initial accumulator value.
+    - parameter accumulator: A accumulator function to be invoked on each element.
+    - parameter mapResult: A function to transform the final accumulator value into the result value.
+    - returns: An observable sequence containing a single element with the final accumulator value.
+    */
+    public func reduce(_ seed: A, accumulator: @escaping (A, E) throws -> A, mapResult: @escaping (A) throws -> R)
+        -> Observable {
+        return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: mapResult)
+    }
+
+    /**
+    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.
+    
+    For aggregation behavior with incremental intermediate results, see `scan`.
+
+    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)
+    
+    - parameter seed: The initial accumulator value.
+    - parameter accumulator: A accumulator function to be invoked on each element.
+    - returns: An observable sequence containing a single element with the final accumulator value.
+    */
+    public func reduce(_ seed: A, accumulator: @escaping (A, E) throws -> A)
+        -> Observable {
+        return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: { $0 })
+    }
+}
+
+final fileprivate class ReduceSink : Sink, ObserverType {
     typealias ResultType = O.E
     typealias Parent = Reduce
     
@@ -48,7 +84,7 @@ final class ReduceSink : Sink, O
     }
 }
 
-final class Reduce : Producer {
+final fileprivate class Reduce : Producer {
     typealias AccumulatorType = (AccumulateType, SourceType) throws -> AccumulateType
     typealias ResultSelectorType = (AccumulateType) throws -> ResultType
     
@@ -70,3 +106,4 @@ final class Reduce : Producer : Producer {
+extension Observable {
+    /**
+     Generates an observable sequence that repeats the given element infinitely, using the specified scheduler to send out observer messages.
+
+     - seealso: [repeat operator on reactivex.io](http://reactivex.io/documentation/operators/repeat.html)
+
+     - parameter element: Element to repeat.
+     - parameter scheduler: Scheduler to run the producer loop on.
+     - returns: An observable sequence that repeats the given element infinitely.
+     */
+    public static func repeatElement(_ element: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
+        return RepeatElement(element: element, scheduler: scheduler)
+    }
+}
+
+final fileprivate class RepeatElement : Producer {
     fileprivate let _element: Element
     fileprivate let _scheduler: ImmediateSchedulerType
     
@@ -23,7 +38,7 @@ final class RepeatElement : Producer {
     }
 }
 
-final class RepeatElementSink : Sink {
+final fileprivate class RepeatElementSink : Sink {
     typealias Parent = RepeatElement
     
     private let _parent: Parent
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift b/Pods/RxSwift/RxSwift/Observables/RetryWhen.swift
similarity index 64%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift
rename to Pods/RxSwift/RxSwift/Observables/RetryWhen.swift
index b836eb6f..268b399a 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift
+++ b/Pods/RxSwift/RxSwift/Observables/RetryWhen.swift
@@ -6,7 +6,38 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class RetryTriggerSink
+extension ObservableType {
+
+    /**
+     Repeats the source observable sequence on error when the notifier emits a next value.
+     If the source observable errors and the notifier completes, it will complete the source sequence.
+
+     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
+
+     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.
+     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.
+     */
+    public func retryWhen(_ notificationHandler: @escaping (Observable) -> TriggerObservable)
+        -> Observable {
+        return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)
+    }
+
+    /**
+     Repeats the source observable sequence on error when the notifier emits a next value.
+     If the source observable errors and the notifier completes, it will complete the source sequence.
+
+     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)
+
+     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.
+     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.
+     */
+    public func retryWhen(_ notificationHandler: @escaping (Observable) -> TriggerObservable)
+        -> Observable {
+        return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)
+    }
+}
+
+final fileprivate class RetryTriggerSink
     : ObserverType where S.Iterator.Element : ObservableType, S.Iterator.Element.E == O.E {
     typealias E = TriggerObservable.E
     
@@ -33,7 +64,7 @@ final class RetryTriggerSink
+final fileprivate class RetryWhenSequenceSinkIter
     : ObserverType
     , Disposable where S.Iterator.Element : ObservableType, S.Iterator.Element.E == O.E {
     typealias E = O.E
@@ -79,7 +110,7 @@ final class RetryWhenSequenceSinkIter
+final fileprivate class RetryWhenSequenceSink
     : TailRecursiveSink where S.Iterator.Element : ObservableType, S.Iterator.Element.E == O.E {
     typealias Element = O.E
     typealias Parent = RetryWhenSequence
@@ -132,7 +163,7 @@ final class RetryWhenSequenceSink : Producer where S.Iterator.Element : ObservableType {
+final fileprivate class RetryWhenSequence : Producer where S.Iterator.Element : ObservableType {
     typealias Element = S.Iterator.Element.E
     
     fileprivate let _sources: S
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift b/Pods/RxSwift/RxSwift/Observables/Sample.swift
similarity index 75%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift
rename to Pods/RxSwift/RxSwift/Observables/Sample.swift
index 88916779..31f8b625 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Sample.swift
@@ -6,7 +6,27 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class SamplerSink
+extension ObservableType {
+
+    /**
+     Samples the source observable sequence using a sampler observable sequence producing sampling ticks.
+
+     Upon each sampling tick, the latest element (if any) in the source sequence during the last sampling interval is sent to the resulting sequence.
+
+     **In case there were no new elements between sampler ticks, no element is sent to the resulting sequence.**
+
+     - seealso: [sample operator on reactivex.io](http://reactivex.io/documentation/operators/sample.html)
+
+     - parameter sampler: Sampling tick sequence.
+     - returns: Sampled observable sequence.
+     */
+    public func sample(_ sampler: O)
+        -> Observable {
+            return Sample(source: self.asObservable(), sampler: sampler.asObservable())
+    }
+}
+
+final fileprivate class SamplerSink
     : ObserverType
     , LockOwnerType
     , SynchronizedOnType {
@@ -56,7 +76,7 @@ final class SamplerSink
     }
 }
 
-final class SampleSequenceSink
+final fileprivate class SampleSequenceSink
     : Sink
     , ObserverType
     , LockOwnerType
@@ -105,7 +125,7 @@ final class SampleSequenceSink
     
 }
 
-final class Sample : Producer {
+final fileprivate class Sample : Producer {
     fileprivate let _source: Observable
     fileprivate let _sampler: Observable
 
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift b/Pods/RxSwift/RxSwift/Observables/Scan.swift
similarity index 65%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift
rename to Pods/RxSwift/RxSwift/Observables/Scan.swift
index c84385ac..e94db11b 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Scan.swift
@@ -6,7 +6,26 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class ScanSink : Sink, ObserverType {
+extension ObservableType {
+
+    /**
+     Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.
+
+     For aggregation behavior with no intermediate results, see `reduce`.
+
+     - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)
+
+     - parameter seed: The initial accumulator value.
+     - parameter accumulator: An accumulator function to be invoked on each element.
+     - returns: An observable sequence containing the accumulated values.
+     */
+    public func scan(_ seed: A, accumulator: @escaping (A, E) throws -> A)
+        -> Observable {
+        return Scan(source: self.asObservable(), seed: seed, accumulator: accumulator)
+    }
+}
+
+final fileprivate class ScanSink : Sink, ObserverType {
     typealias Accumulate = O.E
     typealias Parent = Scan
     typealias E = ElementType
@@ -42,7 +61,7 @@ final class ScanSink : Sink, ObserverType {
     
 }
 
-final class Scan: Producer {
+final fileprivate class Scan: Producer {
     typealias Accumulator = (Accumulate, Element) throws -> Accumulate
     
     fileprivate let _source: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Sequence.swift b/Pods/RxSwift/RxSwift/Observables/Sequence.swift
new file mode 100644
index 00000000..eb4daed1
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/Sequence.swift
@@ -0,0 +1,89 @@
+//
+//  Sequence.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 11/14/15.
+//  Copyright © 2015 Krunoslav Zaher. All rights reserved.
+//
+
+extension Observable {
+    // MARK: of
+
+    /**
+     This method creates a new Observable instance with a variable number of elements.
+
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+
+     - parameter elements: Elements to generate.
+     - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediately on subscription.
+     - returns: The observable sequence whose elements are pulled from the given arguments.
+     */
+    public static func of(_ elements: E ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
+        return ObservableSequence(elements: elements, scheduler: scheduler)
+    }
+}
+
+extension Observable {
+    /**
+     Converts an array to an observable sequence.
+
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+
+     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
+     */
+    public static func from(_ array: [E], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
+        return ObservableSequence(elements: array, scheduler: scheduler)
+    }
+
+    /**
+     Converts a sequence to an observable sequence.
+
+     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
+
+     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
+     */
+    public static func from(_ sequence: S, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable where S.Iterator.Element == E {
+        return ObservableSequence(elements: sequence, scheduler: scheduler)
+    }
+}
+
+final fileprivate class ObservableSequenceSink : Sink where S.Iterator.Element == O.E {
+    typealias Parent = ObservableSequence
+
+    private let _parent: Parent
+
+    init(parent: Parent, observer: O, cancel: Cancelable) {
+        _parent = parent
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    func run() -> Disposable {
+        return _parent._scheduler.scheduleRecursive((_parent._elements.makeIterator(), _parent._elements)) { (iterator, recurse) in
+            var mutableIterator = iterator
+            if let next = mutableIterator.0.next() {
+                self.forwardOn(.next(next))
+                recurse(mutableIterator)
+            }
+            else {
+                self.forwardOn(.completed)
+                self.dispose()
+            }
+        }
+    }
+}
+
+final fileprivate class ObservableSequence : Producer {
+    fileprivate let _elements: S
+    fileprivate let _scheduler: ImmediateSchedulerType
+
+    init(elements: S, scheduler: ImmediateSchedulerType) {
+        _elements = elements
+        _scheduler = scheduler
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
+        let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel)
+        let subscription = sink.run()
+        return (sink: sink, subscription: subscription)
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift b/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift
new file mode 100644
index 00000000..ee5e8f89
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift
@@ -0,0 +1,496 @@
+//
+//  ShareReplayScope.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 5/28/17.
+//  Copyright © 2017 Krunoslav Zaher. All rights reserved.
+//
+
+/// Subject lifetime scope
+public enum SubjectLifetimeScope {
+    /**
+     **Each connection will have it's own subject instance to store replay events.**
+     **Connections will be isolated from each another.**
+
+     Configures the underlying implementation to behave equivalent to.
+     
+     ```
+     source.multicast(makeSubject: { MySubject() }).refCount()
+     ```
+
+     **This is the recommended default.**
+
+     This has the following consequences:
+     * `retry` or `concat` operators will function as expected because terminating the sequence will clear internal state.
+     * Each connection to source observable sequence will use it's own subject.
+     * When the number of subscribers drops from 1 to 0 and connection to source sequence is disposed, subject will be cleared.
+
+     
+     ```
+     let xs = Observable.deferred { () -> Observable in
+             print("Performing work ...")
+             return Observable.just(Date().timeIntervalSince1970)
+         }
+         .share(replay: 1, scope: .whileConnected)
+
+     _ = xs.subscribe(onNext: { print("next \($0)") }, onCompleted: { print("completed\n") })
+     _ = xs.subscribe(onNext: { print("next \($0)") }, onCompleted: { print("completed\n") })
+     _ = xs.subscribe(onNext: { print("next \($0)") }, onCompleted: { print("completed\n") })
+
+     ```
+
+     Notice how time interval is different and `Performing work ...` is printed each time)
+     
+     ```
+     Performing work ...
+     next 1495998900.82141
+     completed
+
+     Performing work ...
+     next 1495998900.82359
+     completed
+
+     Performing work ...
+     next 1495998900.82444
+     completed
+
+
+     ```
+     
+     */
+    case whileConnected
+
+    /**
+     **One subject will store replay events for all connections to source.**
+     **Connections won't be isolated from each another.**
+
+     Configures the underlying implementation behave equivalent to.
+
+     ```
+     source.multicast(MySubject()).refCount()
+     ```
+     
+     This has the following consequences:
+     * Using `retry` or `concat` operators after this operator usually isn't advised.
+     * Each connection to source observable sequence will share the same subject.
+     * After number of subscribers drops from 1 to 0 and connection to source observable sequence is dispose, this operator will 
+       continue holding a reference to the same subject.
+       If at some later moment a new observer initiates a new connection to source it can potentially receive
+       some of the stale events received during previous connection.
+     * After source sequence terminates any new observer will always immediatelly receive replayed elements and terminal event.
+       No new subscriptions to source observable sequence will be attempted.
+
+     ```
+     let xs = Observable.deferred { () -> Observable in
+             print("Performing work ...")
+             return Observable.just(Date().timeIntervalSince1970)
+         }
+         .share(replay: 1, scope: .forever)
+
+     _ = xs.subscribe(onNext: { print("next \($0)") }, onCompleted: { print("completed\n") })
+     _ = xs.subscribe(onNext: { print("next \($0)") }, onCompleted: { print("completed\n") })
+     _ = xs.subscribe(onNext: { print("next \($0)") }, onCompleted: { print("completed\n") })
+     ```
+     
+     Notice how time interval is the same, replayed, and `Performing work ...` is printed only once
+     
+     ```
+     Performing work ...
+     next 1495999013.76356
+     completed
+
+     next 1495999013.76356
+     completed
+
+     next 1495999013.76356
+     completed
+     ```
+     
+    */
+    case forever
+}
+
+extension ObservableType {
+
+    /**
+     Returns an observable sequence that **shares a single subscription to the underlying sequence**, and immediately upon subscription replays  elements in buffer.
+     
+     This operator is equivalent to:
+     * `.whileConnected`
+     ```
+     // Each connection will have it's own subject instance to store replay events.
+     // Connections will be isolated from each another.
+     source.multicast(makeSubject: { Replay.create(bufferSize: replay) }).refCount()
+     ```
+     * `.forever`
+     ```
+     // One subject will store replay events for all connections to source.
+     // Connections won't be isolated from each another.
+     source.multicast(Replay.create(bufferSize: replay)).refCount()
+     ```
+     
+     It uses optimized versions of the operators for most common operations.
+
+     - parameter replay: Maximum element count of the replay buffer.
+     - parameter scope: Lifetime scope of sharing subject. For more information see `SubjectLifetimeScope` enum.
+
+     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
+
+     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
+     */
+    public func share(replay: Int = 0, scope: SubjectLifetimeScope)
+        -> Observable {
+        switch scope {
+        case .forever:
+            switch replay {
+            case 0: return self.multicast(PublishSubject()).refCount()
+            default: return shareReplay(replay)
+            }
+        case .whileConnected:
+            switch replay {
+            case 0: return ShareWhileConnected(source: self.asObservable())
+            case 1: return ShareReplay1WhileConnected(source: self.asObservable())
+            default: return self.multicast(makeSubject: { ReplaySubject.create(bufferSize: replay) }).refCount()
+            }
+        }
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays latest element in buffer.
+
+     This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.
+
+     Unlike `shareReplay(bufferSize: Int)`, this operator will clear latest element from replay buffer in case number of subscribers drops from one to zero. In case sequence
+     completes or errors out replay buffer is also cleared.
+
+     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
+
+     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
+     */
+    public func shareReplayLatestWhileConnected()
+        -> Observable {
+        return ShareReplay1WhileConnected(source: self.asObservable())
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays maximum number of elements in buffer.
+
+     This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.
+
+     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)
+
+     - parameter bufferSize: Maximum element count of the replay buffer.
+     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.
+     */
+    public func shareReplay(_ bufferSize: Int)
+        -> Observable {
+        return self.replay(bufferSize).refCount()
+    }
+}
+
+fileprivate final class ShareReplay1WhileConnectedConnection
+    : ObserverType
+    , SynchronizedUnsubscribeType {
+    typealias E = Element
+    typealias Observers = AnyObserver.s
+    typealias DisposeKey = Observers.KeyType
+
+    typealias Parent = ShareReplay1WhileConnected
+    private let _parent: Parent
+    private let _subscription = SingleAssignmentDisposable()
+
+    private let _lock: RecursiveLock
+    private var _disposed: Bool = false
+    fileprivate var _observers = Observers()
+    fileprivate var _element: Element?
+
+    init(parent: Parent, lock: RecursiveLock) {
+        _parent = parent
+        _lock = lock
+
+        #if TRACE_RESOURCES
+            _ = Resources.incrementTotal()
+        #endif
+    }
+
+    final func on(_ event: Event) {
+        _lock.lock()
+        let observers = _synchronized_on(event)
+        _lock.unlock()
+        dispatch(observers, event)
+    }
+
+    final private func _synchronized_on(_ event: Event) -> Observers {
+        if _disposed {
+            return Observers()
+        }
+
+        switch event {
+        case .next(let element):
+            _element = element
+            return _observers
+        case .error, .completed:
+            let observers = _observers
+            self._synchronized_dispose()
+            return observers
+        }
+    }
+
+    final func connect() {
+        _subscription.setDisposable(_parent._source.subscribe(self))
+    }
+
+    final func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == Element {
+        _lock.lock(); defer { _lock.unlock() }
+        if let element = _element {
+            observer.on(.next(element))
+        }
+
+        let disposeKey = _observers.insert(observer.on)
+
+        return SubscriptionDisposable(owner: self, key: disposeKey)
+    }
+
+    final private func _synchronized_dispose() {
+        _disposed = true
+        if _parent._connection === self {
+            _parent._connection = nil
+        }
+        _observers = Observers()
+    }
+
+    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {
+        _lock.lock()
+        let shouldDisconnect = _synchronized_unsubscribe(disposeKey)
+        _lock.unlock()
+        if shouldDisconnect {
+            _subscription.dispose()
+        }
+    }
+
+    @inline(__always)
+    final private func _synchronized_unsubscribe(_ disposeKey: DisposeKey) -> Bool {
+        // if already unsubscribed, just return
+        if self._observers.removeKey(disposeKey) == nil {
+            return false
+        }
+
+        if _observers.count == 0 {
+            _synchronized_dispose()
+            return true
+        }
+
+        return false
+    }
+
+    #if TRACE_RESOURCES
+        deinit {
+            _ = Resources.decrementTotal()
+        }
+    #endif
+}
+
+// optimized version of share replay for most common case
+final fileprivate class ShareReplay1WhileConnected
+    : Observable {
+
+    fileprivate typealias Connection = ShareReplay1WhileConnectedConnection
+
+    fileprivate let _source: Observable
+
+    fileprivate let _lock = RecursiveLock()
+
+    fileprivate var _connection: Connection?
+
+    init(source: Observable) {
+        self._source = source
+    }
+
+    override func subscribe(_ observer: O) -> Disposable where O.E == E {
+        _lock.lock()
+
+        let connection = _synchronized_subscribe(observer)
+        let count = connection._observers.count
+
+        let disposable = connection._synchronized_subscribe(observer)
+
+        _lock.unlock()
+        
+        if count == 0 {
+            connection.connect()
+        }
+
+        return disposable
+    }
+
+    @inline(__always)
+    private func _synchronized_subscribe(_ observer: O) -> Connection where O.E == E {
+        let connection: Connection
+
+        if let existingConnection = _connection {
+            connection = existingConnection
+        }
+        else {
+            connection = ShareReplay1WhileConnectedConnection(
+                parent: self,
+                lock: _lock)
+            _connection = connection
+        }
+
+        return connection
+    }
+}
+
+fileprivate final class ShareWhileConnectedConnection
+    : ObserverType
+    , SynchronizedUnsubscribeType {
+    typealias E = Element
+    typealias Observers = AnyObserver.s
+    typealias DisposeKey = Observers.KeyType
+
+    typealias Parent = ShareWhileConnected
+    private let _parent: Parent
+    private let _subscription = SingleAssignmentDisposable()
+
+    private let _lock: RecursiveLock
+    private var _disposed: Bool = false
+    fileprivate var _observers = Observers()
+
+    init(parent: Parent, lock: RecursiveLock) {
+        _parent = parent
+        _lock = lock
+
+        #if TRACE_RESOURCES
+            _ = Resources.incrementTotal()
+        #endif
+    }
+
+    final func on(_ event: Event) {
+        _lock.lock()
+        let observers = _synchronized_on(event)
+        _lock.unlock()
+        dispatch(observers, event)
+    }
+
+    final private func _synchronized_on(_ event: Event) -> Observers {
+        if _disposed {
+            return Observers()
+        }
+
+        switch event {
+        case .next:
+            return _observers
+        case .error, .completed:
+            let observers = _observers
+            self._synchronized_dispose()
+            return observers
+        }
+    }
+
+    final func connect() {
+        _subscription.setDisposable(_parent._source.subscribe(self))
+    }
+
+    final func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == Element {
+        _lock.lock(); defer { _lock.unlock() }
+
+        let disposeKey = _observers.insert(observer.on)
+
+        return SubscriptionDisposable(owner: self, key: disposeKey)
+    }
+
+    final private func _synchronized_dispose() {
+        _disposed = true
+        if _parent._connection === self {
+            _parent._connection = nil
+        }
+        _observers = Observers()
+    }
+
+    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {
+        _lock.lock()
+        let shouldDisconnect = _synchronized_unsubscribe(disposeKey)
+        _lock.unlock()
+        if shouldDisconnect {
+            _subscription.dispose()
+        }
+    }
+
+    @inline(__always)
+    final private func _synchronized_unsubscribe(_ disposeKey: DisposeKey) -> Bool {
+        // if already unsubscribed, just return
+        if self._observers.removeKey(disposeKey) == nil {
+            return false
+        }
+
+        if _observers.count == 0 {
+            _synchronized_dispose()
+            return true
+        }
+
+        return false
+    }
+
+    #if TRACE_RESOURCES
+    deinit {
+        _ = Resources.decrementTotal()
+    }
+    #endif
+}
+
+// optimized version of share replay for most common case
+final fileprivate class ShareWhileConnected
+    : Observable {
+
+    fileprivate typealias Connection = ShareWhileConnectedConnection
+
+    fileprivate let _source: Observable
+
+    fileprivate let _lock = RecursiveLock()
+
+    fileprivate var _connection: Connection?
+
+    init(source: Observable) {
+        self._source = source
+    }
+
+    override func subscribe(_ observer: O) -> Disposable where O.E == E {
+        _lock.lock()
+
+        let connection = _synchronized_subscribe(observer)
+        let count = connection._observers.count
+
+        let disposable = connection._synchronized_subscribe(observer)
+
+        _lock.unlock()
+
+        if count == 0 {
+            connection.connect()
+        }
+
+        return disposable
+    }
+
+    @inline(__always)
+    private func _synchronized_subscribe(_ observer: O) -> Connection where O.E == E {
+        let connection: Connection
+
+        if let existingConnection = _connection {
+            connection = existingConnection
+        }
+        else {
+            connection = ShareWhileConnectedConnection(
+                parent: self,
+                lock: _lock)
+            _connection = connection
+        }
+        
+        return connection
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift b/Pods/RxSwift/RxSwift/Observables/SingleAsync.swift
similarity index 62%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift
rename to Pods/RxSwift/RxSwift/Observables/SingleAsync.swift
index 8ccd310c..1419a93f 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift
+++ b/Pods/RxSwift/RxSwift/Observables/SingleAsync.swift
@@ -6,6 +6,36 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
+extension ObservableType {
+
+    /**
+     The single operator is similar to first, but throws a `RxError.noElements` or `RxError.moreThanOneElement`
+     if the source Observable does not emit exactly one element before successfully completing.
+
+     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)
+
+     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.
+     */
+    public func single()
+        -> Observable {
+        return SingleAsync(source: asObservable())
+    }
+
+    /**
+     The single operator is similar to first, but throws a `RxError.NoElements` or `RxError.MoreThanOneElement`
+     if the source Observable does not emit exactly one element before successfully completing.
+
+     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)
+
+     - parameter predicate: A function to test each source element for a condition.
+     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.
+     */
+    public func single(_ predicate: @escaping (E) throws -> Bool)
+        -> Observable {
+        return SingleAsync(source: asObservable(), predicate: predicate)
+    }
+}
+
 fileprivate final class SingleAsyncSink : Sink, ObserverType {
     typealias ElementType = O.E
     typealias Parent = SingleAsync
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift b/Pods/RxSwift/RxSwift/Observables/Sink.swift
similarity index 82%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift
rename to Pods/RxSwift/RxSwift/Observables/Sink.swift
index bd65cc93..214cfda3 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Sink.swift
@@ -12,7 +12,7 @@ class Sink : Disposable {
     fileprivate var _disposed: Bool
 
     #if DEBUG
-        fileprivate var _numberOfConcurrentCalls: AtomicInt = 0
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
     #endif
 
     init(observer: O, cancel: Cancelable) {
@@ -26,13 +26,8 @@ class Sink : Disposable {
     
     final func forwardOn(_ event: Event) {
         #if DEBUG
-            if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
-                rxFatalError("Warning: Recursive call or synchronization error!")
-            }
-
-            defer {
-                _ = AtomicDecrement(&_numberOfConcurrentCalls)
-            }
+            _synchronizationTracker.register(synchronizationErrorMessage: .default)
+            defer { _synchronizationTracker.unregister() }
         #endif
         if _disposed {
             return
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift b/Pods/RxSwift/RxSwift/Observables/Skip.swift
similarity index 64%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift
rename to Pods/RxSwift/RxSwift/Observables/Skip.swift
index df062d1f..1226bf89 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Skip.swift
@@ -6,9 +6,42 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
+extension ObservableType {
+
+    /**
+     Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.
+
+     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)
+
+     - parameter count: The number of elements to skip before returning the remaining elements.
+     - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.
+     */
+    public func skip(_ count: Int)
+        -> Observable {
+        return SkipCount(source: asObservable(), count: count)
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.
+
+     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)
+
+     - parameter duration: Duration for skipping elements from the start of the sequence.
+     - parameter scheduler: Scheduler to run the timer on.
+     - returns: An observable sequence with the elements skipped during the specified duration from the start of the source sequence.
+     */
+    public func skip(_ duration: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+        return SkipTime(source: self.asObservable(), duration: duration, scheduler: scheduler)
+    }
+}
+
 // count version
 
-final class SkipCountSink : Sink, ObserverType {
+final fileprivate class SkipCountSink : Sink, ObserverType {
     typealias Element = O.E
     typealias Parent = SkipCount
     
@@ -43,7 +76,7 @@ final class SkipCountSink : Sink, ObserverType {
     
 }
 
-final class SkipCount: Producer {
+final fileprivate class SkipCount: Producer {
     let source: Observable
     let count: Int
     
@@ -62,7 +95,7 @@ final class SkipCount: Producer {
 
 // time version
 
-final class SkipTimeSink : Sink, ObserverType where O.E == ElementType {
+final fileprivate class SkipTimeSink : Sink, ObserverType where O.E == ElementType {
     typealias Parent = SkipTime
     typealias Element = ElementType
 
@@ -107,7 +140,7 @@ final class SkipTimeSink : Sink, ObserverType w
     }
 }
 
-final class SkipTime: Producer {
+final fileprivate class SkipTime: Producer {
     let source: Observable
     let duration: RxTimeInterval
     let scheduler: SchedulerType
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift b/Pods/RxSwift/RxSwift/Observables/SkipUntil.swift
similarity index 77%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift
rename to Pods/RxSwift/RxSwift/Observables/SkipUntil.swift
index 0e77c94d..f35f1fd8 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift
+++ b/Pods/RxSwift/RxSwift/Observables/SkipUntil.swift
@@ -6,7 +6,23 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class SkipUntilSinkOther
+extension ObservableType {
+
+    /**
+     Returns the elements from the source observable sequence that are emitted after the other observable sequence produces an element.
+
+     - seealso: [skipUntil operator on reactivex.io](http://reactivex.io/documentation/operators/skipuntil.html)
+
+     - parameter other: Observable sequence that starts propagation of elements of the source sequence.
+     - returns: An observable sequence containing the elements of the source sequence that are emitted after the other sequence emits an item.
+     */
+    public func skipUntil(_ other: O)
+        -> Observable {
+        return SkipUntil(source: asObservable(), other: other.asObservable())
+    }
+}
+
+final fileprivate class SkipUntilSinkOther
     : ObserverType
     , LockOwnerType
     , SynchronizedOnType {
@@ -54,7 +70,7 @@ final class SkipUntilSinkOther
 }
 
 
-final class SkipUntilSink
+final fileprivate class SkipUntilSink
     : Sink
     , ObserverType
     , LockOwnerType
@@ -105,7 +121,7 @@ final class SkipUntilSink
     }
 }
 
-final class SkipUntil: Producer {
+final fileprivate class SkipUntil: Producer {
     
     fileprivate let _source: Observable
     fileprivate let _other: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift b/Pods/RxSwift/RxSwift/Observables/SkipWhile.swift
similarity index 63%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift
rename to Pods/RxSwift/RxSwift/Observables/SkipWhile.swift
index 0d984239..42bf9bc5 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift
+++ b/Pods/RxSwift/RxSwift/Observables/SkipWhile.swift
@@ -6,7 +6,35 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class SkipWhileSink : Sink, ObserverType {
+extension ObservableType {
+
+    /**
+     Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.
+
+     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)
+
+     - parameter predicate: A function to test each element for a condition.
+     - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.
+     */
+    public func skipWhile(_ predicate: @escaping (E) throws -> Bool) -> Observable {
+        return SkipWhile(source: asObservable(), predicate: predicate)
+    }
+
+    /**
+     Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.
+     The element's index is used in the logic of the predicate function.
+
+     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)
+
+     - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element.
+     - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.
+     */
+    public func skipWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable {
+        return SkipWhile(source: asObservable(), predicate: predicate)
+    }
+}
+
+final fileprivate class SkipWhileSink : Sink, ObserverType {
 
     typealias Element = O.E
     typealias Parent = SkipWhile
@@ -42,7 +70,7 @@ final class SkipWhileSink : Sink, ObserverType {
     }
 }
 
-final class SkipWhileSinkWithIndex : Sink, ObserverType {
+final fileprivate class SkipWhileSinkWithIndex : Sink, ObserverType {
 
     typealias Element = O.E
     typealias Parent = SkipWhile
@@ -80,7 +108,7 @@ final class SkipWhileSinkWithIndex : Sink, ObserverType {
     }
 }
 
-final class SkipWhile: Producer {
+final fileprivate class SkipWhile: Producer {
     typealias Predicate = (Element) throws -> Bool
     typealias PredicateWithIndex = (Element, Int) throws -> Bool
 
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift b/Pods/RxSwift/RxSwift/Observables/StartWith.swift
similarity index 53%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift
rename to Pods/RxSwift/RxSwift/Observables/StartWith.swift
index 24bd16e2..14776f9e 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift
+++ b/Pods/RxSwift/RxSwift/Observables/StartWith.swift
@@ -6,7 +6,23 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class StartWith: Producer {
+extension ObservableType {
+
+    /**
+     Prepends a sequence of values to an observable sequence.
+
+     - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)
+
+     - parameter elements: Elements to prepend to the specified sequence.
+     - returns: The source sequence prepended with the specified values.
+     */
+    public func startWith(_ elements: E ...)
+        -> Observable {
+            return StartWith(source: self.asObservable(), elements: elements)
+    }
+}
+
+final fileprivate class StartWith: Producer {
     let elements: [Element]
     let source: Observable
 
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift b/Pods/RxSwift/RxSwift/Observables/SubscribeOn.swift
similarity index 61%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift
rename to Pods/RxSwift/RxSwift/Observables/SubscribeOn.swift
index e2998568..2a33e03e 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift
+++ b/Pods/RxSwift/RxSwift/Observables/SubscribeOn.swift
@@ -6,7 +6,30 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class SubscribeOnSink : Sink, ObserverType where Ob.E == O.E {
+extension ObservableType {
+
+    /**
+     Wraps the source sequence in order to run its subscription and unsubscription logic on the specified
+     scheduler.
+
+     This operation is not commonly used.
+
+     This only performs the side-effects of subscription and unsubscription on the specified scheduler.
+
+     In order to invoke observer callbacks on a `scheduler`, use `observeOn`.
+
+     - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)
+
+     - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.
+     - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.
+     */
+    public func subscribeOn(_ scheduler: ImmediateSchedulerType)
+        -> Observable {
+        return SubscribeOn(source: self, scheduler: scheduler)
+    }
+}
+
+final fileprivate class SubscribeOnSink : Sink, ObserverType where Ob.E == O.E {
     typealias Element = O.E
     typealias Parent = SubscribeOn
     
@@ -43,7 +66,7 @@ final class SubscribeOnSink : Sink, Obse
     }
 }
 
-final class SubscribeOn : Producer {
+final fileprivate class SubscribeOn : Producer {
     let source: Ob
     let scheduler: ImmediateSchedulerType
     
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift b/Pods/RxSwift/RxSwift/Observables/Switch.swift
similarity index 62%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift
rename to Pods/RxSwift/RxSwift/Observables/Switch.swift
index af1ccadf..2da10005 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Switch.swift
@@ -6,11 +6,46 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-class SwitchSink
+extension ObservableType {
+    /**
+     Projects each element of an observable sequence into a new sequence of observable sequences and then
+     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.
+
+     It is a combination of `map` + `switchLatest` operator
+
+     - seealso: [flatMapLatest operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)
+
+     - parameter selector: A transform function to apply to each element.
+     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an
+     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.
+     */
+    public func flatMapLatest(_ selector: @escaping (E) throws -> O)
+        -> Observable {
+            return FlatMapLatest(source: asObservable(), selector: selector)
+    }
+}
+
+extension ObservableType where E : ObservableConvertibleType {
+
+    /**
+     Transforms an observable sequence of observable sequences into an observable sequence
+     producing values only from the most recent observable sequence.
+
+     Each time a new inner observable sequence is received, unsubscribe from the
+     previous inner observable sequence.
+
+     - seealso: [switch operator on reactivex.io](http://reactivex.io/documentation/operators/switch.html)
+
+     - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.
+     */
+    public func switchLatest() -> Observable {
+        return Switch(source: asObservable())
+    }
+}
+
+fileprivate class SwitchSink
     : Sink
-    , ObserverType
-    , LockOwnerType
-    , SynchronizedOnType where S.E == O.E {
+    , ObserverType where S.E == O.E {
     typealias E = SourceType
 
     fileprivate let _subscriptions: SingleAssignmentDisposable = SingleAssignmentDisposable()
@@ -32,24 +67,33 @@ class SwitchSink
         _subscriptions.setDisposable(subscription)
         return Disposables.create(_subscriptions, _innerSubscription)
     }
-    
-    func on(_ event: Event) {
-        synchronizedOn(event)
-    }
 
     func performMap(_ element: SourceType) throws -> S {
         rxAbstractMethod()
     }
 
-    func _synchronized_on(_ event: Event) {
-        switch event {
-        case .next(let element):
+    @inline(__always)
+    final private func nextElementArrived(element: E) -> (Int, Observable)? {
+        _lock.lock(); defer { _lock.unlock() } // {
             do {
                 let observable = try performMap(element).asObservable()
                 _hasLatest = true
                 _latest = _latest &+ 1
-                let latest = _latest
+                return (_latest, observable)
+            }
+            catch let error {
+                forwardOn(.error(error))
+                dispose()
+            }
 
+            return nil
+        // }
+    }
+
+    func on(_ event: Event) {
+        switch event {
+        case .next(let element):
+            if let (latest, observable) = nextElementArrived(element: element) {
                 let d = SingleAssignmentDisposable()
                 _innerSubscription.disposable = d
                    
@@ -57,14 +101,12 @@ class SwitchSink
                 let disposable = observable.subscribe(observer)
                 d.setDisposable(disposable)
             }
-            catch let error {
-                forwardOn(.error(error))
-                dispose()
-            }
         case .error(let error):
+            _lock.lock(); defer { _lock.unlock() }
             forwardOn(.error(error))
             dispose()
         case .completed:
+            _lock.lock(); defer { _lock.unlock() }
             _stopped = true
             
             _subscriptions.dispose()
@@ -77,7 +119,7 @@ class SwitchSink
     }
 }
 
-final class SwitchSinkIter
+final fileprivate class SwitchSinkIter
     : ObserverType
     , LockOwnerType
     , SynchronizedOnType where S.E == O.E {
@@ -131,7 +173,7 @@ final class SwitchSinkIter : SwitchSink where O.E == S.E {
+final fileprivate class SwitchIdentitySink : SwitchSink where O.E == S.E {
     override init(observer: O, cancel: Cancelable) {
         super.init(observer: observer, cancel: cancel)
     }
@@ -141,7 +183,7 @@ final class SwitchIdentitySink :
     }
 }
 
-final class MapSwitchSink : SwitchSink where O.E == S.E {
+final fileprivate class MapSwitchSink : SwitchSink where O.E == S.E {
     typealias Selector = (SourceType) throws -> S
 
     fileprivate let _selector: Selector
@@ -158,7 +200,7 @@ final class MapSwitchSink : Producer {
+final fileprivate class Switch : Producer {
     fileprivate let _source: Observable
     
     init(source: Observable) {
@@ -172,7 +214,7 @@ final class Switch : Producer {
     }
 }
 
-final class FlatMapLatest : Producer {
+final fileprivate class FlatMapLatest : Producer {
     typealias Selector = (SourceType) throws -> S
 
     fileprivate let _source: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/SwitchIfEmpty.swift b/Pods/RxSwift/RxSwift/Observables/SwitchIfEmpty.swift
similarity index 73%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/SwitchIfEmpty.swift
rename to Pods/RxSwift/RxSwift/Observables/SwitchIfEmpty.swift
index d447d315..0b10dc61 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/SwitchIfEmpty.swift
+++ b/Pods/RxSwift/RxSwift/Observables/SwitchIfEmpty.swift
@@ -6,7 +6,21 @@
 //  Copyright © 2016 Krunoslav Zaher. All rights reserved.
 //
 
-final class SwitchIfEmpty: Producer {
+extension ObservableType {
+    /**
+     Returns the elements of the specified sequence or `switchTo` sequence if the sequence is empty.
+
+     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)
+
+     - parameter switchTo: Observable sequence being returned when source sequence is empty.
+     - returns: Observable sequence that contains elements from switchTo sequence if source is empty, otherwise returns source sequence elements.
+     */
+    public func ifEmpty(switchTo other: Observable) -> Observable {
+        return SwitchIfEmpty(source: asObservable(), ifEmpty: other)
+    }
+}
+
+final fileprivate class SwitchIfEmpty: Producer {
     
     private let _source: Observable
     private let _ifEmpty: Observable
@@ -26,7 +40,7 @@ final class SwitchIfEmpty: Producer {
     }
 }
 
-final class SwitchIfEmptySink: Sink
+final fileprivate class SwitchIfEmptySink: Sink
     , ObserverType {
     typealias E = O.E
     
@@ -64,7 +78,7 @@ final class SwitchIfEmptySink: Sink
     }
 }
 
-final class SwitchIfEmptySinkIter
+final fileprivate class SwitchIfEmptySinkIter
     : ObserverType {
     typealias E = O.E
     typealias Parent = SwitchIfEmptySink
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift b/Pods/RxSwift/RxSwift/Observables/Take.swift
similarity index 68%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift
rename to Pods/RxSwift/RxSwift/Observables/Take.swift
index f6726387..a7fbe852 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Take.swift
@@ -6,9 +6,47 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
+extension ObservableType {
+
+    /**
+     Returns a specified number of contiguous elements from the start of an observable sequence.
+
+     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)
+
+     - parameter count: The number of elements to return.
+     - returns: An observable sequence that contains the specified number of elements from the start of the input sequence.
+     */
+    public func take(_ count: Int)
+        -> Observable {
+        if count == 0 {
+            return Observable.empty()
+        }
+        else {
+            return TakeCount(source: asObservable(), count: count)
+        }
+    }
+}
+
+extension ObservableType {
+
+    /**
+     Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.
+
+     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)
+
+     - parameter duration: Duration for taking elements from the start of the sequence.
+     - parameter scheduler: Scheduler to run the timer on.
+     - returns: An observable sequence with the elements taken during the specified duration from the start of the source sequence.
+     */
+    public func take(_ duration: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+        return TakeTime(source: self.asObservable(), duration: duration, scheduler: scheduler)
+    }
+}
+
 // count version
 
-final class TakeCountSink : Sink, ObserverType {
+final fileprivate class TakeCountSink : Sink, ObserverType {
     typealias E = O.E
     typealias Parent = TakeCount
     
@@ -47,7 +85,7 @@ final class TakeCountSink : Sink, ObserverType {
     
 }
 
-final class TakeCount: Producer {
+final fileprivate class TakeCount: Producer {
     fileprivate let _source: Observable
     fileprivate let _count: Int
     
@@ -68,7 +106,7 @@ final class TakeCount: Producer {
 
 // time version
 
-final class TakeTimeSink
+final fileprivate class TakeTimeSink
     : Sink
     , LockOwnerType
     , ObserverType
@@ -121,7 +159,7 @@ final class TakeTimeSink
     }
 }
 
-final class TakeTime : Producer {
+final fileprivate class TakeTime : Producer {
     typealias TimeInterval = RxTimeInterval
     
     fileprivate let _source: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift b/Pods/RxSwift/RxSwift/Observables/TakeLast.swift
similarity index 62%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift
rename to Pods/RxSwift/RxSwift/Observables/TakeLast.swift
index b3778c0c..7bf1664b 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift
+++ b/Pods/RxSwift/RxSwift/Observables/TakeLast.swift
@@ -6,7 +6,25 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class TakeLastSink : Sink, ObserverType {
+extension ObservableType {
+
+    /**
+     Returns a specified number of contiguous elements from the end of an observable sequence.
+
+     This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.
+
+     - seealso: [takeLast operator on reactivex.io](http://reactivex.io/documentation/operators/takelast.html)
+
+     - parameter count: Number of elements to take from the end of the source sequence.
+     - returns: An observable sequence containing the specified number of elements from the end of the source sequence.
+     */
+    public func takeLast(_ count: Int)
+        -> Observable {
+        return TakeLast(source: asObservable(), count: count)
+    }
+}
+
+final fileprivate class TakeLastSink : Sink, ObserverType {
     typealias E = O.E
     typealias Parent = TakeLast
     
@@ -40,7 +58,7 @@ final class TakeLastSink : Sink, ObserverType {
     }
 }
 
-final class TakeLast: Producer {
+final fileprivate class TakeLast: Producer {
     fileprivate let _source: Observable
     fileprivate let _count: Int
     
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift b/Pods/RxSwift/RxSwift/Observables/TakeUntil.swift
similarity index 75%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift
rename to Pods/RxSwift/RxSwift/Observables/TakeUntil.swift
index 16aa5c35..f2e5f98b 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift
+++ b/Pods/RxSwift/RxSwift/Observables/TakeUntil.swift
@@ -6,7 +6,23 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class TakeUntilSinkOther
+extension ObservableType {
+
+    /**
+     Returns the elements from the source observable sequence until the other observable sequence produces an element.
+
+     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)
+
+     - parameter other: Observable sequence that terminates propagation of elements of the source sequence.
+     - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.
+     */
+    public func takeUntil(_ other: O)
+        -> Observable {
+        return TakeUntil(source: asObservable(), other: other.asObservable())
+    }
+}
+
+final fileprivate class TakeUntilSinkOther
     : ObserverType
     , LockOwnerType
     , SynchronizedOnType {
@@ -41,7 +57,6 @@ final class TakeUntilSinkOther
             _parent.forwardOn(.error(e))
             _parent.dispose()
         case .completed:
-            _parent._open = true
             _subscription.dispose()
         }
     }
@@ -53,7 +68,7 @@ final class TakeUntilSinkOther
 #endif
 }
 
-final class TakeUntilSink
+final fileprivate class TakeUntilSink
     : Sink
     , LockOwnerType
     , ObserverType
@@ -65,8 +80,6 @@ final class TakeUntilSink
  
     let _lock = RecursiveLock()
     
-    // state
-    fileprivate var _open = false
     
     init(parent: Parent, observer: O, cancel: Cancelable) {
         _parent = parent
@@ -100,7 +113,7 @@ final class TakeUntilSink
     }
 }
 
-final class TakeUntil: Producer {
+final fileprivate class TakeUntil: Producer {
     
     fileprivate let _source: Observable
     fileprivate let _other: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift b/Pods/RxSwift/RxSwift/Observables/TakeWhile.swift
similarity index 67%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift
rename to Pods/RxSwift/RxSwift/Observables/TakeWhile.swift
index 249914b9..45521fb4 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift
+++ b/Pods/RxSwift/RxSwift/Observables/TakeWhile.swift
@@ -6,7 +6,38 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class TakeWhileSink
+extension ObservableType {
+
+    /**
+     Returns elements from an observable sequence as long as a specified condition is true.
+
+     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)
+
+     - parameter predicate: A function to test each element for a condition.
+     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.
+     */
+    public func takeWhile(_ predicate: @escaping (E) throws -> Bool)
+        -> Observable {
+        return TakeWhile(source: asObservable(), predicate: predicate)
+    }
+
+    /**
+     Returns elements from an observable sequence as long as a specified condition is true.
+
+     The element's index is used in the logic of the predicate function.
+
+     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)
+
+     - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element.
+     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.
+     */
+    public func takeWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool)
+        -> Observable {
+        return TakeWhile(source: asObservable(), predicate: predicate)
+    }
+}
+
+final fileprivate class TakeWhileSink
     : Sink
     , ObserverType {
     typealias Element = O.E
@@ -50,7 +81,7 @@ final class TakeWhileSink
     
 }
 
-final class TakeWhileSinkWithIndex
+final fileprivate class TakeWhileSinkWithIndex
     : Sink
     , ObserverType {
     typealias Element = O.E
@@ -96,7 +127,7 @@ final class TakeWhileSinkWithIndex
     
 }
 
-final class TakeWhile: Producer {
+final fileprivate class TakeWhile: Producer {
     typealias Predicate = (Element) throws -> Bool
     typealias PredicateWithIndex = (Element, Int) throws -> Bool
 
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift b/Pods/RxSwift/RxSwift/Observables/Throttle.swift
similarity index 78%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift
rename to Pods/RxSwift/RxSwift/Observables/Throttle.swift
index 4274016e..0c4ca746 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Throttle.swift
@@ -8,7 +8,27 @@
 
 import struct Foundation.Date
 
-final class ThrottleSink
+extension ObservableType {
+
+    /**
+     Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.
+
+     This operator makes sure that no two elements are emitted in less then dueTime.
+
+     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)
+
+     - parameter dueTime: Throttling duration for each element.
+     - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.
+     - parameter scheduler: Scheduler to run the throttle timers on.
+     - returns: The throttled sequence.
+     */
+    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)
+        -> Observable {
+        return Throttle(source: self.asObservable(), dueTime: dueTime, latest: latest, scheduler: scheduler)
+    }
+}
+
+final fileprivate class ThrottleSink
     : Sink
     , ObserverType
     , LockOwnerType
@@ -120,7 +140,7 @@ final class ThrottleSink
     }
 }
 
-final class Throttle : Producer {
+final fileprivate class Throttle : Producer {
     
     fileprivate let _source: Observable
     fileprivate let _dueTime: RxTimeInterval
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift b/Pods/RxSwift/RxSwift/Observables/Timeout.swift
similarity index 61%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift
rename to Pods/RxSwift/RxSwift/Observables/Timeout.swift
index b0e79212..7008de82 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Timeout.swift
@@ -6,7 +6,39 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class TimeoutSink: Sink, LockOwnerType, ObserverType {
+extension ObservableType {
+
+    /**
+     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.
+
+     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)
+
+     - parameter dueTime: Maximum duration between values before a timeout occurs.
+     - parameter scheduler: Scheduler to run the timeout timer on.
+     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.
+     */
+    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+            return Timeout(source: self.asObservable(), dueTime: dueTime, other: Observable.error(RxError.timeout), scheduler: scheduler)
+    }
+
+    /**
+     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.
+
+     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)
+
+     - parameter dueTime: Maximum duration between values before a timeout occurs.
+     - parameter other: Sequence to return in case of a timeout.
+     - parameter scheduler: Scheduler to run the timeout timer on.
+     - returns: The source sequence switching to the other sequence in case of a timeout.
+     */
+    public func timeout(_ dueTime: RxTimeInterval, other: O, scheduler: SchedulerType)
+        -> Observable where E == O.E {
+            return Timeout(source: self.asObservable(), dueTime: dueTime, other: other.asObservable(), scheduler: scheduler)
+    }
+}
+
+final fileprivate class TimeoutSink: Sink, LockOwnerType, ObserverType {
     typealias E = O.E
     typealias Parent = Timeout
     
@@ -98,7 +130,7 @@ final class TimeoutSink: Sink, LockOwnerType, ObserverType {
 }
 
 
-final class Timeout : Producer {
+final fileprivate class Timeout : Producer {
     
     fileprivate let _source: Observable
     fileprivate let _dueTime: RxTimeInterval
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift b/Pods/RxSwift/RxSwift/Observables/Timer.swift
similarity index 50%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift
rename to Pods/RxSwift/RxSwift/Observables/Timer.swift
index 15ef01d7..f62be1cc 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Timer.swift
@@ -6,7 +6,47 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class TimerSink : Sink where O.E : SignedInteger  {
+extension Observable where Element : SignedInteger {
+    /**
+     Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.
+
+     - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html)
+
+     - parameter period: Period for producing the values in the resulting sequence.
+     - parameter scheduler: Scheduler to run the timer on.
+     - returns: An observable sequence that produces a value after each period.
+     */
+    public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)
+        -> Observable {
+        return Timer(dueTime: period,
+                     period: period,
+                     scheduler: scheduler
+        )
+    }
+}
+
+extension Observable where Element: SignedInteger {
+    /**
+     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.
+
+     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)
+
+     - parameter dueTime: Relative time at which to produce the first value.
+     - parameter period: Period to produce subsequent values.
+     - parameter scheduler: Scheduler to run timers on.
+     - returns: An observable sequence that produces a value after due time has elapsed and then each period.
+     */
+    public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)
+        -> Observable {
+        return Timer(
+            dueTime: dueTime,
+            period: period,
+            scheduler: scheduler
+        )
+    }
+}
+
+final fileprivate class TimerSink : Sink where O.E : SignedInteger  {
     typealias Parent = Timer
     
     private let _parent: Parent
@@ -24,7 +64,7 @@ final class TimerSink : Sink where O.E : SignedInteger  {
     }
 }
 
-final class TimerOneOffSink : Sink where O.E : SignedInteger {
+final fileprivate class TimerOneOffSink : Sink where O.E : SignedInteger {
     typealias Parent = Timer
     
     private let _parent: Parent
@@ -45,7 +85,7 @@ final class TimerOneOffSink : Sink where O.E : SignedInteger
     }
 }
 
-final class Timer: Producer {
+final fileprivate class Timer: Producer {
     fileprivate let _scheduler: SchedulerType
     fileprivate let _dueTime: RxTimeInterval
     fileprivate let _period: RxTimeInterval?
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift b/Pods/RxSwift/RxSwift/Observables/ToArray.swift
similarity index 63%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift
rename to Pods/RxSwift/RxSwift/Observables/ToArray.swift
index 59fc9127..93fcb80e 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift
+++ b/Pods/RxSwift/RxSwift/Observables/ToArray.swift
@@ -6,7 +6,25 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class ToArraySink : Sink, ObserverType where O.E == [SourceType] {
+
+extension ObservableType {
+
+    /**
+    Converts an Observable into another Observable that emits the whole sequence as a single array and then terminates.
+    
+    For aggregation behavior see `reduce`.
+
+    - seealso: [toArray operator on reactivex.io](http://reactivex.io/documentation/operators/to.html)
+    
+    - returns: An observable sequence containing all the emitted elements as array.
+    */
+    public func toArray()
+        -> Observable<[E]> {
+        return ToArray(source: self.asObservable())
+    }
+}
+
+final fileprivate class ToArraySink : Sink, ObserverType where O.E == [SourceType] {
     typealias Parent = ToArray
     
     let _parent: Parent
@@ -33,7 +51,7 @@ final class ToArraySink : Sink, ObserverType whe
     }
 }
 
-final class ToArray : Producer<[SourceType]> {
+final fileprivate class ToArray : Producer<[SourceType]> {
     let _source: Observable
 
     init(source: Observable) {
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift b/Pods/RxSwift/RxSwift/Observables/Using.swift
similarity index 66%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift
rename to Pods/RxSwift/RxSwift/Observables/Using.swift
index 2df8dc28..6c32a98b 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Using.swift
@@ -6,7 +6,22 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class UsingSink : Sink, ObserverType {
+extension Observable {
+    /**
+     Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.
+
+     - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)
+
+     - parameter resourceFactory: Factory function to obtain a resource object.
+     - parameter observableFactory: Factory function to obtain an observable sequence that depends on the obtained resource.
+     - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.
+     */
+    public static func using(_ resourceFactory: @escaping () throws -> Resource, observableFactory: @escaping (Resource) throws -> Observable) -> Observable {
+        return Using(resourceFactory: resourceFactory, observableFactory: observableFactory)
+    }
+}
+
+final fileprivate class UsingSink : Sink, ObserverType {
     typealias SourceType = O.E
     typealias Parent = Using
 
@@ -51,7 +66,7 @@ final class UsingSink : Sink, Obse
     }
 }
 
-class Using: Producer {
+final fileprivate class Using: Producer {
     
     typealias E = SourceType
     
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift b/Pods/RxSwift/RxSwift/Observables/Window.swift
similarity index 81%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift
rename to Pods/RxSwift/RxSwift/Observables/Window.swift
index d2eeb8bb..c862dfba 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Window.swift
@@ -6,7 +6,25 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class WindowTimeCountSink
+extension ObservableType {
+
+    /**
+     Projects each element of an observable sequence into a window that is completed when either it’s full or a given amount of time has elapsed.
+
+     - seealso: [window operator on reactivex.io](http://reactivex.io/documentation/operators/window.html)
+
+     - parameter timeSpan: Maximum time length of a window.
+     - parameter count: Maximum element count of a window.
+     - parameter scheduler: Scheduler to run windowing timers on.
+     - returns: An observable sequence of windows (instances of `Observable`).
+     */
+    public func window(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)
+        -> Observable> {
+            return WindowTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)
+    }
+}
+
+final fileprivate class WindowTimeCountSink
     : Sink
     , ObserverType
     , LockOwnerType
@@ -130,7 +148,7 @@ final class WindowTimeCountSink
     }
 }
 
-final class WindowTimeCount : Producer> {
+final fileprivate class WindowTimeCount : Producer> {
     
     fileprivate let _timeSpan: RxTimeInterval
     fileprivate let _count: Int
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift b/Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift
similarity index 61%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift
rename to Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift
index 2ed17b1e..35205e4f 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift
+++ b/Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift
@@ -6,7 +6,35 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
-final class WithLatestFromSink
+extension ObservableType {
+
+    /**
+     Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.
+
+     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
+
+     - parameter second: Second observable source.
+     - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.
+     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.
+     */
+    public func withLatestFrom(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) throws -> ResultType) -> Observable {
+        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: resultSelector)
+    }
+
+    /**
+     Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emitts an element.
+
+     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)
+
+     - parameter second: Second observable source.
+     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.
+     */
+    public func withLatestFrom(_ second: SecondO) -> Observable {
+        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: { $1 })
+    }
+}
+
+final fileprivate class WithLatestFromSink
     : Sink
     , ObserverType
     , LockOwnerType
@@ -62,7 +90,7 @@ final class WithLatestFromSink
     }
 }
 
-final class WithLatestFromSecond
+final fileprivate class WithLatestFromSecond
     : ObserverType
     , LockOwnerType
     , SynchronizedOnType {
@@ -100,7 +128,7 @@ final class WithLatestFromSecond
     }
 }
 
-final class WithLatestFrom: Producer {
+final fileprivate class WithLatestFrom: Producer {
     typealias ResultSelector = (FirstType, SecondType) throws -> ResultType
     
     fileprivate let _first: Observable
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+Collection.swift b/Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift
similarity index 71%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Zip+Collection.swift
rename to Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift
index c9cdb957..6559491b 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+Collection.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift
@@ -6,6 +6,34 @@
 //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
 //
 
+extension Observable {
+    /**
+     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
+
+     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
+
+     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
+     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+     */
+    public static func zip(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable
+        where C.Iterator.Element: ObservableType {
+        return ZipCollectionType(sources: collection, resultSelector: resultSelector)
+    }
+
+    /**
+     Merges the specified observable sequences into one observable sequence whenever all of the observable sequences have produced an element at a corresponding index.
+
+     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
+
+     - returns: An observable sequence containing the result of combining elements of the sources.
+     */
+    public static func zip(_ collection: C) -> Observable<[Element]>
+        where C.Iterator.Element: ObservableType, C.Iterator.Element.E == Element {
+        return ZipCollectionType(sources: collection, resultSelector: { $0 })
+    }
+    
+}
+
 final fileprivate class ZipCollectionTypeSink
     : Sink where C.Iterator.Element : ObservableConvertibleType {
     typealias R = O.E
@@ -48,8 +76,7 @@ final fileprivate class ZipCollectionTypeSink
                 }
                 
                 if _numberOfValues < _parent.count {
-                    let numberOfOthersThatAreDone = _numberOfDone - (_isDone[atIndex] ? 1 : 0)
-                    if numberOfOthersThatAreDone == _parent.count - 1 {
+                    if _numberOfDone == _parent.count - 1 {
                         self.forwardOn(.completed)
                         self.dispose()
                     }
@@ -112,12 +139,16 @@ final fileprivate class ZipCollectionTypeSink
             _subscriptions[j].setDisposable(disposable)
             j += 1
         }
+
+        if _parent.sources.isEmpty {
+            self.forwardOn(.completed)
+        }
         
         return Disposables.create(_subscriptions)
     }
 }
 
-final class ZipCollectionType : Producer where C.Iterator.Element : ObservableConvertibleType {
+final fileprivate class ZipCollectionType : Producer where C.Iterator.Element : ObservableConvertibleType {
     typealias ResultSelector = ([C.Iterator.Element.E]) throws -> R
     
     let sources: C
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift b/Pods/RxSwift/RxSwift/Observables/Zip+arity.swift
similarity index 98%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift
rename to Pods/RxSwift/RxSwift/Observables/Zip+arity.swift
index 4f8aaf11..602b49ef 100644
--- a/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift
+++ b/Pods/RxSwift/RxSwift/Observables/Zip+arity.swift
@@ -36,7 +36,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2)
@@ -146,7 +146,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2, _ source3: O3)
@@ -264,7 +264,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)
@@ -390,7 +390,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)
@@ -524,7 +524,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)
@@ -666,7 +666,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)
@@ -816,7 +816,7 @@ extension ObservableType where E == Any {
 
     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)
 
-    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
+    - returns: An observable sequence containing the result of combining elements of the sources.
     */
     public static func zip
         (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)
diff --git a/Pods/RxSwift/RxSwift/Observables/Implementations/Zip.swift b/Pods/RxSwift/RxSwift/Observables/Zip.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Observables/Implementations/Zip.swift
rename to Pods/RxSwift/RxSwift/Observables/Zip.swift
diff --git a/Pods/RxSwift/RxSwift/ObserverType.swift b/Pods/RxSwift/RxSwift/ObserverType.swift
index b024b0fb..21a5722c 100644
--- a/Pods/RxSwift/RxSwift/ObserverType.swift
+++ b/Pods/RxSwift/RxSwift/ObserverType.swift
@@ -13,7 +13,7 @@ public protocol ObserverType {
 
     /// Notify observer about sequence event.
     ///
-    /// - parameter event: Event that occured.
+    /// - parameter event: Event that occurred.
     func on(_ event: Event)
 }
 
diff --git a/Pods/RxSwift/RxSwift/Rx.swift b/Pods/RxSwift/RxSwift/Rx.swift
index 93b066e7..cda826cf 100644
--- a/Pods/RxSwift/RxSwift/Rx.swift
+++ b/Pods/RxSwift/RxSwift/Rx.swift
@@ -65,3 +65,70 @@ func decrementChecked(_ i: inout Int) throws -> Int {
     defer { i -= 1 }
     return i
 }
+
+#if DEBUG
+    import class Foundation.Thread
+    final class SynchronizationTracker {
+        private let _lock = RecursiveLock()
+
+        public enum SychronizationErrorMessages: String {
+            case variable = "Two different threads are trying to assign the same `Variable.value` unsynchronized.\n    This is undefined behavior because the end result (variable value) is nondeterministic and depends on the \n    operating system thread scheduler. This will cause random behavior of your program.\n"
+            case `default` = "Two different unsynchronized threads are trying to send some event simultaneously.\n    This is undefined behavior because the ordering of the effects caused by these events is nondeterministic and depends on the \n    operating system thread scheduler. This will result in a random behavior of your program.\n"
+        }
+
+        private var _threads = Dictionary()
+
+        private func synchronizationError(_ message: String) {
+            #if FATAL_SYNCHRONIZATION
+                rxFatalError(message)
+            #else
+                print(message)
+            #endif
+        }
+        
+        func register(synchronizationErrorMessage: SychronizationErrorMessages) {
+            _lock.lock(); defer { _lock.unlock() }
+            let pointer = Unmanaged.passUnretained(Thread.current).toOpaque()
+            let count = (_threads[pointer] ?? 0) + 1
+
+            if count > 1 {
+                synchronizationError(
+                    "⚠️ Reentrancy anomaly was detected. ⚠️\n" +
+                    "  > Debugging: To debug this issue you can set a breakpoint in \(#file):\(#line) and observe the call stack.\n" +
+                    "  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\n" +
+                    "    This behavior breaks the grammar because there is overlapping between sequence events.\n" +
+                    "    Observable sequence is trying to send an event before sending of previous event has finished.\n" +
+                    "  > Interpretation: This could mean that there is some kind of unexpected cyclic dependency in your code,\n" +
+                    "    or that the system is not behaving in the expected way.\n" +
+                    "  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observeOn(MainScheduler.asyncInstance)`\n" +
+                    "    or by enqueing sequence events in some other way.\n"
+                )
+            }
+            
+            _threads[pointer] = count
+
+            if _threads.count > 1 {
+                synchronizationError(
+                    "⚠️ Synchronization anomaly was detected. ⚠️\n" +
+                    "  > Debugging: To debug this issue you can set a breakpoint in \(#file):\(#line) and observe the call stack.\n" +
+                    "  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\n" +
+                    "    This behavior breaks the grammar because there is overlapping between sequence events.\n" +
+                    "    Observable sequence is trying to send an event before sending of previous event has finished.\n" +
+                    "  > Interpretation: " + synchronizationErrorMessage.rawValue +
+                    "  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observeOn(MainScheduler.asyncInstance)`\n" +
+                    "    or by synchronizing sequence events in some other way.\n"
+                )
+            }
+        }
+
+        func unregister() {
+            _lock.lock(); defer { _lock.unlock() }
+            let pointer = Unmanaged.passUnretained(Thread.current).toOpaque()
+            _threads[pointer] = (_threads[pointer] ?? 1) - 1
+            if _threads[pointer] == 0 {
+                _threads[pointer] = nil
+            }
+        }
+    }
+
+#endif
diff --git a/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift
index d7ec3d88..c6acaa19 100644
--- a/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift
+++ b/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift
@@ -45,7 +45,7 @@ public class ConcurrentDispatchQueueScheduler: SchedulerType {
     }
 
     /**
-    Schedules an action to be executed immediatelly.
+    Schedules an action to be executed immediately.
     
     - parameter state: State passed to the action to be executed.
     - parameter action: Action to be executed.
diff --git a/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift
index 92028b17..a98ad218 100644
--- a/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift
+++ b/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift
@@ -37,7 +37,7 @@ public final class ConcurrentMainScheduler : SchedulerType {
     public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance)
 
     /**
-    Schedules an action to be executed immediatelly.
+    Schedules an action to be executed immediately.
 
     - parameter state: State passed to the action to be executed.
     - parameter action: Action to be executed.
diff --git a/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift
index d411dac7..f6b5db94 100644
--- a/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift
+++ b/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift
@@ -12,7 +12,7 @@ private final class ImmediateScheduler : ImmediateSchedulerType {
     private let _asyncLock = AsyncLock()
 
     /**
-    Schedules an action to be executed immediatelly.
+    Schedules an action to be executed immediately.
 
     In case `schedule` is called recursively from inside of `action` callback, scheduled `action` will be enqueued
     and executed after current `action`. (`AsyncLock` behavior)
diff --git a/Pods/RxSwift/RxSwift/Schedulers/SchedulerServices+Emulation.swift b/Pods/RxSwift/RxSwift/Schedulers/SchedulerServices+Emulation.swift
index 1d224775..41f2947a 100644
--- a/Pods/RxSwift/RxSwift/Schedulers/SchedulerServices+Emulation.swift
+++ b/Pods/RxSwift/RxSwift/Schedulers/SchedulerServices+Emulation.swift
@@ -43,7 +43,7 @@ final class SchedulePeriodicRecursive {
         case .tick:
             scheduler.schedule(.tick, dueTime: _period)
 
-            // The idea is that if on tick there wasn't any item enqueued, schedule to perform work immediatelly.
+            // The idea is that if on tick there wasn't any item enqueued, schedule to perform work immediately.
             // Else work will be scheduled after previous enqueued work completes.
             if AtomicIncrement(&_pendingTickCount) == 1 {
                 self.tick(.dispatchStart, scheduler: scheduler)
diff --git a/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift
index a163406c..71733d39 100644
--- a/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift
+++ b/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift
@@ -82,7 +82,7 @@ public class SerialDispatchQueueScheduler : SchedulerType {
     }
     
     /**
-    Schedules an action to be executed immediatelly.
+    Schedules an action to be executed immediately.
     
     - parameter state: State passed to the action to be executed.
     - parameter action: Action to be executed.
diff --git a/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift
index 0e650c60..c0e1aa56 100644
--- a/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift
+++ b/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift
@@ -55,7 +55,7 @@ open class VirtualTimeScheduler
     }
 
     /**
-    Schedules an action to be executed immediatelly.
+    Schedules an action to be executed immediately.
 
     - parameter state: State passed to the action to be executed.
     - parameter action: Action to be executed.
diff --git a/Pods/RxSwift/RxSwift/Subjects/AsyncSubject.swift b/Pods/RxSwift/RxSwift/Subjects/AsyncSubject.swift
index 3e898590..520207d8 100644
--- a/Pods/RxSwift/RxSwift/Subjects/AsyncSubject.swift
+++ b/Pods/RxSwift/RxSwift/Subjects/AsyncSubject.swift
@@ -38,6 +38,11 @@ public final class AsyncSubject
     }
     private var _lastElement: Element?
 
+    #if DEBUG
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
+    #endif
+
+
     /// Creates a subject.
     public override init() {
         #if TRACE_RESOURCES
@@ -50,6 +55,10 @@ public final class AsyncSubject
     ///
     /// - parameter event: Event to send to the observers.
     public func on(_ event: Event) {
+        #if DEBUG
+            _synchronizationTracker.register(synchronizationErrorMessage: .default)
+            defer { _synchronizationTracker.unregister() }
+        #endif
         let (observers, event) = _synchronized_on(event)
         switch event {
         case .next:
diff --git a/Pods/RxSwift/RxSwift/Subjects/BehaviorSubject.swift b/Pods/RxSwift/RxSwift/Subjects/BehaviorSubject.swift
index 4c6df625..f2de851a 100644
--- a/Pods/RxSwift/RxSwift/Subjects/BehaviorSubject.swift
+++ b/Pods/RxSwift/RxSwift/Subjects/BehaviorSubject.swift
@@ -36,6 +36,10 @@ public final class BehaviorSubject
     private var _observers = Observers()
     private var _stoppedEvent: Event?
 
+    #if DEBUG
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
+    #endif
+
     /// Indicates whether the subject has been disposed.
     public var isDisposed: Bool {
         return _isDisposed
@@ -75,12 +79,15 @@ public final class BehaviorSubject
     ///
     /// - parameter event: Event to send to the observers.
     public func on(_ event: Event) {
-        _lock.lock()
+        #if DEBUG
+            _synchronizationTracker.register(synchronizationErrorMessage: .default)
+            defer { _synchronizationTracker.unregister() }
+        #endif
         dispatch(_synchronized_on(event), event)
-        _lock.unlock()
     }
 
     func _synchronized_on(_ event: Event) -> Observers {
+        _lock.lock(); defer { _lock.unlock() }
         if _stoppedEvent != nil || _isDisposed {
             return Observers()
         }
diff --git a/Pods/RxSwift/RxSwift/Subjects/PublishSubject.swift b/Pods/RxSwift/RxSwift/Subjects/PublishSubject.swift
index 0097fd1e..d847ce86 100644
--- a/Pods/RxSwift/RxSwift/Subjects/PublishSubject.swift
+++ b/Pods/RxSwift/RxSwift/Subjects/PublishSubject.swift
@@ -35,7 +35,11 @@ public final class PublishSubject
     private var _observers = Observers()
     private var _stopped = false
     private var _stoppedEvent = nil as Event?
-    
+
+    #if DEBUG
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
+    #endif
+
     /// Indicates whether the subject has been isDisposed.
     public var isDisposed: Bool {
         return _isDisposed
@@ -53,6 +57,10 @@ public final class PublishSubject
     ///
     /// - parameter event: Event to send to the observers.
     public func on(_ event: Event) {
+        #if DEBUG
+            _synchronizationTracker.register(synchronizationErrorMessage: .default)
+            defer { _synchronizationTracker.unregister() }
+        #endif
         dispatch(_synchronized_on(event), event)
     }
 
diff --git a/Pods/RxSwift/RxSwift/Subjects/ReplaySubject.swift b/Pods/RxSwift/RxSwift/Subjects/ReplaySubject.swift
index 250439a3..54abc35b 100644
--- a/Pods/RxSwift/RxSwift/Subjects/ReplaySubject.swift
+++ b/Pods/RxSwift/RxSwift/Subjects/ReplaySubject.swift
@@ -39,6 +39,10 @@ public class ReplaySubject
     }
     fileprivate var _observers = Observers()
 
+    #if DEBUG
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
+    #endif
+
     func unsubscribe(_ key: DisposeKey) {
         rxAbstractMethod()
     }
@@ -111,6 +115,10 @@ fileprivate class ReplayBufferBase
     }
     
     override func on(_ event: Event) {
+        #if DEBUG
+            _synchronizationTracker.register(synchronizationErrorMessage: .default)
+            defer { _synchronizationTracker.unregister() }
+        #endif
         dispatch(_synchronized_on(event), event)
     }
 
@@ -196,7 +204,7 @@ fileprivate class ReplayBufferBase
     }
 }
 
-final class ReplayOne : ReplayBufferBase {
+fileprivate final class ReplayOne : ReplayBufferBase {
     private var _value: Element?
     
     override init() {
@@ -223,7 +231,7 @@ final class ReplayOne : ReplayBufferBase {
     }
 }
 
-class ReplayManyBase : ReplayBufferBase {
+fileprivate class ReplayManyBase : ReplayBufferBase {
     fileprivate var _queue: Queue
     
     init(queueSize: Int) {
@@ -246,7 +254,7 @@ class ReplayManyBase : ReplayBufferBase {
     }
 }
 
-final class ReplayMany : ReplayManyBase {
+fileprivate final class ReplayMany : ReplayManyBase {
     private let _bufferSize: Int
     
     init(bufferSize: Int) {
@@ -262,7 +270,7 @@ final class ReplayMany : ReplayManyBase {
     }
 }
 
-final class ReplayAll : ReplayManyBase {
+fileprivate final class ReplayAll : ReplayManyBase {
     init() {
         super.init(queueSize: 0)
     }
diff --git a/Pods/RxSwift/RxSwift/Subjects/Variable.swift b/Pods/RxSwift/RxSwift/Subjects/Variable.swift
index 8cc158e8..ba058f87 100644
--- a/Pods/RxSwift/RxSwift/Subjects/Variable.swift
+++ b/Pods/RxSwift/RxSwift/Subjects/Variable.swift
@@ -9,7 +9,7 @@
 /// Variable is a wrapper for `BehaviorSubject`.
 ///
 /// Unlike `BehaviorSubject` it can't terminate with error, and when variable is deallocated
-/// it will complete it's observable sequence (`asObservable`).
+/// it will complete its observable sequence (`asObservable`).
 public final class Variable {
 
     public typealias E = Element
@@ -17,12 +17,12 @@ public final class Variable {
     private let _subject: BehaviorSubject
     
     private var _lock = SpinLock()
- 
+
     // state
     private var _value: E
 
     #if DEBUG
-        fileprivate var _numberOfConcurrentCalls: AtomicInt = 0
+        fileprivate let _synchronizationTracker = SynchronizationTracker()
     #endif
 
     /// Gets or sets current value of variable.
@@ -37,13 +37,8 @@ public final class Variable {
         }
         set(newValue) {
             #if DEBUG
-                if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
-                    rxFatalError("Warning: Recursive call or synchronization error!")
-                }
-
-                defer {
-                    _ = AtomicDecrement(&_numberOfConcurrentCalls)
-                }
+                _synchronizationTracker.register(synchronizationErrorMessage: .variable)
+                defer { _synchronizationTracker.unregister() }
             #endif
             _lock.lock()
             _value = newValue
diff --git a/Pods/RxSwift/RxSwift/Traits/Completable+AndThen.swift b/Pods/RxSwift/RxSwift/Traits/Completable+AndThen.swift
new file mode 100644
index 00000000..c02c9e51
--- /dev/null
+++ b/Pods/RxSwift/RxSwift/Traits/Completable+AndThen.swift
@@ -0,0 +1,132 @@
+//
+//  Completable+AndThen.swift
+//  RxSwift
+//
+//  Created by Krunoslav Zaher on 7/2/17.
+//  Copyright © 2017 Krunoslav Zaher. All rights reserved.
+//
+
+extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Never {
+    /**
+     Concatenates the second observable sequence to `self` upon successful termination of `self`.
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - parameter second: Second observable sequence.
+     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
+     */
+    public func andThen(_ second: Single) -> Single {
+        let completable = self.primitiveSequence.asObservable()
+        return Single(raw: ConcatCompletable(completable: completable, second: second.asObservable()))
+    }
+
+    /**
+     Concatenates the second observable sequence to `self` upon successful termination of `self`.
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - parameter second: Second observable sequence.
+     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
+     */
+    public func andThen(_ second: Maybe) -> Maybe {
+        let completable = self.primitiveSequence.asObservable()
+        return Maybe(raw: ConcatCompletable(completable: completable, second: second.asObservable()))
+    }
+
+    /**
+     Concatenates the second observable sequence to `self` upon successful termination of `self`.
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - parameter second: Second observable sequence.
+     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
+     */
+    public func andThen(_ second: Completable) -> Completable {
+        let completable = self.primitiveSequence.asObservable()
+        return Completable(raw: ConcatCompletable(completable: completable, second: second.asObservable()))
+    }
+
+    /**
+     Concatenates the second observable sequence to `self` upon successful termination of `self`.
+
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+
+     - parameter second: Second observable sequence.
+     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
+     */
+    public func andThen(_ second: Observable) -> Observable {
+        let completable = self.primitiveSequence.asObservable()
+        return ConcatCompletable(completable: completable, second: second.asObservable())
+    }
+}
+
+final fileprivate class ConcatCompletable : Producer {
+    fileprivate let _completable: Observable
+    fileprivate let _second: Observable
+
+    init(completable: Observable, second: Observable) {
+        self._completable = completable
+        self._second = second
+    }
+
+    override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O : ObserverType, O.E == Element {
+        let sink = ConcatCompletableSink(parent: self, observer: observer, cancel: cancel)
+        let subscription = sink.run()
+        return (sink: sink, subscription: subscription)
+    }
+}
+
+final fileprivate class ConcatCompletableSink
+    : Sink
+    , ObserverType {
+    typealias E = Never
+    typealias Parent = ConcatCompletable
+
+    private let _parent: Parent
+    private let _subscription = SerialDisposable()
+    
+    init(parent: Parent, observer: O, cancel: Cancelable) {
+        self._parent = parent
+        super.init(observer: observer, cancel: cancel)
+    }
+
+    func on(_ event: Event) {
+        switch event {
+        case .error(let error):
+            self.forwardOn(.error(error))
+            self.dispose()
+        case .next:
+            break
+        case .completed:
+            let otherSink = ConcatCompletableSinkOther(parent: self)
+            _subscription.disposable = _parent._second.subscribe(otherSink)
+        }
+    }
+
+    func run() -> Disposable {
+        let subscription = SingleAssignmentDisposable()
+        _subscription.disposable = subscription
+        subscription.setDisposable(_parent._completable.subscribe(self))
+        return _subscription
+    }
+}
+
+final fileprivate class ConcatCompletableSinkOther
+    : ObserverType {
+    typealias E = O.E
+
+    typealias Parent = ConcatCompletableSink
+    
+    private let _parent: Parent
+
+    init(parent: Parent) {
+        self._parent = parent
+    }
+
+    func on(_ event: Event) {
+        _parent.forwardOn(event)
+        if event.isStopEvent {
+            _parent.dispose()
+        }
+    }
+}
diff --git a/Pods/RxSwift/RxSwift/Units/PrimitiveSequence+Zip+arity.swift b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift
similarity index 100%
rename from Pods/RxSwift/RxSwift/Units/PrimitiveSequence+Zip+arity.swift
rename to Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift
diff --git a/Pods/RxSwift/RxSwift/Units/PrimitiveSequence.swift b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift
similarity index 69%
rename from Pods/RxSwift/RxSwift/Units/PrimitiveSequence.swift
rename to Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift
index 7ee8d1e9..3261e420 100644
--- a/Pods/RxSwift/RxSwift/Units/PrimitiveSequence.swift
+++ b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift
@@ -124,7 +124,25 @@ extension PrimitiveSequenceType where TraitType == SingleTrait {
             case .error(let error):
                 observer(.error(error))
             case .completed:
-                rxFatalError("SingleProtocol")
+                rxFatalErrorInDebug("Singles can't emit a completion event")
+            }
+        }
+    }
+
+    /**
+     Subscribes a success handler, and an error handler for this sequence.
+
+     - parameter onSuccess: Action to invoke for each element in the observable sequence.
+     - parameter onError: Action to invoke upon errored termination of the observable sequence.
+     - returns: Subscription object used to unsubscribe from the observable sequence.
+     */
+    public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable {
+        return self.primitiveSequence.subscribe { event in
+            switch event {
+            case .success(let element):
+                onSuccess?(element)
+            case .error(let error):
+                onError?(error)
             }
         }
     }
@@ -195,6 +213,27 @@ public extension PrimitiveSequenceType where TraitType == MaybeTrait {
             }
         }
     }
+
+    /**
+     Subscribes a success handler, an error handler, and a completion handler for this sequence.
+
+     - parameter onSuccess: Action to invoke for each element in the observable sequence.
+     - parameter onError: Action to invoke upon errored termination of the observable sequence.
+     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
+     - returns: Subscription object used to unsubscribe from the observable sequence.
+     */
+    public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil) -> Disposable {
+        return self.primitiveSequence.subscribe { event in
+            switch event {
+            case .success(let element):
+                onSuccess?(element)
+            case .error(let error):
+                onError?(error)
+            case .completed:
+                onCompleted?()
+            }
+        }
+    }
 }
 
 // 
@@ -248,7 +287,7 @@ public extension PrimitiveSequenceType where TraitType == CompletableTrait, Elem
 
             switch event {
             case .next:
-                rxFatalError("SingleProtocol")
+                rxFatalError("Completables can't emit values")
             case .error(let error):
                 observer(.error(error))
             case .completed:
@@ -256,6 +295,24 @@ public extension PrimitiveSequenceType where TraitType == CompletableTrait, Elem
             }
         }
     }
+
+    /**
+     Subscribes a completion handler and an error handler for this sequence.
+
+     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
+     - parameter onError: Action to invoke upon errored termination of the observable sequence.
+     - returns: Subscription object used to unsubscribe from the observable sequence.
+     */
+    public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable {
+        return self.primitiveSequence.subscribe { event in
+            switch event {
+            case .error(let error):
+                onError?(error)
+            case .completed:
+                onCompleted?()
+            }
+        }
+    }
 }
 
 // 
@@ -508,6 +565,65 @@ extension PrimitiveSequence {
         -> PrimitiveSequence {
         return PrimitiveSequence(raw: source.retryWhen(notificationHandler))
     }
+
+    /**
+     Prints received events for all observers on standard output.
+
+     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)
+
+     - parameter identifier: Identifier that is printed together with event description to standard output.
+     - parameter trimOutput: Should output be trimmed to max 40 characters.
+     - returns: An observable sequence whose events are printed to standard output.
+     */
+    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)
+        -> PrimitiveSequence {
+            return PrimitiveSequence(raw: source.debug(identifier, trimOutput: trimOutput, file: file, line: line, function: function))
+    }
+    
+    /**
+     Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.
+     
+     - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)
+     
+     - parameter resourceFactory: Factory function to obtain a resource object.
+     - parameter primitiveSequenceFactory: Factory function to obtain an observable sequence that depends on the obtained resource.
+     - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.
+     */
+    public static func using(_ resourceFactory: @escaping () throws -> Resource, primitiveSequenceFactory: @escaping (Resource) throws -> PrimitiveSequence)
+        -> PrimitiveSequence {
+            return PrimitiveSequence(raw: Observable.using(resourceFactory, observableFactory: { (resource: Resource) throws -> Observable in
+                return try primitiveSequenceFactory(resource).asObservable()
+            }))
+    }
+
+    /**
+     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.
+
+     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)
+
+     - parameter dueTime: Maximum duration between values before a timeout occurs.
+     - parameter scheduler: Scheduler to run the timeout timer on.
+     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.
+     */
+    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
+        -> PrimitiveSequence {
+        return PrimitiveSequence(raw: source.timeout(dueTime, scheduler: scheduler))
+    }
+
+    /**
+     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.
+
+     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)
+
+     - parameter dueTime: Maximum duration between values before a timeout occurs.
+     - parameter other: Sequence to return in case of a timeout.
+     - parameter scheduler: Scheduler to run the timeout timer on.
+     - returns: The source sequence switching to the other sequence in case of a timeout.
+     */
+    public func timeout(_ dueTime: RxTimeInterval, other: PrimitiveSequence, scheduler: SchedulerType)
+        -> PrimitiveSequence {
+        return PrimitiveSequence(raw: source.timeout(dueTime, other: other.source, scheduler: scheduler))
+    }
 }
 
 extension PrimitiveSequenceType where ElementType: SignedInteger
@@ -551,6 +667,96 @@ extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType
     public static func empty() -> PrimitiveSequence {
         return PrimitiveSequence(raw: Observable.empty())
     }
+    
+    /**
+     Concatenates the second observable sequence to `self` upon successful termination of `self`.
+     
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+     
+     - parameter second: Second observable sequence.
+     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.
+     */
+    public func concat(_ second: PrimitiveSequence) -> PrimitiveSequence {
+        return Completable.concat(primitiveSequence, second)
+    }
+    
+    /**
+     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
+     
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+     
+     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
+     */
+    public static func concat(_ sequence: S) -> PrimitiveSequence
+        where S.Iterator.Element == PrimitiveSequence {
+            let source = Observable.concat(sequence.lazy.map { $0.asObservable() })
+            return PrimitiveSequence(raw: source)
+    }
+    
+    /**
+     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
+     
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+     
+     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
+     */
+    public static func concat(_ collection: C) -> PrimitiveSequence
+        where C.Iterator.Element == PrimitiveSequence {
+            let source = Observable.concat(collection.map { $0.asObservable() })
+            return PrimitiveSequence(raw: source)
+    }
+    
+    /**
+     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
+     
+     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)
+     
+     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
+     */
+    public static func concat(_ sources: PrimitiveSequence ...) -> PrimitiveSequence {
+        let source = Observable.concat(sources.map { $0.asObservable() })
+        return PrimitiveSequence(raw: source)
+    }
+    
+    /**
+     Merges elements from all observable sequences from collection into a single observable sequence.
+     
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+     
+     - parameter sources: Collection of observable sequences to merge.
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public static func merge(_ sources: C) -> PrimitiveSequence
+        where C.Iterator.Element == PrimitiveSequence {
+            let source = Observable.merge(sources.map { $0.asObservable() })
+            return PrimitiveSequence(raw: source)
+    }
+    
+    /**
+     Merges elements from all observable sequences from array into a single observable sequence.
+     
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+     
+     - parameter sources: Array of observable sequences to merge.
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public static func merge(_ sources: [PrimitiveSequence]) -> PrimitiveSequence {
+        let source = Observable.merge(sources.map { $0.asObservable() })
+        return PrimitiveSequence(raw: source)
+    }
+    
+    /**
+     Merges elements from all observable sequences into a single observable sequence.
+     
+     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)
+     
+     - parameter sources: Collection of observable sequences to merge.
+     - returns: The observable sequence that merges the elements of the observable sequences.
+     */
+    public static func merge(_ sources: PrimitiveSequence...) -> PrimitiveSequence {
+        let source = Observable.merge(sources.map { $0.asObservable() })
+        return PrimitiveSequence(raw: source)
+    }
 }
 
 extension ObservableType {
diff --git a/Pods/Target Support Files/GCDWebServer/Info.plist b/Pods/Target Support Files/GCDWebServer/Info.plist
index 234e3516..152c333e 100644
--- a/Pods/Target Support Files/GCDWebServer/Info.plist	
+++ b/Pods/Target Support Files/GCDWebServer/Info.plist	
@@ -15,7 +15,7 @@
   CFBundlePackageType
   FMWK
   CFBundleShortVersionString
-  3.3.3
+  3.4.2
   CFBundleSignature
   ????
   CFBundleVersion
diff --git a/Pods/Target Support Files/RxCocoa/Info.plist b/Pods/Target Support Files/RxCocoa/Info.plist
index d4b3c294..646f73ca 100644
--- a/Pods/Target Support Files/RxCocoa/Info.plist	
+++ b/Pods/Target Support Files/RxCocoa/Info.plist	
@@ -15,7 +15,7 @@
   CFBundlePackageType
   FMWK
   CFBundleShortVersionString
-  3.3.1
+  3.6.1
   CFBundleSignature
   ????
   CFBundleVersion
diff --git a/Pods/Target Support Files/RxSwift/Info.plist b/Pods/Target Support Files/RxSwift/Info.plist
index d4b3c294..646f73ca 100644
--- a/Pods/Target Support Files/RxSwift/Info.plist	
+++ b/Pods/Target Support Files/RxSwift/Info.plist	
@@ -15,7 +15,7 @@
   CFBundlePackageType
   FMWK
   CFBundleShortVersionString
-  3.3.1
+  3.6.1
   CFBundleSignature
   ????
   CFBundleVersion