BuWanVideo2.0.xcodeproj/project.pbxproj
@@ -2865,6 +2865,7 @@ "${PODS_ROOT}/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-frameworks.sh", "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework", "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework", "${BUILT_PRODUCTS_DIR}/ReactiveCocoa/ReactiveCocoa.framework", "${BUILT_PRODUCTS_DIR}/SDAutoLayout/SDAutoLayout.framework", "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", @@ -2877,6 +2878,7 @@ outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManager.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactiveCocoa.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDAutoLayout.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", @@ -3238,6 +3240,7 @@ ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = BuWanVideo2.0/BuWanVideo2.0.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -3389,6 +3392,7 @@ ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_ENTITLEMENTS = BuWanVideo2.0/BuWanVideo2.0.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; BuWanVideo2.0.xcworkspace/xcuserdata/aeline.xcuserdatad/UserInterfaceState.xcuserstateBinary files differ
BuWanVideo2.0.xcworkspace/xcuserdata/aeline.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -19,63 +19,95 @@ <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "53D47BA7-2FA5-46A6-8A54-2C6AAEC23A51" uuid = "8CD41EE0-A87D-46AF-91E6-35F08F86F964" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" filePath = "BuWanVideo2.0/SettingController.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "14" endingLineNumber = "14" landmarkName = "JSAPI" landmarkType = "3"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "063F8DFB-866A-417B-BC79-4A6E147FC65C" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "26" endingLineNumber = "26" landmarkName = "-playFinish:" startingLineNumber = "85" endingLineNumber = "85" landmarkName = "-OutOfLogin" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "C7CD8336-39F9-40D9-B1D6-78F470638FE1" uuid = "9F1698DB-31A5-4760-A420-C735464637FC" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" filePath = "BuWanVideo2.0/SettingController.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "21" endingLineNumber = "21" landmarkName = "-tryPlayFinish:" startingLineNumber = "152" endingLineNumber = "152" landmarkName = "-tableView:cellForRowAtIndexPath:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "E9279A84-5EBB-4249-9EDB-8BF23A6F9038" uuid = "5942D78B-04D0-4191-B5AE-14E8F4868344" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/LoggingViewController.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "480" endingLineNumber = "480" landmarkName = "-getInfoFromInternet" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "AFF19E7A-D446-427C-8182-190A7D27D138" shouldBeEnabled = "No" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "18" endingLineNumber = "18" startingLineNumber = "71" endingLineNumber = "71" landmarkName = "-jsonStringToJsonData:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "91FAE200-D2A7-4778-919B-18B5656D9C3E" shouldBeEnabled = "No" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "15" endingLineNumber = "15" landmarkName = "-login:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "D68EC0A8-E161-409E-89EC-52E88917ABD4" shouldBeEnabled = "No" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "41" endingLineNumber = "41" landmarkName = "-getUserInfo:" landmarkType = "7"> </BreakpointContent> BuWanVideo2.0/AppDelegate.m
@@ -52,7 +52,8 @@ @property (nonatomic, strong) BUSplashAdView *splashAdView; @property (strong,nonatomic) UIView *bottomView; @property (strong, nonatomic) UIView *bottomView; @property (nonatomic, strong) UIView *viewBot; @end @implementation AppDelegate @@ -265,7 +266,23 @@ #pragma mark - Splash - (void)addSplashAD { CGRect frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 100); CGRect frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 100); self.viewBot = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; self.viewBot .backgroundColor = [UIColor whiteColor]; [self.window.rootViewController.view addSubview:self.viewBot]; UIView *viewTop = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 100)]; [self.viewBot addSubview:viewTop]; UIView *views = [[UIView alloc] init]; views.backgroundColor = [UIColor whiteColor]; [self.viewBot addSubview:views]; views.sd_layout.leftEqualToView(self.viewBot).topSpaceToView(viewTop, 0).rightEqualToView(self.viewBot).bottomEqualToView(self.viewBot); UIImageView *logos = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"375"]]; [views addSubview:logos]; logos.sd_layout.centerXEqualToView(views).centerYEqualToView(views).widthIs(KScreenW).heightIs(57); self.splashAdView = [[BUSplashAdView alloc] initWithSlotID:@"887379201" frame:frame]; @@ -319,7 +336,7 @@ _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, screenH - 100, KScreenW, 100)]; _bottomView.backgroundColor = [UIColor whiteColor]; imageview.frame = CGRectMake(0, 12, _bottomView.frame.size.width, 57); imageview.frame = CGRectMake(0, 21.5, _bottomView.frame.size.width, 57); [_bottomView addSubview:imageview]; [keyWindow addSubview:self.bottomView]; @@ -573,6 +590,7 @@ /// 当splash广告关闭时调用此方法。 - (void)splashAdDidClose:(BUSplashAdView *)splashAd { [self.viewBot removeFromSuperview]; [splashAd removeFromSuperview]; [self.bottomView removeFromSuperview]; [self pbu_logWithSEL:_cmd msg:@""]; @@ -591,6 +609,7 @@ } - (void)splashAd:(BUSplashAdView *)splashAd didFailWithError:(NSError *)error { [self.viewBot removeFromSuperview]; [splashAd removeFromSuperview]; [self.bottomView removeFromSuperview]; self.bottomView = nil; @@ -599,7 +618,7 @@ } - (void)splashAdWillVisible:(BUSplashAdView *)splashAd { [self pbu_logWithSEL:_cmd msg:@""]; [self.viewBot removeFromSuperview]; } - (void)splashAdWillClose:(BUSplashAdView *)splashAd { BuWanVideo2.0/Common.h
@@ -18,6 +18,7 @@ #import "Share.h" #import "YYWebImage.h" #import <SDAutoLayout/SDAutoLayout.h> #import <ReactiveCocoa/ReactiveCocoa.h> #import "HXEasyCustomShareView.h"//分享界面 BuWanVideo2.0/JSAPI.m
@@ -11,18 +11,81 @@ @implementation JSAPI - (NSString *)login:(NSString *)msg { [[NSNotificationCenter defaultCenter] postNotificationName:@"h5Login" object:nil]; return msg; } - (NSString *)getUserInfo:(NSString *)msg { return msg; NSMutableDictionary *parms = [[NSMutableDictionary alloc] init]; NSDictionary *dictionary = [[NSUserDefaults standardUserDefaults] objectForKey:@"buUserInfo"]; if (dictionary) { NSMutableDictionary *data = [[NSMutableDictionary alloc] init]; NSInteger nowDate = [self nowTimeSwitchTimestamp]; if ([dictionary[@"vipExpireTime"] integerValue] > nowDate) {// vip时间大于 data[@"isSVip"] = @(YES); } else { data[@"isSVip"] = @(NO); } data[@"code"] = dictionary[@"pptvCode"]; data[@"nickname"] = dictionary[@"nickName"]; data[@"isCoupon"] = @(NO); parms[@"code"] = @(1); parms[@"data"] = data; } else { parms[@"code"] = @(0); } NSString *json = [self jsonStringToJsonData:parms]; return json; } - (NSString *)tryPlayFinish:(NSString *)msg { [[NSNotificationCenter defaultCenter] postNotificationName:@"tryPlayFinish" object:nil]; return msg; } - (NSString *)playFinish:(NSString *)msg { return msg; } - (NSString *)jsonStringToJsonData:(id)dic { if (!dic || [dic isEqual:[NSNull null]]) { return @""; } NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString = @""; if (!jsonData) { NSLog(@"%@",error); } else { jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; } NSMutableString *mutStr = [NSMutableString stringWithString:jsonString]; NSRange range = {0, jsonString.length}; [mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range]; NSRange range2 = {0, mutStr.length}; //去掉字符串中的换行符 [mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2]; //NSRange range3 = {0,mutStr.length}; //去掉字符串中的换行符 //[mutStr replaceOccurrencesOfString:@"\\" withString:@"" options:NSLiteralSearch range:range3]; return mutStr; } - (NSInteger)nowTimeSwitchTimestamp { NSDate *datenow = [NSDate date]; // 现在时间 NSInteger timeSp = [datenow timeIntervalSince1970]*1000; return timeSp; } @end BuWanVideo2.0/LeftViewController.m
@@ -160,6 +160,7 @@ if(_userOnLine){//跳入个人中心,目前未实现,暂且空着 Personal_informationViewController *Personal_informationVC=[[Personal_informationViewController alloc] init]; Personal_informationVC.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController:Personal_informationVC animated:YES]; }else{//跳入登录界面 LoggingViewController *loginVC=[[LoggingViewController alloc] init]; BuWanVideo2.0/LoggingViewController.h
@@ -11,5 +11,6 @@ @interface LoggingViewController : UIViewController @property (nonatomic) BOOL ispresent; // 是否需要回到跟界面 @property (nonatomic, assign) BOOL backNotRoot; @end BuWanVideo2.0/LoggingViewController.m
@@ -59,7 +59,7 @@ //设置返回按钮 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setImage:[[UIImage imageNamed:@"详情页面返回"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal]; [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; [button addTarget:self action:@selector(eventBack) forControlEvents:UIControlEventTouchUpInside]; button.frame = CGRectMake(0, 0, 32, 32); UIBarButtonItem *iconBarItem=[[UIBarButtonItem alloc] initWithCustomView:button]; self.navigationItem.leftBarButtonItem = iconBarItem; @@ -370,13 +370,10 @@ [[NSUserDefaults standardUserDefaults] setObject:[[result objectForKey:@"Data"] objectForKey:@"Nickname"] forKey:@"QQUserName"]; [[NSUserDefaults standardUserDefaults] setObject:[[result objectForKey:@"Data"] objectForKey:@"Portrait"] forKey:@"iconURL"]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"userOnLine"]; //通知视图刷新 [[NSNotificationCenter defaultCenter] postNotificationName:@"RELOAD_DATA" object:nil]; if (_ispresent) { [self presentBack]; }else{ [self back]; } [self fetchNewInfo]; }else{ //登录失败 [SVProgressHUD showErrorWithStatus:[NSString stringWithFormat:@"账号或密码错误"]]; @@ -391,6 +388,45 @@ } }]; } } - (void)fetchNewInfo { [[YTHNetInterface startInterface] getLoginUserInfoWithUid:[YTHsharedManger startManger].Uid WithSystem:@"1" WithLoginUid:[[NSUserDefaults standardUserDefaults] objectForKey:@"LoginUid"] withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { //首先判断数据是否获成功 NSString *err=[NSString stringWithFormat:@"%@",[result objectForKey:@"Error"]]; if (err.length ==0 ) { //跟新个人信息到全局变量 if ([[result objectForKey:@"Data"] objectForKey:@"Portrait"]!=nil) { NSString *str=[[result objectForKey:@"Data"] objectForKey:@"Portrait"]; if ([[str substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"http"]) { } else { str=[NSString stringWithFormat:@"%@%@",iconImageUrl,str]; } [[NSUserDefaults standardUserDefaults] setObject:str forKey:@"iconURL"]; } if ([[result objectForKey:@"Data"] objectForKey:@"Nickname"]!=nil) { [[NSUserDefaults standardUserDefaults] setObject:[[result objectForKey:@"Data"] objectForKey:@"Nickname"] forKey:@"QQUserName"]; } [[NSUserDefaults standardUserDefaults] setObject:[result objectForKey:@"Data"] forKey:@"buUserInfo"]; [[NSUserDefaults standardUserDefaults] synchronize]; //通知视图刷新 [[NSNotificationCenter defaultCenter] postNotificationName:@"RELOAD_DATA" object:nil]; if (_ispresent) { [self presentBack]; } else { [self eventBack]; } } } } ]; } /** @@ -440,6 +476,7 @@ */ -(void)getInfoFromInternet{ [[YTHNetInterface startInterface] getLoginUserInfoWithUid:[YTHsharedManger startManger].Uid WithSystem:@"1" WithLoginUid:[[NSUserDefaults standardUserDefaults] objectForKey:@"LoginUid"] withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { //首先判断数据是否获成功 NSString *err=[NSString stringWithFormat:@"%@",[result objectForKey:@"Error"]]; @@ -469,8 +506,14 @@ /** * 退出 */ -(void)back{ [self.navigationController popToRootViewControllerAnimated:YES]; -(void)eventBack { if (_backNotRoot) { [self.navigationController popViewControllerAnimated:YES]; } else { [self.navigationController popToRootViewControllerAnimated:YES]; } } BuWanVideo2.0/PPTVBottomVIpVIew.h
@@ -10,8 +10,13 @@ NS_ASSUME_NONNULL_BEGIN typedef void(^buyVip)(void); @interface PPTVBottomVIpVIew : UIView @property (nonatomic, strong) NSDictionary *data; @property (nonatomic) buyVip buyVip; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/PPTVBottomVIpVIew.m
@@ -10,6 +10,14 @@ @interface PPTVBottomVIpVIew () @property (nonatomic, nullable, strong) UILabel *labelName; @property (nonatomic, nullable, strong) UILabel *labelVipTitle; @property (nonatomic, nullable, strong) UILabel *labelVipContent; @property (nonatomic, nullable, strong) UIImageView *imageViewVip; @property (nonatomic, nullable, strong) UIView *viewYellow; @property (nonatomic, nullable, strong) UILabel *labelStart; @property (nonatomic, nullable, strong) UILabel *labelEnd; @@ -43,7 +51,7 @@ [buttonRight addTarget:self action:@selector(onDelete) forControlEvents:UIControlEventTouchUpInside]; [viewGB addSubview:buttonRight]; buttonRight.sd_layout.rightSpaceToView(viewGB, 10).topSpaceToView(viewGB, 10).widthIs(20).heightIs(20); buttonRight.sd_layout.rightSpaceToView(viewGB, 5).topSpaceToView(viewGB, 5).widthIs(30).heightIs(30); UILabel *labelTitle = [[UILabel alloc] init]; labelTitle.textColor = UIColorFromRGBValue(0x010101); @@ -60,28 +68,15 @@ line.sd_layout.leftSpaceToView(viewGB, 20).rightSpaceToView(viewGB, 20).topSpaceToView(viewGB, 57).heightIs(0.5); UILabel *labelName = [[UILabel alloc] init]; labelName.font = [UIFont systemFontOfSize:12]; labelName.textAlignment = NSTextAlignmentLeft; labelName.textColor = UIColorFromRGBValue(0x010101); self.labelName = [[UILabel alloc] init]; self.labelName.font = [UIFont systemFontOfSize:12]; self.labelName.textAlignment = NSTextAlignmentLeft; self.labelName.textColor = UIColorFromRGBValue(0x010101); [viewGB addSubview:labelName]; [viewGB addSubview:self.labelName]; NSString *str1 = @"片名"; long len1= [str1 length]; NSString * str2 = @"《流浪地球》"; long len2 = [str2 length]; NSString * str = [NSString stringWithFormat:@"%@%@",str1, str2]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:str]; [attributedString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:18] range:NSMakeRange(len1, len2)]; labelName.attributedText = attributedString; labelName.isAttributedContent = YES; labelName.sd_layout.leftSpaceToView(viewGB, 10).topSpaceToView(line , 20).rightSpaceToView(viewGB, 110).heightIs(18); self.labelName.isAttributedContent = YES; self.labelName.sd_layout.leftSpaceToView(viewGB, 10).topSpaceToView(line , 20).rightSpaceToView(viewGB, 110).heightIs(18); // 来源 UILabel *labelSource = [[UILabel alloc] init]; @@ -90,7 +85,7 @@ labelSource.text = @"来源:PP视频"; labelSource.textAlignment = NSTextAlignmentRight; [viewGB addSubview:labelSource]; labelSource.sd_layout.rightSpaceToView(viewGB, 20).bottomEqualToView(labelName).widthIs(85).heightIs(13); labelSource.sd_layout.rightSpaceToView(viewGB, 20).bottomEqualToView(self.labelName).widthIs(85).heightIs(13); // 会员背景 self.viewYellow = [[UIView alloc] init]; @@ -99,35 +94,27 @@ [viewGB addSubview:self.viewYellow]; self.viewYellow.layer.masksToBounds = YES; self.viewYellow.layer.cornerRadius = 6; self.viewYellow.userInteractionEnabled = YES; UITapGestureRecognizer *tao = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onBuyVip)]; [self.viewYellow addGestureRecognizer:tao]; CAGradientLayer *layer = [CAGradientLayer layer]; layer.startPoint = CGPointMake(0, 0);//(0,0)表示从左上角开始变化。默认值是(0.5,0.0)表示从x轴为中间,y为顶端的开始变化 layer.endPoint = CGPointMake(1, 1);//(1,1)表示到右下角变化结束。默认值是(0.5,1.0) 表示从x轴为中间,y为低端的结束变化 layer.colors = [NSArray arrayWithObjects:UIColorFromRGBValue(0xF7EDD7).CGColor, UIColorFromRGBValue(0xE9CE93).CGColor, nil]; layer.locations = @[@0.0f, @1.0f];//渐变颜色的区间分布,locations的数组长度和color一致,这个值一般不用管它,默认是nil,会平均分布 layer.frame = self.viewYellow.layer.bounds; [self.viewYellow.layer insertSublayer:layer atIndex:0]; self.imageViewVip = [[UIImageView alloc] init]; [self.viewYellow addSubview:self.imageViewVip]; self.imageViewVip.sd_layout.leftSpaceToView(self.viewYellow, 17).centerYEqualToView(self.viewYellow).widthIs(24).heightIs(25); UIImageView *imageViewVip = [[UIImageView alloc] init]; imageViewVip.image = [UIImage imageNamed:@"pptv_vip_icon"]; [self.viewYellow addSubview:imageViewVip]; imageViewVip.sd_layout.leftSpaceToView(self.viewYellow, 17).centerYEqualToView(self.viewYellow).widthIs(24).heightIs(25); self.labelVipTitle = [[UILabel alloc] init]; self.labelVipTitle.textColor = UIColorFromRGBValue(0x885E24); self.labelVipTitle.font = [UIFont systemFontOfSize:15]; self.labelVipTitle.textAlignment = NSTextAlignmentLeft; [self.viewYellow addSubview:self.labelVipTitle]; self.labelVipTitle.sd_layout.leftSpaceToView(self.imageViewVip, 5).topSpaceToView(self.viewYellow, 13).rightSpaceToView(self.viewYellow, 20).heightIs(15); UILabel *labelVipTitle = [[UILabel alloc] init]; labelVipTitle.text = @"VIP看高清 免广告"; labelVipTitle.textColor = UIColorFromRGBValue(0x885E24); labelVipTitle.font = [UIFont systemFontOfSize:15]; labelVipTitle.textAlignment = NSTextAlignmentLeft; [self.viewYellow addSubview:labelVipTitle]; labelVipTitle.sd_layout.leftSpaceToView(imageViewVip, 5).topSpaceToView(self.viewYellow, 13).rightSpaceToView(self.viewYellow, 20).heightIs(15); UILabel *labelVipContent = [[UILabel alloc] init]; labelVipContent.text = @"包月、季、年卡"; labelVipContent.textColor = UIColorFromRGBValue(0x885E24); labelVipContent.font = [UIFont systemFontOfSize:11]; labelVipContent.textAlignment = NSTextAlignmentLeft; [self.viewYellow addSubview:labelVipContent]; labelVipContent.sd_layout.leftSpaceToView(imageViewVip, 5).topSpaceToView(labelVipTitle, 6).rightSpaceToView(self.viewYellow, 20).heightIs(15); self.labelVipContent = [[UILabel alloc] init]; self.labelVipContent.textColor = UIColorFromRGBValue(0x885E24); self.labelVipContent.font = [UIFont systemFontOfSize:11]; self.labelVipContent.textAlignment = NSTextAlignmentLeft; [self.viewYellow addSubview:self.labelVipContent]; self.labelVipContent.sd_layout.leftSpaceToView(self.imageViewVip, 5).topSpaceToView(self.labelVipTitle, 6).rightSpaceToView(self.viewYellow, 20).heightIs(15); UIImageView *imageViewArrow = [[UIImageView alloc] init]; imageViewArrow.image = [UIImage imageNamed:@"pptv_arrow"]; @@ -140,19 +127,6 @@ self.labelEnd.textAlignment = NSTextAlignmentRight; [self.viewYellow addSubview:self.labelEnd]; NSString *endStr1 = @"¥"; long endLen1= [endStr1 length]; NSString * endStr2 = @"99"; long endLen2 = [endStr2 length]; NSString * strEnd = [NSString stringWithFormat:@"%@%@",endStr1, endStr2]; NSMutableAttributedString *attributedStringEnd = [[NSMutableAttributedString alloc] initWithString:strEnd]; [attributedStringEnd addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:18] range:NSMakeRange(endLen1, endLen2)]; self.labelEnd.attributedText = attributedStringEnd; self.labelEnd.isAttributedContent = YES; self.labelEnd.sd_layout.rightSpaceToView(imageViewArrow, 5).topSpaceToView(self.viewYellow, 19).autoWidthRatio(0).heightIs(15); [self.labelEnd setSingleLineAutoResizeWithMaxWidth:100]; @@ -172,25 +146,260 @@ self.labelStart.textAlignment = NSTextAlignmentRight; [self.viewYellow addSubview:self.labelStart]; NSString *str1Start = @"¥"; long len1Start= [str1Start length]; NSString * str2Start = @"6"; long len2Start = [str2Start length]; NSString * strStart = [NSString stringWithFormat:@"%@%@",str1Start, str2Start]; NSMutableAttributedString *attributedStringStart = [[NSMutableAttributedString alloc] initWithString:strStart]; [attributedStringStart addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:19] range:NSMakeRange(len1Start, len2Start)]; self.labelStart.attributedText = attributedStringStart; self.labelStart.isAttributedContent = YES; self.labelStart.sd_layout.rightSpaceToView(self.labelBL, 2).topSpaceToView(self.viewYellow, 19).autoWidthRatio(0).heightIs(15); [self.labelStart setSingleLineAutoResizeWithMaxWidth:100]; } - (void)onBuyVip { !_buyVip?:_buyVip(); } - (void)setData:(NSDictionary *)data { _data = data; if (data) { // 名字 NSString *str1 = @"片名"; long len1= [str1 length]; NSString * str2 = data[@"videoName"]; long len2 = [str2 length]; NSString * str = [NSString stringWithFormat:@"%@%@",str1, str2]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:str]; [attributedString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:18] range:NSMakeRange(len1, len2)]; self.labelName.attributedText = attributedString; NSDictionary *vipInfo = data[@"wayList"][0]; self.labelVipTitle.textColor = [self colorWithHexString:vipInfo[@"textColor"]]; self.labelVipContent.textColor = [self colorWithHexString:vipInfo[@"textColor"]]; self.labelEnd.textColor = [self colorWithHexString:vipInfo[@"textColor"]]; self.labelBL.textColor = [self colorWithHexString:vipInfo[@"textColor"]]; self.labelStart.textColor = [self colorWithHexString:vipInfo[@"textColor"]]; CAGradientLayer *layer = [CAGradientLayer layer]; layer.startPoint = CGPointMake(0, 0);//(0,0)表示从左上角开始变化。默认值是(0.5,0.0)表示从x轴为中间,y为顶端的开始变化 layer.endPoint = CGPointMake(1, 1);//(1,1)表示到右下角变化结束。默认值是(0.5,1.0) 表示从x轴为中间,y为低端的结束变化 layer.colors = [NSArray arrayWithObjects:[self colorWithHexString:vipInfo[@"startBgColor"]].CGColor, [self colorWithHexString:vipInfo[@"endBgColor"]].CGColor, nil]; layer.locations = @[@0.0f, @1.0f];//渐变颜色的区间分布,locations的数组长度和color一致,这个值一般不用管它,默认是nil,会平均分布 layer.frame = self.viewYellow.layer.bounds; [self.viewYellow.layer insertSublayer:layer atIndex:0]; self.labelVipTitle.text = vipInfo[@"title"]; self.labelVipContent.text = vipInfo[@"subTitle"]; // 结束价钱 NSString *endStr1 = @"¥"; long endLen1= [endStr1 length]; double d1 = [vipInfo[@"endPrice"] doubleValue]; NSString *dStr1 = [NSString stringWithFormat:@"%f", d1]; NSDecimalNumber *dn1 = [NSDecimalNumber decimalNumberWithString:dStr1]; NSString * endStr2 = [dn1 stringValue]; long endLen2 = [endStr2 length]; NSString * strEnd = [NSString stringWithFormat:@"%@%@",endStr1, endStr2]; NSMutableAttributedString *attributedStringEnd = [[NSMutableAttributedString alloc] initWithString:strEnd]; [attributedStringEnd addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:18] range:NSMakeRange(endLen1, endLen2)]; self.labelEnd.attributedText = attributedStringEnd; // 开始价钱 NSString *str1Start = @"¥"; long len1Start= [str1Start length]; double d2 = [vipInfo[@"startPrice"] doubleValue]; NSString *dStr2 = [NSString stringWithFormat:@"%f", d2]; NSDecimalNumber *dn2 = [NSDecimalNumber decimalNumberWithString:dStr2]; NSString * str2Start = [dn2 stringValue]; long len2Start = [str2Start length]; NSString * strStart = [NSString stringWithFormat:@"%@%@",str1Start, str2Start]; NSMutableAttributedString *attributedStringStart = [[NSMutableAttributedString alloc] initWithString:strStart]; [attributedStringStart addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:19] range:NSMakeRange(len1Start, len2Start)]; self.labelStart.attributedText = attributedStringStart; [self.imageViewVip setYthImageWithURL:vipInfo[@"icon"] placeholderImage:nil]; } } - (void)onDelete { self.hidden = YES; } - (UIColor *)colorWithHexString:(NSString *) hexString { NSString *cString = [[hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] lowercaseString]; UIColor * nameForColor = [self colorNameToUIColor:cString]; if(nameForColor!=nil) { return nameForColor; } // 字符串必须最小6个字符 if ([cString length] < 3) return [UIColor clearColor]; if ([cString hasPrefix:@"0x"]) cString = [cString substringFromIndex:2]; if ([cString hasPrefix:@"#"]) cString = [cString substringFromIndex:1]; if(![self valideColorStrFormat:cString]) { return [UIColor clearColor]; } if([cString length]==3) { NSArray * colorSplits = [cString componentsSeparatedByString:@""]; if(colorSplits.count==3) { cString = @""; for (NSString * item in colorSplits) { cString = [cString stringByAppendingFormat:@"%@%@",item,item]; } } } if ([cString length] == 6) {// Separate into r, g, b substrings NSRange range; range.location = 0; range.length = 2; NSString *rString = [cString substringWithRange:range]; range.location = 2; NSString *gString = [cString substringWithRange:range]; range.location = 4; NSString *bString = [cString substringWithRange:range]; // Scan values unsigned int r, g, b; [[NSScanner scannerWithString:rString] scanHexInt:&r]; [[NSScanner scannerWithString:gString] scanHexInt:&g]; [[NSScanner scannerWithString:bString] scanHexInt:&b]; return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f]; } else if ([cString length] == 8) { NSRange range; range.location = 0; range.length = 2; NSString *aString = [cString substringWithRange:range]; range.location = 2; NSString *rString = [cString substringWithRange:range]; range.location = 4; NSString *gString = [cString substringWithRange:range]; range.location = 6; NSString *bString = [cString substringWithRange:range]; // Scan values unsigned int a, r, g, b; [[NSScanner scannerWithString:aString] scanHexInt:&a]; [[NSScanner scannerWithString:rString] scanHexInt:&r]; [[NSScanner scannerWithString:gString] scanHexInt:&g]; [[NSScanner scannerWithString:bString] scanHexInt:&b]; return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:((float) a / 255.0f)]; } else { return [UIColor clearColor]; } } /** * * 通过颜色名称读取Color */ - (UIColor *) colorNameToUIColor:(NSString *) name { if(name==nil || name.length==0) { return nil; } name = [name lowercaseString]; NSDictionary * COLOR_DICT = @{ @"transparent":[UIColor colorWithRed:0 green:0 blue:0 alpha:0], @"black":[UIColor blackColor], @"white":[UIColor whiteColor], @"gray":[UIColor grayColor], @"green":[UIColor greenColor], @"blue":[UIColor blueColor], @"cyan":[UIColor cyanColor], @"yellow":[UIColor yellowColor], @"magenta":[UIColor magentaColor], @"orange":[UIColor orangeColor], @"purple":[UIColor purpleColor], @"brown":[UIColor brownColor] }; if([COLOR_DICT.allKeys containsObject:name]) { return COLOR_DICT[name]; } return nil; } - (BOOL) valideColorStrFormat:(NSString *) source { if(source==nil || source.length==0) { return NO; } if(source.length!=3 && source.length!=6 && source.length!=8) { return NO; } NSError * error; NSString * strNumberRegExp = @"^(([\\da-fA-F]{3}){1,2}|([\\da-fA-F]{8}))$"; NSRegularExpression * regExp = [NSRegularExpression regularExpressionWithPattern:strNumberRegExp options:NSRegularExpressionDotMatchesLineSeparators|NSRegularExpressionCaseInsensitive error:&error]; NSArray * matchResults = [regExp matchesInString:source options:NSMatchingReportCompletion range:NSMakeRange(0, source.length)]; if(matchResults!=nil && matchResults.count==1) { NSRange range = [matchResults[0] range]; return [source isEqualToString:[source substringWithRange:range]]; } return NO; } -(NSString*)deleteFloatAllZero:(NSString*)string { NSArray * arrStr=[string componentsSeparatedByString:@"."]; NSString *str=arrStr.firstObject; NSString *str1=arrStr.lastObject; while ([str1 hasSuffix:@"0"]) { str1=[str1 substringToIndex:(str1.length-1)]; } return (str1.length>0)?[NSString stringWithFormat:@"%@.%@",str,str1]:str; } @end BuWanVideo2.0/PPTVController.m
@@ -7,6 +7,8 @@ // #import "PPTVController.h" #import "LoggingViewController.h" #import "PPTVNavView.h" #import "PPTVPppView.h" #import "PPTVBottomVIpVIew.h" @@ -32,6 +34,7 @@ - (void)viewDidLoad { [super viewDidLoad]; [self addObservers]; [self loadViewConfig]; } @@ -50,7 +53,13 @@ - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setNavigationBarHidden:NO animated:animated]; } - (void)addObservers { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(login) name:@"h5Login" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tryPlayFinish) name:@"tryPlayFinish" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccess) name:@"RELOAD_DATA" object:nil]; } - (void)loadViewConfig { @@ -62,7 +71,10 @@ [self.view addSubview:self.viewPPTVVip]; [self.webView addJavascriptObject:[[JSAPI alloc] init] namespace:@"yestv"]; // open debug mode, Release mode should disable this. [self.webView setDebugMode:true]; [self.webView customJavascriptDialogLabelTitles:@{@"alertTitle":@"Notification",@"alertBtn":@"OK"}]; //192.168.3.135 @@ -72,7 +84,7 @@ [self.webView loadRequest:request]; if (@available(iOS 13, *)) { } else { //将要进入全屏 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startFullScreen) name:UIWindowDidResignKeyNotification object:nil]; @@ -81,7 +93,7 @@ } //[self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL]; //修改滚动速度 //修改滚动速度 } -(void)startFullScreen { @@ -104,20 +116,20 @@ }]; } //- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { // //网页title // if ([keyPath isEqualToString:@"title"]) { // if (object == self.webView) { // self.viewPPTVNav.name = self.webView.title; // // } else { // [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; // } // // } else { // [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; // } //} - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { //网页title if ([keyPath isEqualToString:@"title"]) { if (object == self.webView) { self.viewPPTVNav.name = self.webView.title; } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } #pragma mark --------- PPTVDelegate --------- - (void)backVc { @@ -151,13 +163,36 @@ [SVProgressHUD showWithStatus:@"复制成功"]; } - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { - (void)login { LoggingViewController *loginVC=[[LoggingViewController alloc] init]; loginVC.backNotRoot = YES; [self.navigationController pushViewController:loginVC animated:YES]; } - (void)tryPlayFinish { [SVProgressHUD show]; NSLog(@""); NSString *vid = [self getParamByName:@"vid" URLString:_content]; NSString *cid = [self getParamByName:@"cid" URLString:_content]; [[YTHNetInterface startInterface] fetchPptvBuyResult:[YTHsharedManger startManger].Uid WithSystem:@"1" WithLoginUid:[[NSUserDefaults standardUserDefaults] objectForKey:@"LoginUid"] url:_content vid:vid cid:cid withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { self.viewPPTVVip.data = result[@"Data"]; self.viewPPTVVip.hidden = NO; } [SVProgressHUD dismiss]; }]; //self.viewPPTVVip.hidden = NO; } - (void)loginSuccess { [self.webView reload]; } // 页面开始加载时调用 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { [self jsAdds]; } // 页面加载失败时调用 @@ -167,6 +202,7 @@ // 当内容开始返回时调用 - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { [self jsAdds]; [self performSelector:@selector(afterDelay) withObject:nil afterDelay:0.5]; } @@ -177,6 +213,7 @@ if ([strRequest containsString:@"acmd.api.pptv.com"] && [strRequest containsString:@"bwysdqmovie"]) { self.content = strRequest; self.viewPPTVNav.content = strRequest; [self jsAdds]; } decisionHandler(WKNavigationActionPolicyAllow);//允许跳转 @@ -184,11 +221,11 @@ - (void)afterDelay { [self.webView evaluateJavaScript:@"javascript:adPlayFinish()" completionHandler:^(id _Nullable object, NSError * _Nullable error) {}]; } - (void)jsAdds { NSString *str = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"js"ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil]; [self.webView evaluateJavaScript:str completionHandler:^(id _Nullable object, NSError * _Nullable error) { NSLog(@""); }]; [self.webView evaluateJavaScript:str completionHandler:^(id _Nullable object, NSError * _Nullable error) {}]; } - (DWKWebView *)webView { @@ -198,23 +235,13 @@ // 1.原生与JS交互管理 WKUserContentController *userContentController = [[WKUserContentController alloc] init]; /// 解决循环引用 // 0.在viewdisAppear方法中 // [self.wkWebview.configuration.userContentController removeScriptMessageHandlerForName:@"ScanAction"]; // [userContentController addScriptMessageHandler:self name:@"ScanAction"]; // 1.继承系统的NSProxy // [userContentController addScriptMessageHandler:(id<WKScriptMessageHandler>)[XPZ_Proxy proxyWithTarget:self] name:@"ScanAction"]; // 2.自定义NSProxy // [userContentController addScriptMessageHandler:(id<WKScriptMessageHandler>)[XPZ_CustomProxy proxyWithTarget:self] name:@"ScanAction"]; // 添加 config.userContentController = userContentController; // 3.WKWebview设置 WKPreferences *prefer = [[WKPreferences alloc] init]; //设置是否支持javaScript 默认是支持的 prefer.javaScriptEnabled = true; prefer.javaScriptEnabled = YES; // // 在iOS上默认为NO,表示是否允许不经过用户交互由javaScript自动打开窗口 prefer.javaScriptCanOpenWindowsAutomatically = YES; // 添加 @@ -233,8 +260,9 @@ _webView = [[DWKWebView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.viewPPTVNav.frame), KScreenW, KScreenH - CGRectGetHeight(self.viewPPTVNav.frame)) configuration:config]; _webView.UIDelegate = self; _webView.DSUIDelegate = self; _webView.navigationDelegate = self; // 是否允许手势左滑返回上一级, 类似导航控制的左滑返回 _webView.allowsBackForwardNavigationGestures = YES; //可返回的页面列表, 存储已打开过的网页 @@ -263,9 +291,33 @@ - (PPTVBottomVIpVIew *)viewPPTVVip { if (!_viewPPTVVip) { _viewPPTVVip = [[PPTVBottomVIpVIew alloc] initWithFrame:CGRectMake(0, 0, KScreenW, KScreenH)]; //_viewPPTVVip.hidden = YES; // _viewPPTVVip.delegate = self; _viewPPTVVip.hidden = YES; @weakify(self) _viewPPTVVip.buyVip = ^{ @strongify(self) NSLog(@""); }; // _viewPPTVVip.delegate = self; } return _viewPPTVVip; } - (NSString *)getParamByName:(NSString *)name URLString:(NSString *)url { NSError *error; NSString *regTags=[[NSString alloc] initWithFormat:@"(^|&|\\?)+%@=+([^&]*)(&|$)", name]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regTags options:NSRegularExpressionCaseInsensitive error:&error]; // 执行匹配的过程 NSArray *matches = [regex matchesInString:url options:0 range:NSMakeRange(0, [url length])]; for (NSTextCheckingResult *match in matches) { NSString *tagValue = [url substringWithRange:[match rangeAtIndex:2]]; // 分组2所对应的串 return tagValue; } return @""; } @end BuWanVideo2.0/Recommend/ListControlelr/ListController.m
@@ -7,6 +7,8 @@ // #import "ListController.h" #import "XYRDetailViewController.h" #import "OnlySpecialController.h" #import "RecommendHeaderViewCell.h" #import "ToDayHotCell.h" @@ -166,6 +168,47 @@ [self changeData:vid page:page index:index]; } - (void)onEventBaner:(NSDictionary *)parms { NSInteger LinkType = [parms[@"LinkType"] integerValue]; if (LinkType == 1) {//普通视频跳转 XYRDetailViewController *play = [[XYRDetailViewController alloc]init]; [YTHsharedManger startManger].preController = [self fetchCurrentViewController]; NSString *video = @""; video = @"VideoInfo"; play.modalPresentationStyle = 0; play.Model = [XYRVideoInfoModel yy_modelWithDictionary:parms[@"VideoInfo"]]; [[self fetchCurrentViewController] presentViewController:play animated:YES completion:^{}]; } else if (LinkType == 2){//网页(网页) NSString *s = [parms[@"Params"] stringByReplacingOccurrencesOfString:@"\\"withString:@""]; NSDictionary *Params = [self dictionaryWithJsonString:s]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[Params objectForKey:@"url"]]]; } else if (LinkType == 3){//专辑 OnlySpecialController *OnlySpecial =[OnlySpecialController new]; OnlySpecial.Id = [parms[@"Id"] intValue]; [[self fetchCurrentViewController].navigationController pushViewController:OnlySpecial animated:YES]; } } #pragma mark 把json格式的字符串转换为字典格式 - (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic; } - (void)hideFooger { self.collectionView.mj_footer = nil; } @@ -178,9 +221,44 @@ }]; } - (void)cellClick:(NSIndexPath *)indexPath { NSDictionary *parms = [NSDictionary new]; parms = self.arrayContent[indexPath.row]; XYRDetailViewController *play = [[XYRDetailViewController alloc]init]; [YTHsharedManger startManger].preController = [self fetchCurrentViewController]; play.modalPresentationStyle = 0; play.Model = [XYRVideoInfoModel yy_modelWithDictionary:parms]; [[self fetchCurrentViewController] presentViewController:play animated:YES completion:^{}]; } - (UIViewController *)fetchCurrentViewController { UIViewController* currentViewController = [UIApplication sharedApplication].keyWindow.rootViewController; BOOL runLoopFind = YES; while (runLoopFind) { if (currentViewController.presentedViewController) { currentViewController = currentViewController.presentedViewController; } else if ([currentViewController isKindOfClass:[UINavigationController class]]) { UINavigationController* navigationController = (UINavigationController* )currentViewController; currentViewController = [navigationController.childViewControllers lastObject]; } else if ([currentViewController isKindOfClass:[UITabBarController class]]) { UITabBarController* tabBarController = (UITabBarController* )currentViewController; currentViewController = tabBarController.selectedViewController; } else { NSUInteger childViewControllerCount = currentViewController.childViewControllers.count; if (childViewControllerCount > 0) { currentViewController = currentViewController.childViewControllers.lastObject; return currentViewController; } else { return currentViewController; } } } return currentViewController; } #pragma mark UICollectionViewDelegate, UICollectionViewDataSource - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { //[self cellClick:indexPath]; [self cellClick:indexPath]; } - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { @@ -211,6 +289,7 @@ if (!self.cellRecommendHeader) { self.cellRecommendHeader = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendHeaderViewCell" forIndexPath:indexPath]; } self.cellRecommendHeader.delegate = self; self.cellRecommendHeader.arrayImageNormolData = self.dictionaryBanaer; return self.cellRecommendHeader; @@ -245,8 +324,6 @@ return cell; } } UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"UICollectionViewCell" forIndexPath:indexPath]; return cell; } // 定制collectionView的head和foot BuWanVideo2.0/RegisteViewController.m
@@ -175,7 +175,7 @@ [self.view addSubview:agreeItem]; //注册按钮 registerBtn=[[UIButton alloc] initWithFrame:CGRectMake(70, KScreenH-110, KScreenW-140, 32)]; registerBtn=[[UIButton alloc] initWithFrame:CGRectMake(70, KScreenH-110-kNavigationBarH, KScreenW-140, 32)]; [registerBtn.layer setMasksToBounds:YES]; [registerBtn.layer setCornerRadius:5.0]; registerBtn.backgroundColor=kGlobalYellowColor; BuWanVideo2.0/SettingController.m
@@ -144,12 +144,13 @@ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:indentfly]; [cell setAccessoryType:UITableViewCellAccessoryNone]; } UIButton *outButton=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, KScreenW, 44)]; UIButton *outButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, KScreenW, 44)]; [outButton setBackgroundColor:kGlobalBlueColor]; [outButton setTitle:@"退出登录" forState:UIControlStateNormal]; [outButton setTintColor:[UIColor whiteColor]]; [outButton addTarget:self action:@selector(OutOfLogin) forControlEvents:UIControlEventTouchUpInside]; [cell.viewForLastBaselineLayout addSubview:outButton]; return cell; }else{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:indentfly]; BuWanVideo2.0/YTHNetInterface.h
@@ -269,7 +269,7 @@ /** 修改个人信息 @param uid 用户id @param system 1 @param loginUid 登录id @@ -284,7 +284,7 @@ /** 获取个人信息 @param uid 用户id @param system 1 @param loginUid 登录id @@ -294,7 +294,7 @@ /** 重置密码 @param uid 用户id @param system 1 @param Email 登录id @@ -436,7 +436,7 @@ /** 获取Top10排行 @param uid 用户id @param system 1 */ @@ -444,7 +444,7 @@ /** 获取最新上线 @param uid 用户id @param system 1 @param page 1 @@ -454,7 +454,7 @@ /** 主播点击统计 @param uid 用户id @param system 1 @param Type 渠道类型 @@ -464,7 +464,7 @@ /** 获取热门直播 @param uid 用户id @param system 1 */ @@ -472,7 +472,7 @@ /** 获取直播类别 @param uid 用户id @param system 1 */ @@ -480,7 +480,7 @@ /** 获取直播列表 @param uid 用户id @param system 1 @param page 1 @@ -489,7 +489,7 @@ /** 专题类别 @param uid 用户id @param system 1 @param Type 类型ID @@ -499,7 +499,7 @@ //==================================== /** 获取商品列表 @param uid 用户id @param system 1 @param page 页数 @@ -509,7 +509,7 @@ /** 获取商品详情 @param uid 用户id @param system 1 @param Id 商品ID @@ -519,7 +519,7 @@ /** 获取评论列表 @param uid 用户id @param system 1 @param Id 商品ID @@ -530,7 +530,7 @@ /** 发表评论 @param uid 用户id @param system 1 @param Id 商品ID @@ -542,7 +542,7 @@ /** 添加收藏 @param uid 用户id @param system 1 @param Id 商品ID @@ -552,7 +552,7 @@ /** 取消收藏 @param uid 用户id @param system 1 @param Id 商品ID @@ -562,7 +562,7 @@ /** 商品收藏列表 @param uid 用户id @param system 1 @param page 页数 @@ -582,4 +582,13 @@ /// 热搜榜 - (void)fetchHotSerchListWithUid:(YthNetWorkBlock)block; /// 获取PPTV购买列表 -(void)fetchPptvBuyResult:(NSString *)uid WithSystem:(NSString *)system WithLoginUid:(NSString *)loginUid url:(NSString *)url vid:(NSString *)vid cid:(NSString *)cid withBlock:(YthNetWorkBlock)block; @end BuWanVideo2.0/YTHNetInterface.m
@@ -189,6 +189,13 @@ [self mangerPostWithURL:url WithMutableDictionary:dic withBlock:block]; } - (void)postUserRequestDataNewWith:(NSMutableDictionary *)dic withBlock:(YthNetWorkBlock)block { NSString *url = [NSString stringWithFormat:@"%@/user/getUserInfo",domainHTTP]; [self mangerPostWithURL:url WithMutableDictionary:dic withBlock:block]; } #pragma mark AFNetwork PSOT User 评论类 - (void)postThirdTypeRequestDataWith:(NSMutableDictionary *)dic withBlock:(YthNetWorkBlock)block{ @@ -263,7 +270,11 @@ [self mangerPostWithURL:url WithMutableDictionary:dic withBlock:block]; } #pragma mark AFNetwork POST pptv购买列表 - (void)pptvBuyRequestDataWith:(NSMutableDictionary *)dic withBlock:(YthNetWorkBlock)block{ NSString *url = [NSString stringWithFormat:@"%@/video/play/getPPTVVIPVideoActivity",domainHTTP]; [self mangerPostWithURL:url WithMutableDictionary:dic withBlock:block]; } /** * 分割========================================================================================================================================================= @@ -1016,9 +1027,12 @@ } #pragma mark 获取个人信息 -(void)getLoginUserInfoWithUid:(NSString *)uid WithSystem:(NSString *)system WithLoginUid:(NSString *)loginUid withBlock:(YthNetWorkBlock)block{ -(void)getLoginUserInfoWithUid:(NSString *)uid WithSystem:(NSString *)system WithLoginUid:(NSString *)loginUid withBlock:(YthNetWorkBlock)block { NSMutableDictionary *dic = [YTHNetdata LoginUserInfoWithUid:(NSString *)uid WithSystem:(NSString *)system WithLoginUid:(NSString *)loginUid]; [self postUserRequestDataWith:dic withBlock:^(BOOL isSuccessful, id result, NSString *error) { [self postUserRequestDataNewWith:dic withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { NSDictionary *data = (NSDictionary *)result; block(TRUE , data , nil); @@ -1523,4 +1537,20 @@ // } // }]; } - (void)fetchPptvBuyResult:(NSString *)uid WithSystem:(NSString *)system WithLoginUid:(NSString *)loginUid url:(NSString *)url vid:(NSString *)vid cid:(NSString *)cid withBlock:(YthNetWorkBlock)block { NSMutableDictionary *dic = [YTHNetdata pptvVIPVideoActivityWithUid:uid withSystem:system WithLoginUid:loginUid url:url vid:vid cid:cid]; [self pptvBuyRequestDataWith:dic withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { NSDictionary *data = (NSDictionary *)result; block(TRUE , data , nil); } else { block(FALSE , nil , error); } }]; } @end BuWanVideo2.0/YTHNetdata.h
@@ -619,4 +619,6 @@ + (NSMutableDictionary *)videoClassChangeWithUid:(NSString *)uid vtid:(NSString *)vtid withSystem:(NSString *)system Page:(NSUInteger)Page ; + (NSMutableDictionary *)hotSearch:(NSString *)uid withSystem:(NSString *)system; + (NSMutableDictionary *)pptvVIPVideoActivityWithUid:(NSString *)uid withSystem:(NSString *)system WithLoginUid:(NSString *)loginUid url:(NSString *)url vid:(NSString *)vid cid:(NSString *)cid; @end BuWanVideo2.0/YTHNetdata.m
@@ -727,6 +727,32 @@ return dic; } + (NSMutableDictionary *)pptvVIPVideoActivityWithUid:(NSString *)uid withSystem:(NSString *)system WithLoginUid:(NSString *)loginUid url:(NSString *)url vid:(NSString *)vid cid:(NSString *)cid { NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithCapacity:0]; [dic setObject:@"getHomeClass" forKey:@"Method"]; [dic setObject:@"ios" forKey:@"Platform"]; NSString *sign; if (uid!=nil) { [dic setObject:uid forKey:@"Uid"]; sign = [NSString stringWithFormat:@"%@%@%@",@"getHomeClass",uid,system]; }else{ sign = [NSString stringWithFormat:@"%@%@%@",@"getHomeClass",[[UIDevice currentDevice].identifierForVendor UUIDString],system]; } [dic setObject:url forKey:@"url"]; [dic setObject:vid forKey:@"vid"]; [dic setObject:cid forKey:@"cid"]; [dic setObject:Version forKey:@"Version"]; [dic setObject:Package forKey:@"Package"]; [dic setObject:system forKey:@"System"]; [dic setObject:loginUid forKey:@"loginUid"]; [dic setObject:[NSString md5:sign] forKey:@"Sign"]; [dic setObject:[[UIDevice currentDevice].identifierForVendor UUIDString] forKey:@"Device"]; NSLog(@"%@",dic); return dic; } #pragma mark 精彩频道视频 +(NSMutableDictionary *)ClassVideoWithUid:(NSString *)uid withVideoType:(NSString *)videotype withSystem:(NSString *)system withPage:(NSString *)page{ @@ -1096,7 +1122,7 @@ [dic setObject:Version forKey:@"Version"]; [dic setObject:Package forKey:@"Package"]; [dic setObject:system forKey:@"System"]; [dic setObject:loginUid forKey:@"LoginUid"]; [dic setObject:loginUid forKey:@"loginUid"]; [dic setObject:[[UIDevice currentDevice].identifierForVendor UUIDString] forKey:@"Device"]; return dic; } BuWanVideo2.0/js.txt
@@ -1,3 +1,3 @@ var bridge={default:this,call:function(i,s,t){var d,e="";return"function"==typeof s&&(t=s,s={}),s={data:void 0===s?null:s},"function"==typeof t&&(d="dscb"+window.dscb++,window[d]=t,s._dscbstub=d),s=JSON.stringify(s),window._dsbridge?e=_dsbridge.call(i,s):!window._dswk&&-1==navigator.userAgent.indexOf("_dsbridge")||(e=prompt("_dsbridge="+i,s)),JSON.parse(e||"{}").data},register:function(i,s,t){t=t?window._dsaf:window._dsf,window._dsInit||(window._dsInit=!0,setTimeout(function(){bridge.call("_dsb.dsinit")},0)),"object"==typeof s?t._obs[i]=s:t[i]=s},registerAsyn:function(i,s){this.register(i,s,!0)},hasNativeMethod:function(i,s){return this.call("_dsb.hasNativeMethod",{name:i,type:s||"all"})},disableJavascriptDialogBlock:function(i){this.call("_dsb.disableJavascriptDialogBlock",{disable:!1!==i})}};!function(){if(!window._dsf){var i,s={_dsf:{_obs:{}},_dsaf:{_obs:{}},dscb:0,dsBridge:bridge,close:function(){bridge.call("_dsb.closePage")},_handleMessageFromNative:function(i){function s(i,s){n.data=i.apply(s,e),bridge.call("_dsb.returnValue",n)}function t(i,s){e.push(function(i,s){n.data=i,n.complete=!1!==s,bridge.call("_dsb.returnValue",n)}),i.apply(s,e)}var d,e=JSON.parse(i.data),n={id:i.callbackId,complete:!0},o=this._dsf[i.method],a=this._dsaf[i.method];o?s(o,this._dsf):a?t(a,this._dsaf):(o=i.method.split(".")).length<2||(i=o.pop(),o=o.join("."),(d=(a=(a=this._dsf._obs)[o]||{})[i])&&"function"==typeof d?s(d,a):(d=(a=(a=this._dsaf._obs)[o]||{})[i])&&"function"==typeof d&&t(d,a))}};for(i in s)window[i]=s[i];bridge.register("_hasJavascriptMethod",function(i,s){return(s=i.split(".")).length<2?!(!_dsf[s]&&!_dsaf[s]):(i=s.pop(),s=s.join("."),(s=_dsf._obs[s]||_dsaf._obs[s])&&!!s[i])})}}(); var ppyestv={login:function(){bridge.call("yestv.login")},getUserInfo:function(){return bridge.call("yestv.getUserInfo")},tryPlayFinish:function(){bridge.call("yestv.tryPlayFinish")},playFinish:function(){bridge.call("yestv.playFinish")}}; var ppyestv={login:function(){ console.log("pptv-login"); bridge.call("yestv.login")},getUserInfo:function(){return bridge.call("yestv.getUserInfo")},tryPlayFinish:function(){bridge.call("yestv.tryPlayFinish")},playFinish:function(){bridge.call("yestv.playFinish")}}; Podfile
@@ -13,6 +13,7 @@ pod 'YYModel' pod 'SDWebImage' pod 'ReactiveCocoa', :git => 'https://github.com/zhao0/ReactiveCocoa.git', :tag => '2.5.2' pod 'UMCCommon' pod 'SDAutoLayout' Podfile.lock
@@ -15,6 +15,13 @@ - AFNetworking/UIKit (3.1.0): - AFNetworking/NSURLSession - IQKeyboardManager (3.3.7) - ReactiveCocoa (2.5.2): - ReactiveCocoa/UI (= 2.5.2) - ReactiveCocoa/Core (2.5.2): - ReactiveCocoa/no-arc - ReactiveCocoa/no-arc (2.5.2) - ReactiveCocoa/UI (2.5.2): - ReactiveCocoa/Core - SDAutoLayout (2.2.1) - SDWebImage (4.4.0): - SDWebImage/Core (= 4.4.0) @@ -35,6 +42,7 @@ DEPENDENCIES: - AFNetworking (~> 3.0) - IQKeyboardManager - ReactiveCocoa (from `https://github.com/zhao0/ReactiveCocoa.git`, tag `2.5.2`) - SDAutoLayout - SDWebImage - SVProgressHUD @@ -56,9 +64,20 @@ - YYModel - YYWebImage EXTERNAL SOURCES: ReactiveCocoa: :git: https://github.com/zhao0/ReactiveCocoa.git :tag: 2.5.2 CHECKOUT OPTIONS: ReactiveCocoa: :git: https://github.com/zhao0/ReactiveCocoa.git :tag: 2.5.2 SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 IQKeyboardManager: 249c3946acf61345c18b038eb50863fe2793e3a8 ReactiveCocoa: 3ff25b1bd992ac79c5c79b26b6c0c1713b715bb2 SDAutoLayout: 8bf6b3bbc8b01f775d4defbb4fda2ace805461be SDWebImage: b534502786e43dde36dfcaee89356fe6df30e203 SVProgressHUD: c404a55d78acbeb7ebb78b76d3faf986475a6994 @@ -68,6 +87,6 @@ YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 PODFILE CHECKSUM: d781d1544c8f8305855b93dab835453200677052 PODFILE CHECKSUM: 0af1450aba9f8425eb35bd1d77f5e66c55447c40 COCOAPODS: 1.10.1 Pods/Local Podspecs/ReactiveCocoa.podspec.json
New file @@ -0,0 +1,58 @@ { "name": "ReactiveCocoa", "version": "2.5.2", "summary": "A framework for composing and transforming streams of values.", "homepage": "https://github.com/blog/1107-reactivecocoa-is-now-open-source", "authors": { "Josh Abernathy": "josh@github.com" }, "source": { "git": "https://github.com/ReactiveCocoa/ReactiveCocoa.git", "tag": "2.5.2" }, "license": "MIT", "description": "ReactiveCocoa (RAC) is an Objective-C framework for Functional Reactive Programming. It provides APIs for composing and transforming streams of values.", "requires_arc": true, "platforms": { "ios": "6.0", "osx": "10.8" }, "default_subspecs": "UI", "prepare_command": "find . \\( -regex '.*EXT.*\\.[mh]$' -o -regex '.*metamacros\\.[mh]$' \\) -execdir mv {} RAC{} \\;\nfind . -regex '.*\\.[hm]' -exec sed -i '' -E 's@\"(EXT.*|metamacros)\\.h\"@\"RAC\\1.h\"@' {} \\;\nfind . -regex '.*\\.[hm]' -exec sed -i '' -E 's@<ReactiveCocoa/(EXT.*)\\.h>@<ReactiveCocoa/RAC\\1.h>@' {} \\;", "subspecs": [ { "name": "no-arc", "source_files": "ReactiveCocoa/RACObjCRuntime.{h,m}", "requires_arc": false }, { "name": "UI", "dependencies": { "ReactiveCocoa/Core": [ ] }, "source_files": "ReactiveCocoa/*{AppKit,NSControl,NSText,UI,MK}*", "ios": { "exclude_files": "ReactiveCocoa/*{AppKit,NSControl,NSText}*" }, "osx": { "exclude_files": "ReactiveCocoa/*{UI,MK}*" } }, { "name": "Core", "dependencies": { "ReactiveCocoa/no-arc": [ ] }, "source_files": [ "ReactiveCocoa/*.{d,h,m}", "ReactiveCocoa/extobjc/*.{h,m}" ], "private_header_files": "ReactiveCocoa/*Private.h", "exclude_files": "ReactiveCocoa/*{RACObjCRuntime,AppKit,NSControl,NSText,UIActionSheet,UI,MK}*" } ] } Pods/Manifest.lock
@@ -15,6 +15,13 @@ - AFNetworking/UIKit (3.1.0): - AFNetworking/NSURLSession - IQKeyboardManager (3.3.7) - ReactiveCocoa (2.5.2): - ReactiveCocoa/UI (= 2.5.2) - ReactiveCocoa/Core (2.5.2): - ReactiveCocoa/no-arc - ReactiveCocoa/no-arc (2.5.2) - ReactiveCocoa/UI (2.5.2): - ReactiveCocoa/Core - SDAutoLayout (2.2.1) - SDWebImage (4.4.0): - SDWebImage/Core (= 4.4.0) @@ -35,6 +42,7 @@ DEPENDENCIES: - AFNetworking (~> 3.0) - IQKeyboardManager - ReactiveCocoa (from `https://github.com/zhao0/ReactiveCocoa.git`, tag `2.5.2`) - SDAutoLayout - SDWebImage - SVProgressHUD @@ -56,9 +64,20 @@ - YYModel - YYWebImage EXTERNAL SOURCES: ReactiveCocoa: :git: https://github.com/zhao0/ReactiveCocoa.git :tag: 2.5.2 CHECKOUT OPTIONS: ReactiveCocoa: :git: https://github.com/zhao0/ReactiveCocoa.git :tag: 2.5.2 SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 IQKeyboardManager: 249c3946acf61345c18b038eb50863fe2793e3a8 ReactiveCocoa: 3ff25b1bd992ac79c5c79b26b6c0c1713b715bb2 SDAutoLayout: 8bf6b3bbc8b01f775d4defbb4fda2ace805461be SDWebImage: b534502786e43dde36dfcaee89356fe6df30e203 SVProgressHUD: c404a55d78acbeb7ebb78b76d3faf986475a6994 @@ -68,6 +87,6 @@ YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 PODFILE CHECKSUM: d781d1544c8f8305855b93dab835453200677052 PODFILE CHECKSUM: 0af1450aba9f8425eb35bd1d77f5e66c55447c40 COCOAPODS: 1.10.1 Pods/Pods.xcodeproj/project.pbxproj
@@ -19,592 +19,990 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 01686953CD3D80119BE2E79E920E21C0 /* SDAutoLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D8CC5EA0854A065E4F729E60EAC79440 /* SDAutoLayout-dummy.m */; }; 01D7E391E8E95AB0E70DC249E83712DE /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A722A647707E984C83F82B6E2A97631 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 03761C0962B52E53B7F8A870B2351A8F /* _YYWebImageSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A2CDDCF9D9945D00311BFC9BB8436A1 /* _YYWebImageSetter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 03B8B3005759DA608C1306825F209CD3 /* IQKeyboardManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6231466E6723272781BBF15B73FD5A16 /* IQKeyboardManager.bundle */; }; 06E5333A8E413955FD8C11FFECF520AA /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 522B392BCE6392A9BA3310DA2D5CD46C /* UIRefreshControl+AFNetworking.m */; }; 07B5C8E2673AFDE7E93458F8AA3E912B /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 403347D8D64469731D88DFA85E5BF177 /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 082BCD8FE038428839036EA7081C0667 /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = B61CD6A927AD2A95B66440B87B9D6E45 /* IQUIViewController+Additions.m */; }; 082F001006A4B880FD6DF6A40295DC36 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 77B7302933BC6D02A196B85DFEC0E21C /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; 09D03F80892A9C1F559A675D105A51F8 /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C0772AA815B383D323E200577F058EE /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0A6D1212D37F5050068C8826C6DA8CA9 /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = 776F41CDA4D3EC6CDD6E7F54C91B5CA1 /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0ACC285E6095C841069B68827972B9B8 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C4D5AFF360AAC16FD89F3B5FFE8D68C0 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CA80ED7E59E6BCE64CEEE649A3C6D2F /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = F3CA00D1ED070F8F8722D5D70F4C0C01 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CEAF7266024ECF4088E0E202CAFB971 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E187B581E63340ADBA5C35E8F029870 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00AE159D301D55ABBC0765F9F20BE3C2 /* NSNotificationCenter+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 3817622806CDE7F8532ED0A0D9CE5543 /* NSNotificationCenter+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 01686953CD3D80119BE2E79E920E21C0 /* SDAutoLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FCAD766FDC2CE25FF7F1C4A38D35DDFD /* SDAutoLayout-dummy.m */; }; 01D7E391E8E95AB0E70DC249E83712DE /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 43FEDEB0965DDD0C00F3119FF12B69C5 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0324788F8F31FCCE5BF11860F2F47EE3 /* RACPassthroughSubscriber.h in Headers */ = {isa = PBXBuildFile; fileRef = B2F16994B5C28D7970EF7C36F03AA9EC /* RACPassthroughSubscriber.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0359ED37321A51AB661D79336EE192F1 /* RACStringSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = C468790F90350EF58F5450FA9EE9E8AF /* RACStringSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 03761C0962B52E53B7F8A870B2351A8F /* _YYWebImageSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BB831B403BC247CA9F735E3F0DD3A1C /* _YYWebImageSetter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 03B8B3005759DA608C1306825F209CD3 /* IQKeyboardManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C64185489039A148112E395F72220725 /* IQKeyboardManager.bundle */; }; 05DC282BBB1E2C53B294600B717AC636 /* RACUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = 94A27524FCE58E0CE90F6BB0D089501B /* RACUnit.m */; }; 066E74AB0357DB7E2947FD0843A1CBF0 /* UIStepper+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 878C27BF809E48229882226988050790 /* UIStepper+RACSignalSupport.m */; }; 06E5333A8E413955FD8C11FFECF520AA /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F1F850E1C88A409C73C758C53D621BB /* UIRefreshControl+AFNetworking.m */; }; 0736935D474D0F6DBD5475ED3EC832A0 /* ReactiveCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FE45A096AF6F28F34D05B1EE2A443E7C /* ReactiveCocoa-dummy.m */; }; 07B5C8E2673AFDE7E93458F8AA3E912B /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B34E887546C7E507D5418F5014FD60D /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 07D8A570AD3F2351D94A86ED1DECF74E /* RACScheduler+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = 98140791FC09900C55D90B716AAA89FC /* RACScheduler+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; 082BCD8FE038428839036EA7081C0667 /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF3D5662145627E55D1E84A6A04AA61 /* IQUIViewController+Additions.m */; }; 082EE92E541CC3D1CC3741C17F6C6396 /* RACSubject.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BFC5B0260DCA507F150C3CC60D1A1D6 /* RACSubject.h */; settings = {ATTRIBUTES = (Public, ); }; }; 082F001006A4B880FD6DF6A40295DC36 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = CD2B0C489CDDF40F1BCF010799E7D322 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; 09D03F80892A9C1F559A675D105A51F8 /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 62FFBF64C5659BDE5885E1FE671FFB76 /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0A6D1212D37F5050068C8826C6DA8CA9 /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = E5CE5BE4FB1A36664CB789830D32279D /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0ACC285E6095C841069B68827972B9B8 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BAA0FAC1A1F1875B238116AE52C78963 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0ADB0B766D27D0E07044AE6C157D72A5 /* UIDatePicker+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D4D849E0522DDC9ECA6542E2066D35C /* UIDatePicker+RACSignalSupport.m */; }; 0C00AA492A9FB7B1072AAFF044FF04FC /* NSString+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 92F550E3738CD343AD02863420188AB9 /* NSString+RACSequenceAdditions.m */; }; 0C4F41E1DE82516506AAB48BE2D79C1D /* RACIndexSetSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 9375AD6D248A2BB840150BAAF3E48668 /* RACIndexSetSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0C5449D7CBF40A6E502B4AD1503FDE85 /* NSDictionary+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C27711FC7122DB21AFAB445D04B2EBB /* NSDictionary+RACSequenceAdditions.m */; }; 0CA80ED7E59E6BCE64CEEE649A3C6D2F /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = A51C443E624CAA7767652DE49FC8761B /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CD071D8A36B2094C18CB4E60D812B94 /* RACEagerSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = B8C8A25BA45E668A8A759C345CF15566 /* RACEagerSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CEAF7266024ECF4088E0E202CAFB971 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5123EF586F1A580A919F7A8F30D3986D /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0D3A5284679E75244D76D8E350E24891 /* RACChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = BA0320129ADA36D84A0B9F63B744931B /* RACChannel.m */; }; 0D5FD6CC0D49C8A7C922E477C48145C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 0D6752EE0B527FB09ED922FEEB59E55B /* YYAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 67CEF7643E18673E24232F356F77380D /* YYAnimatedImageView.m */; }; 0D6752EE0B527FB09ED922FEEB59E55B /* YYAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = A8BC32E1275B69B225822D66AE398C55 /* YYAnimatedImageView.m */; }; 0DD380B9CF013147B965CF65A815621B /* UISlider+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = BD02BB08A6B0D1404B248CAFFC7D2A1F /* UISlider+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0E34D0A633DF8637944C056D3E78B674 /* UIGestureRecognizer+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 900C8A8C15638B594D552EE4AD0B01B9 /* UIGestureRecognizer+RACSignalSupport.m */; }; 0F18A1582796BEA8047052486B92CD88 /* RACSubscriptionScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = A195EE79E18E1DC4CB6AAB254EDC483C /* RACSubscriptionScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0F8BB4CF3D1A145DBB43C3F569BFF832 /* UIGestureRecognizer+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = D1954F72ED62A75C4DEB37870483F9C4 /* UIGestureRecognizer+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1007557664FED923362FC418604C4555 /* RACSignalSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 90F36CE5A83CA0FE9C21409881573020 /* RACSignalSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 106468F1D026BCEF8F0DBD89BFD48494 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 13C27E8ACA307045C3BC4FA129336ED0 /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DC5286A839CCD48C7D9CF9DF5B14A27 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12B1BD8C315549A9AE481315F827224A /* NSDictionary+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CC1825358966CF80F3BC608380E8E7A6 /* NSDictionary+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13C27E8ACA307045C3BC4FA129336ED0 /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 35ED2DAB504EFE58B258C70FC4A8C3AC /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13FC4D88E2545CD03029F4B3D73216B3 /* RACSubscriptionScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C02B45988382D2DCD62AD8269116FD2 /* RACSubscriptionScheduler.m */; }; 14838B37F5A630740FA6E5DF1EF06716 /* RACTargetQueueScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FDD2A3F5AE20A6244BF7BE20EA35581 /* RACTargetQueueScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14F89168C65A740ADEDEA99DEE53C70F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */; }; 15A92C516BE7A3A905BD4BBAF40EE6D5 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 97886E255A49CBF2C6C41BFE4211CCAA /* UIView+WebCacheOperation.m */; }; 160EE4E1E0CF80014D10FB88DE80D199 /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 00CFD934075E076A3CBB5D21C4366691 /* YYDiskCache.m */; }; 1658CD0DF2196FAB71B3DEF95B344318 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E952070F6458D5354A580EB5C697A77 /* AFURLRequestSerialization.m */; }; 17080F40C8CDA135222099E3F6326C8B /* UIImageView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 21E3942DA473328650661A64EDF91055 /* UIImageView+YYWebImage.m */; }; 19278CD21FC6C7AA64E72D72103E7527 /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E62458700016A3E23333F3E8D05EC75 /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 196A945D73E49443D09D5470BEB02B0E /* YYImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 31C94702B36F02A8FBD634FA40ECB45E /* YYImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1A1409A5A7F08CFC2962801F1843E2CF /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = A7E093334DF63FCE9D020F9F47A81A44 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B4EA8CA1B9069B5CB12C5E26B3D467A /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B0E5C35357559413BE33DE720EF67CC /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B89EB0CBABE5CB398C0B4BBF7B2B532 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FDC0B0877D4E4A438D368B014D32B73 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1CCCE95A2F6CEB152455375994D8D16F /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5047A05DF375461B730C3048518084B1 /* AFNetworking-dummy.m */; }; 1DBA24E15219339B79A8E4F5940D91F8 /* UIImage+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 954E821E034D1D09CB9FDFB80D9ECAB5 /* UIImage+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1DF9E9B0DCFDA6932201D0C9C7466C14 /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DC4A8FC0FC0C60FE6D3C4BC0935E8C35 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15465DFEA521BD13A1A821E4DD15DA28 /* NSOrderedSet+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 98DA877195A8559A2D72EC623FDFA0B5 /* NSOrderedSet+RACSequenceAdditions.m */; }; 15A92C516BE7A3A905BD4BBAF40EE6D5 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C38B7241AF8D92CE271857AA8F681355 /* UIView+WebCacheOperation.m */; }; 160EE4E1E0CF80014D10FB88DE80D199 /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 748FD6EAC46D719B3D3A848BC4F54D00 /* YYDiskCache.m */; }; 1658CD0DF2196FAB71B3DEF95B344318 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = B158E8AED11DBADBB4AE2F8F57CD6228 /* AFURLRequestSerialization.m */; }; 16E2E5EA34FEC144941883E48D0FE5A5 /* RACEagerSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC2EC642BDF73D200250D1B9FA76930 /* RACEagerSequence.m */; }; 17080F40C8CDA135222099E3F6326C8B /* UIImageView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F9CA04FC992548C8A47C071A76A6447 /* UIImageView+YYWebImage.m */; }; 1872C9FC4BDC6F8F509162BB80BCC5AD /* RACUnarySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A9DD0510BD7143FC10DA4372A1B08B /* RACUnarySequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19278CD21FC6C7AA64E72D72103E7527 /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A52021754DA87023BB04AE4E787465E /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 196A945D73E49443D09D5470BEB02B0E /* YYImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 67F2A907D286E64A2ABD2E19B145F5B4 /* YYImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1A1409A5A7F08CFC2962801F1843E2CF /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5EE1807E84CF81D7E349D27021215E /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1A8A562D8D720140B1877F09EC08A436 /* UIActionSheet+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EC8E3B5ABD438268D92A5672EE06B /* UIActionSheet+RACSignalSupport.m */; }; 1A8CE4FC7EFC2462CA581533C839DF31 /* UITextField+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = A4DE8853B09B5819E6B4FC52DFC16944 /* UITextField+RACSignalSupport.m */; }; 1B4EA8CA1B9069B5CB12C5E26B3D467A /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 88005F4C1722451128C482D2E470A42F /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B606E53085AAC89CE94A6249D2AE139 /* NSFileHandle+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = E3653DFC0E27DCDB0229F57CCC8DFE77 /* NSFileHandle+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B89EB0CBABE5CB398C0B4BBF7B2B532 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C0C7EBCE0B616D5EABE74DC9A5FCA1C /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1CCCE95A2F6CEB152455375994D8D16F /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4205C17B2B0500B98C82A8CB25577A03 /* AFNetworking-dummy.m */; }; 1D6D9CBE2CB3F05ED63EA2673C7AC7D7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 1DBA24E15219339B79A8E4F5940D91F8 /* UIImage+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F729CD728B26013CB9E47F3DCDB8B54 /* UIImage+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1DF9E9B0DCFDA6932201D0C9C7466C14 /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 85A04F85ED4B3E9CD245216C080608F3 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1E5CC267AD2209535B5741AA615601A3 /* RACErrorSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = F8B05EE08125BAFE10DFE5D0F629BE9E /* RACErrorSignal.m */; }; 1E8258ABACC2A0CA814D58F91E8BF418 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */; }; 1F0100C3D20FA338B398C5F78B1A0365 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 277B74DC54F596293D4EC11771448E09 /* UIImage+GIF.m */; }; 1F0100C3D20FA338B398C5F78B1A0365 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 4609CACCE52D57A28244981039D1F74D /* UIImage+GIF.m */; }; 1F0CAFB943FF9A1C978D6FFFAA61ED88 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 1F6A10551E86812B881DD410A45F3DA2 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 212923F53D94AC87D65AD14BDA7520C2 /* RACReplaySubject.m in Sources */ = {isa = PBXBuildFile; fileRef = A8C453FFA1AA0B1FD8B65ECB008947B6 /* RACReplaySubject.m */; }; 219322D73B873BFA5511CB496DA3F8C0 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 22C82F140DCF6E5BA1DA2AA497E203C5 /* YYImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE70CD7B216B7ADB16EDECCCC9898C73 /* YYImage-dummy.m */; }; 233B5AF506E5E01A5F1795421178189A /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB860ABE724253F4D37024E0A728E7F /* IQUIView+IQKeyboardToolbar.m */; }; 23695135D0C88CCC90D310D5E1543580 /* UIButton+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 14BF4C9AB6A8950D65C93996A0A563AF /* UIButton+YYWebImage.m */; }; 246BFE7C6CB405B6E1733CBF11A889AC /* YYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 44525486FDDB56A96229E7264D9AB264 /* YYWebImageManager.m */; }; 249281A863DDBA3E28AA83127A59649A /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CA14631D059A039D7F2A3ED33F5BAFB /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24CBB9E8B88215A2B5D05AE6D328A9C6 /* YYWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0E7518AC47987E9CF7DF3F7ED7DA22 /* YYWebImageOperation.m */; }; 25C1ECF2D0D4F5F303EB2DE037BB86B5 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F9385E5A9AB836D8EFD8F3E69233179 /* UIButton+AFNetworking.m */; }; 260CC600A94EE3ACAEBAEE042882A39F /* CALayer+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 436563794D25F666DCD19BE37A7BBA85 /* CALayer+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 264E1A478BDFA31DA6842749C72EA535 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 87C09894B283EBD278A16FDB3EB75D77 /* SVProgressHUD.bundle */; }; 27FF07CA2721B4A4F2FC51A5904FAFFB /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 68E7E51CC244542FDB45049BFF530B12 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 282638E9CF2067D5216886757C2213C8 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC14ADFC0D82391D9F788C5B3F2643D /* AFURLResponseSerialization.m */; }; 289074B2826B48FD1E713AB6947611F0 /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = EEDD14A100639499B40FB2C6E5D99C7F /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2913A801155359C9C62EADE1D9F62694 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 32152CA18EC34FE8A59B8974A4B80F6F /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29CBD0C882A38F00F5D32EACDD098B72 /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = FAFFD33295AEB5A22C7979EE2C1C7E15 /* IQUIScrollView+Additions.m */; }; 2CA268B8B38D7FA33D18EBB971B489A1 /* YYAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC378B1DA059277B1DB48FEA6D95695 /* YYAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 223EC41EE84BF2D60EB3944BECF69637 /* RACSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F584607422D3120B7CFF79DC73EC9AC /* RACSequence.m */; }; 22C82F140DCF6E5BA1DA2AA497E203C5 /* YYImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5602FF22855607B6323A64DEC1F9CA29 /* YYImage-dummy.m */; }; 233B5AF506E5E01A5F1795421178189A /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B07244460B45F1B2BC37C8FA7BE7BEB /* IQUIView+IQKeyboardToolbar.m */; }; 23695135D0C88CCC90D310D5E1543580 /* UIButton+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = CA6F15111B25DDD99DCCF25DBEFAB9E1 /* UIButton+YYWebImage.m */; }; 246B6B4CAEC28C91BADAB5B9EDAF5894 /* RACEmptySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 61BD20DF76E954AA215311C591A55F03 /* RACEmptySequence.m */; }; 246BFE7C6CB405B6E1733CBF11A889AC /* YYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 65D6532EF4406D5F34DEA45F8A51DA8E /* YYWebImageManager.m */; }; 249281A863DDBA3E28AA83127A59649A /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B6D01C6A46F1253A49F8DB852ADC8F22 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24CBB9E8B88215A2B5D05AE6D328A9C6 /* YYWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B8B72CEB9C5BD1143D7CB3296D9C6A3 /* YYWebImageOperation.m */; }; 25C1ECF2D0D4F5F303EB2DE037BB86B5 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = A3AB1BA8B2D41ABFA4DDCCBB5C250FF0 /* UIButton+AFNetworking.m */; }; 260CC600A94EE3ACAEBAEE042882A39F /* CALayer+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 20A5861C79064C3361B7725F3BE79A81 /* CALayer+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 264E1A478BDFA31DA6842749C72EA535 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 99B3D4C59C0DB23FB84A3D24F0C14AC9 /* SVProgressHUD.bundle */; }; 26B59EBDF1E06850D46D8291B170CF80 /* RACTestScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2919F9E027ED2DF9A2FEB4B149302A61 /* RACTestScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27FF07CA2721B4A4F2FC51A5904FAFFB /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D550258B8C09106C3E3BB818732DF8 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 281A74A04DD23C7D1DE4971774950ACB /* RACMulticastConnection+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B9A9B7C75B1472A936F4E6D2C5DFC04 /* RACMulticastConnection+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 282638E9CF2067D5216886757C2213C8 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = F9B1A992271BB3FEDDF409008415C077 /* AFURLResponseSerialization.m */; }; 2839FC5750B0D92FA9C4C47D37473AAE /* RACTupleSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 57E2ABCDF61EF529A4D0031E1B423BE8 /* RACTupleSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 289074B2826B48FD1E713AB6947611F0 /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = BA6EC94FFA5C97825675C0244BF74BFA /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2913A801155359C9C62EADE1D9F62694 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 61A524733F91898AE8C910515AA38037 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29CBD0C882A38F00F5D32EACDD098B72 /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CE5121D2B1DF8872D1E09042A442AC5 /* IQUIScrollView+Additions.m */; }; 29EF1B5AC55EE7E15E1385BF485D2BB6 /* RACKVOTrampoline.h in Headers */ = {isa = PBXBuildFile; fileRef = E2425B805460ABFDDF241214F42F2B23 /* RACKVOTrampoline.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2A543D0F759273A0A433E198B7F64D2D /* RACBehaviorSubject.m in Sources */ = {isa = PBXBuildFile; fileRef = 44359BCB0BEF1D96DA3876A0E9D0D681 /* RACBehaviorSubject.m */; }; 2A742E66F9B85A09F7EAB3A2EF4476A5 /* RACEXTRuntimeExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = AEAE0771F238056B9994016BA873753D /* RACEXTRuntimeExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2A8024CD3461DE7998477C2BA9034487 /* NSUserDefaults+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 5868373245108120B0D33C04574AC67B /* NSUserDefaults+RACSupport.m */; }; 2B6F2C15996397DFE4C1EB2EA2EE3BC3 /* MKAnnotationView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = FC790DCB7BC82465D349A49441125692 /* MKAnnotationView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2CA268B8B38D7FA33D18EBB971B489A1 /* YYAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = FE367B94D6C728C276AF208CE53E50B5 /* YYAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2CD2731B5BAA1C193C6A8799AB744E13 /* RACObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = B5BCE7CF342AAB12DE8189071F30D61D /* RACObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2D173375C6C4C3373A225D9D769BE12E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 312293715694D76DFAD273155EB4B413 /* YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CABF9A305C1DA818E14D2E427EE8F6E /* YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3392F8407B8C6F47A4E47436894642D8 /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 338EE01B9A8BF03B8F154654FDF37857 /* SVProgressHUD.m */; }; 3534E888D24CF701441C1BE77C3F8571 /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = E2F02E0FA6EDE103A0023DBBF26819E5 /* IQKeyboardReturnKeyHandler.m */; }; 36E5A040B5969F53739CAE7CBFD675FB /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = 23BCBFFFAF38ACFE565CD1279A2A7E41 /* IQNSArray+Sort.m */; }; 2EC8CBDF494209E3C17D558B026500B8 /* UISegmentedControl+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = D103328D73DEC8D85F4B748B80D8FF81 /* UISegmentedControl+RACSignalSupport.m */; }; 3035AE24E4F177561B9DDA85C6FAF1D3 /* UICollectionReusableView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 0848474DE4B93376F530460F0AEC6B6D /* UICollectionReusableView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30AAA08CB85A7632E163745A33B1A1E8 /* NSObject+RACKVOWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D555489FA91BAE8137D7E10AFE52E644 /* NSObject+RACKVOWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 312293715694D76DFAD273155EB4B413 /* YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 80858E3A6DAE804A9A5D0C0BFC8ECF73 /* YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32847A1E157C22EA34F7C4E3FD401A13 /* RACMulticastConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B5C14B83BF494FC37393EF0A044FE8C /* RACMulticastConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; 337D6BB46524504CC371A1948E6CF525 /* NSFileHandle+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AB09CF98E54E12254F38AD90A9D85B9 /* NSFileHandle+RACSupport.m */; }; 3392F8407B8C6F47A4E47436894642D8 /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EE01DFD16660D22DC57C56115B9511C /* SVProgressHUD.m */; }; 348E248BFE74155E0C49FE6EF4B2B113 /* NSUserDefaults+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = E334FF3B79C08A435863880297EC647F /* NSUserDefaults+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3534E888D24CF701441C1BE77C3F8571 /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = C6749570D1ADFBD1832728C1D966D23C /* IQKeyboardReturnKeyHandler.m */; }; 35B4FDEF4026F2BF599BDD239E3531E9 /* RACCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 8453CF9C00D6DAA765CAC20A933A583F /* RACCommand.m */; }; 36D2AA6D0E48D5BAF9335437E39212C7 /* NSString+RACKeyPathUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 98DDB64E58946DC23B6C3B693A0C56BF /* NSString+RACKeyPathUtilities.m */; }; 36E5A040B5969F53739CAE7CBFD675FB /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FC794CFD745AD723C0AB24EEAC6B922 /* IQNSArray+Sort.m */; }; 3736A8BCD00246F0307314AFF8A722F1 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */; }; 37D20E5E8D97C2E024A584681BE908CD /* YYImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FF757B06FC51079DE3E74976127FC490 /* YYImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 38253CEF04E53A38CCF2E9904F6E5071 /* YYImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6D8478A9EBA8567512E695CEBB58EF /* YYImageCache.m */; }; 3A3E8ECDD4DA8B9C235F539C2BE24C65 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC82EFB2C6B435B223A64E725C9E568 /* AFURLSessionManager.m */; }; 3762317630AD2C73ACE7CAE48FABCC8F /* UIStepper+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F34D023FAAB083ACDDD7A2ADF33C1851 /* UIStepper+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 37D20E5E8D97C2E024A584681BE908CD /* YYImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 33AB6B81E9C6A52B4A837E8D76123295 /* YYImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 38253CEF04E53A38CCF2E9904F6E5071 /* YYImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 86C9D6E5E6EFDC3C5CDE58AFE73F44B2 /* YYImageCache.m */; }; 3A3E8ECDD4DA8B9C235F539C2BE24C65 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A8BD8FBB95072C2A4A9D8B3F046171 /* AFURLSessionManager.m */; }; 3A610394B6B3BAD839E2BFDE78F54B09 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 3AAB542C649A5CD2B56B914AD8823E9C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AD6E8DFA8A95F045C0E5EACCECE804C /* Security.framework */; }; 3D1DADFAD6A4BA721C0075CA32BDD633 /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EB255DCF0E56A85B9D8D475576A026C /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3D246CE1D817A0EE00F8D8F9DD4BFE26 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = C07901861F7033136A10E9E079189DE0 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3EB3343E3237E27BF431177ADD3A5CBF /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 199D63082191E4E0094F9E922C5B4353 /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 40DBC045F76B6E92E5C751110CE9C869 /* IQUIWindow+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 666FDAF0A4607C7E635294B50E8583A8 /* IQUIWindow+Hierarchy.m */; }; 416BEF9978A1BD50545717CAA92F476A /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 064F4C4BF9323C0B2DF7050F670C30D4 /* IQUIView+Hierarchy.m */; }; 3D1DADFAD6A4BA721C0075CA32BDD633 /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AF4577F59CF32DBE4466F1648D450CB /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3D246CE1D817A0EE00F8D8F9DD4BFE26 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B2AC081E027B9973EC5516F4FC2A080 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3EB3343E3237E27BF431177ADD3A5CBF /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E409F177B91C8024B6A14FCB4A5718D /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3F671C2E5DD53C12ABF87E3FFF378318 /* RACSerialDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = D999AA74EACE8BFEA6095485583F9FC0 /* RACSerialDisposable.m */; }; 40DBC045F76B6E92E5C751110CE9C869 /* IQUIWindow+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 73FD92AACA61A2DCCFD48D05CDA8FF40 /* IQUIWindow+Hierarchy.m */; }; 416BEF9978A1BD50545717CAA92F476A /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = D73115BC0307E5D9C826EA7896F3150C /* IQUIView+Hierarchy.m */; }; 41C06E6FB57F432EF39C6B915FEDEFA2 /* UIImagePickerController+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = FBEF70DB009A6AE2E009814F5936E336 /* UIImagePickerController+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42B47E77D4307132B577801DFDAB4CCD /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FFED48445D4C690FD88E438116ED89BD /* Accelerate.framework */; }; 4381C0C2775DF318539274584275BCB1 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = ECA462F2698E894555C1B7BFAD347E13 /* NSObject+YYModel.m */; }; 4762EA920C9F9819455692BA3EE71354 /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 276CE4C9368DCF201C8020FDC956603E /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4381C0C2775DF318539274584275BCB1 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CC44335CA52698D41D74DF0DF7C0E147 /* NSObject+YYModel.m */; }; 43F15A40517D0CE8C45D42323BA5111D /* RACKVOChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 947D043281885DFE8E92EAC756993910 /* RACKVOChannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 453F36F96611182025D9C4CF66679811 /* RACTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = A7180998FC103032D8E88A178405C4BE /* RACTuple.m */; }; 462F886C642EF09D0B7D46572BE796EC /* RACReturnSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CC16DE85EED25CEDCDF598ACFF9CE8 /* RACReturnSignal.m */; }; 4762EA920C9F9819455692BA3EE71354 /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = CFCBA79B002E9A756BCF52BE603D82AD /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47FFF84BE18DE7F0EB2416D17F699F55 /* RACScheduler+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = CA0B2C35340007DD7FA1A7950DEEA7EB /* RACScheduler+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 482E36AAACA318DA959AE2483AEF02D6 /* RACCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 833AC91B582C93032622D0F76E1E5768 /* RACCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4915520B56F1D9EE53C133ACE7EBB24E /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */; }; 4B4AD435A9EE19886E4C62760BAD63B8 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = B46936C03AE70A35AD70DD2631D87E30 /* SDWebImageCompat.m */; }; 4E0B40AA7188E6833F0B9360C5B74D79 /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 74D5DA7238E160253A95D43C0B5A4F2D /* YYCache.m */; }; 4F7A7E7060578A2E22141D37FCD0E99C /* UIView+SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A1CB53CA3AB4D8680DE596155FA9ED6 /* UIView+SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; 50610569C8916D516CC73F63950CCB84 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E53EC95813F9ED2C02C25B21AF2E3C5 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; 510E404D41BEC8DF78F85A7DDE7B56E1 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BF83A817AC689F9973FE34E2899AA4 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 521AD1329887CB8273DF9131F7333624 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F55B88B20E8DBC00ADF538D1E100A82 /* SDWebImageCoderHelper.m */; }; 53053E6349DD9D4D31071F38E392BF59 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 423B0DD5CBA7AEDD53CC8590726B838F /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 545A75E3EEACE311E80B97663712095C /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F6AEAC98FD2F93167BDA306D2DE93C3F /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 551E99BC10F7CDC9BC88F87F781671E9 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A3A182F138404FF1C5E4492D48F71E32 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 58093D9B7E8597171CBF5CFF90097DE0 /* _YYWebImageSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F761F215F2ED99F5C58244DEE41957C /* _YYWebImageSetter.m */; }; 49E9DCC5114DE66808AE2344D54D6045 /* UITableViewCell+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = D77134E6892BFE82EF868BD34A118BC4 /* UITableViewCell+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 49FD48552CF61BA11BA1DF1DB818096E /* NSData+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = BB25E43C6D1DE779F80D3627E305B364 /* NSData+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4B4AD435A9EE19886E4C62760BAD63B8 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E86E9DEF29FD0FC1AB0A7F719F1A639 /* SDWebImageCompat.m */; }; 4BC1CB5FB72CDE1EB8A7A7CDF69D83B1 /* NSString+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 78613155C0BE74CD8CDAD57324AACA8E /* NSString+RACSupport.m */; }; 4C9557DF19D731B63533B218BB24FA89 /* UITextView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A78D4790F17D229D6C0868F53E0E245 /* UITextView+RACSignalSupport.m */; }; 4E0B40AA7188E6833F0B9360C5B74D79 /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 49113269607E4F08B7CFA6148EC3DBEB /* YYCache.m */; }; 4F7A7E7060578A2E22141D37FCD0E99C /* UIView+SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FE10A5EE645311CE6977A21BC5B0698 /* UIView+SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; 50610569C8916D516CC73F63950CCB84 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 019DA6AC9B8183E37BEA239CC2868A58 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; 510E404D41BEC8DF78F85A7DDE7B56E1 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B51CD7EB9C0CAAB70DAA7266265903 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 521AD1329887CB8273DF9131F7333624 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = BA8BBA26EF90C8FEAE8A1A4147A8F995 /* SDWebImageCoderHelper.m */; }; 525CEBC70B390685EC59D17DCF9284E7 /* NSArray+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = BED23C37C5BBF70FFEFD4925BACF3AA7 /* NSArray+RACSequenceAdditions.m */; }; 53053E6349DD9D4D31071F38E392BF59 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E466463DF8B3AE64DD9C973BCF30D29 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53247B558DF2156FEFD2FBB28A018321 /* RACDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = 98816DCB7AB298E8BC997ED4850F5462 /* RACDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53268BEB74BB363EEA2B4E4F6806B815 /* RACScopedDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = 158483EA3C0097D27339FE47E7E163AB /* RACScopedDisposable.m */; }; 545A75E3EEACE311E80B97663712095C /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A43EF1279DE5F7EC31453352EC5C151E /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 551E99BC10F7CDC9BC88F87F781671E9 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 77D703F77CE0DD41A9F009FD6E2F0D5F /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 55B3E720A0357FA6653DF992715E8E8E /* RACSignalSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 80D395D3DF01AE93D254385A2D56B74D /* RACSignalSequence.m */; }; 58093D9B7E8597171CBF5CFF90097DE0 /* _YYWebImageSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = C26CC8AF49451A3472849F13615F5721 /* _YYWebImageSetter.m */; }; 58AEC8AF3B611C7C1791067ECADAB282 /* NSString+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E3666D3A03026EF31697B7736F001546 /* NSString+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 591A8317F58698083EA0925D454B1F77 /* UITextView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 44F7854B861E24CBC750ACC1CEE01A73 /* UITextView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5A47720AA3478ABCD79FC59654FE66A9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 5AD6365AF464A2FB29405CCBF671449C /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = C931BFAC1492FBAD2150D90870044B64 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5C2234296AADE84E794617E7D34E67F6 /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 65C8D432CB8AEB2482293031D7FB17EC /* IQBarButtonItem.m */; }; 5C74C17AB844AC9F6C13EEFED38CF41F /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AFCE8DBE0A4C0EB931EF252B1E23E5 /* AFNetworkActivityIndicatorManager.m */; }; 5D472E3F0DD3276633EE91E830A0D29F /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A7D01EB7485DD6573A8E179985B9283 /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5E1A0543905AB8FCAC0402AF11B81281 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1138BDB8408523552A38A32B6A83A31F /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 614AD41B1BBFF1692CCCDA43B44C31AB /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = FB40F6AB3391D3DA0027EC49BD9CE401 /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6218AABA7D60EEE58F24657D65595CC1 /* YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 24FE9AC4A49F1392F5792CA37EAEC008 /* YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65221D8847419CEC03519C8FA5624619 /* KeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 90FE38F4186C1FBFC016BF52A9211D7A /* KeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65332E624BEBAC6BED2932B7A9B70F7E /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 161A37E3C472DFF98A4831F759041736 /* SDWebImageFrame.m */; }; 6657CC5A77D6A6A366F5BA87241BC7B9 /* Pods-BuWanVideo2.0-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B794B4FBBA19E0D4327C041ADBFD6E1 /* Pods-BuWanVideo2.0-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6782FD484DE28206A848E06EDCE055D4 /* Pods-BuWanVideo2.0-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E40F103D1F2E2CA838F80D0BE5EFC4D /* Pods-BuWanVideo2.0-dummy.m */; }; 67E7CC98657717872D159DA4F0AC3110 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C2429A01B58547277CA5AE9257FC93AC /* NSButton+WebCache.m */; }; 6A06F5531F501AD4F245B9832B685C38 /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 28BE94CD106A8C4F00420B542A2D9F16 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5A73E0971EE149AF6C87D3E116731130 /* NSObject+RACKVOWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3367EE331F736AF3909E52253D32DBEB /* NSObject+RACKVOWrapper.m */; }; 5AD5F93B19E36953E086CA873D3B270D /* RACObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 17AB1FE005A0732C82438CC799768391 /* RACObjCRuntime.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 5AD6365AF464A2FB29405CCBF671449C /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B664162C8D5BF47E619C08321B2499D /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5C2234296AADE84E794617E7D34E67F6 /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F1DD8AB7EE0FA14CF829CB8FDE868E8 /* IQBarButtonItem.m */; }; 5C74C17AB844AC9F6C13EEFED38CF41F /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 814878CB0DE6801FB2C3F086C3DB47E1 /* AFNetworkActivityIndicatorManager.m */; }; 5D472E3F0DD3276633EE91E830A0D29F /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9207278B9D4AB9254B0DB88F04F95F12 /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5E1A0543905AB8FCAC0402AF11B81281 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B43D7DACAC40381CE45C3164522A8A /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5E8062C4CA7CFF864E870DD32EF373D0 /* NSURLConnection+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 224E5D87CBD046E04A0A65DFB5DE2BC4 /* NSURLConnection+RACSupport.m */; }; 5F86F0A9416CF47DE55F7C1F333F9B20 /* RACSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E4881518C81EE4B8B6CEE5ABA2A936 /* RACSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 614AD41B1BBFF1692CCCDA43B44C31AB /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = B588FB5B5FC3BDBB4A0F4165E640A5A0 /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 61A4F8288571431BD9CCAEA01D489B8B /* NSObject+RACPropertySubscribing.h in Headers */ = {isa = PBXBuildFile; fileRef = E88D6DAB1482251E1381F7ADFFD504F2 /* NSObject+RACPropertySubscribing.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6218AABA7D60EEE58F24657D65595CC1 /* YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 56F51A923876C6B57829933883B4C084 /* YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6306D961C138CF5C115F53C8B01D2324 /* RACEmptySignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 50650CAA18C2C10BA1E811D6F7F55039 /* RACEmptySignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 633BFEC434FA1AC4DCB86B134D8120C9 /* RACQueueScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = A8880B484489FA1ECAF24AFAE683C16B /* RACQueueScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 644259BC00D7510C939873AB975D0580 /* MKAnnotationView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B0A7591C6FBC7202F295E779FD1323B /* MKAnnotationView+RACSignalSupport.m */; }; 65221D8847419CEC03519C8FA5624619 /* KeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CD92FA027BFCD405F343A81FC99C8AE /* KeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65332E624BEBAC6BED2932B7A9B70F7E /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = EBF6F1933EA0456A19C40D1ECD1F203E /* SDWebImageFrame.m */; }; 6547F42706FE0F450AE76B538609FD26 /* RACDynamicSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = E80EC1428998ED15F19267485D7BBA50 /* RACDynamicSignal.m */; }; 67E7CC98657717872D159DA4F0AC3110 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE82E236609C1EBFA68AF66C47C644 /* NSButton+WebCache.m */; }; 69F5D0AF17D22DD8DCDEF2A118D99554 /* RACDynamicSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EA4085253678493F59845F2B77ADC79 /* RACDynamicSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6A06F5531F501AD4F245B9832B685C38 /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 97CCC96F312B584AFDC931C045B035D3 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6A522FD6027D430613F767326A47CF52 /* NSObject+RACDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 550D4ED99E2D46472D0C1EEFB7DBCAB4 /* NSObject+RACDescription.m */; }; 6B2382229D769F71D1BAB712CB085E93 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA9BD546B398156542593B6FD8FA13D6 /* SystemConfiguration.framework */; }; 6B9DE8A420537AC967C0A87E43FDF3A6 /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB1F0CC71FD4A9C5F0E8B09BC450A76 /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6CA3ADBF9BE822A05AD91650CECE05C8 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 25805FC802E30CB4DEF62B580AD7C0DC /* UIImageView+WebCache.m */; }; 6E118A825C37D28DEBA12D4CC43621DA /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE56B9020EA08B1264A713571D82EAC /* YYKVStorage.m */; }; 6F6C6AA412D71F441DECD84528B6ED55 /* YYImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 735F66840C380AE30470C97BF7AC301B /* YYImageCoder.m */; }; 6F6F3576CC9FA481EFA3723EFF19BE10 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A344B319BEC0E1B8A28B5AE3C427899 /* SDWebImagePrefetcher.m */; }; 70BE02AB7D87BA952406D342473E52BE /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = DBE470B5103AAD174FDEFED1D372D753 /* SDImageCacheConfig.m */; }; 6B9DE8A420537AC967C0A87E43FDF3A6 /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 70928C74247BE51F102A438F71B54F0E /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6CA3ADBF9BE822A05AD91650CECE05C8 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B9DCC8659F13FE0EB07E99175B192159 /* UIImageView+WebCache.m */; }; 6E118A825C37D28DEBA12D4CC43621DA /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = BFBCD62A75EF89430836862FE02E4293 /* YYKVStorage.m */; }; 6F39836FEDB917CEC130865A29D6A49B /* NSString+RACKeyPathUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = A8DAFD8E017204BB5BAB0708BCCBF8F0 /* NSString+RACKeyPathUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6F6C6AA412D71F441DECD84528B6ED55 /* YYImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D4EF8B1FB9EA633057C722A0D7B2BD /* YYImageCoder.m */; }; 6F6F3576CC9FA481EFA3723EFF19BE10 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F01FF58ED09D88DA9B84D9B8C70CBC1 /* SDWebImagePrefetcher.m */; }; 708FD0F6ED2181AF6CFB102B07AE9736 /* RACBehaviorSubject.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA029B4A4A952E7810299FFF0C30A63 /* RACBehaviorSubject.h */; settings = {ATTRIBUTES = (Public, ); }; }; 70BE02AB7D87BA952406D342473E52BE /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F8593FC6D7BA66876D7E1E0DB2B210 /* SDImageCacheConfig.m */; }; 711D0CCAD93057E832D238B2BC5A6033 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */; }; 720ECE6897B4E06BCB36CFF15CDE4086 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BA64E9B6956CB8B50404D1109AF2B0FC /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73D83703524EE58AEEBA1052C720671E /* IQUIWindow+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 74D3AD2E8CB8E9FD5B6ADD640D6AAB18 /* IQUIWindow+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 74DCBC98B76908869FD23A65B6645252 /* UITableView+SDAutoTableViewCellHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = 7852085FC4FFA2B275BC46043D03C538 /* UITableView+SDAutoTableViewCellHeight.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7693ED98971103A809300586EB4096F4 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18E77A78AB5601DA1A19A7E0B437E203 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7709A6A2F8BDA356D0418B89A01B4D31 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = DB04FCC2775BBC134AA91CDE58E9CBA8 /* UIProgressView+AFNetworking.m */; }; 781F3526AF90F13DAEDAD4253E29D082 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 004B93B66E20FB5EA371BD2D5A2A176D /* SDImageCache.m */; }; 79277E06065625F5473ED7D0626C3A68 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = B450207B23EC4430E17575125E7C6FB9 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 79FD7C8EFDB479D2EB1BF9B2E0B24DD0 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E8F7E358CF6EE0D4983A0AF618A86D4 /* SDWebImageDownloaderOperation.m */; }; 7CFC9AFD1D190791F910F4A5A2BAB553 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F764FDB5F9B0181ED0316445471D3C /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7D496B6EF9D73C90F8DAE3FC6CA071FE /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = DDEA2F8CBD187ED244641ECB5CAE904E /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E6E6846E6395A179A7C0755F565712F /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D8DB7FE9CE9C64DF0DD6CF4FD7AF501 /* YYMemoryCache.m */; }; 7EC8E8BC904C8DEEA88BBA95A154667E /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A272000203E690BDDF171A04E002113 /* UIView+WebCache.m */; }; 7EDD1704F7BA5A5F0205E0723E4FC971 /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B3A615FAD585E5A40B20867999D7BE4 /* IQKeyboardManager-dummy.m */; }; 720ECE6897B4E06BCB36CFF15CDE4086 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F9B0A75E7D51A7D9CF2972FEAB6FC4 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72639114A8E00E411B7931609CEECEF1 /* RACDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A3EBB3FF5880ACE149AD6943F34E11 /* RACDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73D83703524EE58AEEBA1052C720671E /* IQUIWindow+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C3853C907D62B6CF7911F8A39BDF54C /* IQUIWindow+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 74DCBC98B76908869FD23A65B6645252 /* UITableView+SDAutoTableViewCellHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = B609706CC8B36378E05276D7AB98D5BB /* UITableView+SDAutoTableViewCellHeight.h */; settings = {ATTRIBUTES = (Public, ); }; }; 75DED089B685357D34569CFC24045E73 /* RACStringSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D95FD0F87F5CD1A4DAFCA4E7EAA87E1 /* RACStringSequence.m */; }; 7693ED98971103A809300586EB4096F4 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E14A4529B80BD6D6B2B869262602FA72 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7709A6A2F8BDA356D0418B89A01B4D31 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 1855988F316B6F522AD9424B194D1818 /* UIProgressView+AFNetworking.m */; }; 777B08381903387AEBE83CA0713DB562 /* RACIndexSetSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = BFA429B6507B97E1DB640B327AEEAC79 /* RACIndexSetSequence.m */; }; 781F3526AF90F13DAEDAD4253E29D082 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E9A0EA2D9E1FEC80A7449FDB9FBEF5 /* SDImageCache.m */; }; 79277E06065625F5473ED7D0626C3A68 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = CB2B377748802219807AEC79B42643B4 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 796479DBF7957AA0153A83183FD7A278 /* UITableViewCell+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = DE5ABC7124DD5740F19D35EB3345161B /* UITableViewCell+RACSignalSupport.m */; }; 79754E9B3C4404A6B808E18EF7EED7FE /* RACBlockTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = F005F95DA9816FFC3C645FF2CF1A34AA /* RACBlockTrampoline.m */; }; 7981DD1D07B466400300755F572B5FFB /* NSOrderedSet+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 156CEAF82F165222EB93E27807ED730A /* NSOrderedSet+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 79FD7C8EFDB479D2EB1BF9B2E0B24DD0 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 51B13B8D7A3003456A4D115BA461CFFE /* SDWebImageDownloaderOperation.m */; }; 7C24AAF711EEFFE33DC03B2663B71B21 /* NSEnumerator+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CF0218D422241C628F1FE04E229D140 /* NSEnumerator+RACSequenceAdditions.m */; }; 7CEBC925DB1FA8AC1B944294F7F79F9F /* RACValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7244EB669A442CD41E0E97236B6C0771 /* RACValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7CFC9AFD1D190791F910F4A5A2BAB553 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 19382336CC66C11EE9CB466C0653DD63 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7D496B6EF9D73C90F8DAE3FC6CA071FE /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 97FDB4289325AA57C7C02A0DEBCD14A9 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7D9B234A80745375B69B16745BB6ECF6 /* RACDynamicSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = C6F4DF4BADD492B836AC4B7BEC1CBFF2 /* RACDynamicSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7DE20C090855CD99A5D208A3410AF5F4 /* RACStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E4E6B20D47B5ADA5444AC46ED5832D8 /* RACStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E6E6846E6395A179A7C0755F565712F /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 12EE1B3754DB8169317EAD351E8CC5D7 /* YYMemoryCache.m */; }; 7EC8E8BC904C8DEEA88BBA95A154667E /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B36F0542A406F6F794DA6B8A7BE9CA4B /* UIView+WebCache.m */; }; 7EDD1704F7BA5A5F0205E0723E4FC971 /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93680FCA5D70F06A1FE07B53BD2D470F /* IQKeyboardManager-dummy.m */; }; 7F52BD0341E46A6053B15014557ACB6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 824587F89090ED9CC9033F61A77724B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 824870F519CB0826C1156BA0B1EBD2F2 /* SDAutoLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D1FCBF17339E0503FC0A5815A8B59B /* SDAutoLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 84084D48DF90D4854965E8D87E848C1A /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 79FEC923DCFB592C5B0707E8A32F6E99 /* AFSecurityPolicy.m */; }; 85EF941A4BDD8092002F420CC2BB7ADD /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C0B51074A42033961C10F7B0900C715 /* UIActivityIndicatorView+AFNetworking.m */; }; 8729F89654316F693E74C3C079897D6D /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FA3696182C088F327A126D8E13EB9D5 /* IQUITextFieldView+Additions.m */; }; 824870F519CB0826C1156BA0B1EBD2F2 /* SDAutoLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 565F37EF9ECE829784E7C27D4E7C3133 /* SDAutoLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8356648C8026AB8EBA631C6D2DD179C4 /* NSObject+RACDeallocating.m in Sources */ = {isa = PBXBuildFile; fileRef = 595B21677F2F1603D6B7A94F494AFC56 /* NSObject+RACDeallocating.m */; }; 84084D48DF90D4854965E8D87E848C1A /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = B08B301668C17E4DED669484C56AFA7D /* AFSecurityPolicy.m */; }; 85CBFF9F7DC7598A6A2BE6B2FA3CDC84 /* NSIndexSet+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BE0A6BB0CE10019E62B062479041392 /* NSIndexSet+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 85EF941A4BDD8092002F420CC2BB7ADD /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 346B5892710DB600A2A5DBFB606ACDD5 /* UIActivityIndicatorView+AFNetworking.m */; }; 8729F89654316F693E74C3C079897D6D /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 51B8B1865321000DBF691A1F865A49D8 /* IQUITextFieldView+Additions.m */; }; 876EFD89D31B4898FCFEEE681815443B /* UIBarButtonItem+RACCommandSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 12BA37936417B2075E52E2050C1A4759 /* UIBarButtonItem+RACCommandSupport.m */; }; 877D257E7B0B1D74A230DCD6B4113ADD /* RACPassthroughSubscriber.m in Sources */ = {isa = PBXBuildFile; fileRef = B686B8FA39EE0D567BFC6BD27B1310F2 /* RACPassthroughSubscriber.m */; }; 881BDB53E45DFB3050B7F13A5399C209 /* UIBarButtonItem+RACCommandSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = B7D2668FEF5668B4F39FF42E7CAD610E /* UIBarButtonItem+RACCommandSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 88DE9AE01F97FD29E9D8793174A5BF14 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 8AF811EB2E5208003431E85B00F983DB /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = B06935E915BC7EE24FF39FEC596A42B8 /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8B71AC80C50029397575DAEA33DAEAE9 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 26892DA0ECD5B12C8FD4073EAD1E9237 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BA6B74504A7404B3187C31073A5812A /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E0330675D0150100081993C047FB3D7 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BF86037EDF057C8E6D6C9DFFDDA36A3 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 7287F2809D154FC010E08FD9CE21148F /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8C43B7D0D3865D9A9C4D49EF82334CE3 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A735E9C2405BD745A1E76AA06DA294A4 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8D9B945F0AFBC1D1097696AB22F99BCF /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = A566BFDC3300AE83207B09AF697540E0 /* SDAnimatedImageRep.m */; }; 8DD422F65B364DB9C1EAE655653561A7 /* YYModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C98F4C1A08FB254B89E0A2D10711986B /* YYModel-dummy.m */; }; 8F70E70E64F899537D38A1F79F8D57B5 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = A83B21C0E415562B7F3AA852853901B2 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 905A5BD8B0732532496FAA4BCA58958C /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ADAC7154F49562704B1C3D92C45BDE93 /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8AF811EB2E5208003431E85B00F983DB /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = D314D61BBEC86DC8D663F9DB536A85AC /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8B1B7A5DCA698775C6BD816AABFAAEFA /* RACScopedDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = C3ABEDEE908C79771507FAC199F6488A /* RACScopedDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8B71AC80C50029397575DAEA33DAEAE9 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = D50615C98040D7A8F05D6516C09CA9FA /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BA6B74504A7404B3187C31073A5812A /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C37D08E516C63DAD0005156414E6C06 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BF86037EDF057C8E6D6C9DFFDDA36A3 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 24480AA9A20ED501BC7CB73F906BCBE1 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8C43B7D0D3865D9A9C4D49EF82334CE3 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 40B4AC6F6400166DCE5B9D4B07D26B6C /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8D9B945F0AFBC1D1097696AB22F99BCF /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = B5118F54CE1FC484D8EF0DFF4C22AC4F /* SDAnimatedImageRep.m */; }; 8DD422F65B364DB9C1EAE655653561A7 /* YYModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B922B10C69ED4316FF058381FF254C2 /* YYModel-dummy.m */; }; 8F70E70E64F899537D38A1F79F8D57B5 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = F209D369E0B2AC308D7ECFEC3CD412A6 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F72A8A13CA8FC3E305C1535E41D04EB /* NSURLConnection+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 2935D9B072D3E7A83648AD1B45D7A1CF /* NSURLConnection+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F9007604EDE67D2D13CB13356F95659 /* RACEXTRuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C630C0A887F984C3A255809B69E2342C /* RACEXTRuntimeExtensions.m */; }; 905A5BD8B0732532496FAA4BCA58958C /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BA8E501E142062CAB635E8D44F4FD0B2 /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 91B9A2A4C61C5D595A0F0419A325AC40 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; 924BB695217934F16F8E192BF617FC83 /* UIAlertView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B7D7FF5A35E89A06418103D502E8B36 /* UIAlertView+RACSignalSupport.m */; }; 928F8138E2582858005CA31B3141CDC3 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FFED48445D4C690FD88E438116ED89BD /* Accelerate.framework */; }; 92C28AA1FA2F8C956842FD8F139FEAB7 /* UIImageView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 52E1DCA567703CCCA3596EBF6DD74067 /* UIImageView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9402C6C6CB65FA5044809FF0975BFE4D /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E7BD087582D365B7C7195190F03660 /* IQTitleBarButtonItem.m */; }; 92C28AA1FA2F8C956842FD8F139FEAB7 /* UIImageView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B213228D95FB56208B6334F46E485B8C /* UIImageView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 92FCC7ECEDA4C066663C0843A759463B /* ReactiveCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B7EDF8E75B2CB2566D3F4512274A114D /* ReactiveCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 932DF66B84716C4423EA6410F9ECA1F5 /* RACmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 55AA30B54E883389C97CFE781CEB6994 /* RACmetamacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; 93CC6A2CBD4762B7F8949E453C59DD75 /* NSSet+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 056ACD6BFE21EC8D6FE0D0A36F310CD6 /* NSSet+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9402C6C6CB65FA5044809FF0975BFE4D /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3148D8593CB285438F27A9DE1B2D69F8 /* IQTitleBarButtonItem.m */; }; 940687B883484C7E1E26D6798AF033C1 /* UIButton+RACCommandSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A2F2DD222FD70D3E1E40D7F8BEB13EA /* UIButton+RACCommandSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 94AC2AFF07AFF95D801F947F2ABBD51A /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 96EADE99073DBA8FCE7904627E2D18EE /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 40C0478F247FD53447751EDB888A0EC9 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 97F1A9CA6BBC0096DF0C1FFC7E66A90F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 98E7FA15BF438999C6844F3B4C5B7C7F /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 158B6C4D9030F93BCCE250DFE085B1EF /* IQToolbar.m */; }; 95BDD71EF01FCC27312EFF595F4DB16F /* NSNotificationCenter+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 08C56FBC976B8B7972E9967F28F22F9D /* NSNotificationCenter+RACSupport.m */; }; 96EADE99073DBA8FCE7904627E2D18EE /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = D4C479BCE7C508653EA1627FE4B17425 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9718D5CBD857231C24D37F08DB97BD8C /* RACKVOProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = F91C975E8C7DB9346E2B9C5AB3E81C0C /* RACKVOProxy.m */; }; 976D20E5B6257D0EED254049511BFDEB /* UIControl+RACSignalSupportPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = C12091C957E009164D69B6AFF58A24F9 /* UIControl+RACSignalSupportPrivate.m */; }; 9854F625EB691C938CB938AC14F7A2C7 /* RACEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = EA66F561A1C07CE8E662344E57451964 /* RACEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; 986389AB078ECF507FDED38D12A2FE40 /* RACBlockTrampoline.h in Headers */ = {isa = PBXBuildFile; fileRef = E7E1E268681B87CAE7D1DB4C69D65AB4 /* RACBlockTrampoline.h */; settings = {ATTRIBUTES = (Public, ); }; }; 98775A84946B367858339515F96ACFF3 /* Pods-BuWanVideo2.0-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E40F103D1F2E2CA838F80D0BE5EFC4D /* Pods-BuWanVideo2.0-dummy.m */; }; 9897BC1413163BA28F88DCC6420FBD95 /* UITextField+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 869DA4218386BEB7839648712CBA317E /* UITextField+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 98E7FA15BF438999C6844F3B4C5B7C7F /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B045764D204BDE5EDDC9D0067AB265 /* IQToolbar.m */; }; 992D239F5B142006F36438E77A2B531A /* RACSubscriptingAssignmentTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A570727D818FF979E931832845EF0A5 /* RACSubscriptingAssignmentTrampoline.m */; }; 9D0B6C5BE070D0FA1DE9E8F572FECED9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54EB9970CE17B7B031A9F665B86288E9 /* CoreGraphics.framework */; }; 9DB574CAF1B65B49E42B66D457AF5714 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BDC1252B5B77C045A32DDEBA4734C145 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9F5640657DA2CE1775F92DB0AFB96EB1 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F5EE7BD6D5A1141C527748161FFCA4 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9FDEEEE37349769B84A30B0105DFF456 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 302868D19BAB22BF2096F7357927D9D8 /* SVProgressHUD-dummy.m */; }; A06586F6C95F5672F87CCE76EC1C03DA /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 713B331B5562B59F12D85CBB81461365 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A06F8E2BDB1C1C5627C02E09756BD055 /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = CCAE2CAB49893772FAC15CE03C7F3852 /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; A0E7562E696BD40E4D86232FFC137CC5 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = AC7DD126C303BC63B0A47A864015048F /* UIImage+ForceDecode.m */; }; A251155849AEE5C8B8E3F88ADD4DC646 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 35379D10E7453817C556E7DCA6A244B2 /* UIImageView+AFNetworking.m */; }; 9D5C9C39B1ED488C693D7E68D30064DC /* RACSignalProvider.d in Sources */ = {isa = PBXBuildFile; fileRef = 78C588E2FB66251B7448A5A65F6C007C /* RACSignalProvider.d */; }; 9DB574CAF1B65B49E42B66D457AF5714 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = FCBE5DEEB8CE6D2357278BB3BA1F1946 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9DF011F3CC2E6C60502CE9CB2B4C5621 /* RACSerialDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = 442B6FFFF04B0FD408E4A6CAD5E159D0 /* RACSerialDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9E8EA010661C670EF52F121DB94D66F9 /* RACScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 16DEC8E05D8EA4A6B7198DC5AC6B8303 /* RACScheduler.m */; }; 9F5640657DA2CE1775F92DB0AFB96EB1 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F42204D8F8812EEF89FA876F4526AF53 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9FDA87D8654C85916F1B84F2F4FF3592 /* NSString+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 74013A15B194BA7ECB3355DE5917359A /* NSString+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9FDEEEE37349769B84A30B0105DFF456 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 613D48FAF061671FADFC8677396D6D5C /* SVProgressHUD-dummy.m */; }; A00A107C8091C6CBBFCC0AB7B7315759 /* RACEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 339174111B6380A1C878F83E7830B0E5 /* RACEvent.m */; }; A06586F6C95F5672F87CCE76EC1C03DA /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D8E4AE8492CD85A3AA0007B2E2FD438A /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A06F8E2BDB1C1C5627C02E09756BD055 /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = C7345D9D9E1FBF78566047A9A63E4FF9 /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; A0E7562E696BD40E4D86232FFC137CC5 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = B1806F16888D7C8CE1E16F7B49D0B9A5 /* UIImage+ForceDecode.m */; }; A251155849AEE5C8B8E3F88ADD4DC646 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 881F18746DC772DDA447B22CFFBC2FEA /* UIImageView+AFNetworking.m */; }; A299807BB62EA27766C43F32715D3A64 /* RACCompoundDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = 59E487DE10796A0F53DFFCD2B66AB9E9 /* RACCompoundDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; A2A59DBCA090BBD47F9995C3F81F12D3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */; }; A2AE66EE8F32341D7199867E04DDB48F /* YYImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A09E028517389C3AC406E3E5ADCC7372 /* YYImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4B26F9C0AD28AC8629E03B084D58153 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FCC7B0B5AB4A56496C01EE23E3318409 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4EEC50B476499D7774479ED700B7CAA /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D1493131A3499E59F3F8F82A2789AE2F /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A64AEFFB083BD4CC51E4A1B24120E601 /* YYCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E08E8F26ED25EA439035109732AEF93 /* YYCache-dummy.m */; }; A6E7C58E58AE42E14B07F7F3C45F11D6 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C8EE86CD70BDCE1CB83C2AC34F1E1B86 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A8E9F3FDBA4A379585660CD123974DF7 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 71D2E008665B2BCE171EA47CFD1CC366 /* SDWebImageCodersManager.m */; }; A2AE66EE8F32341D7199867E04DDB48F /* YYImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = DFAD290958EE44F610480F7ACA363F5C /* YYImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A36802C377AD51FA89641B3B834F4C02 /* UISlider+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFE7E8D814EC51A4FC7DDC2E17C835A /* UISlider+RACSignalSupport.m */; }; A4B26F9C0AD28AC8629E03B084D58153 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 95EB7D99B8FEBED422320B52FE9DD44D /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4E67531A1E94CF08B3808330D77103B /* UIRefreshControl+RACCommandSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 900D08EFF9663043FE9823AC799B129E /* UIRefreshControl+RACCommandSupport.m */; }; A4EEC50B476499D7774479ED700B7CAA /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F9DA13783E226D17EFB2B7DE1FF7257 /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A510FED6943809E7E3DA700F672B2F7D /* RACQueueScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 88E2E62884248FD20E1AA9F31EE2CAE4 /* RACQueueScheduler.m */; }; A64AEFFB083BD4CC51E4A1B24120E601 /* YYCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 804AF148E7749A5C2133A96312EC6583 /* YYCache-dummy.m */; }; A6E7C58E58AE42E14B07F7F3C45F11D6 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AA5DB41983C21CD34E26FB7C1B5B78A /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A8E9F3FDBA4A379585660CD123974DF7 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DDAF626EFB181E6DA46DA2B826969915 /* SDWebImageCodersManager.m */; }; A9044F54D6B87D173D3DBC4D37B0322E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; A993C1145B885A9AEDC6F5B33BC33B2A /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8BEBBB4D7F6F85EAD46E2A3656217DF /* AFNetworkReachabilityManager.m */; }; A9E6984E363F2582F604864C26AB65D5 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E857907BC4DD146CDEB5C62D1394A78 /* AFImageDownloader.m */; }; A993C1145B885A9AEDC6F5B33BC33B2A /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C12944C02F254E7FB08779E41A084DBE /* AFNetworkReachabilityManager.m */; }; A9E6984E363F2582F604864C26AB65D5 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 5261D5A149DFC33E5AE0DD5D492942B6 /* AFImageDownloader.m */; }; AC31721D8A23663DA6EEF6F2B7E81652 /* RACSubscriptingAssignmentTrampoline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DF8A183543FC6407243D76887B33A5A /* RACSubscriptingAssignmentTrampoline.h */; settings = {ATTRIBUTES = (Public, ); }; }; AE274AE6E10B72984A77D6EBC4283923 /* RACQueueScheduler+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = B578422E949B59D5220F93F4171ED00B /* RACQueueScheduler+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; AF5020295AF52986538B58EBD14CAD22 /* YYImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A7715F1A1B156E616461C07DD63E2E8 /* YYImage.framework */; }; B2064E3412AFB3FA11A067824C3AF9C0 /* YYFrameImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E9AFD35E94021D0EC91CD4E9A6874ADA /* YYFrameImage.m */; }; AFD44F8A46638784EBBD8E515DF799F8 /* RACMulticastConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B81DE5BD3D5C5327F4FD71624AE6490 /* RACMulticastConnection.m */; }; B1784BB8A283FF28BE29BDD9AA7FA653 /* UIActionSheet+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B0BCDB15F7B2779431027130EA4F5D9 /* UIActionSheet+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; B2064E3412AFB3FA11A067824C3AF9C0 /* YYFrameImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 482F5116C8F87BFE652F0102474A41D6 /* YYFrameImage.m */; }; B3B592DBB39B9BEBAEE741984CA4EDBC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */; }; B3D5E1407586ECB0691CAB7D494F2EA3 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A32433DDA3B649D68B28A0D04D7BB2 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; B5B9915F785CB47C5C07F0B698911B00 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89A32B7BB601F8F442821FB96FE9AAB7 /* SVIndefiniteAnimatedView.m */; }; B8B70DAB160593E2878AD868EC470C8E /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ADDFEF03F03252FDFF3A58029DD1E78 /* SDWebImageGIFCoder.m */; }; B9B3A5780DDF886D16F9A708E03257B9 /* IQKeyboardManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A89505BE5DB6EB8C15D3A859D3ABC461 /* IQKeyboardManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; B9E702E84151F4D198A859C11E942FE8 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = EA69C266560FAAE2F7E128E1FF4DD2B5 /* SDWebImageTransition.m */; }; BC2362E084FC2F3D1403F395E43B2AE6 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 59692B056342E1201D62D17D4BC0C0BF /* SDWebImage-dummy.m */; }; BCAEAD0B6FB7CF3E6B2E299EC211A598 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 32E86A6163A5E145E3A6F38D55B0B80B /* UIImage+MultiFormat.m */; }; BCD5541CA37B64DFDF167614CF9A6307 /* UITableView+SDAutoTableViewCellHeight.m in Sources */ = {isa = PBXBuildFile; fileRef = F92BA11FB00565F6CCA04D3A274D5CF2 /* UITableView+SDAutoTableViewCellHeight.m */; }; BEFBB26C2EF5BB115DADF979915C0CFF /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B618FEA1CB31965E122F833174EEF7A /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; C04504996E623DF9D821C32A69E773A7 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D10C7AF73F0F5A3710124E3370CDE3 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; B3D5E1407586ECB0691CAB7D494F2EA3 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = AC39B8A34F90FED549ABF921B9B04977 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; B3FF7A4ACFC23BABF5490CD0AE5A10B2 /* UIAlertView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E1F8BD708829A73F9408D4D08A0A51E /* UIAlertView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; B436BB09B39285A18A4CB16D89D06DFC /* UIButton+RACCommandSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = B1F7886832F5F2A25A2F0A49D17B43E1 /* UIButton+RACCommandSupport.m */; }; B5B9915F785CB47C5C07F0B698911B00 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9878D2C18E9003F889F5458D2203A124 /* SVIndefiniteAnimatedView.m */; }; B68AF262D3D1325E124753B593CD777C /* UIImagePickerController+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = C6602512AB4BE8FE4AA7DE1228C16053 /* UIImagePickerController+RACSignalSupport.m */; }; B78E84384EC3B04E9E59CE88985E44EF /* RACUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EDFD4A81F06A5D23740B0CC0624D853 /* RACUnit.h */; settings = {ATTRIBUTES = (Public, ); }; }; B891D66299E0932A4BF2721CA526B9D0 /* ReactiveCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 05862CDF1BA942452A8C52E3EAB476E5 /* ReactiveCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; B8B70DAB160593E2878AD868EC470C8E /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F83590546C5E728242E874F34458FA4 /* SDWebImageGIFCoder.m */; }; B997C538A5E30F1A7C6D259F2485F295 /* UIControl+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 76EFD6B707B75126B0A5FF4F4D34F69E /* UIControl+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; B9B3A5780DDF886D16F9A708E03257B9 /* IQKeyboardManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C55F8FE2D33DFF135364A3ED05A6BFB8 /* IQKeyboardManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; B9E702E84151F4D198A859C11E942FE8 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 058834EB4E38EE8F2DDB340A0D8E3C69 /* SDWebImageTransition.m */; }; BA479012E53B6F27FC46F7E7149FF5B9 /* RACArraySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = BD419F1FE2BC539F1FBB44AAD718DA3D /* RACArraySequence.m */; }; BA5A3A9DDCC0D0622727BFE8BCDB1308 /* NSObject+RACLifting.h in Headers */ = {isa = PBXBuildFile; fileRef = C5F9831AAE1EE95E6DECE83938DA09BB /* NSObject+RACLifting.h */; settings = {ATTRIBUTES = (Public, ); }; }; BBEA4D90D3B81E2542179101F19A554E /* RACDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = 424B25A2BD6CB947E588DC9575A3C0B8 /* RACDisposable.m */; }; BC2362E084FC2F3D1403F395E43B2AE6 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A5F7B3F192878937FCE6279FE696379 /* SDWebImage-dummy.m */; }; BCAEAD0B6FB7CF3E6B2E299EC211A598 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = DE59F1432457CA0AFC3D1C5B7BAF6880 /* UIImage+MultiFormat.m */; }; BCD5541CA37B64DFDF167614CF9A6307 /* UITableView+SDAutoTableViewCellHeight.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A1EA769401A5056B2E867E16DD8F8AD /* UITableView+SDAutoTableViewCellHeight.m */; }; BD4AC00BB5A61FE416686D76E6739D0A /* RACImmediateScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFD4A179CA752E073B8D6DF3F0C3851 /* RACImmediateScheduler.m */; }; BD7DD450A9191071160B67923A21A761 /* NSObject+RACDeallocating.h in Headers */ = {isa = PBXBuildFile; fileRef = 404B04F2FEE6FF0B48A9B1FB5DB8C435 /* NSObject+RACDeallocating.h */; settings = {ATTRIBUTES = (Public, ); }; }; BDB640F1DE341B48A36885BFECF8243F /* RACSubscriber.h in Headers */ = {isa = PBXBuildFile; fileRef = C038C91715934C21109A8313DBE02AC9 /* RACSubscriber.h */; settings = {ATTRIBUTES = (Public, ); }; }; BEDDECB8063326BEBE5DC4413915E38A /* RACEXTKeyPathCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 987F7379FFCCFAF789988816226B4499 /* RACEXTKeyPathCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; BEFBB26C2EF5BB115DADF979915C0CFF /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 40C54E5E793EA4DC4580C56D9A00139F /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFB92EC9EC421B6F493A3EE2B354F1F5 /* RACImmediateScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = FBE4BCB695718AB1210188BA713F5B65 /* RACImmediateScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFB9DED247873991F11BB8AF74601C11 /* NSInvocation+RACTypeParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = 74518041523B99D090A6318632EFCEE2 /* NSInvocation+RACTypeParsing.m */; }; BFE6B130EA90C444C0B4C195BD6AC38B /* RACEmptySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C9D1D6453C40B830564AF3B6445728 /* RACEmptySequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; C01488A7467BDE3E7EFF535588426947 /* RACDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = BA346367BF24C52BCDA92E7402833F53 /* RACDelegateProxy.m */; }; C04504996E623DF9D821C32A69E773A7 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 87ADDD56092E030AB5B25A2D321CB463 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; C068FF76BB7397ABC8E28A128D476D6B /* RACSubscriber.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB6E68412913CC1BBA68C4EDA4D2846 /* RACSubscriber.m */; }; C089CB3645ED26108475717D8A234F4D /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E700DBDACCC1B25FAAA670E476A16FFF /* AssetsLibrary.framework */; }; C29C1BF86EA5C3DBD7AB893ACF8E2B17 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C0815B5388C859B774151CC732E139 /* YYClassInfo.m */; }; C3C34A910C2DEE4E35AE27371176DF68 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = C04B499BD8BD9413F843D3F224DDC73B /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; C4C923BAAED4E28AD1B097DB7C8545B8 /* YYWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AEF4F75716C93FA16447E82A7DB674 /* YYWebImage-dummy.m */; }; C4F280FF927E33AE4B49CCD5A0DEB1B5 /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FFDD4B32DEFDD0555453D01AB11D183D /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0AF1E8BC5282FC1FC463067AA5B7FA8 /* RACGroupedSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 0972F9327D1F3D18CF014811334630B8 /* RACGroupedSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; C155832E84FF8DA040283136B88D385F /* RACTargetQueueScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CE046E8301497F843BCD5569CE0C00D /* RACTargetQueueScheduler.m */; }; C1E521BFEA7CB65AA7C7E74C23246F4A /* RACEmptySignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C54507E369F93932CC88253C8054574 /* RACEmptySignal.m */; }; C29C1BF86EA5C3DBD7AB893ACF8E2B17 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DAEC3A734034508FA24900E1B67E6CB /* YYClassInfo.m */; }; C38BFB29DD2C9DFAAD95593B747DC118 /* NSSet+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 179C101671A76BF9C881588979BCBB96 /* NSSet+RACSequenceAdditions.m */; }; C3C34A910C2DEE4E35AE27371176DF68 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = BE3300C475FAF141ED7B5897EF782A63 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3EDE2F9B7AD98AAA9AA0C71706639C8 /* NSData+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6E46D7889FEF9FA35813A249C2D37B /* NSData+RACSupport.m */; }; C4C923BAAED4E28AD1B097DB7C8545B8 /* YYWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0481E582DB20BC238DA6446D5FE54B21 /* YYWebImage-dummy.m */; }; C4F280FF927E33AE4B49CCD5A0DEB1B5 /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F11A1CC136CFD9BB12B9C019A5E24C58 /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; C50103D2DB3878621E00012B3C0924E8 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E700DBDACCC1B25FAAA670E476A16FFF /* AssetsLibrary.framework */; }; C6023210D2C9949BB4F985AB776510D4 /* YYWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 561FB82ED37D54725529791805C28050 /* YYWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C628BDEF88A00A48741BF1CD14212E22 /* MKAnnotationView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 13AC94841B02E69EBF9BFE64AA3CECC1 /* MKAnnotationView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C6023210D2C9949BB4F985AB776510D4 /* YYWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C2156F8B4F76611CA48A6A0A09734B04 /* YYWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C628BDEF88A00A48741BF1CD14212E22 /* MKAnnotationView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FDE10C3CEF540DD64CA7E798E47990C /* MKAnnotationView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C693B482FBB1AC59EE45643501FC0501 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; C7158550434B8AB9E73238AE7C16D5D3 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 00F98CD578C835088BAD11FE1D8FF775 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C783DEBC3B894EC0FB1403F5A7B8192B /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE35A1F11A75919EDB8E585CA0E39584 /* IQTextView.m */; }; C7E3B8A3173AC2FEADEC3EB0E5ED87C3 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 90F887DFB0B7D54B1587BCD959311BF8 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9A2A2640C150DDFC404F03217AA0B8C /* YYWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B7DFBFF6819BEBB3E1911F01FD4116D /* YYWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; CEABDB5B9BB37C6A0625573B58524773 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = B56A59E1393978801887DEEE848C5740 /* NSData+ImageContentType.m */; }; C7158550434B8AB9E73238AE7C16D5D3 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B6B88A114410EE2E394D50A29DFFF02 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C7198C4F63C30A464FDD8841EE070508 /* UIControl+RACSignalSupportPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADE4A8C0C19FD265DF62CE4558D4DC0 /* UIControl+RACSignalSupportPrivate.h */; settings = {ATTRIBUTES = (Public, ); }; }; C782A4471C023B7F846A985B9B5BCE50 /* RACSubscriber+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B5A819A69C1E1997BBC50F78E5C062C /* RACSubscriber+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; C783DEBC3B894EC0FB1403F5A7B8192B /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 21FDF742FA54A9999270C070F354CEB6 /* IQTextView.m */; }; C7E3B8A3173AC2FEADEC3EB0E5ED87C3 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 1517481917F6476D3FEFC37B6CB05284 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; C84A6A3E2CCE57A58704456166D18069 /* RACKVOChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = DF75D9B4CA5E8CBEBBB7DF9A734EA3C1 /* RACKVOChannel.m */; }; C9A2A2640C150DDFC404F03217AA0B8C /* YYWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 556981E0DA75C5CF9D95848F11AEC670 /* YYWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9E83B3024265E75806B4F9F60C3D06B /* RACSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BE0BAED7D9E504C50C96E94E6C62F8C /* RACSignal.m */; }; CA6BEA35F6F22F61075631EF4CA476C5 /* RACReplaySubject.h in Headers */ = {isa = PBXBuildFile; fileRef = 2662E8366008204679FA94ABBA5BF025 /* RACReplaySubject.h */; settings = {ATTRIBUTES = (Public, ); }; }; CADA3263D9306E1D64AAB82D23D2E19E /* UITableViewHeaderFooterView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D62D79746105BBB8C392B564DD13F /* UITableViewHeaderFooterView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C642566282D6390D6D79811F6C1DC /* RACErrorSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D21BDBB6B9674DF9341698E117C51C3 /* RACErrorSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; CEABDB5B9BB37C6A0625573B58524773 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 623325980428B1ACB02B1FE54DFE5AAE /* NSData+ImageContentType.m */; }; CF788718B39D4FFA2C994F6CD7D5B0BC /* NSArray+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A1D5121CF9DAB5B036EFC7BF9F5E244F /* NSArray+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; D09EF4AC8FC4676ED0ACA92A7C4D979A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; D0AE5B928359BB96D0F44BBD95F8BC56 /* YYFrameImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 85986F6F80A890AB51E97FEB19D339AF /* YYFrameImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D15A139A20C280E5F6CC519DB787D78D /* UIButton+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 58BD1815001CC5034BB6255837AF5AE8 /* UIButton+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D2246BE5AF9C116D84444CC5C955BC02 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6384748F502E6A77B7044817A4129FC8 /* SVRadialGradientLayer.m */; }; D2B67B0AD9D2BB06A45268778DC5CC3F /* UIView+SDAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 5658EE8670AD7F46326F68C97E0965C4 /* UIView+SDAutoLayout.m */; }; D0AE5B928359BB96D0F44BBD95F8BC56 /* YYFrameImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB8D127456595A163640931F226123E /* YYFrameImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D15A139A20C280E5F6CC519DB787D78D /* UIButton+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B970CD25001B099C48E341AB6E6F8DB5 /* UIButton+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D1B8CDC88CA0293447091D168F39B66B /* UICollectionReusableView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 42535A4AF768629FBC4501D92E7222B2 /* UICollectionReusableView+RACSignalSupport.m */; }; D2246BE5AF9C116D84444CC5C955BC02 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FD4233E6AADCD93597335821EEF158 /* SVRadialGradientLayer.m */; }; D27FB235F57668A1FF7F957D559E4E2C /* NSIndexSet+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A8BFF3BDF77DEBA5AECA8BB422A2901E /* NSIndexSet+RACSequenceAdditions.m */; }; D2B67B0AD9D2BB06A45268778DC5CC3F /* UIView+SDAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = DC26D0D87DD2C52C536DE5BD573D3B9A /* UIView+SDAutoLayout.m */; }; D2D73FCE699F4DE8492156DF39F2EC1D /* RACSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = AD6D87078F5C5957BC495E5F630EB1A4 /* RACSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; D47D82B6AA23A0E873D5D007ACE4FF4C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; D87B2D5ED73534ACF97CE0A52FA18AE4 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6268E02094726CB4F270B5E5734600C1 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; D95B5D47B59AA2E90271A199F117F338 /* UIImage+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = B7BB8316EB15A2F1D4345C57B50D19F4 /* UIImage+YYWebImage.m */; }; D9CC0E6B7DBCACFD43A5B12A8538C544 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CA21697F97665E4AF1D900C0673BF00 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; DA40AA8CBB6200B48F32ED61B3D071EA /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = D09826676879AB23092A3824F3AD317E /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC48D98AE84238022712CDFA94A0D4FE /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B4E6D390027BC38891D8B27ED3A53A2E /* AFHTTPSessionManager.m */; }; DD25952BB2317C1796500F490ED3FE03 /* YYWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 19542EB054626AA5D4EC57E14A4CDD65 /* YYWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE12057AB8895931A0E9499619C5CFC8 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B468F7252C4E9D17C6AB261FC977B177 /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0B877ED736BECF2C97D60013CB18E9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 658E17FB1CA6793E7A873F0715999DAE /* SDWebImageDownloader.m */; }; E0186A63060F0EB3676F95CD0ACE0E18 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5C6E06542E297A135D519C6804088F7 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; E05231BD74C57583C638BB5DE2B8DC8E /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 73A8D0E98CE29AB8E321DF3EE8FEBFB7 /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; E130FD79B8A48ABE549B214AC4658CFB /* YYImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 993B95BCCFEC31E992AB4F34B7677DEB /* YYImage.m */; }; D4D04CDBE68E638C8ADD838618DB9E7F /* RACEXTScope.h in Headers */ = {isa = PBXBuildFile; fileRef = B58D21EB1B75D201289E7C9F6F024BF0 /* RACEXTScope.h */; settings = {ATTRIBUTES = (Public, ); }; }; D87B2D5ED73534ACF97CE0A52FA18AE4 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A57423AF76D0F3BDA12433514FA0AC /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; D95B5D47B59AA2E90271A199F117F338 /* UIImage+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E87D9D004B86E5F84106CDA49E3A60D0 /* UIImage+YYWebImage.m */; }; D9CC0E6B7DBCACFD43A5B12A8538C544 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = FC6B8C412C4D37ADDB145560DAAA0FD4 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; D9E08178B8524CA556D6682189FA8236 /* UISwitch+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FA6F56A17961CE24DA4586437B71235 /* UISwitch+RACSignalSupport.m */; }; DA40AA8CBB6200B48F32ED61B3D071EA /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EB5DE113CE8CFF3D7A80D34F7055E1B /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; DAF10BF53C843C1AA6E404E7CA7791ED /* RACCompoundDisposableProvider.d in Sources */ = {isa = PBXBuildFile; fileRef = 0D5A9DE1AE9D01AB7E6D110CCD935795 /* RACCompoundDisposableProvider.d */; }; DAFB0A83D66BB123AE5651E2E93A410B /* NSObject+RACDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = CCB028AFE7A0DF0D56182BC0AC6AE902 /* NSObject+RACDescription.h */; settings = {ATTRIBUTES = (Public, ); }; }; DB81F00D368720A95F634752E4976718 /* NSEnumerator+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 20A93C3B656A73F808E3D24A32DABE5D /* NSEnumerator+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC48D98AE84238022712CDFA94A0D4FE /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 96DAF2E95371EFEFD8B1C836D2789042 /* AFHTTPSessionManager.m */; }; DD10923803BB05211A7243C8D3D44498 /* UIControl+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F6848E4B27C4664E5684A54E348883F /* UIControl+RACSignalSupport.m */; }; DD25952BB2317C1796500F490ED3FE03 /* YYWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 38485D00465440C758C2732C4931A564 /* YYWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE12057AB8895931A0E9499619C5CFC8 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF56418AB93AC5009C1779A22CB7F79 /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE33B6BA0000DF02A8D3CF96ADF92B85 /* RACKVOTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = 70F59258887AC37B3BF11293334EF2E5 /* RACKVOTrampoline.m */; }; DECA8B73D1F2CC17814AF107F275FC25 /* RACScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ACC5DEA78507FDA644C3FCE3F4EF5EA /* RACScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0B877ED736BECF2C97D60013CB18E9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC2C0D21F974D29BA887E57A5479179 /* SDWebImageDownloader.m */; }; E0186A63060F0EB3676F95CD0ACE0E18 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DC89EA2CB30606C7DC27F6A73CD293C /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; E05231BD74C57583C638BB5DE2B8DC8E /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = CF13B9CD526E12ECBEAD613ABEF78602 /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; E0D17030910F5B27D27F62BAD0B65C6B /* RACTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 1565DA1DB3FE698314D015DF7217DB63 /* RACTuple.h */; settings = {ATTRIBUTES = (Public, ); }; }; E130FD79B8A48ABE549B214AC4658CFB /* YYImage.m in Sources */ = {isa = PBXBuildFile; fileRef = F591215C6EB56AD9E6881C04D44ECC78 /* YYImage.m */; }; E1824AFF87F40AA106F17692F1993AD8 /* NSObject+RACPropertySubscribing.m in Sources */ = {isa = PBXBuildFile; fileRef = F3B7F534E1C75F385C1A4774F3C47DC1 /* NSObject+RACPropertySubscribing.m */; }; E28C2A4D11D0E714F957E6AEF7F92B9F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; E2F4CD643C7A11E485B97318F82B5DD8 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 584CE427BE9EA742C6CBA4761F9A926A /* NSImage+WebCache.m */; }; E3FDE4FEAEDEFB5B4EFC2B3CBD1B67F7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC1E6623FE2473E9F1D8EF980DE2823 /* SDWebImageManager.m */; }; E42834A2D935B3CC6EEAADAEB1D2EFFB /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9721108E154FBB96F9B4F47956EB917D /* AFAutoPurgingImageCache.m */; }; E563E067FD0D9F24C7508D4D4FF33D90 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CD7A77387C606806B800301EAED3FF /* UIImageView+HighlightedWebCache.m */; }; E2F4CD643C7A11E485B97318F82B5DD8 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 320E932C11A9F70A65537B1459793A49 /* NSImage+WebCache.m */; }; E33CBF2B828469F0ECD45C0B5B8C92AF /* NSObject+RACLifting.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F2757632E925E3FFE5D3408EFBF5890 /* NSObject+RACLifting.m */; }; E3FDE4FEAEDEFB5B4EFC2B3CBD1B67F7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E6B7F0DDE588CB4BBDD9719B167D3CF1 /* SDWebImageManager.m */; }; E42834A2D935B3CC6EEAADAEB1D2EFFB /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F6BD74D2AEB9E5909DBCE5E196323450 /* AFAutoPurgingImageCache.m */; }; E563E067FD0D9F24C7508D4D4FF33D90 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = D7F18E472350556FC6C10C3AB0EDDFAB /* UIImageView+HighlightedWebCache.m */; }; E667AF98DE4D39AE296A43CB195A4669 /* RACChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = DC8103F01BD7BC487061DF76BB3C1802 /* RACChannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; E6EF8FFC4F685FE72AD8FD950A22396B /* RACArraySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 35390A03834DB0B8786F70D0A12D558D /* RACArraySequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; E78632E3ECB979B8210CD00250025E0A /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */; }; E79543DCC3D74CF6741290811F6417B3 /* YYSpriteSheetImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A217778F71886BDEB622CABA8D17505 /* YYSpriteSheetImage.m */; }; E81C6D77F417BDB6170862FDB6AAC845 /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D6A440FE908DFF9E24FEA2876DDB7E /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; E79543DCC3D74CF6741290811F6417B3 /* YYSpriteSheetImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE48436D791B70237BC771703BE7521 /* YYSpriteSheetImage.m */; }; E7CB601E57442AAE994A1FDE532E2D94 /* UIRefreshControl+RACCommandSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 267CA4472D295D3E28F45C533CBCCCD1 /* UIRefreshControl+RACCommandSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; E81C6D77F417BDB6170862FDB6AAC845 /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A1B2487ACD76A2782C4ABCFDDC00E3B9 /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; E9950F4C8C6B6EF6EDA5409AB7933364 /* UIDatePicker+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8D802B680EB36AB364D9A012752AF9 /* UIDatePicker+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; EA1AC9E0A11A65A3E291F8AB9DA8DC03 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */; }; EA7FA0F375F7ECD6EC75D3FB35582CAD /* MKAnnotationView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 628D9C339AAC48F0BCB896C9CEE8175B /* MKAnnotationView+YYWebImage.m */; }; EAB3C3F7710E26690FC2D38E833CE33C /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = B6CAB5D74635D11F0987470A7CF362E6 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB93D649F6CD1CC7AE5C33A7C2DD4A92 /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FFB0C026B7A9FA00C92CBFD2B008F6C /* IQKeyboardManager.m */; }; EBEBA6A1D9786158E80F5BF4DBD9CA8F /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB0ED33B7BB6511AD60C265D69680FC /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; ED12CD4EE27C699258CAC0CD29582888 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B083F83B7B619CF5325F8BEE4EB9D21D /* UIButton+WebCache.m */; }; EEAA1518C49804736C3F40117D064CBE /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = C30D70E4FA7926DB96CD8F1E95DDD23C /* SVProgressAnimatedView.m */; }; EA7FA0F375F7ECD6EC75D3FB35582CAD /* MKAnnotationView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AA5A2A4C7265ECA3B255CD11CF69881 /* MKAnnotationView+YYWebImage.m */; }; EAB3C3F7710E26690FC2D38E833CE33C /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = AA4A65D5C30F8CDE4F495FFF90DE282A /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB6419062518904BBB42F089025C28EF /* Pods-BuWanVideo2.0-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B794B4FBBA19E0D4327C041ADBFD6E1 /* Pods-BuWanVideo2.0-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB93D649F6CD1CC7AE5C33A7C2DD4A92 /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 40DF122B79D1CF595CD3F4B311F90902 /* IQKeyboardManager.m */; }; EBEBA6A1D9786158E80F5BF4DBD9CA8F /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = F0FC3B3345E30380C1C6C2784328BF88 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; EC78925B5BC2B7E21791E6D66A59B92C /* UISwitch+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = BD454E7E154511F9B7C254A4032B1847 /* UISwitch+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; ECC26668A0FB2BB2A8D5CF6BB9B39926 /* RACDynamicSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CC4D16B06BBF0FA86BDA63BD575AB85 /* RACDynamicSequence.m */; }; ECC516A879C21E51BB5CB48FDD4C6F6F /* RACGroupedSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 85E47DE7B0134E6B9D9BF33E95897108 /* RACGroupedSignal.m */; }; ED12CD4EE27C699258CAC0CD29582888 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E83F09FF6BA4E5B0CF6480560FD72F2B /* UIButton+WebCache.m */; }; EDAC9E3E3D7B41933488778B8B61A943 /* NSObject+RACSelectorSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = C07F3BEDE4ADEFE3CEE51C199043AC14 /* NSObject+RACSelectorSignal.m */; }; EEAA1518C49804736C3F40117D064CBE /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 262110A7935B4ADF77AB26643667ADFA /* SVProgressAnimatedView.m */; }; EEB7CC04EE70F442DBC73498F9ECDD56 /* YYCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BC90E4D272CEA5634B637942FBA7CFF /* YYCache.framework */; }; EEF7959B592D4019202C84D82D2A8FE0 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F1A59D204A792B04690231B282B8936 /* SDWebImageImageIOCoder.m */; }; EFB2C2CB1AB435691E0FF07CFA3B19E1 /* YYCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0985215BEFFD85D43B677A489489569D /* YYCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F04A2B26084965ADA0330211C8F86CE6 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0972198189366754E8CD85E85F821ECB /* SDWebImageCoder.m */; }; F0815FF4F542A8FE9CFD07ECF237E4B6 /* CALayer+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 95917B3873C0A27B15FE95B54577B960 /* CALayer+YYWebImage.m */; }; F16F321A9197112912327EB6055BCF13 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D8F507B0AD09B94415DAFC3427A0C308 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F1AF58FF116C9C0780A8D9FE0F028EFD /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D664ED52BFE17EAC61AEF048B9ECC3 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; F7AE4667F4D56C085FB6F3D0D74F8055 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AF91CF4D12E4987DE5AE0EA3E73FC3C2 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; FB0822F79D370CD5CF7C51979A0271BE /* SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6DB96860830D683DD062D9FC416A20 /* SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; FBAAC816A95407EFC6F55A20809A121C /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = AB921236EFEEA7E1F0AF90E95E46867C /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; FE234DE6B80B1383BF4E445CC9F4AE20 /* YYSpriteSheetImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C63621A41D21E370BA7572D25405DE87 /* YYSpriteSheetImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; EEE7C3B2DB0A8AA92F28F87310FDBF5B /* RACStream+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 63A1A481F03A6EF1F846592ABE47D3EB /* RACStream+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; EEF7959B592D4019202C84D82D2A8FE0 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = CF32DEAE935907212F05887D894E8560 /* SDWebImageImageIOCoder.m */; }; EF57656B0F585FA18814D96F8B301E8E /* NSObject+RACSelectorSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AF8F6BA6F5592334F714274C4B3BB15 /* NSObject+RACSelectorSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; EFB2C2CB1AB435691E0FF07CFA3B19E1 /* YYCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CA48C73A04E49BB531E4FB67ACD24191 /* YYCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F04A2B26084965ADA0330211C8F86CE6 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4485D1CD0602CE9B219D6CD347B3E0DB /* SDWebImageCoder.m */; }; F0815FF4F542A8FE9CFD07ECF237E4B6 /* CALayer+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = A2AE3BC45C093B95D130463715214217 /* CALayer+YYWebImage.m */; }; F16F321A9197112912327EB6055BCF13 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FB9C11FA05290B3BD8D9FF2AA816662A /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F1AF58FF116C9C0780A8D9FE0F028EFD /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B1B44A4F4540AD62627C52FAF396B40 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; F202AE59369A42D39FDDE8A0E67C4B06 /* RACCompoundDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = 008A4FA6B3774E7EFA4B0C204DE0D359 /* RACCompoundDisposable.m */; }; F28C3D140DF2FC29C1CE7ECE95CCB446 /* RACSignal+Operations.m in Sources */ = {isa = PBXBuildFile; fileRef = 551E6348AA5B04458DD1022464A5115F /* RACSignal+Operations.m */; }; F4B28FB40E0D76F12441CE050ED55CB1 /* RACTestScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = F22A6CF95C36F2DB67876FB7E0BB2363 /* RACTestScheduler.m */; }; F4F1789324DA09F33F0C567B9973B437 /* RACReturnSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD065B83FCA4EC8D0792FF4B408F63C /* RACReturnSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; F511E46DD072825B3F0F4C87AC812259 /* NSInvocation+RACTypeParsing.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F95C75B8335E1E85B52A8A19C9E16A1 /* NSInvocation+RACTypeParsing.h */; settings = {ATTRIBUTES = (Public, ); }; }; F57F89A4CA7E896A541B19134F2F898D /* RACUnarySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = EAE15951F97A0B811DD8697D1D456EF3 /* RACUnarySequence.m */; }; F5D40BEB1902E778C516443F03283946 /* RACSubject.m in Sources */ = {isa = PBXBuildFile; fileRef = 72DE5406487B537359BD6BCF5D093495 /* RACSubject.m */; }; F71F43AA460A63C52541C275B3293873 /* RACTupleSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F3FBFE616E8B26FFAE7A01A81E4DB02 /* RACTupleSequence.m */; }; F7AE4667F4D56C085FB6F3D0D74F8055 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 765AF9C9873B0DE0D36FC8579BD3949C /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; F8A90B58596E63DD5AEF4059A0B5FB2E /* RACKVOProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 96291BF17B7DD8E08BF673C2145F20FF /* RACKVOProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; F95E9612D7C529ADBAF213B08C346923 /* RACStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 99B8D9707E15BC4F80CF2650B7174F38 /* RACStream.m */; }; FA209D5F876638139A11A6FE009C50CA /* RACValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = CA4EF78971B6F3F366CA6E0AB17E901F /* RACValueTransformer.m */; }; FA97B2A41EE18A3785FC1F5CC5F13F18 /* RACSignal+Operations.h in Headers */ = {isa = PBXBuildFile; fileRef = DC3409F628DDE79F8854CEACD4720C2A /* RACSignal+Operations.h */; settings = {ATTRIBUTES = (Public, ); }; }; FB0822F79D370CD5CF7C51979A0271BE /* SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A799B881D162AC5FBBF37BD6607A66A /* SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; FBAAC816A95407EFC6F55A20809A121C /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = EBE315C7D6E406815861904976F83DAF /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; FC2A20C4DBA752872E86BC15ABEF89B7 /* UISegmentedControl+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CA5EF95BED88CF937F50F8619718D4B /* UISegmentedControl+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; FE234DE6B80B1383BF4E445CC9F4AE20 /* YYSpriteSheetImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 798DF8123DD26AF8FE75CAD9CC0413D3 /* YYSpriteSheetImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; FFE9685D959585534780D0C8DE931137 /* UITableViewHeaderFooterView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BA0E988C4803617F21A7F9E78B2C215 /* UITableViewHeaderFooterView+RACSignalSupport.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 0104E26FD175BEA255C6856FF19FB484 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1; remoteInfo = AFNetworking; }; 15F5EB11DB9B4325A6F80F975F9A85BA /* PBXContainerItemProxy */ = { 06BC34F31C533A1F9ED764C5826444A9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; remoteInfo = SDWebImage; }; 195BE46DBF20E99C879F0694E2C05E7C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 6F6B630FA5213AB083E7CEF1F986FE44; remoteInfo = UMCCommon; }; 39010B3C4CD3E161A5359EC62F062B3F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 1C8D67D8B72D6BA42CCEDB648537A340; remoteInfo = SVProgressHUD; }; 39E01E082225420D2B27661D102B08AF /* PBXContainerItemProxy */ = { 12E38ADC3186C43970F17AF01E637D10 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; 54F6CEA4803E4F0979EC311FBCA8B3A1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 03932C47FBFD347205B2F367F78E9B63; remoteInfo = SDAutoLayout; }; 6C1CF5D3986704BF19F9EB59D987C6C0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 84B44807A12996D487A4A591A481D6A0; remoteInfo = YYModel; }; 70722B4466CCEF7C48301488CA06D47E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 488E8C830C5A5694EE916251B9ADAADA; remoteInfo = YYWebImage; }; 8CF7F27808F8A5A006B38502A5B1B60F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; A7164C3D5176976AE6A9386AC65256AB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; A7725E3D9598E58FD15784801553CCF0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; AA8F9DC2302FB0FC551F2944853C3486 /* PBXContainerItemProxy */ = { 1F548367755F470B103ADBF8084D2B90 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = FBA456CB50E371584C11231929A0971E; remoteInfo = IQKeyboardManager; }; 6E4C67B39C968DA5171CB5BFF9347687 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 488E8C830C5A5694EE916251B9ADAADA; remoteInfo = YYWebImage; }; 73248A947596392E175A7D9FCDF75502 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 03932C47FBFD347205B2F367F78E9B63; remoteInfo = SDAutoLayout; }; 741D65FEB7E0B2AFC84FC8CE8D9BCF2F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 84B44807A12996D487A4A591A481D6A0; remoteInfo = YYModel; }; 8D43102BAF2B807D494340802E2013B2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1; remoteInfo = AFNetworking; }; A5A3E2E6A6EAD986A88E08B43D197DF2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 07B5C6907D09E767CDC5954A9468CA2E; remoteInfo = ReactiveCocoa; }; ADF28A730A0FEE2B299E3D5B7A4797E2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; C44DC32BBB604C441028E2FE32CD5A80 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; D4D5AF2CFBDD43F1B48247E9C6EABF7C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 1C8D67D8B72D6BA42CCEDB648537A340; remoteInfo = SVProgressHUD; }; D61D8DB52F1FF866F95073FBF877BB45 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; FC2452388D3F72B55F9BAB970E597304 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 6F6B630FA5213AB083E7CEF1F986FE44; remoteInfo = UMCCommon; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 004B93B66E20FB5EA371BD2D5A2A176D /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; }; 00CFD934075E076A3CBB5D21C4366691 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYCache/YYDiskCache.m; sourceTree = "<group>"; }; 00F98CD578C835088BAD11FE1D8FF775 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; }; 019EC0F5541FE58CA6A668CA8E90E0BE /* SDAutoLayout.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.release.xcconfig; sourceTree = "<group>"; }; 05432A9AD307A07CDC115D90314C096C /* YYCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYCache-Info.plist"; sourceTree = "<group>"; }; 064F4C4BF9323C0B2DF7050F670C30D4 /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyBoardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = "<group>"; }; 06617545769B7AFFDF1D2D8CAD0E3C40 /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = "<group>"; }; 0863BA2E7625437CCF2AD822AADBD14C /* YYModel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.debug.xcconfig; sourceTree = "<group>"; }; 0972198189366754E8CD85E85F821ECB /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = "<group>"; }; 0985215BEFFD85D43B677A489489569D /* YYCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-umbrella.h"; sourceTree = "<group>"; }; 0A2CDDCF9D9945D00311BFC9BB8436A1 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYWebImage/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; }; 0A722A647707E984C83F82B6E2A97631 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = "<group>"; }; 008A4FA6B3774E7EFA4B0C204DE0D359 /* RACCompoundDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACCompoundDisposable.m; path = ReactiveCocoa/RACCompoundDisposable.m; sourceTree = "<group>"; }; 019DA6AC9B8183E37BEA239CC2868A58 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; }; 01B43D7DACAC40381CE45C3164522A8A /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; }; 0481E582DB20BC238DA6446D5FE54B21 /* YYWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYWebImage-dummy.m"; sourceTree = "<group>"; }; 056ACD6BFE21EC8D6FE0D0A36F310CD6 /* NSSet+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSSet+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSSet+RACSequenceAdditions.h"; sourceTree = "<group>"; }; 05862CDF1BA942452A8C52E3EAB476E5 /* ReactiveCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ReactiveCocoa.h; path = ReactiveCocoa/ReactiveCocoa.h; sourceTree = "<group>"; }; 058834EB4E38EE8F2DDB340A0D8E3C69 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = "<group>"; }; 07E4881518C81EE4B8B6CEE5ABA2A936 /* RACSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSequence.h; path = ReactiveCocoa/RACSequence.h; sourceTree = "<group>"; }; 0848474DE4B93376F530460F0AEC6B6D /* UICollectionReusableView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionReusableView+RACSignalSupport.h"; path = "ReactiveCocoa/UICollectionReusableView+RACSignalSupport.h"; sourceTree = "<group>"; }; 08C56FBC976B8B7972E9967F28F22F9D /* NSNotificationCenter+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNotificationCenter+RACSupport.m"; path = "ReactiveCocoa/NSNotificationCenter+RACSupport.m"; sourceTree = "<group>"; }; 0972F9327D1F3D18CF014811334630B8 /* RACGroupedSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACGroupedSignal.h; path = ReactiveCocoa/RACGroupedSignal.h; sourceTree = "<group>"; }; 0B57FDA153A165D34A06973162D053CD /* ReactiveCocoa-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ReactiveCocoa-Info.plist"; sourceTree = "<group>"; }; 0B5A819A69C1E1997BBC50F78E5C062C /* RACSubscriber+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACSubscriber+Private.h"; path = "ReactiveCocoa/RACSubscriber+Private.h"; sourceTree = "<group>"; }; 0B664162C8D5BF47E619C08321B2499D /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = "<group>"; }; 0B794B4FBBA19E0D4327C041ADBFD6E1 /* Pods-BuWanVideo2.0-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-BuWanVideo2.0-umbrella.h"; sourceTree = "<group>"; }; 0B854A205AB073BF3636BC961E846FD3 /* SDAutoLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDAutoLayout.modulemap; sourceTree = "<group>"; }; 0C6D8478A9EBA8567512E695CEBB58EF /* YYImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCache.m; path = YYWebImage/YYImageCache.m; sourceTree = "<group>"; }; 0BE0BAED7D9E504C50C96E94E6C62F8C /* RACSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSignal.m; path = ReactiveCocoa/RACSignal.m; sourceTree = "<group>"; }; 0C02B45988382D2DCD62AD8269116FD2 /* RACSubscriptionScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubscriptionScheduler.m; path = ReactiveCocoa/RACSubscriptionScheduler.m; sourceTree = "<group>"; }; 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYImage.framework; path = YYImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0E0330675D0150100081993C047FB3D7 /* YYImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImage.h; path = YYImage/YYImage.h; sourceTree = "<group>"; }; 0E84503CC7AC8803383E34A33700A149 /* IQKeyboardManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.release.xcconfig; sourceTree = "<group>"; }; 0F1A59D204A792B04690231B282B8936 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = "<group>"; }; 0CC4D16B06BBF0FA86BDA63BD575AB85 /* RACDynamicSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDynamicSequence.m; path = ReactiveCocoa/RACDynamicSequence.m; sourceTree = "<group>"; }; 0CE5121D2B1DF8872D1E09042A442AC5 /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyBoardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = "<group>"; }; 0CF0218D422241C628F1FE04E229D140 /* NSEnumerator+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSEnumerator+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSEnumerator+RACSequenceAdditions.m"; sourceTree = "<group>"; }; 0D5A9DE1AE9D01AB7E6D110CCD935795 /* RACCompoundDisposableProvider.d */ = {isa = PBXFileReference; includeInIndex = 1; name = RACCompoundDisposableProvider.d; path = ReactiveCocoa/RACCompoundDisposableProvider.d; sourceTree = "<group>"; }; 0DF8A183543FC6407243D76887B33A5A /* RACSubscriptingAssignmentTrampoline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubscriptingAssignmentTrampoline.h; path = ReactiveCocoa/RACSubscriptingAssignmentTrampoline.h; sourceTree = "<group>"; }; 0E466463DF8B3AE64DD9C973BCF30D29 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; }; 0E4E6B20D47B5ADA5444AC46ED5832D8 /* RACStream.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACStream.h; path = ReactiveCocoa/RACStream.h; sourceTree = "<group>"; }; 0F83590546C5E728242E874F34458FA4 /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = "<group>"; }; 0FC794CFD745AD723C0AB24EEAC6B922 /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyBoardManager/Categories/IQNSArray+Sort.m"; sourceTree = "<group>"; }; 112C50B27098B24207F78749EB22F2A1 /* Pods-BuWanVideo2.0-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BuWanVideo2.0-Info.plist"; sourceTree = "<group>"; }; 1138BDB8408523552A38A32B6A83A31F /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; }; 11A9F777D6CAF09F8A2527AD18805629 /* SVProgressHUD.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.debug.xcconfig; sourceTree = "<group>"; }; 13AC94841B02E69EBF9BFE64AA3CECC1 /* MKAnnotationView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+YYWebImage.h"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.h"; sourceTree = "<group>"; }; 14BF4C9AB6A8950D65C93996A0A563AF /* UIButton+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+YYWebImage.m"; path = "YYWebImage/Categories/UIButton+YYWebImage.m"; sourceTree = "<group>"; }; 14F5EE7BD6D5A1141C527748161FFCA4 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = "<group>"; }; 1538EA8172164A02CB89A3BCA93D91E1 /* UMCCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.release.xcconfig; sourceTree = "<group>"; }; 158B6C4D9030F93BCCE250DFE085B1EF /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyBoardManager/IQToolbar/IQToolbar.m; sourceTree = "<group>"; }; 15A32433DDA3B649D68B28A0D04D7BB2 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = "<group>"; }; 161A37E3C472DFF98A4831F759041736 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = "<group>"; }; 18E77A78AB5601DA1A19A7E0B437E203 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = "<group>"; }; 18FDA1F0984624BF4FBFFC20F1BD72DF /* YYCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-prefix.pch"; sourceTree = "<group>"; }; 19542EB054626AA5D4EC57E14A4CDD65 /* YYWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageManager.h; path = YYWebImage/YYWebImageManager.h; sourceTree = "<group>"; }; 199D63082191E4E0094F9E922C5B4353 /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyBoardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = "<group>"; }; 1A344B319BEC0E1B8A28B5AE3C427899 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; }; 1E2C2F03B2242AE5D58CC619ABB1933E /* SDAutoLayout.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.debug.xcconfig; sourceTree = "<group>"; }; 1FA3696182C088F327A126D8E13EB9D5 /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyBoardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = "<group>"; }; 21CD7A77387C606806B800301EAED3FF /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; }; 21E3942DA473328650661A64EDF91055 /* UIImageView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+YYWebImage.m"; path = "YYWebImage/Categories/UIImageView+YYWebImage.m"; sourceTree = "<group>"; }; 23BCBFFFAF38ACFE565CD1279A2A7E41 /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyBoardManager/Categories/IQNSArray+Sort.m"; sourceTree = "<group>"; }; 2401641EA88D2D3E42D792F6F1C609F5 /* YYCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYCache.modulemap; sourceTree = "<group>"; }; 24FE9AC4A49F1392F5792CA37EAEC008 /* YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYModel.h; path = YYModel/YYModel.h; sourceTree = "<group>"; }; 25805FC802E30CB4DEF62B580AD7C0DC /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; }; 26892DA0ECD5B12C8FD4073EAD1E9237 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = "<group>"; }; 276CE4C9368DCF201C8020FDC956603E /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = "<group>"; }; 277B74DC54F596293D4EC11771448E09 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; }; 28BE94CD106A8C4F00420B542A2D9F16 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyBoardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = "<group>"; }; 1251B84BE5D70DDDB0F8F6D057EE5724 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; }; 12BA37936417B2075E52E2050C1A4759 /* UIBarButtonItem+RACCommandSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBarButtonItem+RACCommandSupport.m"; path = "ReactiveCocoa/UIBarButtonItem+RACCommandSupport.m"; sourceTree = "<group>"; }; 12EE1B3754DB8169317EAD351E8CC5D7 /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = "<group>"; }; 13FBEAD71022F7D73517926DD75A34D5 /* YYImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYImage-Info.plist"; sourceTree = "<group>"; }; 1517481917F6476D3FEFC37B6CB05284 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = "<group>"; }; 1565DA1DB3FE698314D015DF7217DB63 /* RACTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTuple.h; path = ReactiveCocoa/RACTuple.h; sourceTree = "<group>"; }; 156CEAF82F165222EB93E27807ED730A /* NSOrderedSet+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSOrderedSet+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSOrderedSet+RACSequenceAdditions.h"; sourceTree = "<group>"; }; 158483EA3C0097D27339FE47E7E163AB /* RACScopedDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACScopedDisposable.m; path = ReactiveCocoa/RACScopedDisposable.m; sourceTree = "<group>"; }; 15A57423AF76D0F3BDA12433514FA0AC /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; }; 16DEC8E05D8EA4A6B7198DC5AC6B8303 /* RACScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACScheduler.m; path = ReactiveCocoa/RACScheduler.m; sourceTree = "<group>"; }; 179C101671A76BF9C881588979BCBB96 /* NSSet+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSSet+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSSet+RACSequenceAdditions.m"; sourceTree = "<group>"; }; 17AB1FE005A0732C82438CC799768391 /* RACObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACObjCRuntime.m; path = ReactiveCocoa/RACObjCRuntime.m; sourceTree = "<group>"; }; 1855988F316B6F522AD9424B194D1818 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = "<group>"; }; 18992D88B7680F305CEA078A5E3B1BC5 /* WebP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebP.framework; path = Vendor/WebP.framework; sourceTree = "<group>"; }; 19382336CC66C11EE9CB466C0653DD63 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; }; 1A78D4790F17D229D6C0868F53E0E245 /* UITextView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextView+RACSignalSupport.m"; path = "ReactiveCocoa/UITextView+RACSignalSupport.m"; sourceTree = "<group>"; }; 1A799B881D162AC5FBBF37BD6607A66A /* SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAutoLayout.h; path = SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h; sourceTree = "<group>"; }; 1AA5DB41983C21CD34E26FB7C1B5B78A /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; }; 1AB09CF98E54E12254F38AD90A9D85B9 /* NSFileHandle+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileHandle+RACSupport.m"; path = "ReactiveCocoa/NSFileHandle+RACSupport.m"; sourceTree = "<group>"; }; 1ADE4A8C0C19FD265DF62CE4558D4DC0 /* UIControl+RACSignalSupportPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+RACSignalSupportPrivate.h"; path = "ReactiveCocoa/UIControl+RACSignalSupportPrivate.h"; sourceTree = "<group>"; }; 1AF4577F59CF32DBE4466F1648D450CB /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = "<group>"; }; 1AFE7E8D814EC51A4FC7DDC2E17C835A /* UISlider+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISlider+RACSignalSupport.m"; path = "ReactiveCocoa/UISlider+RACSignalSupport.m"; sourceTree = "<group>"; }; 1B1B44A4F4540AD62627C52FAF396B40 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = "<group>"; }; 1B2AC081E027B9973EC5516F4FC2A080 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = "<group>"; }; 1B34E887546C7E507D5418F5014FD60D /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyBoardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = "<group>"; }; 1BE0A6BB0CE10019E62B062479041392 /* NSIndexSet+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSIndexSet+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSIndexSet+RACSequenceAdditions.h"; sourceTree = "<group>"; }; 1BE48436D791B70237BC771703BE7521 /* YYSpriteSheetImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSpriteSheetImage.m; path = YYImage/YYSpriteSheetImage.m; sourceTree = "<group>"; }; 1BFC5B0260DCA507F150C3CC60D1A1D6 /* RACSubject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubject.h; path = ReactiveCocoa/RACSubject.h; sourceTree = "<group>"; }; 1C33A481313DE8A7C2FA5FA4102EE0DE /* YYCache.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.release.xcconfig; sourceTree = "<group>"; }; 1C37D08E516C63DAD0005156414E6C06 /* YYImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImage.h; path = YYImage/YYImage.h; sourceTree = "<group>"; }; 1C6331A22B6F893F8493943B77C41000 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; }; 1D4D849E0522DDC9ECA6542E2066D35C /* UIDatePicker+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIDatePicker+RACSignalSupport.m"; path = "ReactiveCocoa/UIDatePicker+RACSignalSupport.m"; sourceTree = "<group>"; }; 1DFD4A179CA752E073B8D6DF3F0C3851 /* RACImmediateScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACImmediateScheduler.m; path = ReactiveCocoa/RACImmediateScheduler.m; sourceTree = "<group>"; }; 1E1F8BD708829A73F9408D4D08A0A51E /* UIAlertView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertView+RACSignalSupport.h"; path = "ReactiveCocoa/UIAlertView+RACSignalSupport.h"; sourceTree = "<group>"; }; 1FB6E68412913CC1BBA68C4EDA4D2846 /* RACSubscriber.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubscriber.m; path = ReactiveCocoa/RACSubscriber.m; sourceTree = "<group>"; }; 1FDE10C3CEF540DD64CA7E798E47990C /* MKAnnotationView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+YYWebImage.h"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.h"; sourceTree = "<group>"; }; 1FE10A5EE645311CE6977A21BC5B0698 /* UIView+SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+SDAutoLayout.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h"; sourceTree = "<group>"; }; 20A5861C79064C3361B7725F3BE79A81 /* CALayer+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYWebImage.h"; path = "YYWebImage/Categories/CALayer+YYWebImage.h"; sourceTree = "<group>"; }; 20A93C3B656A73F808E3D24A32DABE5D /* NSEnumerator+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSEnumerator+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSEnumerator+RACSequenceAdditions.h"; sourceTree = "<group>"; }; 21FDF742FA54A9999270C070F354CEB6 /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyBoardManager/IQTextView/IQTextView.m; sourceTree = "<group>"; }; 224E5D87CBD046E04A0A65DFB5DE2BC4 /* NSURLConnection+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURLConnection+RACSupport.m"; path = "ReactiveCocoa/NSURLConnection+RACSupport.m"; sourceTree = "<group>"; }; 24480AA9A20ED501BC7CB73F906BCBE1 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; }; 262110A7935B4ADF77AB26643667ADFA /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; }; 2662E8366008204679FA94ABBA5BF025 /* RACReplaySubject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACReplaySubject.h; path = ReactiveCocoa/RACReplaySubject.h; sourceTree = "<group>"; }; 267CA4472D295D3E28F45C533CBCCCD1 /* UIRefreshControl+RACCommandSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+RACCommandSupport.h"; path = "ReactiveCocoa/UIRefreshControl+RACCommandSupport.h"; sourceTree = "<group>"; }; 2919F9E027ED2DF9A2FEB4B149302A61 /* RACTestScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTestScheduler.h; path = ReactiveCocoa/RACTestScheduler.h; sourceTree = "<group>"; }; 2935D9B072D3E7A83648AD1B45D7A1CF /* NSURLConnection+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLConnection+RACSupport.h"; path = "ReactiveCocoa/NSURLConnection+RACSupport.h"; sourceTree = "<group>"; }; 29459A553362BAFEE7FA8F9BCB90FC09 /* YYCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYCache.modulemap; sourceTree = "<group>"; }; 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 2A7715F1A1B156E616461C07DD63E2E8 /* YYImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2ADDFEF03F03252FDFF3A58029DD1E78 /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = "<group>"; }; 2CABF9A305C1DA818E14D2E427EE8F6E /* YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImage.h; path = YYWebImage/YYWebImage.h; sourceTree = "<group>"; }; 2C27711FC7122DB21AFAB445D04B2EBB /* NSDictionary+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSDictionary+RACSequenceAdditions.m"; sourceTree = "<group>"; }; 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDAutoLayout.framework; path = SDAutoLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2FDC0B0877D4E4A438D368B014D32B73 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = "<group>"; }; 302868D19BAB22BF2096F7357927D9D8 /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; }; 30F764FDB5F9B0181ED0316445471D3C /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; }; 30F94E2C298157954AAB33D5AF87FD1A /* YYWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.release.xcconfig; sourceTree = "<group>"; }; 31C94702B36F02A8FBD634FA40ECB45E /* YYImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCache.h; path = YYWebImage/YYImageCache.h; sourceTree = "<group>"; }; 32152CA18EC34FE8A59B8974A4B80F6F /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = "<group>"; }; 32E86A6163A5E145E3A6F38D55B0B80B /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; }; 338EE01B9A8BF03B8F154654FDF37857 /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; }; 34C0815B5388C859B774151CC732E139 /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYModel/YYClassInfo.m; sourceTree = "<group>"; }; 35379D10E7453817C556E7DCA6A244B2 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = "<group>"; }; 36D664ED52BFE17EAC61AEF048B9ECC3 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = "<group>"; }; 3BB1F0CC71FD4A9C5F0E8B09BC450A76 /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYCache/YYKVStorage.h; sourceTree = "<group>"; }; 3E53EC95813F9ED2C02C25B21AF2E3C5 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; }; 3EEE4E4687D58E6A3DF38DB2C4333F1F /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = "<group>"; }; 3F23DA8E76BB95245303351117CD4386 /* WebP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebP.framework; path = Vendor/WebP.framework; sourceTree = "<group>"; }; 3F761F215F2ED99F5C58244DEE41957C /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYWebImage/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; }; 403347D8D64469731D88DFA85E5BF177 /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyBoardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = "<group>"; }; 40C0478F247FD53447751EDB888A0EC9 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; }; 423B0DD5CBA7AEDD53CC8590726B838F /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; }; 431F3B040054806778D2F4C904F42267 /* SVProgressHUD-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SVProgressHUD-Info.plist"; sourceTree = "<group>"; }; 436563794D25F666DCD19BE37A7BBA85 /* CALayer+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYWebImage.h"; path = "YYWebImage/Categories/CALayer+YYWebImage.h"; sourceTree = "<group>"; }; 44525486FDDB56A96229E7264D9AB264 /* YYWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageManager.m; path = YYWebImage/YYWebImageManager.m; sourceTree = "<group>"; }; 4600196AA2978695F863C06E8FA7A756 /* YYCache.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.release.xcconfig; sourceTree = "<group>"; }; 2DC89EA2CB30606C7DC27F6A73CD293C /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; }; 2DDB1D0F3102AFB005CAC2E3EEFD7967 /* IQKeyboardManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.release.xcconfig; sourceTree = "<group>"; }; 2EB5DE113CE8CFF3D7A80D34F7055E1B /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYModel/NSObject+YYModel.h"; sourceTree = "<group>"; }; 2FA6F56A17961CE24DA4586437B71235 /* UISwitch+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISwitch+RACSignalSupport.m"; path = "ReactiveCocoa/UISwitch+RACSignalSupport.m"; sourceTree = "<group>"; }; 30A8BD8FBB95072C2A4A9D8B3F046171 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = "<group>"; }; 30E3DFE7B9B5226AC7BC767989CBA348 /* YYImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYImage.modulemap; sourceTree = "<group>"; }; 3148D8593CB285438F27A9DE1B2D69F8 /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = "<group>"; }; 320E932C11A9F70A65537B1459793A49 /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = "<group>"; }; 3367EE331F736AF3909E52253D32DBEB /* NSObject+RACKVOWrapper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACKVOWrapper.m"; path = "ReactiveCocoa/NSObject+RACKVOWrapper.m"; sourceTree = "<group>"; }; 339174111B6380A1C878F83E7830B0E5 /* RACEvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEvent.m; path = ReactiveCocoa/RACEvent.m; sourceTree = "<group>"; }; 33AB6B81E9C6A52B4A837E8D76123295 /* YYImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-umbrella.h"; sourceTree = "<group>"; }; 346B5892710DB600A2A5DBFB606ACDD5 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = "<group>"; }; 35390A03834DB0B8786F70D0A12D558D /* RACArraySequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACArraySequence.h; path = ReactiveCocoa/RACArraySequence.h; sourceTree = "<group>"; }; 35ED2DAB504EFE58B258C70FC4A8C3AC /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = "<group>"; }; 375A61D91780F8AF0EBFC0EEEBC55309 /* IQKeyboardManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.debug.xcconfig; sourceTree = "<group>"; }; 3817622806CDE7F8532ED0A0D9CE5543 /* NSNotificationCenter+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+RACSupport.h"; path = "ReactiveCocoa/NSNotificationCenter+RACSupport.h"; sourceTree = "<group>"; }; 38485D00465440C758C2732C4931A564 /* YYWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageManager.h; path = YYWebImage/YYWebImageManager.h; sourceTree = "<group>"; }; 38FD4233E6AADCD93597335821EEF158 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; }; 3A1EA769401A5056B2E867E16DD8F8AD /* UITableView+SDAutoTableViewCellHeight.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+SDAutoTableViewCellHeight.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m"; sourceTree = "<group>"; }; 3A52021754DA87023BB04AE4E787465E /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyBoardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = "<group>"; }; 3B78F214085A80BF38BCE51C0B157944 /* YYWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.debug.xcconfig; sourceTree = "<group>"; }; 3E57DA243178E435EAF7FFC38C7912C3 /* SVProgressHUD.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.debug.xcconfig; sourceTree = "<group>"; }; 3E86E9DEF29FD0FC1AB0A7F719F1A639 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; }; 404B04F2FEE6FF0B48A9B1FB5DB8C435 /* NSObject+RACDeallocating.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACDeallocating.h"; path = "ReactiveCocoa/NSObject+RACDeallocating.h"; sourceTree = "<group>"; }; 40B4AC6F6400166DCE5B9D4B07D26B6C /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = "<group>"; }; 40C54E5E793EA4DC4580C56D9A00139F /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = "<group>"; }; 40DF122B79D1CF595CD3F4B311F90902 /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyBoardManager/IQKeyboardManager.m; sourceTree = "<group>"; }; 4205C17B2B0500B98C82A8CB25577A03 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = "<group>"; }; 424B25A2BD6CB947E588DC9575A3C0B8 /* RACDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDisposable.m; path = ReactiveCocoa/RACDisposable.m; sourceTree = "<group>"; }; 42535A4AF768629FBC4501D92E7222B2 /* UICollectionReusableView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionReusableView+RACSignalSupport.m"; path = "ReactiveCocoa/UICollectionReusableView+RACSignalSupport.m"; sourceTree = "<group>"; }; 43A3EBB3FF5880ACE149AD6943F34E11 /* RACDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDelegateProxy.h; path = ReactiveCocoa/RACDelegateProxy.h; sourceTree = "<group>"; }; 43FEDEB0965DDD0C00F3119FF12B69C5 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = "<group>"; }; 442B6FFFF04B0FD408E4A6CAD5E159D0 /* RACSerialDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSerialDisposable.h; path = ReactiveCocoa/RACSerialDisposable.h; sourceTree = "<group>"; }; 44359BCB0BEF1D96DA3876A0E9D0D681 /* RACBehaviorSubject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACBehaviorSubject.m; path = ReactiveCocoa/RACBehaviorSubject.m; sourceTree = "<group>"; }; 4485D1CD0602CE9B219D6CD347B3E0DB /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = "<group>"; }; 44F7854B861E24CBC750ACC1CEE01A73 /* UITextView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextView+RACSignalSupport.h"; path = "ReactiveCocoa/UITextView+RACSignalSupport.h"; sourceTree = "<group>"; }; 4609CACCE52D57A28244981039D1F74D /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; }; 4612DB65D2A1365AC8062526D50065F8 /* ReactiveCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ReactiveCocoa.modulemap; sourceTree = "<group>"; }; 482F5116C8F87BFE652F0102474A41D6 /* YYFrameImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFrameImage.m; path = YYImage/YYFrameImage.m; sourceTree = "<group>"; }; 487C8FD1E464C880EA97EC276D628521 /* YYImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-prefix.pch"; sourceTree = "<group>"; }; 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYCache.framework; path = YYCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4ACA87A555BA903C17DE1C8766674ECA /* YYImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.debug.xcconfig; sourceTree = "<group>"; }; 4B3A615FAD585E5A40B20867999D7BE4 /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = "<group>"; }; 4B79D5FCA8231E9F45A5B31DC173CA1D /* YYImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYImage.modulemap; sourceTree = "<group>"; }; 4CC378B1DA059277B1DB48FEA6D95695 /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYImage/YYAnimatedImageView.h; sourceTree = "<group>"; }; 48E53290BF676DC4968E988F86DA3828 /* YYModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYModel.modulemap; sourceTree = "<group>"; }; 490AC753C5C289D7B70E73B4E7512560 /* ReactiveCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ReactiveCocoa.framework; path = ReactiveCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49113269607E4F08B7CFA6148EC3DBEB /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYCache/YYCache.m; sourceTree = "<group>"; }; 4A570727D818FF979E931832845EF0A5 /* RACSubscriptingAssignmentTrampoline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubscriptingAssignmentTrampoline.m; path = ReactiveCocoa/RACSubscriptingAssignmentTrampoline.m; sourceTree = "<group>"; }; 4B7D7FF5A35E89A06418103D502E8B36 /* UIAlertView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertView+RACSignalSupport.m"; path = "ReactiveCocoa/UIAlertView+RACSignalSupport.m"; sourceTree = "<group>"; }; 4B81DE5BD3D5C5327F4FD71624AE6490 /* RACMulticastConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACMulticastConnection.m; path = ReactiveCocoa/RACMulticastConnection.m; sourceTree = "<group>"; }; 4B8B72CEB9C5BD1143D7CB3296D9C6A3 /* YYWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageOperation.m; path = YYWebImage/YYWebImageOperation.m; sourceTree = "<group>"; }; 4BEC12E61DF0F1EADC1216142661F863 /* SDAutoLayout.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.debug.xcconfig; sourceTree = "<group>"; }; 4C54507E369F93932CC88253C8054574 /* RACEmptySignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEmptySignal.m; path = ReactiveCocoa/RACEmptySignal.m; sourceTree = "<group>"; }; 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; 4E0E7518AC47987E9CF7DF3F7ED7DA22 /* YYWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageOperation.m; path = YYWebImage/YYWebImageOperation.m; sourceTree = "<group>"; }; 4E857907BC4DD146CDEB5C62D1394A78 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = "<group>"; }; 4E8F7E358CF6EE0D4983A0AF618A86D4 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; }; 4EB255DCF0E56A85B9D8D475576A026C /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = "<group>"; }; 4F9385E5A9AB836D8EFD8F3E69233179 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = "<group>"; }; 4DDDA9B909764E9465C35A3F93EA3E0C /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = "<group>"; }; 4E409F177B91C8024B6A14FCB4A5718D /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyBoardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = "<group>"; }; 4EA4085253678493F59845F2B77ADC79 /* RACDynamicSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDynamicSignal.h; path = ReactiveCocoa/RACDynamicSignal.h; sourceTree = "<group>"; }; 4EE01DFD16660D22DC57C56115B9511C /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; }; 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYWebImage.framework; path = YYWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5047A05DF375461B730C3048518084B1 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = "<group>"; }; 51BF83A817AC689F9973FE34E2899AA4 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = "<group>"; }; 522B392BCE6392A9BA3310DA2D5CD46C /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = "<group>"; }; 52E1DCA567703CCCA3596EBF6DD74067 /* UIImageView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+YYWebImage.h"; path = "YYWebImage/Categories/UIImageView+YYWebImage.h"; sourceTree = "<group>"; }; 535FF7AEEA0A877AB813020B3A5C2513 /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = "<group>"; }; 50650CAA18C2C10BA1E811D6F7F55039 /* RACEmptySignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEmptySignal.h; path = ReactiveCocoa/RACEmptySignal.h; sourceTree = "<group>"; }; 5123EF586F1A580A919F7A8F30D3986D /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = "<group>"; }; 51B13B8D7A3003456A4D115BA461CFFE /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; }; 51B8B1865321000DBF691A1F865A49D8 /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyBoardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = "<group>"; }; 5261D5A149DFC33E5AE0DD5D492942B6 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = "<group>"; }; 53B045764D204BDE5EDDC9D0067AB265 /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyBoardManager/IQToolbar/IQToolbar.m; sourceTree = "<group>"; }; 54EB9970CE17B7B031A9F665B86288E9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; 561FB82ED37D54725529791805C28050 /* YYWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageOperation.h; path = YYWebImage/YYWebImageOperation.h; sourceTree = "<group>"; }; 5658EE8670AD7F46326F68C97E0965C4 /* UIView+SDAutoLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+SDAutoLayout.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m"; sourceTree = "<group>"; }; 567E673CD6E46A9F7459BA13BABE1B46 /* YYWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYWebImage.modulemap; sourceTree = "<group>"; }; 584CE427BE9EA742C6CBA4761F9A926A /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = "<group>"; }; 58BD1815001CC5034BB6255837AF5AE8 /* UIButton+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+YYWebImage.h"; path = "YYWebImage/Categories/UIButton+YYWebImage.h"; sourceTree = "<group>"; }; 59692B056342E1201D62D17D4BC0C0BF /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; }; 5FFB0C026B7A9FA00C92CBFD2B008F6C /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyBoardManager/IQKeyboardManager.m; sourceTree = "<group>"; }; 550D4ED99E2D46472D0C1EEFB7DBCAB4 /* NSObject+RACDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACDescription.m"; path = "ReactiveCocoa/NSObject+RACDescription.m"; sourceTree = "<group>"; }; 551E6348AA5B04458DD1022464A5115F /* RACSignal+Operations.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "RACSignal+Operations.m"; path = "ReactiveCocoa/RACSignal+Operations.m"; sourceTree = "<group>"; }; 556981E0DA75C5CF9D95848F11AEC670 /* YYWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-umbrella.h"; sourceTree = "<group>"; }; 55AA30B54E883389C97CFE781CEB6994 /* RACmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACmetamacros.h; path = ReactiveCocoa/extobjc/RACmetamacros.h; sourceTree = "<group>"; }; 5602FF22855607B6323A64DEC1F9CA29 /* YYImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYImage-dummy.m"; sourceTree = "<group>"; }; 565F37EF9ECE829784E7C27D4E7C3133 /* SDAutoLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-umbrella.h"; sourceTree = "<group>"; }; 56F51A923876C6B57829933883B4C084 /* YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYModel.h; path = YYModel/YYModel.h; sourceTree = "<group>"; }; 57E2ABCDF61EF529A4D0031E1B423BE8 /* RACTupleSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTupleSequence.h; path = ReactiveCocoa/RACTupleSequence.h; sourceTree = "<group>"; }; 5868373245108120B0D33C04574AC67B /* NSUserDefaults+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSUserDefaults+RACSupport.m"; path = "ReactiveCocoa/NSUserDefaults+RACSupport.m"; sourceTree = "<group>"; }; 595B21677F2F1603D6B7A94F494AFC56 /* NSObject+RACDeallocating.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACDeallocating.m"; path = "ReactiveCocoa/NSObject+RACDeallocating.m"; sourceTree = "<group>"; }; 59A9DD0510BD7143FC10DA4372A1B08B /* RACUnarySequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACUnarySequence.h; path = ReactiveCocoa/RACUnarySequence.h; sourceTree = "<group>"; }; 59E487DE10796A0F53DFFCD2B66AB9E9 /* RACCompoundDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACCompoundDisposable.h; path = ReactiveCocoa/RACCompoundDisposable.h; sourceTree = "<group>"; }; 59E9A0EA2D9E1FEC80A7449FDB9FBEF5 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; }; 5A5F7B3F192878937FCE6279FE696379 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; }; 5B5C14B83BF494FC37393EF0A044FE8C /* RACMulticastConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACMulticastConnection.h; path = ReactiveCocoa/RACMulticastConnection.h; sourceTree = "<group>"; }; 5B922B10C69ED4316FF058381FF254C2 /* YYModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYModel-dummy.m"; sourceTree = "<group>"; }; 5B9A9B7C75B1472A936F4E6D2C5DFC04 /* RACMulticastConnection+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACMulticastConnection+Private.h"; path = "ReactiveCocoa/RACMulticastConnection+Private.h"; sourceTree = "<group>"; }; 5C0C7EBCE0B616D5EABE74DC9A5FCA1C /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = "<group>"; }; 5CA5EF95BED88CF937F50F8619718D4B /* UISegmentedControl+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISegmentedControl+RACSignalSupport.h"; path = "ReactiveCocoa/UISegmentedControl+RACSignalSupport.h"; sourceTree = "<group>"; }; 5CE046E8301497F843BCD5569CE0C00D /* RACTargetQueueScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTargetQueueScheduler.m; path = ReactiveCocoa/RACTargetQueueScheduler.m; sourceTree = "<group>"; }; 5DF3D5662145627E55D1E84A6A04AA61 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyBoardManager/Categories/IQUIViewController+Additions.m"; sourceTree = "<group>"; }; 60BF37AF45E0C1545ADD5E112E15DCA9 /* Pods-BuWanVideo2.0-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BuWanVideo2.0-acknowledgements.markdown"; sourceTree = "<group>"; }; 6231466E6723272781BBF15B73FD5A16 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyBoardManager/Resources/IQKeyboardManager.bundle; sourceTree = "<group>"; }; 6268E02094726CB4F270B5E5734600C1 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; }; 628D9C339AAC48F0BCB896C9CEE8175B /* MKAnnotationView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+YYWebImage.m"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.m"; sourceTree = "<group>"; }; 633F9A5C6929420CE95700768F073EFB /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = "<group>"; }; 6384748F502E6A77B7044817A4129FC8 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; }; 658E17FB1CA6793E7A873F0715999DAE /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; }; 60C1ECC2C08E5012A14278B450F0EF18 /* UMCCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.release.xcconfig; sourceTree = "<group>"; }; 613D48FAF061671FADFC8677396D6D5C /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; }; 61A524733F91898AE8C910515AA38037 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = "<group>"; }; 61BD20DF76E954AA215311C591A55F03 /* RACEmptySequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEmptySequence.m; path = ReactiveCocoa/RACEmptySequence.m; sourceTree = "<group>"; }; 623325980428B1ACB02B1FE54DFE5AAE /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; }; 62D4EF8B1FB9EA633057C722A0D7B2BD /* YYImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCoder.m; path = YYImage/YYImageCoder.m; sourceTree = "<group>"; }; 62FFBF64C5659BDE5885E1FE671FFB76 /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = "<group>"; }; 63728FA9C1CADDC69E6210875309A1EA /* AFNetworking-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AFNetworking-Info.plist"; sourceTree = "<group>"; }; 63A1A481F03A6EF1F846592ABE47D3EB /* RACStream+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACStream+Private.h"; path = "ReactiveCocoa/RACStream+Private.h"; sourceTree = "<group>"; }; 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 65C8D432CB8AEB2482293031D7FB17EC /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyBoardManager/IQToolbar/IQBarButtonItem.m; sourceTree = "<group>"; }; 666FDAF0A4607C7E635294B50E8583A8 /* IQUIWindow+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIWindow+Hierarchy.m"; path = "IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.m"; sourceTree = "<group>"; }; 67CEF7643E18673E24232F356F77380D /* YYAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAnimatedImageView.m; path = YYImage/YYAnimatedImageView.m; sourceTree = "<group>"; }; 65D6532EF4406D5F34DEA45F8A51DA8E /* YYWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageManager.m; path = YYWebImage/YYWebImageManager.m; sourceTree = "<group>"; }; 65DB53CB512A4D7980D4F0C8F3DDA112 /* IQKeyboardManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManager-Info.plist"; sourceTree = "<group>"; }; 67F2A907D286E64A2ABD2E19B145F5B4 /* YYImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCache.h; path = YYWebImage/YYImageCache.h; sourceTree = "<group>"; }; 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 68E7E51CC244542FDB45049BFF530B12 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYCache/YYDiskCache.h; sourceTree = "<group>"; }; 6A7D01EB7485DD6573A8E179985B9283 /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyBoardManager/IQKeyboardReturnKeyHandler.h; sourceTree = "<group>"; }; 6B3D311CC989B02E43F1BABC1BA52A9B /* YYModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-prefix.pch"; sourceTree = "<group>"; }; 6B618FEA1CB31965E122F833174EEF7A /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = "<group>"; }; 6BB1FC1CA63AAA77E98E85CF3431087F /* UMCCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.debug.xcconfig; sourceTree = "<group>"; }; 6C0772AA815B383D323E200577F058EE /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = "<group>"; }; 6C0B51074A42033961C10F7B0900C715 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = "<group>"; }; 6CA21697F97665E4AF1D900C0673BF00 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; }; 6911B89F9AFFA28DD82EC1F2BB8D87FD /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; }; 6AA5A2A4C7265ECA3B255CD11CF69881 /* MKAnnotationView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+YYWebImage.m"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.m"; sourceTree = "<group>"; }; 6B0BCDB15F7B2779431027130EA4F5D9 /* UIActionSheet+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActionSheet+RACSignalSupport.h"; path = "ReactiveCocoa/UIActionSheet+RACSignalSupport.h"; sourceTree = "<group>"; }; 6C3853C907D62B6CF7911F8A39BDF54C /* IQUIWindow+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIWindow+Hierarchy.h"; path = "IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.h"; sourceTree = "<group>"; }; 6C6BC4013A00DD77209861FD34C44D8A /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; }; 6E09767F4BF6F4F8097CD3216064B101 /* SDAutoLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDAutoLayout.modulemap; sourceTree = "<group>"; }; 6E40F103D1F2E2CA838F80D0BE5EFC4D /* Pods-BuWanVideo2.0-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BuWanVideo2.0-dummy.m"; sourceTree = "<group>"; }; 6F55B88B20E8DBC00ADF538D1E100A82 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = "<group>"; }; 6F1F850E1C88A409C73C758C53D621BB /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = "<group>"; }; 6F584607422D3120B7CFF79DC73EC9AC /* RACSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSequence.m; path = ReactiveCocoa/RACSequence.m; sourceTree = "<group>"; }; 6F95C75B8335E1E85B52A8A19C9E16A1 /* NSInvocation+RACTypeParsing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSInvocation+RACTypeParsing.h"; path = "ReactiveCocoa/NSInvocation+RACTypeParsing.h"; sourceTree = "<group>"; }; 6FE8C410B33DC810A88573107F71567C /* Pods-BuWanVideo2.0-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BuWanVideo2.0-acknowledgements.plist"; sourceTree = "<group>"; }; 7134F20032CBB294C097E37753D0B990 /* YYImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-prefix.pch"; sourceTree = "<group>"; }; 713B331B5562B59F12D85CBB81461365 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; }; 71D2E008665B2BCE171EA47CFD1CC366 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = "<group>"; }; 7287F2809D154FC010E08FD9CE21148F /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; }; 735F66840C380AE30470C97BF7AC301B /* YYImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCoder.m; path = YYImage/YYImageCoder.m; sourceTree = "<group>"; }; 73A8D0E98CE29AB8E321DF3EE8FEBFB7 /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = "<group>"; }; 74D3AD2E8CB8E9FD5B6ADD640D6AAB18 /* IQUIWindow+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIWindow+Hierarchy.h"; path = "IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.h"; sourceTree = "<group>"; }; 74D5DA7238E160253A95D43C0B5A4F2D /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYCache/YYCache.m; sourceTree = "<group>"; }; 70928C74247BE51F102A438F71B54F0E /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYCache/YYKVStorage.h; sourceTree = "<group>"; }; 70F59258887AC37B3BF11293334EF2E5 /* RACKVOTrampoline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACKVOTrampoline.m; path = ReactiveCocoa/RACKVOTrampoline.m; sourceTree = "<group>"; }; 71F9B0A75E7D51A7D9CF2972FEAB6FC4 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = "<group>"; }; 7244EB669A442CD41E0E97236B6C0771 /* RACValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACValueTransformer.h; path = ReactiveCocoa/RACValueTransformer.h; sourceTree = "<group>"; }; 72DE5406487B537359BD6BCF5D093495 /* RACSubject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubject.m; path = ReactiveCocoa/RACSubject.m; sourceTree = "<group>"; }; 73CC36396FA8D5DB03C34C3009DBE5A1 /* UMCCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.debug.xcconfig; sourceTree = "<group>"; }; 73FD92AACA61A2DCCFD48D05CDA8FF40 /* IQUIWindow+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIWindow+Hierarchy.m"; path = "IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.m"; sourceTree = "<group>"; }; 74013A15B194BA7ECB3355DE5917359A /* NSString+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+RACSupport.h"; path = "ReactiveCocoa/NSString+RACSupport.h"; sourceTree = "<group>"; }; 74518041523B99D090A6318632EFCEE2 /* NSInvocation+RACTypeParsing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSInvocation+RACTypeParsing.m"; path = "ReactiveCocoa/NSInvocation+RACTypeParsing.m"; sourceTree = "<group>"; }; 748FD6EAC46D719B3D3A848BC4F54D00 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYCache/YYDiskCache.m; sourceTree = "<group>"; }; 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; 776F41CDA4D3EC6CDD6E7F54C91B5CA1 /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyBoardManager/Categories/IQNSArray+Sort.h"; sourceTree = "<group>"; }; 77B7302933BC6D02A196B85DFEC0E21C /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = "<group>"; }; 7852085FC4FFA2B275BC46043D03C538 /* UITableView+SDAutoTableViewCellHeight.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+SDAutoTableViewCellHeight.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h"; sourceTree = "<group>"; }; 79FEC923DCFB592C5B0707E8A32F6E99 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = "<group>"; }; 7A1CB53CA3AB4D8680DE596155FA9ED6 /* UIView+SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+SDAutoLayout.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h"; sourceTree = "<group>"; }; 7A217778F71886BDEB622CABA8D17505 /* YYSpriteSheetImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSpriteSheetImage.m; path = YYImage/YYSpriteSheetImage.m; sourceTree = "<group>"; }; 765AF9C9873B0DE0D36FC8579BD3949C /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; }; 769447B0A8CD1DCB9FD8DEA9B1C6C25E /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = "<group>"; }; 76EFD6B707B75126B0A5FF4F4D34F69E /* UIControl+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+RACSignalSupport.h"; path = "ReactiveCocoa/UIControl+RACSignalSupport.h"; sourceTree = "<group>"; }; 77D703F77CE0DD41A9F009FD6E2F0D5F /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = "<group>"; }; 78613155C0BE74CD8CDAD57324AACA8E /* NSString+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+RACSupport.m"; path = "ReactiveCocoa/NSString+RACSupport.m"; sourceTree = "<group>"; }; 78C588E2FB66251B7448A5A65F6C007C /* RACSignalProvider.d */ = {isa = PBXFileReference; includeInIndex = 1; name = RACSignalProvider.d; path = ReactiveCocoa/RACSignalProvider.d; sourceTree = "<group>"; }; 798DF8123DD26AF8FE75CAD9CC0413D3 /* YYSpriteSheetImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSpriteSheetImage.h; path = YYImage/YYSpriteSheetImage.h; sourceTree = "<group>"; }; 7A2F2DD222FD70D3E1E40D7F8BEB13EA /* UIButton+RACCommandSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+RACCommandSupport.h"; path = "ReactiveCocoa/UIButton+RACCommandSupport.h"; sourceTree = "<group>"; }; 7AD6E8DFA8A95F045C0E5EACCECE804C /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 7B0E5C35357559413BE33DE720EF67CC /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyBoardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = "<group>"; }; 7AF8F6BA6F5592334F714274C4B3BB15 /* NSObject+RACSelectorSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACSelectorSignal.h"; path = "ReactiveCocoa/NSObject+RACSelectorSignal.h"; sourceTree = "<group>"; }; 7BA0E988C4803617F21A7F9E78B2C215 /* UITableViewHeaderFooterView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewHeaderFooterView+RACSignalSupport.m"; path = "ReactiveCocoa/UITableViewHeaderFooterView+RACSignalSupport.m"; sourceTree = "<group>"; }; 7BA7BEF589982FD9C8B376EA994796DE /* Pods-BuWanVideo2.0.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BuWanVideo2.0.debug.xcconfig"; sourceTree = "<group>"; }; 7DE56B9020EA08B1264A713571D82EAC /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = "<group>"; }; 7DE8C593B8367EAF68AD4DCF1102981A /* YYModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYModel.modulemap; sourceTree = "<group>"; }; 7E952070F6458D5354A580EB5C697A77 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = "<group>"; }; 7EB860ABE724253F4D37024E0A728E7F /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = "<group>"; }; 80052075A66CB61EFC5C01C3A9B556F7 /* YYWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-prefix.pch"; sourceTree = "<group>"; }; 83D10C7AF73F0F5A3710124E3370CDE3 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = "<group>"; }; 83E7BD087582D365B7C7195190F03660 /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = "<group>"; }; 85986F6F80A890AB51E97FEB19D339AF /* YYFrameImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFrameImage.h; path = YYImage/YYFrameImage.h; sourceTree = "<group>"; }; 86CBDEBB1EF16BE5599C7B3C764E1B78 /* IQKeyboardManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManager.modulemap; sourceTree = "<group>"; }; 86D6A440FE908DFF9E24FEA2876DDB7E /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYCache/YYMemoryCache.h; sourceTree = "<group>"; }; 87A93D738A57DCA03A5F89B311F2D61A /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; }; 87C09894B283EBD278A16FDB3EB75D77 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; }; 886CECEF031D4E8EBE4FAD2041707202 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; }; 89A32B7BB601F8F442821FB96FE9AAB7 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; }; 8A272000203E690BDDF171A04E002113 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = "<group>"; }; 8B7DFBFF6819BEBB3E1911F01FD4116D /* YYWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-umbrella.h"; sourceTree = "<group>"; }; 8CA14631D059A039D7F2A3ED33F5BAFB /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; }; 8D8DB7FE9CE9C64DF0DD6CF4FD7AF501 /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = "<group>"; }; 8DC5286A839CCD48C7D9CF9DF5B14A27 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = "<group>"; }; 8E08E8F26ED25EA439035109732AEF93 /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = "<group>"; }; 8E187B581E63340ADBA5C35E8F029870 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = "<group>"; }; 8E6DB96860830D683DD062D9FC416A20 /* SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAutoLayout.h; path = SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h; sourceTree = "<group>"; }; 90F887DFB0B7D54B1587BCD959311BF8 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = "<group>"; }; 90FE38F4186C1FBFC016BF52A9211D7A /* KeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KeyboardManager.h; path = IQKeyBoardManager/KeyboardManager.h; sourceTree = "<group>"; }; 94AEF4F75716C93FA16447E82A7DB674 /* YYWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYWebImage-dummy.m"; sourceTree = "<group>"; }; 954E821E034D1D09CB9FDFB80D9ECAB5 /* UIImage+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+YYWebImage.h"; path = "YYWebImage/Categories/UIImage+YYWebImage.h"; sourceTree = "<group>"; }; 95917B3873C0A27B15FE95B54577B960 /* CALayer+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYWebImage.m"; path = "YYWebImage/Categories/CALayer+YYWebImage.m"; sourceTree = "<group>"; }; 9721108E154FBB96F9B4F47956EB917D /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = "<group>"; }; 97886E255A49CBF2C6C41BFE4211CCAA /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; }; 7D95FD0F87F5CD1A4DAFCA4E7EAA87E1 /* RACStringSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACStringSequence.m; path = ReactiveCocoa/RACStringSequence.m; sourceTree = "<group>"; }; 7F01FF58ED09D88DA9B84D9B8C70CBC1 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; }; 7F2757632E925E3FFE5D3408EFBF5890 /* NSObject+RACLifting.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACLifting.m"; path = "ReactiveCocoa/NSObject+RACLifting.m"; sourceTree = "<group>"; }; 7F3FBFE616E8B26FFAE7A01A81E4DB02 /* RACTupleSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTupleSequence.m; path = ReactiveCocoa/RACTupleSequence.m; sourceTree = "<group>"; }; 7FDD2A3F5AE20A6244BF7BE20EA35581 /* RACTargetQueueScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTargetQueueScheduler.h; path = ReactiveCocoa/RACTargetQueueScheduler.h; sourceTree = "<group>"; }; 804AF148E7749A5C2133A96312EC6583 /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = "<group>"; }; 80858E3A6DAE804A9A5D0C0BFC8ECF73 /* YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImage.h; path = YYWebImage/YYWebImage.h; sourceTree = "<group>"; }; 80D395D3DF01AE93D254385A2D56B74D /* RACSignalSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSignalSequence.m; path = ReactiveCocoa/RACSignalSequence.m; sourceTree = "<group>"; }; 814878CB0DE6801FB2C3F086C3DB47E1 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = "<group>"; }; 81B59BBD2CC1A1AC412D8AFBADAC876B /* YYModel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.release.xcconfig; sourceTree = "<group>"; }; 833AC91B582C93032622D0F76E1E5768 /* RACCommand.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACCommand.h; path = ReactiveCocoa/RACCommand.h; sourceTree = "<group>"; }; 83CC16DE85EED25CEDCDF598ACFF9CE8 /* RACReturnSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACReturnSignal.m; path = ReactiveCocoa/RACReturnSignal.m; sourceTree = "<group>"; }; 8453CF9C00D6DAA765CAC20A933A583F /* RACCommand.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACCommand.m; path = ReactiveCocoa/RACCommand.m; sourceTree = "<group>"; }; 850D980D60C28982D957F335E4A73398 /* YYImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.release.xcconfig; sourceTree = "<group>"; }; 85A04F85ED4B3E9CD245216C080608F3 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyBoardManager/IQKeyboardManager.h; sourceTree = "<group>"; }; 85E47DE7B0134E6B9D9BF33E95897108 /* RACGroupedSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACGroupedSignal.m; path = ReactiveCocoa/RACGroupedSignal.m; sourceTree = "<group>"; }; 869DA4218386BEB7839648712CBA317E /* UITextField+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextField+RACSignalSupport.h"; path = "ReactiveCocoa/UITextField+RACSignalSupport.h"; sourceTree = "<group>"; }; 86C9D6E5E6EFDC3C5CDE58AFE73F44B2 /* YYImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCache.m; path = YYWebImage/YYImageCache.m; sourceTree = "<group>"; }; 86D550258B8C09106C3E3BB818732DF8 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYCache/YYDiskCache.h; sourceTree = "<group>"; }; 878C27BF809E48229882226988050790 /* UIStepper+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIStepper+RACSignalSupport.m"; path = "ReactiveCocoa/UIStepper+RACSignalSupport.m"; sourceTree = "<group>"; }; 87ADDD56092E030AB5B25A2D321CB463 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = "<group>"; }; 88005F4C1722451128C482D2E470A42F /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyBoardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = "<group>"; }; 881F18746DC772DDA447B22CFFBC2FEA /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = "<group>"; }; 88E2E62884248FD20E1AA9F31EE2CAE4 /* RACQueueScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACQueueScheduler.m; path = ReactiveCocoa/RACQueueScheduler.m; sourceTree = "<group>"; }; 88F8593FC6D7BA66876D7E1E0DB2B210 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = "<group>"; }; 8B07244460B45F1B2BC37C8FA7BE7BEB /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = "<group>"; }; 8B0A7591C6FBC7202F295E779FD1323B /* MKAnnotationView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+RACSignalSupport.m"; path = "ReactiveCocoa/MKAnnotationView+RACSignalSupport.m"; sourceTree = "<group>"; }; 8BB831B403BC247CA9F735E3F0DD3A1C /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYWebImage/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; }; 8CD92FA027BFCD405F343A81FC99C8AE /* KeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KeyboardManager.h; path = IQKeyBoardManager/KeyboardManager.h; sourceTree = "<group>"; }; 8D21BDBB6B9674DF9341698E117C51C3 /* RACErrorSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACErrorSignal.h; path = ReactiveCocoa/RACErrorSignal.h; sourceTree = "<group>"; }; 8DAEC3A734034508FA24900E1B67E6CB /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYModel/YYClassInfo.m; sourceTree = "<group>"; }; 8EDFD4A81F06A5D23740B0CC0624D853 /* RACUnit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACUnit.h; path = ReactiveCocoa/RACUnit.h; sourceTree = "<group>"; }; 8F1DD8AB7EE0FA14CF829CB8FDE868E8 /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyBoardManager/IQToolbar/IQBarButtonItem.m; sourceTree = "<group>"; }; 8F805C5AA57FB69B6E8041BCAFECB8EB /* SDAutoLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDAutoLayout-Info.plist"; sourceTree = "<group>"; }; 900C8A8C15638B594D552EE4AD0B01B9 /* UIGestureRecognizer+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIGestureRecognizer+RACSignalSupport.m"; path = "ReactiveCocoa/UIGestureRecognizer+RACSignalSupport.m"; sourceTree = "<group>"; }; 900D08EFF9663043FE9823AC799B129E /* UIRefreshControl+RACCommandSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+RACCommandSupport.m"; path = "ReactiveCocoa/UIRefreshControl+RACCommandSupport.m"; sourceTree = "<group>"; }; 90F36CE5A83CA0FE9C21409881573020 /* RACSignalSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSignalSequence.h; path = ReactiveCocoa/RACSignalSequence.h; sourceTree = "<group>"; }; 9207278B9D4AB9254B0DB88F04F95F12 /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyBoardManager/IQKeyboardReturnKeyHandler.h; sourceTree = "<group>"; }; 92F550E3738CD343AD02863420188AB9 /* NSString+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSString+RACSequenceAdditions.m"; sourceTree = "<group>"; }; 93680FCA5D70F06A1FE07B53BD2D470F /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = "<group>"; }; 9375AD6D248A2BB840150BAAF3E48668 /* RACIndexSetSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACIndexSetSequence.h; path = ReactiveCocoa/RACIndexSetSequence.h; sourceTree = "<group>"; }; 93E56372323730ADB5065DE15ADFA168 /* IQKeyboardManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManager.modulemap; sourceTree = "<group>"; }; 947D043281885DFE8E92EAC756993910 /* RACKVOChannel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACKVOChannel.h; path = ReactiveCocoa/RACKVOChannel.h; sourceTree = "<group>"; }; 94A27524FCE58E0CE90F6BB0D089501B /* RACUnit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACUnit.m; path = ReactiveCocoa/RACUnit.m; sourceTree = "<group>"; }; 95EB7D99B8FEBED422320B52FE9DD44D /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = "<group>"; }; 96291BF17B7DD8E08BF673C2145F20FF /* RACKVOProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACKVOProxy.h; path = ReactiveCocoa/RACKVOProxy.h; sourceTree = "<group>"; }; 96DAF2E95371EFEFD8B1C836D2789042 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = "<group>"; }; 97CCC96F312B584AFDC931C045B035D3 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyBoardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = "<group>"; }; 97FDB4289325AA57C7C02A0DEBCD14A9 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = "<group>"; }; 98140791FC09900C55D90B716AAA89FC /* RACScheduler+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACScheduler+Subclass.h"; path = "ReactiveCocoa/RACScheduler+Subclass.h"; sourceTree = "<group>"; }; 98527D7196957AAB07B79E2E2AFDE23E /* IQKeyboardManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardManager.framework; path = IQKeyboardManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 992112BE47ED0CD282A19A686DEC5FA8 /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = "<group>"; }; 993B95BCCFEC31E992AB4F34B7677DEB /* YYImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImage.m; path = YYImage/YYImage.m; sourceTree = "<group>"; }; 9878D2C18E9003F889F5458D2203A124 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; }; 987F7379FFCCFAF789988816226B4499 /* RACEXTKeyPathCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEXTKeyPathCoding.h; path = ReactiveCocoa/extobjc/RACEXTKeyPathCoding.h; sourceTree = "<group>"; }; 98816DCB7AB298E8BC997ED4850F5462 /* RACDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDisposable.h; path = ReactiveCocoa/RACDisposable.h; sourceTree = "<group>"; }; 98DA877195A8559A2D72EC623FDFA0B5 /* NSOrderedSet+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSOrderedSet+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSOrderedSet+RACSequenceAdditions.m"; sourceTree = "<group>"; }; 98DDB64E58946DC23B6C3B693A0C56BF /* NSString+RACKeyPathUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+RACKeyPathUtilities.m"; path = "ReactiveCocoa/NSString+RACKeyPathUtilities.m"; sourceTree = "<group>"; }; 99B3D4C59C0DB23FB84A3D24F0C14AC9 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; }; 99B8D9707E15BC4F80CF2650B7174F38 /* RACStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACStream.m; path = ReactiveCocoa/RACStream.m; sourceTree = "<group>"; }; 9ACC5DEA78507FDA644C3FCE3F4EF5EA /* RACScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACScheduler.h; path = ReactiveCocoa/RACScheduler.h; sourceTree = "<group>"; }; 9B6B88A114410EE2E394D50A29DFFF02 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; }; 9BC90E4D272CEA5634B637942FBA7CFF /* YYCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9DF4DE629098FF15B403BE56D0856DA2 /* YYCache.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.debug.xcconfig; sourceTree = "<group>"; }; 9E62458700016A3E23333F3E8D05EC75 /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyBoardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = "<group>"; }; 9EB0ED33B7BB6511AD60C265D69680FC /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = "<group>"; }; 9FFE6337C733122EF8FD39AD185A6F77 /* AFNetworking-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AFNetworking-Info.plist"; sourceTree = "<group>"; }; A09E028517389C3AC406E3E5ADCC7372 /* YYImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCoder.h; path = YYImage/YYImageCoder.h; sourceTree = "<group>"; }; A1E5E3B69E93987B632086B93782F078 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = "<group>"; }; A25D4294B555D413AB588FBA8F96B306 /* IQKeyboardManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManager-Info.plist"; sourceTree = "<group>"; }; A2FD65B3495B0AD2D2D16197F3D9075A /* AFNetworking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.release.xcconfig; sourceTree = "<group>"; }; A3A182F138404FF1C5E4492D48F71E32 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = "<group>"; }; 9E8D802B680EB36AB364D9A012752AF9 /* UIDatePicker+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIDatePicker+RACSignalSupport.h"; path = "ReactiveCocoa/UIDatePicker+RACSignalSupport.h"; sourceTree = "<group>"; }; 9EB8D127456595A163640931F226123E /* YYFrameImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFrameImage.h; path = YYImage/YYFrameImage.h; sourceTree = "<group>"; }; 9F6848E4B27C4664E5684A54E348883F /* UIControl+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+RACSignalSupport.m"; path = "ReactiveCocoa/UIControl+RACSignalSupport.m"; sourceTree = "<group>"; }; 9F729CD728B26013CB9E47F3DCDB8B54 /* UIImage+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+YYWebImage.h"; path = "YYWebImage/Categories/UIImage+YYWebImage.h"; sourceTree = "<group>"; }; 9F9CA04FC992548C8A47C071A76A6447 /* UIImageView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+YYWebImage.m"; path = "YYWebImage/Categories/UIImageView+YYWebImage.m"; sourceTree = "<group>"; }; 9F9DA13783E226D17EFB2B7DE1FF7257 /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = "<group>"; }; 9FCE82E236609C1EBFA68AF66C47C644 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = "<group>"; }; A082ECD800427D9F8926C4BB8599E0B2 /* SVProgressHUD-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SVProgressHUD-Info.plist"; sourceTree = "<group>"; }; A195EE79E18E1DC4CB6AAB254EDC483C /* RACSubscriptionScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubscriptionScheduler.h; path = ReactiveCocoa/RACSubscriptionScheduler.h; sourceTree = "<group>"; }; A1B2487ACD76A2782C4ABCFDDC00E3B9 /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYCache/YYMemoryCache.h; sourceTree = "<group>"; }; A1D5121CF9DAB5B036EFC7BF9F5E244F /* NSArray+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSArray+RACSequenceAdditions.h"; sourceTree = "<group>"; }; A2AE3BC45C093B95D130463715214217 /* CALayer+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYWebImage.m"; path = "YYWebImage/Categories/CALayer+YYWebImage.m"; sourceTree = "<group>"; }; A3AB1BA8B2D41ABFA4DDCCBB5C250FF0 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = "<group>"; }; A43EF1279DE5F7EC31453352EC5C151E /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = "<group>"; }; A4DE8853B09B5819E6B4FC52DFC16944 /* UITextField+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+RACSignalSupport.m"; path = "ReactiveCocoa/UITextField+RACSignalSupport.m"; sourceTree = "<group>"; }; A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking.framework; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A566BFDC3300AE83207B09AF697540E0 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = "<group>"; }; A6D1D2633FCA2C2E14D4DCE781C73340 /* IQKeyboardManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.debug.xcconfig; sourceTree = "<group>"; }; A735E9C2405BD745A1E76AA06DA294A4 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = "<group>"; }; A7E093334DF63FCE9D020F9F47A81A44 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; }; A83B21C0E415562B7F3AA852853901B2 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = "<group>"; }; A89505BE5DB6EB8C15D3A859D3ABC461 /* IQKeyboardManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-umbrella.h"; sourceTree = "<group>"; }; AB921236EFEEA7E1F0AF90E95E46867C /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyBoardManager/IQToolbar/IQToolbar.h; sourceTree = "<group>"; }; AC7DD126C303BC63B0A47A864015048F /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = "<group>"; }; ADAC7154F49562704B1C3D92C45BDE93 /* YYModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-umbrella.h"; sourceTree = "<group>"; }; AE035C5592517EF0C4EC5D5F6316EE0D /* YYWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.debug.xcconfig; sourceTree = "<group>"; }; AF91CF4D12E4987DE5AE0EA3E73FC3C2 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; }; B06935E915BC7EE24FF39FEC596A42B8 /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyBoardManager/IQTextView/IQTextView.h; sourceTree = "<group>"; }; B083F83B7B619CF5325F8BEE4EB9D21D /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; }; A51C443E624CAA7767652DE49FC8761B /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; }; A6732C57D0B32E5F29B65FCA3D321A75 /* SDAutoLayout.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.release.xcconfig; sourceTree = "<group>"; }; A7180998FC103032D8E88A178405C4BE /* RACTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTuple.m; path = ReactiveCocoa/RACTuple.m; sourceTree = "<group>"; }; A8880B484489FA1ECAF24AFAE683C16B /* RACQueueScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACQueueScheduler.h; path = ReactiveCocoa/RACQueueScheduler.h; sourceTree = "<group>"; }; A8BC32E1275B69B225822D66AE398C55 /* YYAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAnimatedImageView.m; path = YYImage/YYAnimatedImageView.m; sourceTree = "<group>"; }; A8BFF3BDF77DEBA5AECA8BB422A2901E /* NSIndexSet+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSIndexSet+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSIndexSet+RACSequenceAdditions.m"; sourceTree = "<group>"; }; A8C453FFA1AA0B1FD8B65ECB008947B6 /* RACReplaySubject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACReplaySubject.m; path = ReactiveCocoa/RACReplaySubject.m; sourceTree = "<group>"; }; A8DAFD8E017204BB5BAB0708BCCBF8F0 /* NSString+RACKeyPathUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+RACKeyPathUtilities.h"; path = "ReactiveCocoa/NSString+RACKeyPathUtilities.h"; sourceTree = "<group>"; }; AA4A65D5C30F8CDE4F495FFF90DE282A /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = "<group>"; }; ABF56418AB93AC5009C1779A22CB7F79 /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; }; AC39B8A34F90FED549ABF921B9B04977 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = "<group>"; }; AD6D87078F5C5957BC495E5F630EB1A4 /* RACSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSignal.h; path = ReactiveCocoa/RACSignal.h; sourceTree = "<group>"; }; AEAE0771F238056B9994016BA873753D /* RACEXTRuntimeExtensions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEXTRuntimeExtensions.h; path = ReactiveCocoa/extobjc/RACEXTRuntimeExtensions.h; sourceTree = "<group>"; }; AFC2EC642BDF73D200250D1B9FA76930 /* RACEagerSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEagerSequence.m; path = ReactiveCocoa/RACEagerSequence.m; sourceTree = "<group>"; }; B08B301668C17E4DED669484C56AFA7D /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = "<group>"; }; B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B450207B23EC4430E17575125E7C6FB9 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; }; B468F7252C4E9D17C6AB261FC977B177 /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; }; B46936C03AE70A35AD70DD2631D87E30 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; }; B4E6D390027BC38891D8B27ED3A53A2E /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = "<group>"; }; B56A59E1393978801887DEEE848C5740 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; }; B61CD6A927AD2A95B66440B87B9D6E45 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyBoardManager/Categories/IQUIViewController+Additions.m"; sourceTree = "<group>"; }; B6CAB5D74635D11F0987470A7CF362E6 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = "<group>"; }; B7BB8316EB15A2F1D4345C57B50D19F4 /* UIImage+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYWebImage.m"; path = "YYWebImage/Categories/UIImage+YYWebImage.m"; sourceTree = "<group>"; }; B8D1FCBF17339E0503FC0A5815A8B59B /* SDAutoLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-umbrella.h"; sourceTree = "<group>"; }; BA64E9B6956CB8B50404D1109AF2B0FC /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = "<group>"; }; BCB58A5382C1F631BEE128C111FDFE77 /* SVProgressHUD.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.release.xcconfig; sourceTree = "<group>"; }; BCC14ADFC0D82391D9F788C5B3F2643D /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = "<group>"; }; BDC1252B5B77C045A32DDEBA4734C145 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = "<group>"; }; BE35A1F11A75919EDB8E585CA0E39584 /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyBoardManager/IQTextView/IQTextView.m; sourceTree = "<group>"; }; BE70CD7B216B7ADB16EDECCCC9898C73 /* YYImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYImage-dummy.m"; sourceTree = "<group>"; }; B158E8AED11DBADBB4AE2F8F57CD6228 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = "<group>"; }; B16B09647C7889027ADC44AA11F1520A /* SVProgressHUD.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.release.xcconfig; sourceTree = "<group>"; }; B1806F16888D7C8CE1E16F7B49D0B9A5 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = "<group>"; }; B1F7886832F5F2A25A2F0A49D17B43E1 /* UIButton+RACCommandSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+RACCommandSupport.m"; path = "ReactiveCocoa/UIButton+RACCommandSupport.m"; sourceTree = "<group>"; }; B213228D95FB56208B6334F46E485B8C /* UIImageView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+YYWebImage.h"; path = "YYWebImage/Categories/UIImageView+YYWebImage.h"; sourceTree = "<group>"; }; B2F16994B5C28D7970EF7C36F03AA9EC /* RACPassthroughSubscriber.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACPassthroughSubscriber.h; path = ReactiveCocoa/RACPassthroughSubscriber.h; sourceTree = "<group>"; }; B363CABAD1A2FAB3048B00E9AE457E44 /* YYWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-prefix.pch"; sourceTree = "<group>"; }; B36F0542A406F6F794DA6B8A7BE9CA4B /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = "<group>"; }; B5118F54CE1FC484D8EF0DFF4C22AC4F /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = "<group>"; }; B578422E949B59D5220F93F4171ED00B /* RACQueueScheduler+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACQueueScheduler+Subclass.h"; path = "ReactiveCocoa/RACQueueScheduler+Subclass.h"; sourceTree = "<group>"; }; B588FB5B5FC3BDBB4A0F4165E640A5A0 /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyBoardManager/Categories/IQUIViewController+Additions.h"; sourceTree = "<group>"; }; B58D21EB1B75D201289E7C9F6F024BF0 /* RACEXTScope.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEXTScope.h; path = ReactiveCocoa/extobjc/RACEXTScope.h; sourceTree = "<group>"; }; B5BCE7CF342AAB12DE8189071F30D61D /* RACObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACObjCRuntime.h; path = ReactiveCocoa/RACObjCRuntime.h; sourceTree = "<group>"; }; B609706CC8B36378E05276D7AB98D5BB /* UITableView+SDAutoTableViewCellHeight.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+SDAutoTableViewCellHeight.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h"; sourceTree = "<group>"; }; B64D776B0B4DFBBA82505BF0E0216AB1 /* YYModel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.debug.xcconfig; sourceTree = "<group>"; }; B686B8FA39EE0D567BFC6BD27B1310F2 /* RACPassthroughSubscriber.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACPassthroughSubscriber.m; path = ReactiveCocoa/RACPassthroughSubscriber.m; sourceTree = "<group>"; }; B6D01C6A46F1253A49F8DB852ADC8F22 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; }; B7D2668FEF5668B4F39FF42E7CAD610E /* UIBarButtonItem+RACCommandSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+RACCommandSupport.h"; path = "ReactiveCocoa/UIBarButtonItem+RACCommandSupport.h"; sourceTree = "<group>"; }; B7EDF8E75B2CB2566D3F4512274A114D /* ReactiveCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ReactiveCocoa-umbrella.h"; sourceTree = "<group>"; }; B8C8A25BA45E668A8A759C345CF15566 /* RACEagerSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEagerSequence.h; path = ReactiveCocoa/RACEagerSequence.h; sourceTree = "<group>"; }; B970CD25001B099C48E341AB6E6F8DB5 /* UIButton+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+YYWebImage.h"; path = "YYWebImage/Categories/UIButton+YYWebImage.h"; sourceTree = "<group>"; }; B9DCC8659F13FE0EB07E99175B192159 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; }; BA0320129ADA36D84A0B9F63B744931B /* RACChannel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACChannel.m; path = ReactiveCocoa/RACChannel.m; sourceTree = "<group>"; }; BA346367BF24C52BCDA92E7402833F53 /* RACDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDelegateProxy.m; path = ReactiveCocoa/RACDelegateProxy.m; sourceTree = "<group>"; }; BA6EC94FFA5C97825675C0244BF74BFA /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyBoardManager/IQToolbar/IQBarButtonItem.h; sourceTree = "<group>"; }; BA8BBA26EF90C8FEAE8A1A4147A8F995 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = "<group>"; }; BA8E501E142062CAB635E8D44F4FD0B2 /* YYModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-umbrella.h"; sourceTree = "<group>"; }; BAA0FAC1A1F1875B238116AE52C78963 /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = "<group>"; }; BB25E43C6D1DE779F80D3627E305B364 /* NSData+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+RACSupport.h"; path = "ReactiveCocoa/NSData+RACSupport.h"; sourceTree = "<group>"; }; BBC2C0D21F974D29BA887E57A5479179 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; }; BD02BB08A6B0D1404B248CAFFC7D2A1F /* UISlider+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISlider+RACSignalSupport.h"; path = "ReactiveCocoa/UISlider+RACSignalSupport.h"; sourceTree = "<group>"; }; BD419F1FE2BC539F1FBB44AAD718DA3D /* RACArraySequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACArraySequence.m; path = ReactiveCocoa/RACArraySequence.m; sourceTree = "<group>"; }; BD454E7E154511F9B7C254A4032B1847 /* UISwitch+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISwitch+RACSignalSupport.h"; path = "ReactiveCocoa/UISwitch+RACSignalSupport.h"; sourceTree = "<group>"; }; BD8BBC1C5104B25A56D54DDB0AA3D3B3 /* AFNetworking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.release.xcconfig; sourceTree = "<group>"; }; BD901C0090BA1EF3A2BA39314E6ECA3C /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = "<group>"; }; BDA029B4A4A952E7810299FFF0C30A63 /* RACBehaviorSubject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACBehaviorSubject.h; path = ReactiveCocoa/RACBehaviorSubject.h; sourceTree = "<group>"; }; BE3300C475FAF141ED7B5897EF782A63 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; }; BED23C37C5BBF70FFEFD4925BACF3AA7 /* NSArray+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+RACSequenceAdditions.m"; path = "ReactiveCocoa/NSArray+RACSequenceAdditions.m"; sourceTree = "<group>"; }; BF74743C7A7A330AC3A1799C8DAE8332 /* Pods-BuWanVideo2.0.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BuWanVideo2.0.release.xcconfig"; sourceTree = "<group>"; }; C04B499BD8BD9413F843D3F224DDC73B /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; }; C07901861F7033136A10E9E079189DE0 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = "<group>"; }; C2429A01B58547277CA5AE9257FC93AC /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = "<group>"; }; C30D70E4FA7926DB96CD8F1E95DDD23C /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; }; C4D5AFF360AAC16FD89F3B5FFE8D68C0 /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = "<group>"; }; C63621A41D21E370BA7572D25405DE87 /* YYSpriteSheetImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSpriteSheetImage.h; path = YYImage/YYSpriteSheetImage.h; sourceTree = "<group>"; }; C6AFABD9240597E93FCDAC14C3E51C57 /* YYModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYModel-Info.plist"; sourceTree = "<group>"; }; C8EE86CD70BDCE1CB83C2AC34F1E1B86 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; }; C931BFAC1492FBAD2150D90870044B64 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = "<group>"; }; C98F4C1A08FB254B89E0A2D10711986B /* YYModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYModel-dummy.m"; sourceTree = "<group>"; }; CA4B9B1C91E57BF82783779720252630 /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; }; CCAE2CAB49893772FAC15CE03C7F3852 /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYModel/YYClassInfo.h; sourceTree = "<group>"; }; CCC82EFB2C6B435B223A64E725C9E568 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = "<group>"; }; D09826676879AB23092A3824F3AD317E /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYModel/NSObject+YYModel.h"; sourceTree = "<group>"; }; D1493131A3499E59F3F8F82A2789AE2F /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = "<group>"; }; D436DD56400948B8D2F8E227212BEA3A /* SDAutoLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDAutoLayout-Info.plist"; sourceTree = "<group>"; }; D5AFCE8DBE0A4C0EB931EF252B1E23E5 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = "<group>"; }; BFA429B6507B97E1DB640B327AEEAC79 /* RACIndexSetSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACIndexSetSequence.m; path = ReactiveCocoa/RACIndexSetSequence.m; sourceTree = "<group>"; }; BFBCD62A75EF89430836862FE02E4293 /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = "<group>"; }; C038C91715934C21109A8313DBE02AC9 /* RACSubscriber.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubscriber.h; path = ReactiveCocoa/RACSubscriber.h; sourceTree = "<group>"; }; C07F3BEDE4ADEFE3CEE51C199043AC14 /* NSObject+RACSelectorSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACSelectorSignal.m"; path = "ReactiveCocoa/NSObject+RACSelectorSignal.m"; sourceTree = "<group>"; }; C12091C957E009164D69B6AFF58A24F9 /* UIControl+RACSignalSupportPrivate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+RACSignalSupportPrivate.m"; path = "ReactiveCocoa/UIControl+RACSignalSupportPrivate.m"; sourceTree = "<group>"; }; C12944C02F254E7FB08779E41A084DBE /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = "<group>"; }; C2156F8B4F76611CA48A6A0A09734B04 /* YYWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageOperation.h; path = YYWebImage/YYWebImageOperation.h; sourceTree = "<group>"; }; C26CC8AF49451A3472849F13615F5721 /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYWebImage/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; }; C32EC8E3B5ABD438268D92A5672EE06B /* UIActionSheet+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActionSheet+RACSignalSupport.m"; path = "ReactiveCocoa/UIActionSheet+RACSignalSupport.m"; sourceTree = "<group>"; }; C38B7241AF8D92CE271857AA8F681355 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; }; C3ABEDEE908C79771507FAC199F6488A /* RACScopedDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACScopedDisposable.h; path = ReactiveCocoa/RACScopedDisposable.h; sourceTree = "<group>"; }; C468790F90350EF58F5450FA9EE9E8AF /* RACStringSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACStringSequence.h; path = ReactiveCocoa/RACStringSequence.h; sourceTree = "<group>"; }; C55F8FE2D33DFF135364A3ED05A6BFB8 /* IQKeyboardManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-umbrella.h"; sourceTree = "<group>"; }; C5F9831AAE1EE95E6DECE83938DA09BB /* NSObject+RACLifting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACLifting.h"; path = "ReactiveCocoa/NSObject+RACLifting.h"; sourceTree = "<group>"; }; C630C0A887F984C3A255809B69E2342C /* RACEXTRuntimeExtensions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEXTRuntimeExtensions.m; path = ReactiveCocoa/extobjc/RACEXTRuntimeExtensions.m; sourceTree = "<group>"; }; C64185489039A148112E395F72220725 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyBoardManager/Resources/IQKeyboardManager.bundle; sourceTree = "<group>"; }; C6602512AB4BE8FE4AA7DE1228C16053 /* UIImagePickerController+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImagePickerController+RACSignalSupport.m"; path = "ReactiveCocoa/UIImagePickerController+RACSignalSupport.m"; sourceTree = "<group>"; }; C6749570D1ADFBD1832728C1D966D23C /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyBoardManager/IQKeyboardReturnKeyHandler.m; sourceTree = "<group>"; }; C6F4DF4BADD492B836AC4B7BEC1CBFF2 /* RACDynamicSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDynamicSequence.h; path = ReactiveCocoa/RACDynamicSequence.h; sourceTree = "<group>"; }; C7345D9D9E1FBF78566047A9A63E4FF9 /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYModel/YYClassInfo.h; sourceTree = "<group>"; }; CA0B2C35340007DD7FA1A7950DEEA7EB /* RACScheduler+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACScheduler+Private.h"; path = "ReactiveCocoa/RACScheduler+Private.h"; sourceTree = "<group>"; }; CA48C73A04E49BB531E4FB67ACD24191 /* YYCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-umbrella.h"; sourceTree = "<group>"; }; CA4EF78971B6F3F366CA6E0AB17E901F /* RACValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACValueTransformer.m; path = ReactiveCocoa/RACValueTransformer.m; sourceTree = "<group>"; }; CA6F15111B25DDD99DCCF25DBEFAB9E1 /* UIButton+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+YYWebImage.m"; path = "YYWebImage/Categories/UIButton+YYWebImage.m"; sourceTree = "<group>"; }; CAC778F10AAC16F8F8054FB32F5B9364 /* YYCache.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.debug.xcconfig; sourceTree = "<group>"; }; CB2B377748802219807AEC79B42643B4 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; }; CC1825358966CF80F3BC608380E8E7A6 /* NSDictionary+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSDictionary+RACSequenceAdditions.h"; sourceTree = "<group>"; }; CC44335CA52698D41D74DF0DF7C0E147 /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYModel/NSObject+YYModel.m"; sourceTree = "<group>"; }; CC5789DBA76E68E708E55A058A8E0873 /* YYCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-prefix.pch"; sourceTree = "<group>"; }; CCB028AFE7A0DF0D56182BC0AC6AE902 /* NSObject+RACDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACDescription.h"; path = "ReactiveCocoa/NSObject+RACDescription.h"; sourceTree = "<group>"; }; CD2B0C489CDDF40F1BCF010799E7D322 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = "<group>"; }; CD5EE1807E84CF81D7E349D27021215E /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; }; CEF7F311E3B0F90F2FFCA775361B398E /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = "<group>"; }; CF13B9CD526E12ECBEAD613ABEF78602 /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = "<group>"; }; CF32DEAE935907212F05887D894E8560 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = "<group>"; }; CFCBA79B002E9A756BCF52BE603D82AD /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = "<group>"; }; D103328D73DEC8D85F4B748B80D8FF81 /* UISegmentedControl+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISegmentedControl+RACSignalSupport.m"; path = "ReactiveCocoa/UISegmentedControl+RACSignalSupport.m"; sourceTree = "<group>"; }; D1954F72ED62A75C4DEB37870483F9C4 /* UIGestureRecognizer+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIGestureRecognizer+RACSignalSupport.h"; path = "ReactiveCocoa/UIGestureRecognizer+RACSignalSupport.h"; sourceTree = "<group>"; }; D1F93A8472B060CEC1ED1062D0DC7BEA /* YYWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYWebImage-Info.plist"; sourceTree = "<group>"; }; D22D62D79746105BBB8C392B564DD13F /* UITableViewHeaderFooterView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableViewHeaderFooterView+RACSignalSupport.h"; path = "ReactiveCocoa/UITableViewHeaderFooterView+RACSignalSupport.h"; sourceTree = "<group>"; }; D2852C259BBD4C618B14A423AB352290 /* ReactiveCocoa.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReactiveCocoa.release.xcconfig; sourceTree = "<group>"; }; D314D61BBEC86DC8D663F9DB536A85AC /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyBoardManager/IQTextView/IQTextView.h; sourceTree = "<group>"; }; D4C479BCE7C508653EA1627FE4B17425 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; }; D50615C98040D7A8F05D6516C09CA9FA /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = "<group>"; }; D555489FA91BAE8137D7E10AFE52E644 /* NSObject+RACKVOWrapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACKVOWrapper.h"; path = "ReactiveCocoa/NSObject+RACKVOWrapper.h"; sourceTree = "<group>"; }; D5EFB96E1F6CFE8955BC11A2160A2066 /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = "<group>"; }; D60872E5F1A73BD7F0996C3C3924A93E /* Pods-BuWanVideo2.0-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BuWanVideo2.0-frameworks.sh"; sourceTree = "<group>"; }; D729A3449394AD8ED95EB96B57BA219C /* Pods-BuWanVideo2.0.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-BuWanVideo2.0.modulemap"; sourceTree = "<group>"; }; D8CC5EA0854A065E4F729E60EAC79440 /* SDAutoLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDAutoLayout-dummy.m"; sourceTree = "<group>"; }; D8F507B0AD09B94415DAFC3427A0C308 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; }; D991275587332C3DC6F5543A13528CED /* YYModel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.release.xcconfig; sourceTree = "<group>"; }; D73115BC0307E5D9C826EA7896F3150C /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyBoardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = "<group>"; }; D77134E6892BFE82EF868BD34A118BC4 /* UITableViewCell+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableViewCell+RACSignalSupport.h"; path = "ReactiveCocoa/UITableViewCell+RACSignalSupport.h"; sourceTree = "<group>"; }; D7F18E472350556FC6C10C3AB0EDDFAB /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; }; D8E4AE8492CD85A3AA0007B2E2FD438A /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; }; D999AA74EACE8BFEA6095485583F9FC0 /* RACSerialDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSerialDisposable.m; path = ReactiveCocoa/RACSerialDisposable.m; sourceTree = "<group>"; }; D9FC88CFA8A5DD9CB2FE208853FCB502 /* ReactiveCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ReactiveCocoa-prefix.pch"; sourceTree = "<group>"; }; DA9BD546B398156542593B6FD8FA13D6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; DB04FCC2775BBC134AA91CDE58E9CBA8 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = "<group>"; }; DBE470B5103AAD174FDEFED1D372D753 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = "<group>"; }; DBCF7F9C3396B14F3904971E963AD488 /* YYModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYModel-Info.plist"; sourceTree = "<group>"; }; DC26D0D87DD2C52C536DE5BD573D3B9A /* UIView+SDAutoLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+SDAutoLayout.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m"; sourceTree = "<group>"; }; DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; DC4A8FC0FC0C60FE6D3C4BC0935E8C35 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyBoardManager/IQKeyboardManager.h; sourceTree = "<group>"; }; DC6E37E1052C3C2235209A3A867F0A76 /* YYImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYImage-Info.plist"; sourceTree = "<group>"; }; DDEA2F8CBD187ED244641ECB5CAE904E /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = "<group>"; }; DF3E5DE912602F028F7F75A6ABC70A43 /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = "<group>"; }; E2F02E0FA6EDE103A0023DBBF26819E5 /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyBoardManager/IQKeyboardReturnKeyHandler.m; sourceTree = "<group>"; }; DC3409F628DDE79F8854CEACD4720C2A /* RACSignal+Operations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACSignal+Operations.h"; path = "ReactiveCocoa/RACSignal+Operations.h"; sourceTree = "<group>"; }; DC8103F01BD7BC487061DF76BB3C1802 /* RACChannel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACChannel.h; path = ReactiveCocoa/RACChannel.h; sourceTree = "<group>"; }; DCD065B83FCA4EC8D0792FF4B408F63C /* RACReturnSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACReturnSignal.h; path = ReactiveCocoa/RACReturnSignal.h; sourceTree = "<group>"; }; DDAF626EFB181E6DA46DA2B826969915 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = "<group>"; }; DE59F1432457CA0AFC3D1C5B7BAF6880 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; }; DE5ABC7124DD5740F19D35EB3345161B /* UITableViewCell+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+RACSignalSupport.m"; path = "ReactiveCocoa/UITableViewCell+RACSignalSupport.m"; sourceTree = "<group>"; }; DEC461A247DD72A88F017914E2D520F0 /* SDAutoLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-prefix.pch"; sourceTree = "<group>"; }; DF75D9B4CA5E8CBEBBB7DF9A734EA3C1 /* RACKVOChannel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACKVOChannel.m; path = ReactiveCocoa/RACKVOChannel.m; sourceTree = "<group>"; }; DFAD290958EE44F610480F7ACA363F5C /* YYImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCoder.h; path = YYImage/YYImageCoder.h; sourceTree = "<group>"; }; E12987F6D63393126F3EB6F037CA4334 /* YYModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-prefix.pch"; sourceTree = "<group>"; }; E14A4529B80BD6D6B2B869262602FA72 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = "<group>"; }; E2425B805460ABFDDF241214F42F2B23 /* RACKVOTrampoline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACKVOTrampoline.h; path = ReactiveCocoa/RACKVOTrampoline.h; sourceTree = "<group>"; }; E334FF3B79C08A435863880297EC647F /* NSUserDefaults+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSUserDefaults+RACSupport.h"; path = "ReactiveCocoa/NSUserDefaults+RACSupport.h"; sourceTree = "<group>"; }; E3653DFC0E27DCDB0229F57CCC8DFE77 /* NSFileHandle+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileHandle+RACSupport.h"; path = "ReactiveCocoa/NSFileHandle+RACSupport.h"; sourceTree = "<group>"; }; E3666D3A03026EF31697B7736F001546 /* NSString+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+RACSequenceAdditions.h"; path = "ReactiveCocoa/NSString+RACSequenceAdditions.h"; sourceTree = "<group>"; }; E3C9D1D6453C40B830564AF3B6445728 /* RACEmptySequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEmptySequence.h; path = ReactiveCocoa/RACEmptySequence.h; sourceTree = "<group>"; }; E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYModel.framework; path = YYModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E5C6E06542E297A135D519C6804088F7 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; }; E5CE5BE4FB1A36664CB789830D32279D /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyBoardManager/Categories/IQNSArray+Sort.h"; sourceTree = "<group>"; }; E6B7F0DDE588CB4BBDD9719B167D3CF1 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; }; E700DBDACCC1B25FAAA670E476A16FFF /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; }; E750E913839C0F5BBC6A4F8DA265F43A /* YYCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYCache-Info.plist"; sourceTree = "<group>"; }; E7E1E268681B87CAE7D1DB4C69D65AB4 /* RACBlockTrampoline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACBlockTrampoline.h; path = ReactiveCocoa/RACBlockTrampoline.h; sourceTree = "<group>"; }; E7E7BA38F7FF6280171AD6CC890B4D46 /* YYWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYWebImage.modulemap; sourceTree = "<group>"; }; E80EC1428998ED15F19267485D7BBA50 /* RACDynamicSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDynamicSignal.m; path = ReactiveCocoa/RACDynamicSignal.m; sourceTree = "<group>"; }; E83F09FF6BA4E5B0CF6480560FD72F2B /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; }; E87D9D004B86E5F84106CDA49E3A60D0 /* UIImage+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYWebImage.m"; path = "YYWebImage/Categories/UIImage+YYWebImage.m"; sourceTree = "<group>"; }; E88D6DAB1482251E1381F7ADFFD504F2 /* NSObject+RACPropertySubscribing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACPropertySubscribing.h"; path = "ReactiveCocoa/NSObject+RACPropertySubscribing.h"; sourceTree = "<group>"; }; E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E9AFD35E94021D0EC91CD4E9A6874ADA /* YYFrameImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFrameImage.m; path = YYImage/YYFrameImage.m; sourceTree = "<group>"; }; EA69C266560FAAE2F7E128E1FF4DD2B5 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = "<group>"; }; ECA462F2698E894555C1B7BFAD347E13 /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYModel/NSObject+YYModel.m"; sourceTree = "<group>"; }; EEDD14A100639499B40FB2C6E5D99C7F /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyBoardManager/IQToolbar/IQBarButtonItem.h; sourceTree = "<group>"; }; F3CA00D1ED070F8F8722D5D70F4C0C01 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; }; F6AEAC98FD2F93167BDA306D2DE93C3F /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = "<group>"; }; F8623FC9861C8ABEBE1730FC61A1111F /* YYImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.release.xcconfig; sourceTree = "<group>"; }; EA66F561A1C07CE8E662344E57451964 /* RACEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEvent.h; path = ReactiveCocoa/RACEvent.h; sourceTree = "<group>"; }; EAE15951F97A0B811DD8697D1D456EF3 /* RACUnarySequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACUnarySequence.m; path = ReactiveCocoa/RACUnarySequence.m; sourceTree = "<group>"; }; EBE315C7D6E406815861904976F83DAF /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyBoardManager/IQToolbar/IQToolbar.h; sourceTree = "<group>"; }; EBF6F1933EA0456A19C40D1ECD1F203E /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = "<group>"; }; F005F95DA9816FFC3C645FF2CF1A34AA /* RACBlockTrampoline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACBlockTrampoline.m; path = ReactiveCocoa/RACBlockTrampoline.m; sourceTree = "<group>"; }; F0FC3B3345E30380C1C6C2784328BF88 /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = "<group>"; }; F11A1CC136CFD9BB12B9C019A5E24C58 /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYCache/YYCache.h; sourceTree = "<group>"; }; F145567818BE29467A94C45F66EC21D8 /* YYImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.debug.xcconfig; sourceTree = "<group>"; }; F209D369E0B2AC308D7ECFEC3CD412A6 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = "<group>"; }; F22A6CF95C36F2DB67876FB7E0BB2363 /* RACTestScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTestScheduler.m; path = ReactiveCocoa/RACTestScheduler.m; sourceTree = "<group>"; }; F34D023FAAB083ACDDD7A2ADF33C1851 /* UIStepper+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIStepper+RACSignalSupport.h"; path = "ReactiveCocoa/UIStepper+RACSignalSupport.h"; sourceTree = "<group>"; }; F3B7F534E1C75F385C1A4774F3C47DC1 /* NSObject+RACPropertySubscribing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACPropertySubscribing.m"; path = "ReactiveCocoa/NSObject+RACPropertySubscribing.m"; sourceTree = "<group>"; }; F42204D8F8812EEF89FA876F4526AF53 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = "<group>"; }; F54A53A0CD8AD77A8F377AC93608438D /* ReactiveCocoa.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReactiveCocoa.debug.xcconfig; sourceTree = "<group>"; }; F591215C6EB56AD9E6881C04D44ECC78 /* YYImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImage.m; path = YYImage/YYImage.m; sourceTree = "<group>"; }; F5B51CD7EB9C0CAAB70DAA7266265903 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = "<group>"; }; F6BD74D2AEB9E5909DBCE5E196323450 /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = "<group>"; }; F7A93864BA5248907FC26D958AFA12A7 /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = "<group>"; }; F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_BuWanVideo2_0.framework; path = "Pods-BuWanVideo2.0.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; F8BEBBB4D7F6F85EAD46E2A3656217DF /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = "<group>"; }; F92BA11FB00565F6CCA04D3A274D5CF2 /* UITableView+SDAutoTableViewCellHeight.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+SDAutoTableViewCellHeight.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m"; sourceTree = "<group>"; }; FAC1E6623FE2473E9F1D8EF980DE2823 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; }; FAFFD33295AEB5A22C7979EE2C1C7E15 /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyBoardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = "<group>"; }; FB40F6AB3391D3DA0027EC49BD9CE401 /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyBoardManager/Categories/IQUIViewController+Additions.h"; sourceTree = "<group>"; }; FC4BDE0C141DAE902F587415F361A4D8 /* YYWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYWebImage-Info.plist"; sourceTree = "<group>"; }; FCC7B0B5AB4A56496C01EE23E3318409 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = "<group>"; }; FCD4E9507A1EF5D6F511F0C033266E5E /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; }; FDA60A6242FB5E5E939171F483393755 /* SDAutoLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-prefix.pch"; sourceTree = "<group>"; }; FEB39772AA9566576BC914AFC4FD3A75 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; }; FF757B06FC51079DE3E74976127FC490 /* YYImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-umbrella.h"; sourceTree = "<group>"; }; FFDD4B32DEFDD0555453D01AB11D183D /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYCache/YYCache.h; sourceTree = "<group>"; }; F8B05EE08125BAFE10DFE5D0F629BE9E /* RACErrorSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACErrorSignal.m; path = ReactiveCocoa/RACErrorSignal.m; sourceTree = "<group>"; }; F91C975E8C7DB9346E2B9C5AB3E81C0C /* RACKVOProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACKVOProxy.m; path = ReactiveCocoa/RACKVOProxy.m; sourceTree = "<group>"; }; F9B1A992271BB3FEDDF409008415C077 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = "<group>"; }; FB3BD5BFC0811750D86596AD1EBE97B0 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = "<group>"; }; FB9C11FA05290B3BD8D9FF2AA816662A /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; }; FBE4BCB695718AB1210188BA713F5B65 /* RACImmediateScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACImmediateScheduler.h; path = ReactiveCocoa/RACImmediateScheduler.h; sourceTree = "<group>"; }; FBEF70DB009A6AE2E009814F5936E336 /* UIImagePickerController+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImagePickerController+RACSignalSupport.h"; path = "ReactiveCocoa/UIImagePickerController+RACSignalSupport.h"; sourceTree = "<group>"; }; FC152C434115D656719FE2ABE32E5ABB /* YYWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.release.xcconfig; sourceTree = "<group>"; }; FC6B8C412C4D37ADDB145560DAAA0FD4 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; }; FC790DCB7BC82465D349A49441125692 /* MKAnnotationView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+RACSignalSupport.h"; path = "ReactiveCocoa/MKAnnotationView+RACSignalSupport.h"; sourceTree = "<group>"; }; FCAD766FDC2CE25FF7F1C4A38D35DDFD /* SDAutoLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDAutoLayout-dummy.m"; sourceTree = "<group>"; }; FCBE5DEEB8CE6D2357278BB3BA1F1946 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = "<group>"; }; FE367B94D6C728C276AF208CE53E50B5 /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYImage/YYAnimatedImageView.h; sourceTree = "<group>"; }; FE45A096AF6F28F34D05B1EE2A443E7C /* ReactiveCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ReactiveCocoa-dummy.m"; sourceTree = "<group>"; }; FF6E46D7889FEF9FA35813A249C2D37B /* NSData+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+RACSupport.m"; path = "ReactiveCocoa/NSData+RACSupport.m"; sourceTree = "<group>"; }; FFED48445D4C690FD88E438116ED89BD /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; FFFA9B801F334E8BE2D607D16607C35F /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -624,6 +1022,14 @@ 0D5FD6CC0D49C8A7C922E477C48145C7 /* Foundation.framework in Frameworks */, 91B9A2A4C61C5D595A0F0419A325AC40 /* QuartzCore.framework in Frameworks */, 14F89168C65A740ADEDEA99DEE53C70F /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 2DA6D3992470BA83E36A3961F928BD34 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 3A610394B6B3BAD839E2BFDE78F54B09 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -663,14 +1069,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 9D1C768C597BF82E5D67B19EA3F55A6D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 97F1A9CA6BBC0096DF0C1FFC7E66A90F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; ADEED147B124BE7EB0C717F29107F404 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -697,6 +1095,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; D679E25B3BF95A8067DCEC55B970AB89 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1D6D9CBE2CB3F05ED63EA2673C7AC7D7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; D81E52B8AE4343E0084D6C5AE3FA0F31 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -717,218 +1123,143 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 014470781AF4760CC00E1BBE4ECF6C64 /* Core */ = { 0427ADF17399EFB50599B1148B6E65B4 /* WebP */ = { isa = PBXGroup; children = ( 4CC378B1DA059277B1DB48FEA6D95695 /* YYAnimatedImageView.h */, 67CEF7643E18673E24232F356F77380D /* YYAnimatedImageView.m */, 85986F6F80A890AB51E97FEB19D339AF /* YYFrameImage.h */, E9AFD35E94021D0EC91CD4E9A6874ADA /* YYFrameImage.m */, 0E0330675D0150100081993C047FB3D7 /* YYImage.h */, 993B95BCCFEC31E992AB4F34B7677DEB /* YYImage.m */, A09E028517389C3AC406E3E5ADCC7372 /* YYImageCoder.h */, 735F66840C380AE30470C97BF7AC301B /* YYImageCoder.m */, C63621A41D21E370BA7572D25405DE87 /* YYSpriteSheetImage.h */, 7A217778F71886BDEB622CABA8D17505 /* YYSpriteSheetImage.m */, ); name = Core; sourceTree = "<group>"; }; 03D82A2D2EAEAC7BAE2227B55CAC5287 /* WebP */ = { isa = PBXGroup; children = ( 1FAB7781DFA9C8ABB121FE008FDF1FAC /* Frameworks */, 173723CA56B812243A4CE36DF69FB1CE /* Frameworks */, ); name = WebP; sourceTree = "<group>"; }; 04A92D6FF0F8E1DF9E55BE94F4831887 /* IQKeyboardManager */ = { 046BB934B24039F1CBAE4BAEFAB9F58B /* Support Files */ = { isa = PBXGroup; children = ( EEDD14A100639499B40FB2C6E5D99C7F /* IQBarButtonItem.h */, 65C8D432CB8AEB2482293031D7FB17EC /* IQBarButtonItem.m */, DC4A8FC0FC0C60FE6D3C4BC0935E8C35 /* IQKeyboardManager.h */, 5FFB0C026B7A9FA00C92CBFD2B008F6C /* IQKeyboardManager.m */, 7B0E5C35357559413BE33DE720EF67CC /* IQKeyboardManagerConstants.h */, 403347D8D64469731D88DFA85E5BF177 /* IQKeyboardManagerConstantsInternal.h */, 6A7D01EB7485DD6573A8E179985B9283 /* IQKeyboardReturnKeyHandler.h */, E2F02E0FA6EDE103A0023DBBF26819E5 /* IQKeyboardReturnKeyHandler.m */, 776F41CDA4D3EC6CDD6E7F54C91B5CA1 /* IQNSArray+Sort.h */, 23BCBFFFAF38ACFE565CD1279A2A7E41 /* IQNSArray+Sort.m */, B06935E915BC7EE24FF39FEC596A42B8 /* IQTextView.h */, BE35A1F11A75919EDB8E585CA0E39584 /* IQTextView.m */, 73A8D0E98CE29AB8E321DF3EE8FEBFB7 /* IQTitleBarButtonItem.h */, 83E7BD087582D365B7C7195190F03660 /* IQTitleBarButtonItem.m */, AB921236EFEEA7E1F0AF90E95E46867C /* IQToolbar.h */, 158B6C4D9030F93BCCE250DFE085B1EF /* IQToolbar.m */, 28BE94CD106A8C4F00420B542A2D9F16 /* IQUIScrollView+Additions.h */, FAFFD33295AEB5A22C7979EE2C1C7E15 /* IQUIScrollView+Additions.m */, 9E62458700016A3E23333F3E8D05EC75 /* IQUITextFieldView+Additions.h */, 1FA3696182C088F327A126D8E13EB9D5 /* IQUITextFieldView+Additions.m */, 199D63082191E4E0094F9E922C5B4353 /* IQUIView+Hierarchy.h */, 064F4C4BF9323C0B2DF7050F670C30D4 /* IQUIView+Hierarchy.m */, 276CE4C9368DCF201C8020FDC956603E /* IQUIView+IQKeyboardToolbar.h */, 7EB860ABE724253F4D37024E0A728E7F /* IQUIView+IQKeyboardToolbar.m */, FB40F6AB3391D3DA0027EC49BD9CE401 /* IQUIViewController+Additions.h */, B61CD6A927AD2A95B66440B87B9D6E45 /* IQUIViewController+Additions.m */, 74D3AD2E8CB8E9FD5B6ADD640D6AAB18 /* IQUIWindow+Hierarchy.h */, 666FDAF0A4607C7E635294B50E8583A8 /* IQUIWindow+Hierarchy.m */, 90FE38F4186C1FBFC016BF52A9211D7A /* KeyboardManager.h */, D8267C6FA2C5F0AB339C82781F3F76C0 /* Resources */, FDA41F2BA38E90C00E951D18DA60AF7F /* Support Files */, 30E3DFE7B9B5226AC7BC767989CBA348 /* YYImage.modulemap */, 5602FF22855607B6323A64DEC1F9CA29 /* YYImage-dummy.m */, 13FBEAD71022F7D73517926DD75A34D5 /* YYImage-Info.plist */, 487C8FD1E464C880EA97EC276D628521 /* YYImage-prefix.pch */, 33AB6B81E9C6A52B4A837E8D76123295 /* YYImage-umbrella.h */, F145567818BE29467A94C45F66EC21D8 /* YYImage.debug.xcconfig */, 850D980D60C28982D957F335E4A73398 /* YYImage.release.xcconfig */, ); name = IQKeyboardManager; path = IQKeyboardManager; name = "Support Files"; path = "../Target Support Files/YYImage"; sourceTree = "<group>"; }; 14B5654852E347080C7A3B5C05D56201 /* Pods */ = { 05DB4D59B00F107DD103AD68E79A6D06 /* NSURLSession */ = { isa = PBXGroup; children = ( F0589110DB2987ADCCF693DC4ADAD4D7 /* AFNetworking */, 04A92D6FF0F8E1DF9E55BE94F4831887 /* IQKeyboardManager */, C6B5658FF107EB1BCEDCA901D3EC8F27 /* SDAutoLayout */, 33564D0CAC800BC8FBCEA5E9DDA8B6FD /* SDWebImage */, 5F57F578425BD660FF01F7813C7044D2 /* SVProgressHUD */, DE6E09649D05347D2C1669D9C3C3E612 /* UMCCommon */, 9E480C914401597A71DC1AE34ED232BF /* YYCache */, 675167C66DE9119C69F6F0D8CE014EB6 /* YYImage */, 36A775F1269A5F8705CC441090C6A651 /* YYModel */, E97A8D5F6664685C9A7712F8F8C5FCC2 /* YYWebImage */, 61A524733F91898AE8C910515AA38037 /* AFHTTPSessionManager.h */, 96DAF2E95371EFEFD8B1C836D2789042 /* AFHTTPSessionManager.m */, E14A4529B80BD6D6B2B869262602FA72 /* AFURLSessionManager.h */, 30A8BD8FBB95072C2A4A9D8B3F046171 /* AFURLSessionManager.m */, ); name = Pods; name = NSURLSession; sourceTree = "<group>"; }; 1FAB7781DFA9C8ABB121FE008FDF1FAC /* Frameworks */ = { 173723CA56B812243A4CE36DF69FB1CE /* Frameworks */ = { isa = PBXGroup; children = ( 3F23DA8E76BB95245303351117CD4386 /* WebP.framework */, 18992D88B7680F305CEA078A5E3B1BC5 /* WebP.framework */, ); name = Frameworks; sourceTree = "<group>"; }; 2A1ADBDE0E5F7BDEBE86F193E7C10F7F /* Products */ = { 1EC26CF49C2B56BA4849E1498201D7EB /* no-arc */ = { isa = PBXGroup; children = ( A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking.framework */, 98527D7196957AAB07B79E2E2AFDE23E /* IQKeyboardManager.framework */, F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */, 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */, B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */, E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD.framework */, 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */, 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */, E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */, 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */, B5BCE7CF342AAB12DE8189071F30D61D /* RACObjCRuntime.h */, 17AB1FE005A0732C82438CC799768391 /* RACObjCRuntime.m */, ); name = Products; name = "no-arc"; sourceTree = "<group>"; }; 30FB8590C566F10DE670DA040395D48E /* Support Files */ = { 2772A4E5CBB3A89A5443580B9820917F /* Resources */ = { isa = PBXGroup; children = ( 7DE8C593B8367EAF68AD4DCF1102981A /* YYModel.modulemap */, C98F4C1A08FB254B89E0A2D10711986B /* YYModel-dummy.m */, C6AFABD9240597E93FCDAC14C3E51C57 /* YYModel-Info.plist */, 6B3D311CC989B02E43F1BABC1BA52A9B /* YYModel-prefix.pch */, ADAC7154F49562704B1C3D92C45BDE93 /* YYModel-umbrella.h */, 0863BA2E7625437CCF2AD822AADBD14C /* YYModel.debug.xcconfig */, D991275587332C3DC6F5543A13528CED /* YYModel.release.xcconfig */, 99B3D4C59C0DB23FB84A3D24F0C14AC9 /* SVProgressHUD.bundle */, ); name = Resources; sourceTree = "<group>"; }; 2CC3E2DAC765E70B74BAFDEC7BA8430A /* Support Files */ = { isa = PBXGroup; children = ( 93E56372323730ADB5065DE15ADFA168 /* IQKeyboardManager.modulemap */, 93680FCA5D70F06A1FE07B53BD2D470F /* IQKeyboardManager-dummy.m */, 65DB53CB512A4D7980D4F0C8F3DDA112 /* IQKeyboardManager-Info.plist */, F7A93864BA5248907FC26D958AFA12A7 /* IQKeyboardManager-prefix.pch */, C55F8FE2D33DFF135364A3ED05A6BFB8 /* IQKeyboardManager-umbrella.h */, 375A61D91780F8AF0EBFC0EEEBC55309 /* IQKeyboardManager.debug.xcconfig */, 2DDB1D0F3102AFB005CAC2E3EEFD7967 /* IQKeyboardManager.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/IQKeyboardManager"; sourceTree = "<group>"; }; 2E246E91DFC8E8DCA8D4A3F0525C1033 /* Serialization */ = { isa = PBXGroup; children = ( 0B664162C8D5BF47E619C08321B2499D /* AFURLRequestSerialization.h */, B158E8AED11DBADBB4AE2F8F57CD6228 /* AFURLRequestSerialization.m */, 97FDB4289325AA57C7C02A0DEBCD14A9 /* AFURLResponseSerialization.h */, F9B1A992271BB3FEDDF409008415C077 /* AFURLResponseSerialization.m */, ); name = Serialization; sourceTree = "<group>"; }; 2EEC5FB3E65851BE6E760C210C4BE1C2 /* Support Files */ = { isa = PBXGroup; children = ( 48E53290BF676DC4968E988F86DA3828 /* YYModel.modulemap */, 5B922B10C69ED4316FF058381FF254C2 /* YYModel-dummy.m */, DBCF7F9C3396B14F3904971E963AD488 /* YYModel-Info.plist */, E12987F6D63393126F3EB6F037CA4334 /* YYModel-prefix.pch */, BA8E501E142062CAB635E8D44F4FD0B2 /* YYModel-umbrella.h */, B64D776B0B4DFBBA82505BF0E0216AB1 /* YYModel.debug.xcconfig */, 81B59BBD2CC1A1AC412D8AFBADAC876B /* YYModel.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYModel"; sourceTree = "<group>"; }; 33564D0CAC800BC8FBCEA5E9DDA8B6FD /* SDWebImage */ = { 35CFA809384783BED7CAEADB0CD8490B /* YYCache */ = { isa = PBXGroup; children = ( 3AE31E2FEF59835FD87D826E263C8C7D /* Core */, 6CF2C2566DCD77564B6455D6FABD0D95 /* Support Files */, F11A1CC136CFD9BB12B9C019A5E24C58 /* YYCache.h */, 49113269607E4F08B7CFA6148EC3DBEB /* YYCache.m */, 86D550258B8C09106C3E3BB818732DF8 /* YYDiskCache.h */, 748FD6EAC46D719B3D3A848BC4F54D00 /* YYDiskCache.m */, 70928C74247BE51F102A438F71B54F0E /* YYKVStorage.h */, BFBCD62A75EF89430836862FE02E4293 /* YYKVStorage.m */, A1B2487ACD76A2782C4ABCFDDC00E3B9 /* YYMemoryCache.h */, 12EE1B3754DB8169317EAD351E8CC5D7 /* YYMemoryCache.m */, B5FFC25F49CA9837FFA99CB94479AF83 /* Support Files */, ); name = SDWebImage; path = SDWebImage; name = YYCache; path = YYCache; sourceTree = "<group>"; }; 36A775F1269A5F8705CC441090C6A651 /* YYModel */ = { 377BD0629CDDD2B7FA2C4546D2CD8E7D /* Frameworks */ = { isa = PBXGroup; children = ( D09826676879AB23092A3824F3AD317E /* NSObject+YYModel.h */, ECA462F2698E894555C1B7BFAD347E13 /* NSObject+YYModel.m */, CCAE2CAB49893772FAC15CE03C7F3852 /* YYClassInfo.h */, 34C0815B5388C859B774151CC732E139 /* YYClassInfo.m */, 24FE9AC4A49F1392F5792CA37EAEC008 /* YYModel.h */, 30FB8590C566F10DE670DA040395D48E /* Support Files */, FFFA9B801F334E8BE2D607D16607C35F /* UMCommon.framework */, ); name = YYModel; path = YYModel; name = Frameworks; sourceTree = "<group>"; }; 3AE31E2FEF59835FD87D826E263C8C7D /* Core */ = { 4A8F91CEC24FD670403E0FF4C38148B2 /* SDAutoLayout */ = { isa = PBXGroup; children = ( FCC7B0B5AB4A56496C01EE23E3318409 /* NSButton+WebCache.h */, C2429A01B58547277CA5AE9257FC93AC /* NSButton+WebCache.m */, 3E53EC95813F9ED2C02C25B21AF2E3C5 /* NSData+ImageContentType.h */, B56A59E1393978801887DEEE848C5740 /* NSData+ImageContentType.m */, C4D5AFF360AAC16FD89F3B5FFE8D68C0 /* NSImage+WebCache.h */, 584CE427BE9EA742C6CBA4761F9A926A /* NSImage+WebCache.m */, 77B7302933BC6D02A196B85DFEC0E21C /* SDAnimatedImageRep.h */, A566BFDC3300AE83207B09AF697540E0 /* SDAnimatedImageRep.m */, C8EE86CD70BDCE1CB83C2AC34F1E1B86 /* SDImageCache.h */, 004B93B66E20FB5EA371BD2D5A2A176D /* SDImageCache.m */, 51BF83A817AC689F9973FE34E2899AA4 /* SDImageCacheConfig.h */, DBE470B5103AAD174FDEFED1D372D753 /* SDImageCacheConfig.m */, 14F5EE7BD6D5A1141C527748161FFCA4 /* SDWebImageCoder.h */, 0972198189366754E8CD85E85F821ECB /* SDWebImageCoder.m */, 15A32433DDA3B649D68B28A0D04D7BB2 /* SDWebImageCoderHelper.h */, 6F55B88B20E8DBC00ADF538D1E100A82 /* SDWebImageCoderHelper.m */, A3A182F138404FF1C5E4492D48F71E32 /* SDWebImageCodersManager.h */, 71D2E008665B2BCE171EA47CFD1CC366 /* SDWebImageCodersManager.m */, C04B499BD8BD9413F843D3F224DDC73B /* SDWebImageCompat.h */, B46936C03AE70A35AD70DD2631D87E30 /* SDWebImageCompat.m */, B450207B23EC4430E17575125E7C6FB9 /* SDWebImageDownloader.h */, 658E17FB1CA6793E7A873F0715999DAE /* SDWebImageDownloader.m */, 6CA21697F97665E4AF1D900C0673BF00 /* SDWebImageDownloaderOperation.h */, 4E8F7E358CF6EE0D4983A0AF618A86D4 /* SDWebImageDownloaderOperation.m */, 6C0772AA815B383D323E200577F058EE /* SDWebImageFrame.h */, 161A37E3C472DFF98A4831F759041736 /* SDWebImageFrame.m */, 8DC5286A839CCD48C7D9CF9DF5B14A27 /* SDWebImageGIFCoder.h */, 2ADDFEF03F03252FDFF3A58029DD1E78 /* SDWebImageGIFCoder.m */, D1493131A3499E59F3F8F82A2789AE2F /* SDWebImageImageIOCoder.h */, 0F1A59D204A792B04690231B282B8936 /* SDWebImageImageIOCoder.m */, 1138BDB8408523552A38A32B6A83A31F /* SDWebImageManager.h */, FAC1E6623FE2473E9F1D8EF980DE2823 /* SDWebImageManager.m */, 00F98CD578C835088BAD11FE1D8FF775 /* SDWebImageOperation.h */, A7E093334DF63FCE9D020F9F47A81A44 /* SDWebImagePrefetcher.h */, 1A344B319BEC0E1B8A28B5AE3C427899 /* SDWebImagePrefetcher.m */, 36D664ED52BFE17EAC61AEF048B9ECC3 /* SDWebImageTransition.h */, EA69C266560FAAE2F7E128E1FF4DD2B5 /* SDWebImageTransition.m */, 8CA14631D059A039D7F2A3ED33F5BAFB /* UIButton+WebCache.h */, B083F83B7B619CF5325F8BEE4EB9D21D /* UIButton+WebCache.m */, A83B21C0E415562B7F3AA852853901B2 /* UIImage+ForceDecode.h */, AC7DD126C303BC63B0A47A864015048F /* UIImage+ForceDecode.m */, 7287F2809D154FC010E08FD9CE21148F /* UIImage+GIF.h */, 277B74DC54F596293D4EC11771448E09 /* UIImage+GIF.m */, 423B0DD5CBA7AEDD53CC8590726B838F /* UIImage+MultiFormat.h */, 32E86A6163A5E145E3A6F38D55B0B80B /* UIImage+MultiFormat.m */, 30F764FDB5F9B0181ED0316445471D3C /* UIImageView+HighlightedWebCache.h */, 21CD7A77387C606806B800301EAED3FF /* UIImageView+HighlightedWebCache.m */, 713B331B5562B59F12D85CBB81461365 /* UIImageView+WebCache.h */, 25805FC802E30CB4DEF62B580AD7C0DC /* UIImageView+WebCache.m */, F6AEAC98FD2F93167BDA306D2DE93C3F /* UIView+WebCache.h */, 8A272000203E690BDDF171A04E002113 /* UIView+WebCache.m */, AF91CF4D12E4987DE5AE0EA3E73FC3C2 /* UIView+WebCacheOperation.h */, 97886E255A49CBF2C6C41BFE4211CCAA /* UIView+WebCacheOperation.m */, 1A799B881D162AC5FBBF37BD6607A66A /* SDAutoLayout.h */, B609706CC8B36378E05276D7AB98D5BB /* UITableView+SDAutoTableViewCellHeight.h */, 3A1EA769401A5056B2E867E16DD8F8AD /* UITableView+SDAutoTableViewCellHeight.m */, 1FE10A5EE645311CE6977A21BC5B0698 /* UIView+SDAutoLayout.h */, DC26D0D87DD2C52C536DE5BD573D3B9A /* UIView+SDAutoLayout.m */, 58C21482A4CCCCB7027894A3898F8AE1 /* Support Files */, ); name = Core; sourceTree = "<group>"; }; 4CE483645377B852914F927F0CDA9F93 /* Security */ = { isa = PBXGroup; children = ( 83D10C7AF73F0F5A3710124E3370CDE3 /* AFSecurityPolicy.h */, 79FEC923DCFB592C5B0707E8A32F6E99 /* AFSecurityPolicy.m */, ); name = Security; name = SDAutoLayout; path = SDAutoLayout; sourceTree = "<group>"; }; 514529C9DFB8AE38EAB07682A2725913 /* Pods-BuWanVideo2.0 */ = { @@ -948,48 +1279,88 @@ path = "Target Support Files/Pods-BuWanVideo2.0"; sourceTree = "<group>"; }; 5F57F578425BD660FF01F7813C7044D2 /* SVProgressHUD */ = { 58C21482A4CCCCB7027894A3898F8AE1 /* Support Files */ = { isa = PBXGroup; children = ( 40C0478F247FD53447751EDB888A0EC9 /* SVIndefiniteAnimatedView.h */, 89A32B7BB601F8F442821FB96FE9AAB7 /* SVIndefiniteAnimatedView.m */, E5C6E06542E297A135D519C6804088F7 /* SVProgressAnimatedView.h */, C30D70E4FA7926DB96CD8F1E95DDD23C /* SVProgressAnimatedView.m */, F3CA00D1ED070F8F8722D5D70F4C0C01 /* SVProgressHUD.h */, 338EE01B9A8BF03B8F154654FDF37857 /* SVProgressHUD.m */, 6268E02094726CB4F270B5E5734600C1 /* SVRadialGradientLayer.h */, 6384748F502E6A77B7044817A4129FC8 /* SVRadialGradientLayer.m */, 9A7ADFB571CDCD709B3C35FFCD14979B /* Resources */, 80C49BDC34833BC1D43FD8AAD1B110F0 /* Support Files */, ); name = SVProgressHUD; path = SVProgressHUD; sourceTree = "<group>"; }; 675167C66DE9119C69F6F0D8CE014EB6 /* YYImage */ = { isa = PBXGroup; children = ( 014470781AF4760CC00E1BBE4ECF6C64 /* Core */, 8A24526F9EF164E46734C4EBDCE65CB1 /* Support Files */, 03D82A2D2EAEAC7BAE2227B55CAC5287 /* WebP */, ); name = YYImage; path = YYImage; sourceTree = "<group>"; }; 6CF2C2566DCD77564B6455D6FABD0D95 /* Support Files */ = { isa = PBXGroup; children = ( 87A93D738A57DCA03A5F89B311F2D61A /* SDWebImage.modulemap */, 59692B056342E1201D62D17D4BC0C0BF /* SDWebImage-dummy.m */, 3EEE4E4687D58E6A3DF38DB2C4333F1F /* SDWebImage-Info.plist */, 886CECEF031D4E8EBE4FAD2041707202 /* SDWebImage-prefix.pch */, D8F507B0AD09B94415DAFC3427A0C308 /* SDWebImage-umbrella.h */, 633F9A5C6929420CE95700768F073EFB /* SDWebImage.debug.xcconfig */, 06617545769B7AFFDF1D2D8CAD0E3C40 /* SDWebImage.release.xcconfig */, 6E09767F4BF6F4F8097CD3216064B101 /* SDAutoLayout.modulemap */, FCAD766FDC2CE25FF7F1C4A38D35DDFD /* SDAutoLayout-dummy.m */, 8F805C5AA57FB69B6E8041BCAFECB8EB /* SDAutoLayout-Info.plist */, DEC461A247DD72A88F017914E2D520F0 /* SDAutoLayout-prefix.pch */, 565F37EF9ECE829784E7C27D4E7C3133 /* SDAutoLayout-umbrella.h */, 4BEC12E61DF0F1EADC1216142661F863 /* SDAutoLayout.debug.xcconfig */, A6732C57D0B32E5F29B65FCA3D321A75 /* SDAutoLayout.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SDWebImage"; path = "../Target Support Files/SDAutoLayout"; sourceTree = "<group>"; }; 5AEB6466107AAE579E16AE804BF7411B /* Support Files */ = { isa = PBXGroup; children = ( D5EFB96E1F6CFE8955BC11A2160A2066 /* AFNetworking.modulemap */, 4205C17B2B0500B98C82A8CB25577A03 /* AFNetworking-dummy.m */, 63728FA9C1CADDC69E6210875309A1EA /* AFNetworking-Info.plist */, CEF7F311E3B0F90F2FFCA775361B398E /* AFNetworking-prefix.pch */, 40C54E5E793EA4DC4580C56D9A00139F /* AFNetworking-umbrella.h */, BD901C0090BA1EF3A2BA39314E6ECA3C /* AFNetworking.debug.xcconfig */, BD8BBC1C5104B25A56D54DDB0AA3D3B3 /* AFNetworking.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AFNetworking"; sourceTree = "<group>"; }; 687EC606C837C2EB583F0649255F8361 /* IQKeyboardManager */ = { isa = PBXGroup; children = ( BA6EC94FFA5C97825675C0244BF74BFA /* IQBarButtonItem.h */, 8F1DD8AB7EE0FA14CF829CB8FDE868E8 /* IQBarButtonItem.m */, 85A04F85ED4B3E9CD245216C080608F3 /* IQKeyboardManager.h */, 40DF122B79D1CF595CD3F4B311F90902 /* IQKeyboardManager.m */, 88005F4C1722451128C482D2E470A42F /* IQKeyboardManagerConstants.h */, 1B34E887546C7E507D5418F5014FD60D /* IQKeyboardManagerConstantsInternal.h */, 9207278B9D4AB9254B0DB88F04F95F12 /* IQKeyboardReturnKeyHandler.h */, C6749570D1ADFBD1832728C1D966D23C /* IQKeyboardReturnKeyHandler.m */, E5CE5BE4FB1A36664CB789830D32279D /* IQNSArray+Sort.h */, 0FC794CFD745AD723C0AB24EEAC6B922 /* IQNSArray+Sort.m */, D314D61BBEC86DC8D663F9DB536A85AC /* IQTextView.h */, 21FDF742FA54A9999270C070F354CEB6 /* IQTextView.m */, CF13B9CD526E12ECBEAD613ABEF78602 /* IQTitleBarButtonItem.h */, 3148D8593CB285438F27A9DE1B2D69F8 /* IQTitleBarButtonItem.m */, EBE315C7D6E406815861904976F83DAF /* IQToolbar.h */, 53B045764D204BDE5EDDC9D0067AB265 /* IQToolbar.m */, 97CCC96F312B584AFDC931C045B035D3 /* IQUIScrollView+Additions.h */, 0CE5121D2B1DF8872D1E09042A442AC5 /* IQUIScrollView+Additions.m */, 3A52021754DA87023BB04AE4E787465E /* IQUITextFieldView+Additions.h */, 51B8B1865321000DBF691A1F865A49D8 /* IQUITextFieldView+Additions.m */, 4E409F177B91C8024B6A14FCB4A5718D /* IQUIView+Hierarchy.h */, D73115BC0307E5D9C826EA7896F3150C /* IQUIView+Hierarchy.m */, CFCBA79B002E9A756BCF52BE603D82AD /* IQUIView+IQKeyboardToolbar.h */, 8B07244460B45F1B2BC37C8FA7BE7BEB /* IQUIView+IQKeyboardToolbar.m */, B588FB5B5FC3BDBB4A0F4165E640A5A0 /* IQUIViewController+Additions.h */, 5DF3D5662145627E55D1E84A6A04AA61 /* IQUIViewController+Additions.m */, 6C3853C907D62B6CF7911F8A39BDF54C /* IQUIWindow+Hierarchy.h */, 73FD92AACA61A2DCCFD48D05CDA8FF40 /* IQUIWindow+Hierarchy.m */, 8CD92FA027BFCD405F343A81FC99C8AE /* KeyboardManager.h */, CFE1CDD3219D519585755D057C905125 /* Resources */, 2CC3E2DAC765E70B74BAFDEC7BA8430A /* Support Files */, ); name = IQKeyboardManager; path = IQKeyboardManager; sourceTree = "<group>"; }; 6DCBB2D1847E7C376297D77C093A9CF1 /* Support Files */ = { isa = PBXGroup; children = ( 4612DB65D2A1365AC8062526D50065F8 /* ReactiveCocoa.modulemap */, FE45A096AF6F28F34D05B1EE2A443E7C /* ReactiveCocoa-dummy.m */, 0B57FDA153A165D34A06973162D053CD /* ReactiveCocoa-Info.plist */, D9FC88CFA8A5DD9CB2FE208853FCB502 /* ReactiveCocoa-prefix.pch */, B7EDF8E75B2CB2566D3F4512274A114D /* ReactiveCocoa-umbrella.h */, F54A53A0CD8AD77A8F377AC93608438D /* ReactiveCocoa.debug.xcconfig */, D2852C259BBD4C618B14A423AB352290 /* ReactiveCocoa.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/ReactiveCocoa"; sourceTree = "<group>"; }; 6E802FE6713867E1EE25A7CFB10A8312 /* Frameworks */ = { @@ -1002,147 +1373,343 @@ name = Frameworks; sourceTree = "<group>"; }; 80C49BDC34833BC1D43FD8AAD1B110F0 /* Support Files */ = { 7E31C2E5EE6D1B680B27986A1E388007 /* SVProgressHUD */ = { isa = PBXGroup; children = ( FCD4E9507A1EF5D6F511F0C033266E5E /* SVProgressHUD.modulemap */, 302868D19BAB22BF2096F7357927D9D8 /* SVProgressHUD-dummy.m */, 431F3B040054806778D2F4C904F42267 /* SVProgressHUD-Info.plist */, CA4B9B1C91E57BF82783779720252630 /* SVProgressHUD-prefix.pch */, B468F7252C4E9D17C6AB261FC977B177 /* SVProgressHUD-umbrella.h */, 11A9F777D6CAF09F8A2527AD18805629 /* SVProgressHUD.debug.xcconfig */, BCB58A5382C1F631BEE128C111FDFE77 /* SVProgressHUD.release.xcconfig */, D4C479BCE7C508653EA1627FE4B17425 /* SVIndefiniteAnimatedView.h */, 9878D2C18E9003F889F5458D2203A124 /* SVIndefiniteAnimatedView.m */, 2DC89EA2CB30606C7DC27F6A73CD293C /* SVProgressAnimatedView.h */, 262110A7935B4ADF77AB26643667ADFA /* SVProgressAnimatedView.m */, A51C443E624CAA7767652DE49FC8761B /* SVProgressHUD.h */, 4EE01DFD16660D22DC57C56115B9511C /* SVProgressHUD.m */, 15A57423AF76D0F3BDA12433514FA0AC /* SVRadialGradientLayer.h */, 38FD4233E6AADCD93597335821EEF158 /* SVRadialGradientLayer.m */, 2772A4E5CBB3A89A5443580B9820917F /* Resources */, B85BC5C00BC13A9445413617D99415EA /* Support Files */, ); name = SVProgressHUD; path = SVProgressHUD; sourceTree = "<group>"; }; 832CCBE7F39469CE92F66AB817425422 /* Security */ = { isa = PBXGroup; children = ( 87ADDD56092E030AB5B25A2D321CB463 /* AFSecurityPolicy.h */, B08B301668C17E4DED669484C56AFA7D /* AFSecurityPolicy.m */, ); name = Security; sourceTree = "<group>"; }; 8B7099112448B7ECFDB18F9BA279FEEE /* Pods */ = { isa = PBXGroup; children = ( E9323F369D399C0CC5ACBEDD092CD6CE /* AFNetworking */, 687EC606C837C2EB583F0649255F8361 /* IQKeyboardManager */, 909D2B865496DE5D693CAE0C2A5851BC /* ReactiveCocoa */, 4A8F91CEC24FD670403E0FF4C38148B2 /* SDAutoLayout */, C01A37D7C1B3201A0180AF4AC04E6B2A /* SDWebImage */, 7E31C2E5EE6D1B680B27986A1E388007 /* SVProgressHUD */, 95240904F4B631768F51A91302D5D769 /* UMCCommon */, 35CFA809384783BED7CAEADB0CD8490B /* YYCache */, CC50CE4755FB4FE0BA151038D5F4D48B /* YYImage */, F550B56E8CB40359DD757BD4873F7BE3 /* YYModel */, D25A2A9A6A348C8556D4C0EBC7C08986 /* YYWebImage */, ); name = Pods; sourceTree = "<group>"; }; 909D2B865496DE5D693CAE0C2A5851BC /* ReactiveCocoa */ = { isa = PBXGroup; children = ( BBB4299B7956A15FFA1CFB1314F9DFA4 /* Core */, 1EC26CF49C2B56BA4849E1498201D7EB /* no-arc */, 6DCBB2D1847E7C376297D77C093A9CF1 /* Support Files */, CF59B11DC70DDD0A7DE9E0619E72BD56 /* UI */, ); name = ReactiveCocoa; path = ReactiveCocoa; sourceTree = "<group>"; }; 95240904F4B631768F51A91302D5D769 /* UMCCommon */ = { isa = PBXGroup; children = ( 377BD0629CDDD2B7FA2C4546D2CD8E7D /* Frameworks */, D9D12F913B2917D3544C482F3498F10A /* Support Files */, ); name = UMCCommon; path = UMCCommon; sourceTree = "<group>"; }; 9DA324027555AA8E868AD048B8A4CA42 /* Core */ = { isa = PBXGroup; children = ( 95EB7D99B8FEBED422320B52FE9DD44D /* NSButton+WebCache.h */, 9FCE82E236609C1EBFA68AF66C47C644 /* NSButton+WebCache.m */, 019DA6AC9B8183E37BEA239CC2868A58 /* NSData+ImageContentType.h */, 623325980428B1ACB02B1FE54DFE5AAE /* NSData+ImageContentType.m */, BAA0FAC1A1F1875B238116AE52C78963 /* NSImage+WebCache.h */, 320E932C11A9F70A65537B1459793A49 /* NSImage+WebCache.m */, CD2B0C489CDDF40F1BCF010799E7D322 /* SDAnimatedImageRep.h */, B5118F54CE1FC484D8EF0DFF4C22AC4F /* SDAnimatedImageRep.m */, 1AA5DB41983C21CD34E26FB7C1B5B78A /* SDImageCache.h */, 59E9A0EA2D9E1FEC80A7449FDB9FBEF5 /* SDImageCache.m */, F5B51CD7EB9C0CAAB70DAA7266265903 /* SDImageCacheConfig.h */, 88F8593FC6D7BA66876D7E1E0DB2B210 /* SDImageCacheConfig.m */, F42204D8F8812EEF89FA876F4526AF53 /* SDWebImageCoder.h */, 4485D1CD0602CE9B219D6CD347B3E0DB /* SDWebImageCoder.m */, AC39B8A34F90FED549ABF921B9B04977 /* SDWebImageCoderHelper.h */, BA8BBA26EF90C8FEAE8A1A4147A8F995 /* SDWebImageCoderHelper.m */, 77D703F77CE0DD41A9F009FD6E2F0D5F /* SDWebImageCodersManager.h */, DDAF626EFB181E6DA46DA2B826969915 /* SDWebImageCodersManager.m */, BE3300C475FAF141ED7B5897EF782A63 /* SDWebImageCompat.h */, 3E86E9DEF29FD0FC1AB0A7F719F1A639 /* SDWebImageCompat.m */, CB2B377748802219807AEC79B42643B4 /* SDWebImageDownloader.h */, BBC2C0D21F974D29BA887E57A5479179 /* SDWebImageDownloader.m */, FC6B8C412C4D37ADDB145560DAAA0FD4 /* SDWebImageDownloaderOperation.h */, 51B13B8D7A3003456A4D115BA461CFFE /* SDWebImageDownloaderOperation.m */, 62FFBF64C5659BDE5885E1FE671FFB76 /* SDWebImageFrame.h */, EBF6F1933EA0456A19C40D1ECD1F203E /* SDWebImageFrame.m */, 35ED2DAB504EFE58B258C70FC4A8C3AC /* SDWebImageGIFCoder.h */, 0F83590546C5E728242E874F34458FA4 /* SDWebImageGIFCoder.m */, 9F9DA13783E226D17EFB2B7DE1FF7257 /* SDWebImageImageIOCoder.h */, CF32DEAE935907212F05887D894E8560 /* SDWebImageImageIOCoder.m */, 01B43D7DACAC40381CE45C3164522A8A /* SDWebImageManager.h */, E6B7F0DDE588CB4BBDD9719B167D3CF1 /* SDWebImageManager.m */, 9B6B88A114410EE2E394D50A29DFFF02 /* SDWebImageOperation.h */, CD5EE1807E84CF81D7E349D27021215E /* SDWebImagePrefetcher.h */, 7F01FF58ED09D88DA9B84D9B8C70CBC1 /* SDWebImagePrefetcher.m */, 1B1B44A4F4540AD62627C52FAF396B40 /* SDWebImageTransition.h */, 058834EB4E38EE8F2DDB340A0D8E3C69 /* SDWebImageTransition.m */, B6D01C6A46F1253A49F8DB852ADC8F22 /* UIButton+WebCache.h */, E83F09FF6BA4E5B0CF6480560FD72F2B /* UIButton+WebCache.m */, F209D369E0B2AC308D7ECFEC3CD412A6 /* UIImage+ForceDecode.h */, B1806F16888D7C8CE1E16F7B49D0B9A5 /* UIImage+ForceDecode.m */, 24480AA9A20ED501BC7CB73F906BCBE1 /* UIImage+GIF.h */, 4609CACCE52D57A28244981039D1F74D /* UIImage+GIF.m */, 0E466463DF8B3AE64DD9C973BCF30D29 /* UIImage+MultiFormat.h */, DE59F1432457CA0AFC3D1C5B7BAF6880 /* UIImage+MultiFormat.m */, 19382336CC66C11EE9CB466C0653DD63 /* UIImageView+HighlightedWebCache.h */, D7F18E472350556FC6C10C3AB0EDDFAB /* UIImageView+HighlightedWebCache.m */, D8E4AE8492CD85A3AA0007B2E2FD438A /* UIImageView+WebCache.h */, B9DCC8659F13FE0EB07E99175B192159 /* UIImageView+WebCache.m */, A43EF1279DE5F7EC31453352EC5C151E /* UIView+WebCache.h */, B36F0542A406F6F794DA6B8A7BE9CA4B /* UIView+WebCache.m */, 765AF9C9873B0DE0D36FC8579BD3949C /* UIView+WebCacheOperation.h */, C38B7241AF8D92CE271857AA8F681355 /* UIView+WebCacheOperation.m */, ); name = Core; sourceTree = "<group>"; }; B5FFC25F49CA9837FFA99CB94479AF83 /* Support Files */ = { isa = PBXGroup; children = ( 29459A553362BAFEE7FA8F9BCB90FC09 /* YYCache.modulemap */, 804AF148E7749A5C2133A96312EC6583 /* YYCache-dummy.m */, E750E913839C0F5BBC6A4F8DA265F43A /* YYCache-Info.plist */, CC5789DBA76E68E708E55A058A8E0873 /* YYCache-prefix.pch */, CA48C73A04E49BB531E4FB67ACD24191 /* YYCache-umbrella.h */, CAC778F10AAC16F8F8054FB32F5B9364 /* YYCache.debug.xcconfig */, 1C33A481313DE8A7C2FA5FA4102EE0DE /* YYCache.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYCache"; sourceTree = "<group>"; }; B85BC5C00BC13A9445413617D99415EA /* Support Files */ = { isa = PBXGroup; children = ( 1251B84BE5D70DDDB0F8F6D057EE5724 /* SVProgressHUD.modulemap */, 613D48FAF061671FADFC8677396D6D5C /* SVProgressHUD-dummy.m */, A082ECD800427D9F8926C4BB8599E0B2 /* SVProgressHUD-Info.plist */, 6C6BC4013A00DD77209861FD34C44D8A /* SVProgressHUD-prefix.pch */, ABF56418AB93AC5009C1779A22CB7F79 /* SVProgressHUD-umbrella.h */, 3E57DA243178E435EAF7FFC38C7912C3 /* SVProgressHUD.debug.xcconfig */, B16B09647C7889027ADC44AA11F1520A /* SVProgressHUD.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SVProgressHUD"; sourceTree = "<group>"; }; 8A24526F9EF164E46734C4EBDCE65CB1 /* Support Files */ = { BBB4299B7956A15FFA1CFB1314F9DFA4 /* Core */ = { isa = PBXGroup; children = ( 4B79D5FCA8231E9F45A5B31DC173CA1D /* YYImage.modulemap */, BE70CD7B216B7ADB16EDECCCC9898C73 /* YYImage-dummy.m */, DC6E37E1052C3C2235209A3A867F0A76 /* YYImage-Info.plist */, 7134F20032CBB294C097E37753D0B990 /* YYImage-prefix.pch */, FF757B06FC51079DE3E74976127FC490 /* YYImage-umbrella.h */, 4ACA87A555BA903C17DE1C8766674ECA /* YYImage.debug.xcconfig */, F8623FC9861C8ABEBE1730FC61A1111F /* YYImage.release.xcconfig */, A1D5121CF9DAB5B036EFC7BF9F5E244F /* NSArray+RACSequenceAdditions.h */, BED23C37C5BBF70FFEFD4925BACF3AA7 /* NSArray+RACSequenceAdditions.m */, BB25E43C6D1DE779F80D3627E305B364 /* NSData+RACSupport.h */, FF6E46D7889FEF9FA35813A249C2D37B /* NSData+RACSupport.m */, CC1825358966CF80F3BC608380E8E7A6 /* NSDictionary+RACSequenceAdditions.h */, 2C27711FC7122DB21AFAB445D04B2EBB /* NSDictionary+RACSequenceAdditions.m */, 20A93C3B656A73F808E3D24A32DABE5D /* NSEnumerator+RACSequenceAdditions.h */, 0CF0218D422241C628F1FE04E229D140 /* NSEnumerator+RACSequenceAdditions.m */, E3653DFC0E27DCDB0229F57CCC8DFE77 /* NSFileHandle+RACSupport.h */, 1AB09CF98E54E12254F38AD90A9D85B9 /* NSFileHandle+RACSupport.m */, 1BE0A6BB0CE10019E62B062479041392 /* NSIndexSet+RACSequenceAdditions.h */, A8BFF3BDF77DEBA5AECA8BB422A2901E /* NSIndexSet+RACSequenceAdditions.m */, 6F95C75B8335E1E85B52A8A19C9E16A1 /* NSInvocation+RACTypeParsing.h */, 74518041523B99D090A6318632EFCEE2 /* NSInvocation+RACTypeParsing.m */, 3817622806CDE7F8532ED0A0D9CE5543 /* NSNotificationCenter+RACSupport.h */, 08C56FBC976B8B7972E9967F28F22F9D /* NSNotificationCenter+RACSupport.m */, 404B04F2FEE6FF0B48A9B1FB5DB8C435 /* NSObject+RACDeallocating.h */, 595B21677F2F1603D6B7A94F494AFC56 /* NSObject+RACDeallocating.m */, CCB028AFE7A0DF0D56182BC0AC6AE902 /* NSObject+RACDescription.h */, 550D4ED99E2D46472D0C1EEFB7DBCAB4 /* NSObject+RACDescription.m */, D555489FA91BAE8137D7E10AFE52E644 /* NSObject+RACKVOWrapper.h */, 3367EE331F736AF3909E52253D32DBEB /* NSObject+RACKVOWrapper.m */, C5F9831AAE1EE95E6DECE83938DA09BB /* NSObject+RACLifting.h */, 7F2757632E925E3FFE5D3408EFBF5890 /* NSObject+RACLifting.m */, E88D6DAB1482251E1381F7ADFFD504F2 /* NSObject+RACPropertySubscribing.h */, F3B7F534E1C75F385C1A4774F3C47DC1 /* NSObject+RACPropertySubscribing.m */, 7AF8F6BA6F5592334F714274C4B3BB15 /* NSObject+RACSelectorSignal.h */, C07F3BEDE4ADEFE3CEE51C199043AC14 /* NSObject+RACSelectorSignal.m */, 156CEAF82F165222EB93E27807ED730A /* NSOrderedSet+RACSequenceAdditions.h */, 98DA877195A8559A2D72EC623FDFA0B5 /* NSOrderedSet+RACSequenceAdditions.m */, 056ACD6BFE21EC8D6FE0D0A36F310CD6 /* NSSet+RACSequenceAdditions.h */, 179C101671A76BF9C881588979BCBB96 /* NSSet+RACSequenceAdditions.m */, A8DAFD8E017204BB5BAB0708BCCBF8F0 /* NSString+RACKeyPathUtilities.h */, 98DDB64E58946DC23B6C3B693A0C56BF /* NSString+RACKeyPathUtilities.m */, E3666D3A03026EF31697B7736F001546 /* NSString+RACSequenceAdditions.h */, 92F550E3738CD343AD02863420188AB9 /* NSString+RACSequenceAdditions.m */, 74013A15B194BA7ECB3355DE5917359A /* NSString+RACSupport.h */, 78613155C0BE74CD8CDAD57324AACA8E /* NSString+RACSupport.m */, 2935D9B072D3E7A83648AD1B45D7A1CF /* NSURLConnection+RACSupport.h */, 224E5D87CBD046E04A0A65DFB5DE2BC4 /* NSURLConnection+RACSupport.m */, E334FF3B79C08A435863880297EC647F /* NSUserDefaults+RACSupport.h */, 5868373245108120B0D33C04574AC67B /* NSUserDefaults+RACSupport.m */, 35390A03834DB0B8786F70D0A12D558D /* RACArraySequence.h */, BD419F1FE2BC539F1FBB44AAD718DA3D /* RACArraySequence.m */, BDA029B4A4A952E7810299FFF0C30A63 /* RACBehaviorSubject.h */, 44359BCB0BEF1D96DA3876A0E9D0D681 /* RACBehaviorSubject.m */, E7E1E268681B87CAE7D1DB4C69D65AB4 /* RACBlockTrampoline.h */, F005F95DA9816FFC3C645FF2CF1A34AA /* RACBlockTrampoline.m */, DC8103F01BD7BC487061DF76BB3C1802 /* RACChannel.h */, BA0320129ADA36D84A0B9F63B744931B /* RACChannel.m */, 833AC91B582C93032622D0F76E1E5768 /* RACCommand.h */, 8453CF9C00D6DAA765CAC20A933A583F /* RACCommand.m */, 59E487DE10796A0F53DFFCD2B66AB9E9 /* RACCompoundDisposable.h */, 008A4FA6B3774E7EFA4B0C204DE0D359 /* RACCompoundDisposable.m */, 0D5A9DE1AE9D01AB7E6D110CCD935795 /* RACCompoundDisposableProvider.d */, 43A3EBB3FF5880ACE149AD6943F34E11 /* RACDelegateProxy.h */, BA346367BF24C52BCDA92E7402833F53 /* RACDelegateProxy.m */, 98816DCB7AB298E8BC997ED4850F5462 /* RACDisposable.h */, 424B25A2BD6CB947E588DC9575A3C0B8 /* RACDisposable.m */, C6F4DF4BADD492B836AC4B7BEC1CBFF2 /* RACDynamicSequence.h */, 0CC4D16B06BBF0FA86BDA63BD575AB85 /* RACDynamicSequence.m */, 4EA4085253678493F59845F2B77ADC79 /* RACDynamicSignal.h */, E80EC1428998ED15F19267485D7BBA50 /* RACDynamicSignal.m */, B8C8A25BA45E668A8A759C345CF15566 /* RACEagerSequence.h */, AFC2EC642BDF73D200250D1B9FA76930 /* RACEagerSequence.m */, E3C9D1D6453C40B830564AF3B6445728 /* RACEmptySequence.h */, 61BD20DF76E954AA215311C591A55F03 /* RACEmptySequence.m */, 50650CAA18C2C10BA1E811D6F7F55039 /* RACEmptySignal.h */, 4C54507E369F93932CC88253C8054574 /* RACEmptySignal.m */, 8D21BDBB6B9674DF9341698E117C51C3 /* RACErrorSignal.h */, F8B05EE08125BAFE10DFE5D0F629BE9E /* RACErrorSignal.m */, EA66F561A1C07CE8E662344E57451964 /* RACEvent.h */, 339174111B6380A1C878F83E7830B0E5 /* RACEvent.m */, 987F7379FFCCFAF789988816226B4499 /* RACEXTKeyPathCoding.h */, AEAE0771F238056B9994016BA873753D /* RACEXTRuntimeExtensions.h */, C630C0A887F984C3A255809B69E2342C /* RACEXTRuntimeExtensions.m */, B58D21EB1B75D201289E7C9F6F024BF0 /* RACEXTScope.h */, 0972F9327D1F3D18CF014811334630B8 /* RACGroupedSignal.h */, 85E47DE7B0134E6B9D9BF33E95897108 /* RACGroupedSignal.m */, FBE4BCB695718AB1210188BA713F5B65 /* RACImmediateScheduler.h */, 1DFD4A179CA752E073B8D6DF3F0C3851 /* RACImmediateScheduler.m */, 9375AD6D248A2BB840150BAAF3E48668 /* RACIndexSetSequence.h */, BFA429B6507B97E1DB640B327AEEAC79 /* RACIndexSetSequence.m */, 947D043281885DFE8E92EAC756993910 /* RACKVOChannel.h */, DF75D9B4CA5E8CBEBBB7DF9A734EA3C1 /* RACKVOChannel.m */, 96291BF17B7DD8E08BF673C2145F20FF /* RACKVOProxy.h */, F91C975E8C7DB9346E2B9C5AB3E81C0C /* RACKVOProxy.m */, E2425B805460ABFDDF241214F42F2B23 /* RACKVOTrampoline.h */, 70F59258887AC37B3BF11293334EF2E5 /* RACKVOTrampoline.m */, 55AA30B54E883389C97CFE781CEB6994 /* RACmetamacros.h */, 5B5C14B83BF494FC37393EF0A044FE8C /* RACMulticastConnection.h */, 4B81DE5BD3D5C5327F4FD71624AE6490 /* RACMulticastConnection.m */, 5B9A9B7C75B1472A936F4E6D2C5DFC04 /* RACMulticastConnection+Private.h */, B2F16994B5C28D7970EF7C36F03AA9EC /* RACPassthroughSubscriber.h */, B686B8FA39EE0D567BFC6BD27B1310F2 /* RACPassthroughSubscriber.m */, A8880B484489FA1ECAF24AFAE683C16B /* RACQueueScheduler.h */, 88E2E62884248FD20E1AA9F31EE2CAE4 /* RACQueueScheduler.m */, B578422E949B59D5220F93F4171ED00B /* RACQueueScheduler+Subclass.h */, 2662E8366008204679FA94ABBA5BF025 /* RACReplaySubject.h */, A8C453FFA1AA0B1FD8B65ECB008947B6 /* RACReplaySubject.m */, DCD065B83FCA4EC8D0792FF4B408F63C /* RACReturnSignal.h */, 83CC16DE85EED25CEDCDF598ACFF9CE8 /* RACReturnSignal.m */, 9ACC5DEA78507FDA644C3FCE3F4EF5EA /* RACScheduler.h */, 16DEC8E05D8EA4A6B7198DC5AC6B8303 /* RACScheduler.m */, CA0B2C35340007DD7FA1A7950DEEA7EB /* RACScheduler+Private.h */, 98140791FC09900C55D90B716AAA89FC /* RACScheduler+Subclass.h */, C3ABEDEE908C79771507FAC199F6488A /* RACScopedDisposable.h */, 158483EA3C0097D27339FE47E7E163AB /* RACScopedDisposable.m */, 07E4881518C81EE4B8B6CEE5ABA2A936 /* RACSequence.h */, 6F584607422D3120B7CFF79DC73EC9AC /* RACSequence.m */, 442B6FFFF04B0FD408E4A6CAD5E159D0 /* RACSerialDisposable.h */, D999AA74EACE8BFEA6095485583F9FC0 /* RACSerialDisposable.m */, AD6D87078F5C5957BC495E5F630EB1A4 /* RACSignal.h */, 0BE0BAED7D9E504C50C96E94E6C62F8C /* RACSignal.m */, DC3409F628DDE79F8854CEACD4720C2A /* RACSignal+Operations.h */, 551E6348AA5B04458DD1022464A5115F /* RACSignal+Operations.m */, 78C588E2FB66251B7448A5A65F6C007C /* RACSignalProvider.d */, 90F36CE5A83CA0FE9C21409881573020 /* RACSignalSequence.h */, 80D395D3DF01AE93D254385A2D56B74D /* RACSignalSequence.m */, 0E4E6B20D47B5ADA5444AC46ED5832D8 /* RACStream.h */, 99B8D9707E15BC4F80CF2650B7174F38 /* RACStream.m */, 63A1A481F03A6EF1F846592ABE47D3EB /* RACStream+Private.h */, C468790F90350EF58F5450FA9EE9E8AF /* RACStringSequence.h */, 7D95FD0F87F5CD1A4DAFCA4E7EAA87E1 /* RACStringSequence.m */, 1BFC5B0260DCA507F150C3CC60D1A1D6 /* RACSubject.h */, 72DE5406487B537359BD6BCF5D093495 /* RACSubject.m */, C038C91715934C21109A8313DBE02AC9 /* RACSubscriber.h */, 1FB6E68412913CC1BBA68C4EDA4D2846 /* RACSubscriber.m */, 0B5A819A69C1E1997BBC50F78E5C062C /* RACSubscriber+Private.h */, 0DF8A183543FC6407243D76887B33A5A /* RACSubscriptingAssignmentTrampoline.h */, 4A570727D818FF979E931832845EF0A5 /* RACSubscriptingAssignmentTrampoline.m */, A195EE79E18E1DC4CB6AAB254EDC483C /* RACSubscriptionScheduler.h */, 0C02B45988382D2DCD62AD8269116FD2 /* RACSubscriptionScheduler.m */, 7FDD2A3F5AE20A6244BF7BE20EA35581 /* RACTargetQueueScheduler.h */, 5CE046E8301497F843BCD5569CE0C00D /* RACTargetQueueScheduler.m */, 2919F9E027ED2DF9A2FEB4B149302A61 /* RACTestScheduler.h */, F22A6CF95C36F2DB67876FB7E0BB2363 /* RACTestScheduler.m */, 1565DA1DB3FE698314D015DF7217DB63 /* RACTuple.h */, A7180998FC103032D8E88A178405C4BE /* RACTuple.m */, 57E2ABCDF61EF529A4D0031E1B423BE8 /* RACTupleSequence.h */, 7F3FBFE616E8B26FFAE7A01A81E4DB02 /* RACTupleSequence.m */, 59A9DD0510BD7143FC10DA4372A1B08B /* RACUnarySequence.h */, EAE15951F97A0B811DD8697D1D456EF3 /* RACUnarySequence.m */, 8EDFD4A81F06A5D23740B0CC0624D853 /* RACUnit.h */, 94A27524FCE58E0CE90F6BB0D089501B /* RACUnit.m */, 7244EB669A442CD41E0E97236B6C0771 /* RACValueTransformer.h */, CA4EF78971B6F3F366CA6E0AB17E901F /* RACValueTransformer.m */, 05862CDF1BA942452A8C52E3EAB476E5 /* ReactiveCocoa.h */, ); name = "Support Files"; path = "../Target Support Files/YYImage"; name = Core; sourceTree = "<group>"; }; 9A7ADFB571CDCD709B3C35FFCD14979B /* Resources */ = { BE975D91BF2D5D79321D8E86E5007FEE /* Core */ = { isa = PBXGroup; children = ( 87C09894B283EBD278A16FDB3EB75D77 /* SVProgressHUD.bundle */, FE367B94D6C728C276AF208CE53E50B5 /* YYAnimatedImageView.h */, A8BC32E1275B69B225822D66AE398C55 /* YYAnimatedImageView.m */, 9EB8D127456595A163640931F226123E /* YYFrameImage.h */, 482F5116C8F87BFE652F0102474A41D6 /* YYFrameImage.m */, 1C37D08E516C63DAD0005156414E6C06 /* YYImage.h */, F591215C6EB56AD9E6881C04D44ECC78 /* YYImage.m */, DFAD290958EE44F610480F7ACA363F5C /* YYImageCoder.h */, 62D4EF8B1FB9EA633057C722A0D7B2BD /* YYImageCoder.m */, 798DF8123DD26AF8FE75CAD9CC0413D3 /* YYSpriteSheetImage.h */, 1BE48436D791B70237BC771703BE7521 /* YYSpriteSheetImage.m */, ); name = Resources; name = Core; sourceTree = "<group>"; }; 9E480C914401597A71DC1AE34ED232BF /* YYCache */ = { C01A37D7C1B3201A0180AF4AC04E6B2A /* SDWebImage */ = { isa = PBXGroup; children = ( FFDD4B32DEFDD0555453D01AB11D183D /* YYCache.h */, 74D5DA7238E160253A95D43C0B5A4F2D /* YYCache.m */, 68E7E51CC244542FDB45049BFF530B12 /* YYDiskCache.h */, 00CFD934075E076A3CBB5D21C4366691 /* YYDiskCache.m */, 3BB1F0CC71FD4A9C5F0E8B09BC450A76 /* YYKVStorage.h */, 7DE56B9020EA08B1264A713571D82EAC /* YYKVStorage.m */, 86D6A440FE908DFF9E24FEA2876DDB7E /* YYMemoryCache.h */, 8D8DB7FE9CE9C64DF0DD6CF4FD7AF501 /* YYMemoryCache.m */, D68665B2406AB7B75D1B973D3FA5D81E /* Support Files */, 9DA324027555AA8E868AD048B8A4CA42 /* Core */, FBAF1162F88C6742E4DC613EF22C4C94 /* Support Files */, ); name = YYCache; path = YYCache; sourceTree = "<group>"; }; A79E1555EFEC8D969303E53BAB37E464 /* Frameworks */ = { isa = PBXGroup; children = ( FEB39772AA9566576BC914AFC4FD3A75 /* UMCommon.framework */, ); name = Frameworks; sourceTree = "<group>"; }; B5E7E062B514650AD7DC87A45C450875 /* UIKit */ = { isa = PBXGroup; children = ( 4EB255DCF0E56A85B9D8D475576A026C /* AFAutoPurgingImageCache.h */, 9721108E154FBB96F9B4F47956EB917D /* AFAutoPurgingImageCache.m */, 9EB0ED33B7BB6511AD60C265D69680FC /* AFImageDownloader.h */, 4E857907BC4DD146CDEB5C62D1394A78 /* AFImageDownloader.m */, A735E9C2405BD745A1E76AA06DA294A4 /* AFNetworkActivityIndicatorManager.h */, D5AFCE8DBE0A4C0EB931EF252B1E23E5 /* AFNetworkActivityIndicatorManager.m */, 0A722A647707E984C83F82B6E2A97631 /* UIActivityIndicatorView+AFNetworking.h */, 6C0B51074A42033961C10F7B0900C715 /* UIActivityIndicatorView+AFNetworking.m */, BA64E9B6956CB8B50404D1109AF2B0FC /* UIButton+AFNetworking.h */, 4F9385E5A9AB836D8EFD8F3E69233179 /* UIButton+AFNetworking.m */, BDC1252B5B77C045A32DDEBA4734C145 /* UIImage+AFNetworking.h */, B6CAB5D74635D11F0987470A7CF362E6 /* UIImageView+AFNetworking.h */, 35379D10E7453817C556E7DCA6A244B2 /* UIImageView+AFNetworking.m */, 26892DA0ECD5B12C8FD4073EAD1E9237 /* UIKit+AFNetworking.h */, 90F887DFB0B7D54B1587BCD959311BF8 /* UIProgressView+AFNetworking.h */, DB04FCC2775BBC134AA91CDE58E9CBA8 /* UIProgressView+AFNetworking.m */, C07901861F7033136A10E9E079189DE0 /* UIRefreshControl+AFNetworking.h */, 522B392BCE6392A9BA3310DA2D5CD46C /* UIRefreshControl+AFNetworking.m */, ); name = UIKit; sourceTree = "<group>"; }; C337A95EA2293E94C7751090DE237DF1 /* NSURLSession */ = { isa = PBXGroup; children = ( 32152CA18EC34FE8A59B8974A4B80F6F /* AFHTTPSessionManager.h */, B4E6D390027BC38891D8B27ED3A53A2E /* AFHTTPSessionManager.m */, 18E77A78AB5601DA1A19A7E0B437E203 /* AFURLSessionManager.h */, CCC82EFB2C6B435B223A64E725C9E568 /* AFURLSessionManager.m */, ); name = NSURLSession; sourceTree = "<group>"; }; C58824A100680D1130CE6DC415CC01CA /* Support Files */ = { isa = PBXGroup; children = ( 567E673CD6E46A9F7459BA13BABE1B46 /* YYWebImage.modulemap */, 94AEF4F75716C93FA16447E82A7DB674 /* YYWebImage-dummy.m */, FC4BDE0C141DAE902F587415F361A4D8 /* YYWebImage-Info.plist */, 80052075A66CB61EFC5C01C3A9B556F7 /* YYWebImage-prefix.pch */, 8B7DFBFF6819BEBB3E1911F01FD4116D /* YYWebImage-umbrella.h */, AE035C5592517EF0C4EC5D5F6316EE0D /* YYWebImage.debug.xcconfig */, 30F94E2C298157954AAB33D5AF87FD1A /* YYWebImage.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYWebImage"; sourceTree = "<group>"; }; C59A0E810A055A4A03C9B70EA58BC03C /* Support Files */ = { isa = PBXGroup; children = ( DF3E5DE912602F028F7F75A6ABC70A43 /* AFNetworking.modulemap */, 5047A05DF375461B730C3048518084B1 /* AFNetworking-dummy.m */, 9FFE6337C733122EF8FD39AD185A6F77 /* AFNetworking-Info.plist */, A1E5E3B69E93987B632086B93782F078 /* AFNetworking-prefix.pch */, 6B618FEA1CB31965E122F833174EEF7A /* AFNetworking-umbrella.h */, 535FF7AEEA0A877AB813020B3A5C2513 /* AFNetworking.debug.xcconfig */, A2FD65B3495B0AD2D2D16197F3D9075A /* AFNetworking.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AFNetworking"; sourceTree = "<group>"; }; C6B5658FF107EB1BCEDCA901D3EC8F27 /* SDAutoLayout */ = { isa = PBXGroup; children = ( 8E6DB96860830D683DD062D9FC416A20 /* SDAutoLayout.h */, 7852085FC4FFA2B275BC46043D03C538 /* UITableView+SDAutoTableViewCellHeight.h */, F92BA11FB00565F6CCA04D3A274D5CF2 /* UITableView+SDAutoTableViewCellHeight.m */, 7A1CB53CA3AB4D8680DE596155FA9ED6 /* UIView+SDAutoLayout.h */, 5658EE8670AD7F46326F68C97E0965C4 /* UIView+SDAutoLayout.m */, E30CBDFC3E811F83929A96C701A0410B /* Support Files */, ); name = SDAutoLayout; path = SDAutoLayout; name = SDWebImage; path = SDWebImage; sourceTree = "<group>"; }; CBF6FD61B04447E7BD7E451271949FF5 /* iOS */ = { @@ -1163,122 +1730,171 @@ name = iOS; sourceTree = "<group>"; }; CC50CE4755FB4FE0BA151038D5F4D48B /* YYImage */ = { isa = PBXGroup; children = ( BE975D91BF2D5D79321D8E86E5007FEE /* Core */, 046BB934B24039F1CBAE4BAEFAB9F58B /* Support Files */, 0427ADF17399EFB50599B1148B6E65B4 /* WebP */, ); name = YYImage; path = YYImage; sourceTree = "<group>"; }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 6E802FE6713867E1EE25A7CFB10A8312 /* Frameworks */, 14B5654852E347080C7A3B5C05D56201 /* Pods */, 2A1ADBDE0E5F7BDEBE86F193E7C10F7F /* Products */, 8B7099112448B7ECFDB18F9BA279FEEE /* Pods */, FFB32D5089845B3EE2BEFD4EB2A478DA /* Products */, F29FB9007C8660455C39667ECE3711CD /* Targets Support Files */, ); sourceTree = "<group>"; }; D68665B2406AB7B75D1B973D3FA5D81E /* Support Files */ = { CF59B11DC70DDD0A7DE9E0619E72BD56 /* UI */ = { isa = PBXGroup; children = ( 2401641EA88D2D3E42D792F6F1C609F5 /* YYCache.modulemap */, 8E08E8F26ED25EA439035109732AEF93 /* YYCache-dummy.m */, 05432A9AD307A07CDC115D90314C096C /* YYCache-Info.plist */, 18FDA1F0984624BF4FBFFC20F1BD72DF /* YYCache-prefix.pch */, 0985215BEFFD85D43B677A489489569D /* YYCache-umbrella.h */, 9DF4DE629098FF15B403BE56D0856DA2 /* YYCache.debug.xcconfig */, 4600196AA2978695F863C06E8FA7A756 /* YYCache.release.xcconfig */, FC790DCB7BC82465D349A49441125692 /* MKAnnotationView+RACSignalSupport.h */, 8B0A7591C6FBC7202F295E779FD1323B /* MKAnnotationView+RACSignalSupport.m */, 6B0BCDB15F7B2779431027130EA4F5D9 /* UIActionSheet+RACSignalSupport.h */, C32EC8E3B5ABD438268D92A5672EE06B /* UIActionSheet+RACSignalSupport.m */, 1E1F8BD708829A73F9408D4D08A0A51E /* UIAlertView+RACSignalSupport.h */, 4B7D7FF5A35E89A06418103D502E8B36 /* UIAlertView+RACSignalSupport.m */, B7D2668FEF5668B4F39FF42E7CAD610E /* UIBarButtonItem+RACCommandSupport.h */, 12BA37936417B2075E52E2050C1A4759 /* UIBarButtonItem+RACCommandSupport.m */, 7A2F2DD222FD70D3E1E40D7F8BEB13EA /* UIButton+RACCommandSupport.h */, B1F7886832F5F2A25A2F0A49D17B43E1 /* UIButton+RACCommandSupport.m */, 0848474DE4B93376F530460F0AEC6B6D /* UICollectionReusableView+RACSignalSupport.h */, 42535A4AF768629FBC4501D92E7222B2 /* UICollectionReusableView+RACSignalSupport.m */, 76EFD6B707B75126B0A5FF4F4D34F69E /* UIControl+RACSignalSupport.h */, 9F6848E4B27C4664E5684A54E348883F /* UIControl+RACSignalSupport.m */, 1ADE4A8C0C19FD265DF62CE4558D4DC0 /* UIControl+RACSignalSupportPrivate.h */, C12091C957E009164D69B6AFF58A24F9 /* UIControl+RACSignalSupportPrivate.m */, 9E8D802B680EB36AB364D9A012752AF9 /* UIDatePicker+RACSignalSupport.h */, 1D4D849E0522DDC9ECA6542E2066D35C /* UIDatePicker+RACSignalSupport.m */, D1954F72ED62A75C4DEB37870483F9C4 /* UIGestureRecognizer+RACSignalSupport.h */, 900C8A8C15638B594D552EE4AD0B01B9 /* UIGestureRecognizer+RACSignalSupport.m */, FBEF70DB009A6AE2E009814F5936E336 /* UIImagePickerController+RACSignalSupport.h */, C6602512AB4BE8FE4AA7DE1228C16053 /* UIImagePickerController+RACSignalSupport.m */, 267CA4472D295D3E28F45C533CBCCCD1 /* UIRefreshControl+RACCommandSupport.h */, 900D08EFF9663043FE9823AC799B129E /* UIRefreshControl+RACCommandSupport.m */, 5CA5EF95BED88CF937F50F8619718D4B /* UISegmentedControl+RACSignalSupport.h */, D103328D73DEC8D85F4B748B80D8FF81 /* UISegmentedControl+RACSignalSupport.m */, BD02BB08A6B0D1404B248CAFFC7D2A1F /* UISlider+RACSignalSupport.h */, 1AFE7E8D814EC51A4FC7DDC2E17C835A /* UISlider+RACSignalSupport.m */, F34D023FAAB083ACDDD7A2ADF33C1851 /* UIStepper+RACSignalSupport.h */, 878C27BF809E48229882226988050790 /* UIStepper+RACSignalSupport.m */, BD454E7E154511F9B7C254A4032B1847 /* UISwitch+RACSignalSupport.h */, 2FA6F56A17961CE24DA4586437B71235 /* UISwitch+RACSignalSupport.m */, D77134E6892BFE82EF868BD34A118BC4 /* UITableViewCell+RACSignalSupport.h */, DE5ABC7124DD5740F19D35EB3345161B /* UITableViewCell+RACSignalSupport.m */, D22D62D79746105BBB8C392B564DD13F /* UITableViewHeaderFooterView+RACSignalSupport.h */, 7BA0E988C4803617F21A7F9E78B2C215 /* UITableViewHeaderFooterView+RACSignalSupport.m */, 869DA4218386BEB7839648712CBA317E /* UITextField+RACSignalSupport.h */, A4DE8853B09B5819E6B4FC52DFC16944 /* UITextField+RACSignalSupport.m */, 44F7854B861E24CBC750ACC1CEE01A73 /* UITextView+RACSignalSupport.h */, 1A78D4790F17D229D6C0868F53E0E245 /* UITextView+RACSignalSupport.m */, ); name = "Support Files"; path = "../Target Support Files/YYCache"; name = UI; sourceTree = "<group>"; }; D8267C6FA2C5F0AB339C82781F3F76C0 /* Resources */ = { CFE1CDD3219D519585755D057C905125 /* Resources */ = { isa = PBXGroup; children = ( 6231466E6723272781BBF15B73FD5A16 /* IQKeyboardManager.bundle */, C64185489039A148112E395F72220725 /* IQKeyboardManager.bundle */, ); name = Resources; sourceTree = "<group>"; }; DA4A1FE3356F5E45637597A3B656BC01 /* Reachability */ = { D25A2A9A6A348C8556D4C0EBC7C08986 /* YYWebImage */ = { isa = PBXGroup; children = ( 8E187B581E63340ADBA5C35E8F029870 /* AFNetworkReachabilityManager.h */, F8BEBBB4D7F6F85EAD46E2A3656217DF /* AFNetworkReachabilityManager.m */, ); name = Reachability; sourceTree = "<group>"; }; DE6E09649D05347D2C1669D9C3C3E612 /* UMCCommon */ = { isa = PBXGroup; children = ( A79E1555EFEC8D969303E53BAB37E464 /* Frameworks */, E16BEAF9D86643DBB8EC0D24D63AB073 /* Support Files */, ); name = UMCCommon; path = UMCCommon; sourceTree = "<group>"; }; E16BEAF9D86643DBB8EC0D24D63AB073 /* Support Files */ = { isa = PBXGroup; children = ( 6BB1FC1CA63AAA77E98E85CF3431087F /* UMCCommon.debug.xcconfig */, 1538EA8172164A02CB89A3BCA93D91E1 /* UMCCommon.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/UMCCommon"; sourceTree = "<group>"; }; E30CBDFC3E811F83929A96C701A0410B /* Support Files */ = { isa = PBXGroup; children = ( 0B854A205AB073BF3636BC961E846FD3 /* SDAutoLayout.modulemap */, D8CC5EA0854A065E4F729E60EAC79440 /* SDAutoLayout-dummy.m */, D436DD56400948B8D2F8E227212BEA3A /* SDAutoLayout-Info.plist */, FDA60A6242FB5E5E939171F483393755 /* SDAutoLayout-prefix.pch */, B8D1FCBF17339E0503FC0A5815A8B59B /* SDAutoLayout-umbrella.h */, 1E2C2F03B2242AE5D58CC619ABB1933E /* SDAutoLayout.debug.xcconfig */, 019EC0F5541FE58CA6A668CA8E90E0BE /* SDAutoLayout.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SDAutoLayout"; sourceTree = "<group>"; }; E97A8D5F6664685C9A7712F8F8C5FCC2 /* YYWebImage */ = { isa = PBXGroup; children = ( 0A2CDDCF9D9945D00311BFC9BB8436A1 /* _YYWebImageSetter.h */, 3F761F215F2ED99F5C58244DEE41957C /* _YYWebImageSetter.m */, 436563794D25F666DCD19BE37A7BBA85 /* CALayer+YYWebImage.h */, 95917B3873C0A27B15FE95B54577B960 /* CALayer+YYWebImage.m */, 13AC94841B02E69EBF9BFE64AA3CECC1 /* MKAnnotationView+YYWebImage.h */, 628D9C339AAC48F0BCB896C9CEE8175B /* MKAnnotationView+YYWebImage.m */, 58BD1815001CC5034BB6255837AF5AE8 /* UIButton+YYWebImage.h */, 14BF4C9AB6A8950D65C93996A0A563AF /* UIButton+YYWebImage.m */, 954E821E034D1D09CB9FDFB80D9ECAB5 /* UIImage+YYWebImage.h */, B7BB8316EB15A2F1D4345C57B50D19F4 /* UIImage+YYWebImage.m */, 52E1DCA567703CCCA3596EBF6DD74067 /* UIImageView+YYWebImage.h */, 21E3942DA473328650661A64EDF91055 /* UIImageView+YYWebImage.m */, 31C94702B36F02A8FBD634FA40ECB45E /* YYImageCache.h */, 0C6D8478A9EBA8567512E695CEBB58EF /* YYImageCache.m */, 2CABF9A305C1DA818E14D2E427EE8F6E /* YYWebImage.h */, 19542EB054626AA5D4EC57E14A4CDD65 /* YYWebImageManager.h */, 44525486FDDB56A96229E7264D9AB264 /* YYWebImageManager.m */, 561FB82ED37D54725529791805C28050 /* YYWebImageOperation.h */, 4E0E7518AC47987E9CF7DF3F7ED7DA22 /* YYWebImageOperation.m */, C58824A100680D1130CE6DC415CC01CA /* Support Files */, 8BB831B403BC247CA9F735E3F0DD3A1C /* _YYWebImageSetter.h */, C26CC8AF49451A3472849F13615F5721 /* _YYWebImageSetter.m */, 20A5861C79064C3361B7725F3BE79A81 /* CALayer+YYWebImage.h */, A2AE3BC45C093B95D130463715214217 /* CALayer+YYWebImage.m */, 1FDE10C3CEF540DD64CA7E798E47990C /* MKAnnotationView+YYWebImage.h */, 6AA5A2A4C7265ECA3B255CD11CF69881 /* MKAnnotationView+YYWebImage.m */, B970CD25001B099C48E341AB6E6F8DB5 /* UIButton+YYWebImage.h */, CA6F15111B25DDD99DCCF25DBEFAB9E1 /* UIButton+YYWebImage.m */, 9F729CD728B26013CB9E47F3DCDB8B54 /* UIImage+YYWebImage.h */, E87D9D004B86E5F84106CDA49E3A60D0 /* UIImage+YYWebImage.m */, B213228D95FB56208B6334F46E485B8C /* UIImageView+YYWebImage.h */, 9F9CA04FC992548C8A47C071A76A6447 /* UIImageView+YYWebImage.m */, 67F2A907D286E64A2ABD2E19B145F5B4 /* YYImageCache.h */, 86C9D6E5E6EFDC3C5CDE58AFE73F44B2 /* YYImageCache.m */, 80858E3A6DAE804A9A5D0C0BFC8ECF73 /* YYWebImage.h */, 38485D00465440C758C2732C4931A564 /* YYWebImageManager.h */, 65D6532EF4406D5F34DEA45F8A51DA8E /* YYWebImageManager.m */, C2156F8B4F76611CA48A6A0A09734B04 /* YYWebImageOperation.h */, 4B8B72CEB9C5BD1143D7CB3296D9C6A3 /* YYWebImageOperation.m */, DE3C6C3D4BB5F506D6559B35CAD7864A /* Support Files */, ); name = YYWebImage; path = YYWebImage; sourceTree = "<group>"; }; F0589110DB2987ADCCF693DC4ADAD4D7 /* AFNetworking */ = { D3274F0BAE9FB60DD446C10FC5D6D7DB /* UIKit */ = { isa = PBXGroup; children = ( 2FDC0B0877D4E4A438D368B014D32B73 /* AFNetworking.h */, C337A95EA2293E94C7751090DE237DF1 /* NSURLSession */, DA4A1FE3356F5E45637597A3B656BC01 /* Reachability */, 4CE483645377B852914F927F0CDA9F93 /* Security */, FD90654436BF36C4E79EB01225BC1A3E /* Serialization */, C59A0E810A055A4A03C9B70EA58BC03C /* Support Files */, B5E7E062B514650AD7DC87A45C450875 /* UIKit */, 1AF4577F59CF32DBE4466F1648D450CB /* AFAutoPurgingImageCache.h */, F6BD74D2AEB9E5909DBCE5E196323450 /* AFAutoPurgingImageCache.m */, F0FC3B3345E30380C1C6C2784328BF88 /* AFImageDownloader.h */, 5261D5A149DFC33E5AE0DD5D492942B6 /* AFImageDownloader.m */, 40B4AC6F6400166DCE5B9D4B07D26B6C /* AFNetworkActivityIndicatorManager.h */, 814878CB0DE6801FB2C3F086C3DB47E1 /* AFNetworkActivityIndicatorManager.m */, 43FEDEB0965DDD0C00F3119FF12B69C5 /* UIActivityIndicatorView+AFNetworking.h */, 346B5892710DB600A2A5DBFB606ACDD5 /* UIActivityIndicatorView+AFNetworking.m */, 71F9B0A75E7D51A7D9CF2972FEAB6FC4 /* UIButton+AFNetworking.h */, A3AB1BA8B2D41ABFA4DDCCBB5C250FF0 /* UIButton+AFNetworking.m */, FCBE5DEEB8CE6D2357278BB3BA1F1946 /* UIImage+AFNetworking.h */, AA4A65D5C30F8CDE4F495FFF90DE282A /* UIImageView+AFNetworking.h */, 881F18746DC772DDA447B22CFFBC2FEA /* UIImageView+AFNetworking.m */, D50615C98040D7A8F05D6516C09CA9FA /* UIKit+AFNetworking.h */, 1517481917F6476D3FEFC37B6CB05284 /* UIProgressView+AFNetworking.h */, 1855988F316B6F522AD9424B194D1818 /* UIProgressView+AFNetworking.m */, 1B2AC081E027B9973EC5516F4FC2A080 /* UIRefreshControl+AFNetworking.h */, 6F1F850E1C88A409C73C758C53D621BB /* UIRefreshControl+AFNetworking.m */, ); name = UIKit; sourceTree = "<group>"; }; D9D12F913B2917D3544C482F3498F10A /* Support Files */ = { isa = PBXGroup; children = ( 73CC36396FA8D5DB03C34C3009DBE5A1 /* UMCCommon.debug.xcconfig */, 60C1ECC2C08E5012A14278B450F0EF18 /* UMCCommon.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/UMCCommon"; sourceTree = "<group>"; }; DE3C6C3D4BB5F506D6559B35CAD7864A /* Support Files */ = { isa = PBXGroup; children = ( E7E7BA38F7FF6280171AD6CC890B4D46 /* YYWebImage.modulemap */, 0481E582DB20BC238DA6446D5FE54B21 /* YYWebImage-dummy.m */, D1F93A8472B060CEC1ED1062D0DC7BEA /* YYWebImage-Info.plist */, B363CABAD1A2FAB3048B00E9AE457E44 /* YYWebImage-prefix.pch */, 556981E0DA75C5CF9D95848F11AEC670 /* YYWebImage-umbrella.h */, 3B78F214085A80BF38BCE51C0B157944 /* YYWebImage.debug.xcconfig */, FC152C434115D656719FE2ABE32E5ABB /* YYWebImage.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYWebImage"; sourceTree = "<group>"; }; E9323F369D399C0CC5ACBEDD092CD6CE /* AFNetworking */ = { isa = PBXGroup; children = ( 5C0C7EBCE0B616D5EABE74DC9A5FCA1C /* AFNetworking.h */, 05DB4D59B00F107DD103AD68E79A6D06 /* NSURLSession */, FE237B31FF48B747E7CA9DDF4DA7C29B /* Reachability */, 832CCBE7F39469CE92F66AB817425422 /* Security */, 2E246E91DFC8E8DCA8D4A3F0525C1033 /* Serialization */, 5AEB6466107AAE579E16AE804BF7411B /* Support Files */, D3274F0BAE9FB60DD446C10FC5D6D7DB /* UIKit */, ); name = AFNetworking; path = AFNetworking; @@ -1292,43 +1908,65 @@ name = "Targets Support Files"; sourceTree = "<group>"; }; FD90654436BF36C4E79EB01225BC1A3E /* Serialization */ = { F550B56E8CB40359DD757BD4873F7BE3 /* YYModel */ = { isa = PBXGroup; children = ( C931BFAC1492FBAD2150D90870044B64 /* AFURLRequestSerialization.h */, 7E952070F6458D5354A580EB5C697A77 /* AFURLRequestSerialization.m */, DDEA2F8CBD187ED244641ECB5CAE904E /* AFURLResponseSerialization.h */, BCC14ADFC0D82391D9F788C5B3F2643D /* AFURLResponseSerialization.m */, 2EB5DE113CE8CFF3D7A80D34F7055E1B /* NSObject+YYModel.h */, CC44335CA52698D41D74DF0DF7C0E147 /* NSObject+YYModel.m */, C7345D9D9E1FBF78566047A9A63E4FF9 /* YYClassInfo.h */, 8DAEC3A734034508FA24900E1B67E6CB /* YYClassInfo.m */, 56F51A923876C6B57829933883B4C084 /* YYModel.h */, 2EEC5FB3E65851BE6E760C210C4BE1C2 /* Support Files */, ); name = Serialization; name = YYModel; path = YYModel; sourceTree = "<group>"; }; FDA41F2BA38E90C00E951D18DA60AF7F /* Support Files */ = { FBAF1162F88C6742E4DC613EF22C4C94 /* Support Files */ = { isa = PBXGroup; children = ( 86CBDEBB1EF16BE5599C7B3C764E1B78 /* IQKeyboardManager.modulemap */, 4B3A615FAD585E5A40B20867999D7BE4 /* IQKeyboardManager-dummy.m */, A25D4294B555D413AB588FBA8F96B306 /* IQKeyboardManager-Info.plist */, 992112BE47ED0CD282A19A686DEC5FA8 /* IQKeyboardManager-prefix.pch */, A89505BE5DB6EB8C15D3A859D3ABC461 /* IQKeyboardManager-umbrella.h */, A6D1D2633FCA2C2E14D4DCE781C73340 /* IQKeyboardManager.debug.xcconfig */, 0E84503CC7AC8803383E34A33700A149 /* IQKeyboardManager.release.xcconfig */, 6911B89F9AFFA28DD82EC1F2BB8D87FD /* SDWebImage.modulemap */, 5A5F7B3F192878937FCE6279FE696379 /* SDWebImage-dummy.m */, 4DDDA9B909764E9465C35A3F93EA3E0C /* SDWebImage-Info.plist */, 1C6331A22B6F893F8493943B77C41000 /* SDWebImage-prefix.pch */, FB9C11FA05290B3BD8D9FF2AA816662A /* SDWebImage-umbrella.h */, FB3BD5BFC0811750D86596AD1EBE97B0 /* SDWebImage.debug.xcconfig */, 769447B0A8CD1DCB9FD8DEA9B1C6C25E /* SDWebImage.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/IQKeyboardManager"; path = "../Target Support Files/SDWebImage"; sourceTree = "<group>"; }; FE237B31FF48B747E7CA9DDF4DA7C29B /* Reachability */ = { isa = PBXGroup; children = ( 5123EF586F1A580A919F7A8F30D3986D /* AFNetworkReachabilityManager.h */, C12944C02F254E7FB08779E41A084DBE /* AFNetworkReachabilityManager.m */, ); name = Reachability; sourceTree = "<group>"; }; FFB32D5089845B3EE2BEFD4EB2A478DA /* Products */ = { isa = PBXGroup; children = ( A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking.framework */, 98527D7196957AAB07B79E2E2AFDE23E /* IQKeyboardManager.framework */, F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */, 490AC753C5C289D7B70E73B4E7512560 /* ReactiveCocoa.framework */, 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */, B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */, E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD.framework */, 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */, 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */, E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */, 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */, ); name = Products; sourceTree = "<group>"; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 035CE4DDF8A38AEE3A51577C55EB18F9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 6657CC5A77D6A6A366F5BA87241BC7B9 /* Pods-BuWanVideo2.0-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 2BBB19E48E5C6E19074178D75BDB5617 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1413,6 +2051,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 776DB98A1C25357A2B2DB8D5DDB880C1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( EB6419062518904BBB42F089025C28EF /* Pods-BuWanVideo2.0-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 7C044C67F11489EFA3459B8399E7061C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1469,6 +2115,113 @@ 8BA6B74504A7404B3187C31073A5812A /* YYImage.h in Headers */, A2AE66EE8F32341D7199867E04DDB48F /* YYImageCoder.h in Headers */, FE234DE6B80B1383BF4E445CC9F4AE20 /* YYSpriteSheetImage.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; CC7DEDAB49A43E4D23372D5C1701C232 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 2B6F2C15996397DFE4C1EB2EA2EE3BC3 /* MKAnnotationView+RACSignalSupport.h in Headers */, CF788718B39D4FFA2C994F6CD7D5B0BC /* NSArray+RACSequenceAdditions.h in Headers */, 49FD48552CF61BA11BA1DF1DB818096E /* NSData+RACSupport.h in Headers */, 12B1BD8C315549A9AE481315F827224A /* NSDictionary+RACSequenceAdditions.h in Headers */, DB81F00D368720A95F634752E4976718 /* NSEnumerator+RACSequenceAdditions.h in Headers */, 1B606E53085AAC89CE94A6249D2AE139 /* NSFileHandle+RACSupport.h in Headers */, 85CBFF9F7DC7598A6A2BE6B2FA3CDC84 /* NSIndexSet+RACSequenceAdditions.h in Headers */, F511E46DD072825B3F0F4C87AC812259 /* NSInvocation+RACTypeParsing.h in Headers */, 00AE159D301D55ABBC0765F9F20BE3C2 /* NSNotificationCenter+RACSupport.h in Headers */, BD7DD450A9191071160B67923A21A761 /* NSObject+RACDeallocating.h in Headers */, DAFB0A83D66BB123AE5651E2E93A410B /* NSObject+RACDescription.h in Headers */, 30AAA08CB85A7632E163745A33B1A1E8 /* NSObject+RACKVOWrapper.h in Headers */, BA5A3A9DDCC0D0622727BFE8BCDB1308 /* NSObject+RACLifting.h in Headers */, 61A4F8288571431BD9CCAEA01D489B8B /* NSObject+RACPropertySubscribing.h in Headers */, EF57656B0F585FA18814D96F8B301E8E /* NSObject+RACSelectorSignal.h in Headers */, 7981DD1D07B466400300755F572B5FFB /* NSOrderedSet+RACSequenceAdditions.h in Headers */, 93CC6A2CBD4762B7F8949E453C59DD75 /* NSSet+RACSequenceAdditions.h in Headers */, 6F39836FEDB917CEC130865A29D6A49B /* NSString+RACKeyPathUtilities.h in Headers */, 58AEC8AF3B611C7C1791067ECADAB282 /* NSString+RACSequenceAdditions.h in Headers */, 9FDA87D8654C85916F1B84F2F4FF3592 /* NSString+RACSupport.h in Headers */, 8F72A8A13CA8FC3E305C1535E41D04EB /* NSURLConnection+RACSupport.h in Headers */, 348E248BFE74155E0C49FE6EF4B2B113 /* NSUserDefaults+RACSupport.h in Headers */, E6EF8FFC4F685FE72AD8FD950A22396B /* RACArraySequence.h in Headers */, 708FD0F6ED2181AF6CFB102B07AE9736 /* RACBehaviorSubject.h in Headers */, 986389AB078ECF507FDED38D12A2FE40 /* RACBlockTrampoline.h in Headers */, E667AF98DE4D39AE296A43CB195A4669 /* RACChannel.h in Headers */, 482E36AAACA318DA959AE2483AEF02D6 /* RACCommand.h in Headers */, A299807BB62EA27766C43F32715D3A64 /* RACCompoundDisposable.h in Headers */, 72639114A8E00E411B7931609CEECEF1 /* RACDelegateProxy.h in Headers */, 53247B558DF2156FEFD2FBB28A018321 /* RACDisposable.h in Headers */, 7D9B234A80745375B69B16745BB6ECF6 /* RACDynamicSequence.h in Headers */, 69F5D0AF17D22DD8DCDEF2A118D99554 /* RACDynamicSignal.h in Headers */, 0CD071D8A36B2094C18CB4E60D812B94 /* RACEagerSequence.h in Headers */, BFE6B130EA90C444C0B4C195BD6AC38B /* RACEmptySequence.h in Headers */, 6306D961C138CF5C115F53C8B01D2324 /* RACEmptySignal.h in Headers */, CC4C642566282D6390D6D79811F6C1DC /* RACErrorSignal.h in Headers */, 9854F625EB691C938CB938AC14F7A2C7 /* RACEvent.h in Headers */, BEDDECB8063326BEBE5DC4413915E38A /* RACEXTKeyPathCoding.h in Headers */, 2A742E66F9B85A09F7EAB3A2EF4476A5 /* RACEXTRuntimeExtensions.h in Headers */, D4D04CDBE68E638C8ADD838618DB9E7F /* RACEXTScope.h in Headers */, C0AF1E8BC5282FC1FC463067AA5B7FA8 /* RACGroupedSignal.h in Headers */, BFB92EC9EC421B6F493A3EE2B354F1F5 /* RACImmediateScheduler.h in Headers */, 0C4F41E1DE82516506AAB48BE2D79C1D /* RACIndexSetSequence.h in Headers */, 43F15A40517D0CE8C45D42323BA5111D /* RACKVOChannel.h in Headers */, F8A90B58596E63DD5AEF4059A0B5FB2E /* RACKVOProxy.h in Headers */, 29EF1B5AC55EE7E15E1385BF485D2BB6 /* RACKVOTrampoline.h in Headers */, 932DF66B84716C4423EA6410F9ECA1F5 /* RACmetamacros.h in Headers */, 281A74A04DD23C7D1DE4971774950ACB /* RACMulticastConnection+Private.h in Headers */, 32847A1E157C22EA34F7C4E3FD401A13 /* RACMulticastConnection.h in Headers */, 2CD2731B5BAA1C193C6A8799AB744E13 /* RACObjCRuntime.h in Headers */, 0324788F8F31FCCE5BF11860F2F47EE3 /* RACPassthroughSubscriber.h in Headers */, AE274AE6E10B72984A77D6EBC4283923 /* RACQueueScheduler+Subclass.h in Headers */, 633BFEC434FA1AC4DCB86B134D8120C9 /* RACQueueScheduler.h in Headers */, CA6BEA35F6F22F61075631EF4CA476C5 /* RACReplaySubject.h in Headers */, F4F1789324DA09F33F0C567B9973B437 /* RACReturnSignal.h in Headers */, 47FFF84BE18DE7F0EB2416D17F699F55 /* RACScheduler+Private.h in Headers */, 07D8A570AD3F2351D94A86ED1DECF74E /* RACScheduler+Subclass.h in Headers */, DECA8B73D1F2CC17814AF107F275FC25 /* RACScheduler.h in Headers */, 8B1B7A5DCA698775C6BD816AABFAAEFA /* RACScopedDisposable.h in Headers */, 5F86F0A9416CF47DE55F7C1F333F9B20 /* RACSequence.h in Headers */, 9DF011F3CC2E6C60502CE9CB2B4C5621 /* RACSerialDisposable.h in Headers */, FA97B2A41EE18A3785FC1F5CC5F13F18 /* RACSignal+Operations.h in Headers */, D2D73FCE699F4DE8492156DF39F2EC1D /* RACSignal.h in Headers */, 1007557664FED923362FC418604C4555 /* RACSignalSequence.h in Headers */, EEE7C3B2DB0A8AA92F28F87310FDBF5B /* RACStream+Private.h in Headers */, 7DE20C090855CD99A5D208A3410AF5F4 /* RACStream.h in Headers */, 0359ED37321A51AB661D79336EE192F1 /* RACStringSequence.h in Headers */, 082EE92E541CC3D1CC3741C17F6C6396 /* RACSubject.h in Headers */, C782A4471C023B7F846A985B9B5BCE50 /* RACSubscriber+Private.h in Headers */, BDB640F1DE341B48A36885BFECF8243F /* RACSubscriber.h in Headers */, AC31721D8A23663DA6EEF6F2B7E81652 /* RACSubscriptingAssignmentTrampoline.h in Headers */, 0F18A1582796BEA8047052486B92CD88 /* RACSubscriptionScheduler.h in Headers */, 14838B37F5A630740FA6E5DF1EF06716 /* RACTargetQueueScheduler.h in Headers */, 26B59EBDF1E06850D46D8291B170CF80 /* RACTestScheduler.h in Headers */, E0D17030910F5B27D27F62BAD0B65C6B /* RACTuple.h in Headers */, 2839FC5750B0D92FA9C4C47D37473AAE /* RACTupleSequence.h in Headers */, 1872C9FC4BDC6F8F509162BB80BCC5AD /* RACUnarySequence.h in Headers */, B78E84384EC3B04E9E59CE88985E44EF /* RACUnit.h in Headers */, 7CEBC925DB1FA8AC1B944294F7F79F9F /* RACValueTransformer.h in Headers */, 92FCC7ECEDA4C066663C0843A759463B /* ReactiveCocoa-umbrella.h in Headers */, B891D66299E0932A4BF2721CA526B9D0 /* ReactiveCocoa.h in Headers */, B1784BB8A283FF28BE29BDD9AA7FA653 /* UIActionSheet+RACSignalSupport.h in Headers */, B3FF7A4ACFC23BABF5490CD0AE5A10B2 /* UIAlertView+RACSignalSupport.h in Headers */, 881BDB53E45DFB3050B7F13A5399C209 /* UIBarButtonItem+RACCommandSupport.h in Headers */, 940687B883484C7E1E26D6798AF033C1 /* UIButton+RACCommandSupport.h in Headers */, 3035AE24E4F177561B9DDA85C6FAF1D3 /* UICollectionReusableView+RACSignalSupport.h in Headers */, B997C538A5E30F1A7C6D259F2485F295 /* UIControl+RACSignalSupport.h in Headers */, C7198C4F63C30A464FDD8841EE070508 /* UIControl+RACSignalSupportPrivate.h in Headers */, E9950F4C8C6B6EF6EDA5409AB7933364 /* UIDatePicker+RACSignalSupport.h in Headers */, 0F8BB4CF3D1A145DBB43C3F569BFF832 /* UIGestureRecognizer+RACSignalSupport.h in Headers */, 41C06E6FB57F432EF39C6B915FEDEFA2 /* UIImagePickerController+RACSignalSupport.h in Headers */, E7CB601E57442AAE994A1FDE532E2D94 /* UIRefreshControl+RACCommandSupport.h in Headers */, FC2A20C4DBA752872E86BC15ABEF89B7 /* UISegmentedControl+RACSignalSupport.h in Headers */, 0DD380B9CF013147B965CF65A815621B /* UISlider+RACSignalSupport.h in Headers */, 3762317630AD2C73ACE7CAE48FABCC8F /* UIStepper+RACSignalSupport.h in Headers */, EC78925B5BC2B7E21791E6D66A59B92C /* UISwitch+RACSignalSupport.h in Headers */, 49E9DCC5114DE66808AE2344D54D6045 /* UITableViewCell+RACSignalSupport.h in Headers */, CADA3263D9306E1D64AAB82D23D2E19E /* UITableViewHeaderFooterView+RACSignalSupport.h in Headers */, 9897BC1413163BA28F88DCC6420FBD95 /* UITextField+RACSignalSupport.h in Headers */, 591A8317F58698083EA0925D454B1F77 /* UITextView+RACSignalSupport.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1529,6 +2282,24 @@ productReference = 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */; productType = "com.apple.product-type.framework"; }; 07B5C6907D09E767CDC5954A9468CA2E /* ReactiveCocoa */ = { isa = PBXNativeTarget; buildConfigurationList = E99E56B9296D32CB36D7FBE35E014198 /* Build configuration list for PBXNativeTarget "ReactiveCocoa" */; buildPhases = ( CC7DEDAB49A43E4D23372D5C1701C232 /* Headers */, 12329CADA0A1FBA68E96B67D90055147 /* Sources */, 2DA6D3992470BA83E36A3961F928BD34 /* Frameworks */, 6B8CB16350E0855802A58F66D7E4B574 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = ReactiveCocoa; productName = ReactiveCocoa; productReference = 490AC753C5C289D7B70E73B4E7512560 /* ReactiveCocoa.framework */; productType = "com.apple.product-type.framework"; }; 1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */ = { isa = PBXNativeTarget; buildConfigurationList = E76C288BA44757915CF3700D8A326EB7 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */; @@ -1577,8 +2348,8 @@ buildRules = ( ); dependencies = ( D263769A4110C549204FFF9C5224B019 /* PBXTargetDependency */, B988ED9708DAA014CAED486BB803CBEA /* PBXTargetDependency */, E03C95B9EC4B9FBDF096B2795E733296 /* PBXTargetDependency */, 34DC612E97B32C58E43FCAEAAB0CB289 /* PBXTargetDependency */, ); name = YYWebImage; productName = YYWebImage; @@ -1641,26 +2412,27 @@ }; EAD4BA19A0B2ECDDC3897988429A5452 /* Pods-BuWanVideo2.0 */ = { isa = PBXNativeTarget; buildConfigurationList = 9DC28FA5F3E8F258C30D19CAC9A74AE6 /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */; buildConfigurationList = A306AAA1A2C247285DD2A7973840843A /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */; buildPhases = ( 035CE4DDF8A38AEE3A51577C55EB18F9 /* Headers */, B03DBF5B9BCB40CE35E7EE68C51D398C /* Sources */, 9D1C768C597BF82E5D67B19EA3F55A6D /* Frameworks */, C3BDBF2F1E483837C22772654603E084 /* Resources */, 776DB98A1C25357A2B2DB8D5DDB880C1 /* Headers */, 9E24A36F6DA49F292DC51C988E3E814C /* Sources */, D679E25B3BF95A8067DCEC55B970AB89 /* Frameworks */, F3FF02FDECE21A5BBEA73586D5F18ECA /* Resources */, ); buildRules = ( ); dependencies = ( 9D0DAC5C08DB2B6D58391A0550479C50 /* PBXTargetDependency */, 3E746F46EBD3E8386C5B99FD4A7AB8C8 /* PBXTargetDependency */, D93263E564D657742F2C0ED6BDB60695 /* PBXTargetDependency */, DE2A75E62321BB61C5230E23277A64EC /* PBXTargetDependency */, 24189D9FA6D3A75225243293563DF487 /* PBXTargetDependency */, D8232ABD0561A80E7AFC2E480FFA6BEF /* PBXTargetDependency */, 7B197EE9EDED60BDC834DEB1DED15583 /* PBXTargetDependency */, 39957D188EAC09B82BAEA96D138C9F92 /* PBXTargetDependency */, 51A00CD981678108CCB325C32FC62513 /* PBXTargetDependency */, 5E3B0189967010F54ABE8135665B9087 /* PBXTargetDependency */, 86C9114F7E719100BEADA5D035CF5CF9 /* PBXTargetDependency */, 430ED24E3D0EA89397731BDBE210A4BF /* PBXTargetDependency */, FAC56E0815F4D34D017033131FD2AF2A /* PBXTargetDependency */, 003B9709EA56FF77B16D40895013E932 /* PBXTargetDependency */, A478C01429D4F909B78F7986D17644DC /* PBXTargetDependency */, 1F4D43433660A32200965E4CEC79D67B /* PBXTargetDependency */, 6D867262152D9D3F924177D71D2B2C54 /* PBXTargetDependency */, 76E8F15F849EFDDE99E82DDD6940E23E /* PBXTargetDependency */, 0A3F4D29CB9472A9B577F93C5C4D6429 /* PBXTargetDependency */, 9EEFE10C78D21E104FDEEEC5B49C07B3 /* PBXTargetDependency */, 66664093FE6C2447E7EADD60046FA0FC /* PBXTargetDependency */, ); name = "Pods-BuWanVideo2.0"; productName = "Pods-BuWanVideo2.0"; @@ -1703,13 +2475,14 @@ Base, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; productRefGroup = 2A1ADBDE0E5F7BDEBE86F193E7C10F7F /* Products */; productRefGroup = FFB32D5089845B3EE2BEFD4EB2A478DA /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */, FBA456CB50E371584C11231929A0971E /* IQKeyboardManager */, EAD4BA19A0B2ECDDC3897988429A5452 /* Pods-BuWanVideo2.0 */, 07B5C6907D09E767CDC5954A9468CA2E /* ReactiveCocoa */, 03932C47FBFD347205B2F367F78E9B63 /* SDAutoLayout */, 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */, 1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */, @@ -1745,6 +2518,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 6B8CB16350E0855802A58F66D7E4B574 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 7BB2E885B360CCC1AEF0C191542BA06E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1761,13 +2541,6 @@ runOnlyForDeploymentPostprocessing = 0; }; 93339C3415F6DA4D178483BD0941DE7E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; C3BDBF2F1E483837C22772654603E084 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -1795,9 +2568,115 @@ ); runOnlyForDeploymentPostprocessing = 0; }; F3FF02FDECE21A5BBEA73586D5F18ECA /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 12329CADA0A1FBA68E96B67D90055147 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 644259BC00D7510C939873AB975D0580 /* MKAnnotationView+RACSignalSupport.m in Sources */, 525CEBC70B390685EC59D17DCF9284E7 /* NSArray+RACSequenceAdditions.m in Sources */, C3EDE2F9B7AD98AAA9AA0C71706639C8 /* NSData+RACSupport.m in Sources */, 0C5449D7CBF40A6E502B4AD1503FDE85 /* NSDictionary+RACSequenceAdditions.m in Sources */, 7C24AAF711EEFFE33DC03B2663B71B21 /* NSEnumerator+RACSequenceAdditions.m in Sources */, 337D6BB46524504CC371A1948E6CF525 /* NSFileHandle+RACSupport.m in Sources */, D27FB235F57668A1FF7F957D559E4E2C /* NSIndexSet+RACSequenceAdditions.m in Sources */, BFB9DED247873991F11BB8AF74601C11 /* NSInvocation+RACTypeParsing.m in Sources */, 95BDD71EF01FCC27312EFF595F4DB16F /* NSNotificationCenter+RACSupport.m in Sources */, 8356648C8026AB8EBA631C6D2DD179C4 /* NSObject+RACDeallocating.m in Sources */, 6A522FD6027D430613F767326A47CF52 /* NSObject+RACDescription.m in Sources */, 5A73E0971EE149AF6C87D3E116731130 /* NSObject+RACKVOWrapper.m in Sources */, E33CBF2B828469F0ECD45C0B5B8C92AF /* NSObject+RACLifting.m in Sources */, E1824AFF87F40AA106F17692F1993AD8 /* NSObject+RACPropertySubscribing.m in Sources */, EDAC9E3E3D7B41933488778B8B61A943 /* NSObject+RACSelectorSignal.m in Sources */, 15465DFEA521BD13A1A821E4DD15DA28 /* NSOrderedSet+RACSequenceAdditions.m in Sources */, C38BFB29DD2C9DFAAD95593B747DC118 /* NSSet+RACSequenceAdditions.m in Sources */, 36D2AA6D0E48D5BAF9335437E39212C7 /* NSString+RACKeyPathUtilities.m in Sources */, 0C00AA492A9FB7B1072AAFF044FF04FC /* NSString+RACSequenceAdditions.m in Sources */, 4BC1CB5FB72CDE1EB8A7A7CDF69D83B1 /* NSString+RACSupport.m in Sources */, 5E8062C4CA7CFF864E870DD32EF373D0 /* NSURLConnection+RACSupport.m in Sources */, 2A8024CD3461DE7998477C2BA9034487 /* NSUserDefaults+RACSupport.m in Sources */, BA479012E53B6F27FC46F7E7149FF5B9 /* RACArraySequence.m in Sources */, 2A543D0F759273A0A433E198B7F64D2D /* RACBehaviorSubject.m in Sources */, 79754E9B3C4404A6B808E18EF7EED7FE /* RACBlockTrampoline.m in Sources */, 0D3A5284679E75244D76D8E350E24891 /* RACChannel.m in Sources */, 35B4FDEF4026F2BF599BDD239E3531E9 /* RACCommand.m in Sources */, F202AE59369A42D39FDDE8A0E67C4B06 /* RACCompoundDisposable.m in Sources */, DAF10BF53C843C1AA6E404E7CA7791ED /* RACCompoundDisposableProvider.d in Sources */, C01488A7467BDE3E7EFF535588426947 /* RACDelegateProxy.m in Sources */, BBEA4D90D3B81E2542179101F19A554E /* RACDisposable.m in Sources */, ECC26668A0FB2BB2A8D5CF6BB9B39926 /* RACDynamicSequence.m in Sources */, 6547F42706FE0F450AE76B538609FD26 /* RACDynamicSignal.m in Sources */, 16E2E5EA34FEC144941883E48D0FE5A5 /* RACEagerSequence.m in Sources */, 246B6B4CAEC28C91BADAB5B9EDAF5894 /* RACEmptySequence.m in Sources */, C1E521BFEA7CB65AA7C7E74C23246F4A /* RACEmptySignal.m in Sources */, 1E5CC267AD2209535B5741AA615601A3 /* RACErrorSignal.m in Sources */, A00A107C8091C6CBBFCC0AB7B7315759 /* RACEvent.m in Sources */, 8F9007604EDE67D2D13CB13356F95659 /* RACEXTRuntimeExtensions.m in Sources */, ECC516A879C21E51BB5CB48FDD4C6F6F /* RACGroupedSignal.m in Sources */, BD4AC00BB5A61FE416686D76E6739D0A /* RACImmediateScheduler.m in Sources */, 777B08381903387AEBE83CA0713DB562 /* RACIndexSetSequence.m in Sources */, C84A6A3E2CCE57A58704456166D18069 /* RACKVOChannel.m in Sources */, 9718D5CBD857231C24D37F08DB97BD8C /* RACKVOProxy.m in Sources */, DE33B6BA0000DF02A8D3CF96ADF92B85 /* RACKVOTrampoline.m in Sources */, AFD44F8A46638784EBBD8E515DF799F8 /* RACMulticastConnection.m in Sources */, 5AD5F93B19E36953E086CA873D3B270D /* RACObjCRuntime.m in Sources */, 877D257E7B0B1D74A230DCD6B4113ADD /* RACPassthroughSubscriber.m in Sources */, A510FED6943809E7E3DA700F672B2F7D /* RACQueueScheduler.m in Sources */, 212923F53D94AC87D65AD14BDA7520C2 /* RACReplaySubject.m in Sources */, 462F886C642EF09D0B7D46572BE796EC /* RACReturnSignal.m in Sources */, 9E8EA010661C670EF52F121DB94D66F9 /* RACScheduler.m in Sources */, 53268BEB74BB363EEA2B4E4F6806B815 /* RACScopedDisposable.m in Sources */, 223EC41EE84BF2D60EB3944BECF69637 /* RACSequence.m in Sources */, 3F671C2E5DD53C12ABF87E3FFF378318 /* RACSerialDisposable.m in Sources */, F28C3D140DF2FC29C1CE7ECE95CCB446 /* RACSignal+Operations.m in Sources */, C9E83B3024265E75806B4F9F60C3D06B /* RACSignal.m in Sources */, 9D5C9C39B1ED488C693D7E68D30064DC /* RACSignalProvider.d in Sources */, 55B3E720A0357FA6653DF992715E8E8E /* RACSignalSequence.m in Sources */, F95E9612D7C529ADBAF213B08C346923 /* RACStream.m in Sources */, 75DED089B685357D34569CFC24045E73 /* RACStringSequence.m in Sources */, F5D40BEB1902E778C516443F03283946 /* RACSubject.m in Sources */, C068FF76BB7397ABC8E28A128D476D6B /* RACSubscriber.m in Sources */, 992D239F5B142006F36438E77A2B531A /* RACSubscriptingAssignmentTrampoline.m in Sources */, 13FC4D88E2545CD03029F4B3D73216B3 /* RACSubscriptionScheduler.m in Sources */, C155832E84FF8DA040283136B88D385F /* RACTargetQueueScheduler.m in Sources */, F4B28FB40E0D76F12441CE050ED55CB1 /* RACTestScheduler.m in Sources */, 453F36F96611182025D9C4CF66679811 /* RACTuple.m in Sources */, F71F43AA460A63C52541C275B3293873 /* RACTupleSequence.m in Sources */, F57F89A4CA7E896A541B19134F2F898D /* RACUnarySequence.m in Sources */, 05DC282BBB1E2C53B294600B717AC636 /* RACUnit.m in Sources */, FA209D5F876638139A11A6FE009C50CA /* RACValueTransformer.m in Sources */, 0736935D474D0F6DBD5475ED3EC832A0 /* ReactiveCocoa-dummy.m in Sources */, 1A8A562D8D720140B1877F09EC08A436 /* UIActionSheet+RACSignalSupport.m in Sources */, 924BB695217934F16F8E192BF617FC83 /* UIAlertView+RACSignalSupport.m in Sources */, 876EFD89D31B4898FCFEEE681815443B /* UIBarButtonItem+RACCommandSupport.m in Sources */, B436BB09B39285A18A4CB16D89D06DFC /* UIButton+RACCommandSupport.m in Sources */, D1B8CDC88CA0293447091D168F39B66B /* UICollectionReusableView+RACSignalSupport.m in Sources */, DD10923803BB05211A7243C8D3D44498 /* UIControl+RACSignalSupport.m in Sources */, 976D20E5B6257D0EED254049511BFDEB /* UIControl+RACSignalSupportPrivate.m in Sources */, 0ADB0B766D27D0E07044AE6C157D72A5 /* UIDatePicker+RACSignalSupport.m in Sources */, 0E34D0A633DF8637944C056D3E78B674 /* UIGestureRecognizer+RACSignalSupport.m in Sources */, B68AF262D3D1325E124753B593CD777C /* UIImagePickerController+RACSignalSupport.m in Sources */, A4E67531A1E94CF08B3808330D77103B /* UIRefreshControl+RACCommandSupport.m in Sources */, 2EC8CBDF494209E3C17D558B026500B8 /* UISegmentedControl+RACSignalSupport.m in Sources */, A36802C377AD51FA89641B3B834F4C02 /* UISlider+RACSignalSupport.m in Sources */, 066E74AB0357DB7E2947FD0843A1CBF0 /* UIStepper+RACSignalSupport.m in Sources */, D9E08178B8524CA556D6682189FA8236 /* UISwitch+RACSignalSupport.m in Sources */, 796479DBF7957AA0153A83183FD7A278 /* UITableViewCell+RACSignalSupport.m in Sources */, FFE9685D959585534780D0C8DE931137 /* UITableViewHeaderFooterView+RACSignalSupport.m in Sources */, 1A8CE4FC7EFC2462CA581533C839DF31 /* UITextField+RACSignalSupport.m in Sources */, 4C9557DF19D731B63533B218BB24FA89 /* UITextView+RACSignalSupport.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 40EE6C17179F07987EBED15A7810D057 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1862,6 +2741,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 9E24A36F6DA49F292DC51C988E3E814C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 98775A84946B367858339515F96ACFF3 /* Pods-BuWanVideo2.0-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ABA965C7D39C9BB2689CFD564365A313 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1869,14 +2756,6 @@ 01686953CD3D80119BE2E79E920E21C0 /* SDAutoLayout-dummy.m in Sources */, BCD5541CA37B64DFDF167614CF9A6307 /* UITableView+SDAutoTableViewCellHeight.m in Sources */, D2B67B0AD9D2BB06A45268778DC5CC3F /* UIView+SDAutoLayout.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; B03DBF5B9BCB40CE35E7EE68C51D398C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 6782FD484DE28206A848E06EDCE055D4 /* Pods-BuWanVideo2.0-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1960,84 +2839,90 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 24189D9FA6D3A75225243293563DF487 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SVProgressHUD; target = 1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */; targetProxy = 39010B3C4CD3E161A5359EC62F062B3F /* PBXContainerItemProxy */; }; 39957D188EAC09B82BAEA96D138C9F92 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = 39E01E082225420D2B27661D102B08AF /* PBXContainerItemProxy */; }; 3E746F46EBD3E8386C5B99FD4A7AB8C8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = IQKeyboardManager; target = FBA456CB50E371584C11231929A0971E /* IQKeyboardManager */; targetProxy = AA8F9DC2302FB0FC551F2944853C3486 /* PBXContainerItemProxy */; }; 51A00CD981678108CCB325C32FC62513 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYModel; target = 84B44807A12996D487A4A591A481D6A0 /* YYModel */; targetProxy = 6C1CF5D3986704BF19F9EB59D987C6C0 /* PBXContainerItemProxy */; }; 5E3B0189967010F54ABE8135665B9087 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYWebImage; target = 488E8C830C5A5694EE916251B9ADAADA /* YYWebImage */; targetProxy = 70722B4466CCEF7C48301488CA06D47E /* PBXContainerItemProxy */; }; 7B197EE9EDED60BDC834DEB1DED15583 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = A7725E3D9598E58FD15784801553CCF0 /* PBXContainerItemProxy */; }; 9D0DAC5C08DB2B6D58391A0550479C50 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AFNetworking; target = 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */; targetProxy = 0104E26FD175BEA255C6856FF19FB484 /* PBXContainerItemProxy */; }; B988ED9708DAA014CAED486BB803CBEA /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = 8CF7F27808F8A5A006B38502A5B1B60F /* PBXContainerItemProxy */; }; D263769A4110C549204FFF9C5224B019 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = A7164C3D5176976AE6A9386AC65256AB /* PBXContainerItemProxy */; }; D8232ABD0561A80E7AFC2E480FFA6BEF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMCCommon; target = 6F6B630FA5213AB083E7CEF1F986FE44 /* UMCCommon */; targetProxy = 195BE46DBF20E99C879F0694E2C05E7C /* PBXContainerItemProxy */; }; D93263E564D657742F2C0ED6BDB60695 /* PBXTargetDependency */ = { 003B9709EA56FF77B16D40895013E932 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDAutoLayout; target = 03932C47FBFD347205B2F367F78E9B63 /* SDAutoLayout */; targetProxy = 54F6CEA4803E4F0979EC311FBCA8B3A1 /* PBXContainerItemProxy */; targetProxy = 73248A947596392E175A7D9FCDF75502 /* PBXContainerItemProxy */; }; DE2A75E62321BB61C5230E23277A64EC /* PBXTargetDependency */ = { 0A3F4D29CB9472A9B577F93C5C4D6429 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = 12E38ADC3186C43970F17AF01E637D10 /* PBXContainerItemProxy */; }; 1F4D43433660A32200965E4CEC79D67B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SVProgressHUD; target = 1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */; targetProxy = D4D5AF2CFBDD43F1B48247E9C6EABF7C /* PBXContainerItemProxy */; }; 34DC612E97B32C58E43FCAEAAB0CB289 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = D61D8DB52F1FF866F95073FBF877BB45 /* PBXContainerItemProxy */; }; 430ED24E3D0EA89397731BDBE210A4BF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = IQKeyboardManager; target = FBA456CB50E371584C11231929A0971E /* IQKeyboardManager */; targetProxy = 1F548367755F470B103ADBF8084D2B90 /* PBXContainerItemProxy */; }; 66664093FE6C2447E7EADD60046FA0FC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYWebImage; target = 488E8C830C5A5694EE916251B9ADAADA /* YYWebImage */; targetProxy = 6E4C67B39C968DA5171CB5BFF9347687 /* PBXContainerItemProxy */; }; 6D867262152D9D3F924177D71D2B2C54 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMCCommon; target = 6F6B630FA5213AB083E7CEF1F986FE44 /* UMCCommon */; targetProxy = FC2452388D3F72B55F9BAB970E597304 /* PBXContainerItemProxy */; }; 76E8F15F849EFDDE99E82DDD6940E23E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = ADF28A730A0FEE2B299E3D5B7A4797E2 /* PBXContainerItemProxy */; }; 86C9114F7E719100BEADA5D035CF5CF9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AFNetworking; target = 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */; targetProxy = 8D43102BAF2B807D494340802E2013B2 /* PBXContainerItemProxy */; }; 9EEFE10C78D21E104FDEEEC5B49C07B3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYModel; target = 84B44807A12996D487A4A591A481D6A0 /* YYModel */; targetProxy = 741D65FEB7E0B2AFC84FC8CE8D9BCF2F /* PBXContainerItemProxy */; }; A478C01429D4F909B78F7986D17644DC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; targetProxy = 15F5EB11DB9B4325A6F80F975F9A85BA /* PBXContainerItemProxy */; targetProxy = 06BC34F31C533A1F9ED764C5826444A9 /* PBXContainerItemProxy */; }; E03C95B9EC4B9FBDF096B2795E733296 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = C44DC32BBB604C441028E2FE32CD5A80 /* PBXContainerItemProxy */; }; FAC56E0815F4D34D017033131FD2AF2A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ReactiveCocoa; target = 07B5C6907D09E767CDC5954A9468CA2E /* ReactiveCocoa */; targetProxy = A5A3E2E6A6EAD986A88E08B43D197DF2 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 12D4D3868F1FCA559103B98ED53AB23F /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 06617545769B7AFFDF1D2D8CAD0E3C40 /* SDWebImage.release.xcconfig */; baseConfigurationReference = 769447B0A8CD1DCB9FD8DEA9B1C6C25E /* SDWebImage.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2068,7 +2953,7 @@ }; 194603DF5485109ACD936C057344FF81 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = BCB58A5382C1F631BEE128C111FDFE77 /* SVProgressHUD.release.xcconfig */; baseConfigurationReference = B16B09647C7889027ADC44AA11F1520A /* SVProgressHUD.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2099,7 +2984,7 @@ }; 27B6379B9915AD2C6F2A997650D7DF13 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 0863BA2E7625437CCF2AD822AADBD14C /* YYModel.debug.xcconfig */; baseConfigurationReference = B64D776B0B4DFBBA82505BF0E0216AB1 /* YYModel.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2129,7 +3014,7 @@ }; 2D43B37FA711C27FD315A9C48853AAAF /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 535FF7AEEA0A877AB813020B3A5C2513 /* AFNetworking.debug.xcconfig */; baseConfigurationReference = BD901C0090BA1EF3A2BA39314E6ECA3C /* AFNetworking.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2159,7 +3044,7 @@ }; 3155BB214D8F72ED584CCA607CF159B9 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 0E84503CC7AC8803383E34A33700A149 /* IQKeyboardManager.release.xcconfig */; baseConfigurationReference = 2DDB1D0F3102AFB005CAC2E3EEFD7967 /* IQKeyboardManager.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2190,7 +3075,7 @@ }; 49DAD7AE978B8E537BEE5C948BAE3B3D /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 633F9A5C6929420CE95700768F073EFB /* SDWebImage.debug.xcconfig */; baseConfigurationReference = FB3BD5BFC0811750D86596AD1EBE97B0 /* SDWebImage.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2220,7 +3105,7 @@ }; 4EB37250CA71F238C789C4789DEBEE89 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9DF4DE629098FF15B403BE56D0856DA2 /* YYCache.debug.xcconfig */; baseConfigurationReference = CAC778F10AAC16F8F8054FB32F5B9364 /* YYCache.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2250,7 +3135,7 @@ }; 5C36AB9A48012D034A98928714B6BBB3 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 11A9F777D6CAF09F8A2527AD18805629 /* SVProgressHUD.debug.xcconfig */; baseConfigurationReference = 3E57DA243178E435EAF7FFC38C7912C3 /* SVProgressHUD.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2280,7 +3165,7 @@ }; 5DE43F541F0E9DE3CDE10DEDB5D201DD /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 6BB1FC1CA63AAA77E98E85CF3431087F /* UMCCommon.debug.xcconfig */; baseConfigurationReference = 73CC36396FA8D5DB03C34C3009DBE5A1 /* UMCCommon.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -2294,7 +3179,7 @@ }; 65175E750F9EBF6DB95E3BFA342FD1EA /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = D991275587332C3DC6F5543A13528CED /* YYModel.release.xcconfig */; baseConfigurationReference = 81B59BBD2CC1A1AC412D8AFBADAC876B /* YYModel.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2323,9 +3208,40 @@ }; name = Release; }; 6C48F7C246EDDF539AD114B1F4815EB7 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = D2852C259BBD4C618B14A423AB352290 /* ReactiveCocoa.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/ReactiveCocoa/ReactiveCocoa-prefix.pch"; INFOPLIST_FILE = "Target Support Files/ReactiveCocoa/ReactiveCocoa-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/ReactiveCocoa/ReactiveCocoa.modulemap"; PRODUCT_MODULE_NAME = ReactiveCocoa; PRODUCT_NAME = ReactiveCocoa; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; 6ED57EC6B3C5EF40DA5463348AA87A00 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 019EC0F5541FE58CA6A668CA8E90E0BE /* SDAutoLayout.release.xcconfig */; baseConfigurationReference = A6732C57D0B32E5F29B65FCA3D321A75 /* SDAutoLayout.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2356,7 +3272,7 @@ }; 7E688DFE999385AC21BF781CDC4BBCB0 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = A2FD65B3495B0AD2D2D16197F3D9075A /* AFNetworking.release.xcconfig */; baseConfigurationReference = BD8BBC1C5104B25A56D54DDB0AA3D3B3 /* AFNetworking.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2387,7 +3303,7 @@ }; 8D99FE2CA257BE4B65C10DB77E7ABE1A /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = F8623FC9861C8ABEBE1730FC61A1111F /* YYImage.release.xcconfig */; baseConfigurationReference = 850D980D60C28982D957F335E4A73398 /* YYImage.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2416,9 +3332,42 @@ }; name = Release; }; 917B528C031924B4AD5F35784F2A2997 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7BA7BEF589982FD9C8B376EA994796DE /* Pods-BuWanVideo2.0.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; 958F41B792A69E986C72E6915B52FCCC /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = AE035C5592517EF0C4EC5D5F6316EE0D /* YYWebImage.debug.xcconfig */; baseConfigurationReference = 3B78F214085A80BF38BCE51C0B157944 /* YYWebImage.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2448,7 +3397,7 @@ }; 9FB93EDA5C47372550BF6F21599F8582 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 4ACA87A555BA903C17DE1C8766674ECA /* YYImage.debug.xcconfig */; baseConfigurationReference = F145567818BE29467A94C45F66EC21D8 /* YYImage.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2476,9 +3425,43 @@ }; name = Debug; }; A2509F8FB4AEEC84B62686834A56B8E1 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = BF74743C7A7A330AC3A1799C8DAE8332 /* Pods-BuWanVideo2.0.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; A7C58B22381068D2332BDADE8ACE88F0 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 4600196AA2978695F863C06E8FA7A756 /* YYCache.release.xcconfig */; baseConfigurationReference = 1C33A481313DE8A7C2FA5FA4102EE0DE /* YYCache.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2509,7 +3492,7 @@ }; B849CC5F92FCF52405DC94008BA6BA6F /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 1538EA8172164A02CB89A3BCA93D91E1 /* UMCCommon.release.xcconfig */; baseConfigurationReference = 60C1ECC2C08E5012A14278B450F0EF18 /* UMCCommon.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -2524,7 +3507,7 @@ }; BB8A92E1706E027197AAD12021E99C37 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = A6D1D2633FCA2C2E14D4DCE781C73340 /* IQKeyboardManager.debug.xcconfig */; baseConfigurationReference = 375A61D91780F8AF0EBFC0EEEBC55309 /* IQKeyboardManager.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2543,6 +3526,36 @@ MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; PRODUCT_MODULE_NAME = IQKeyboardManager; PRODUCT_NAME = IQKeyboardManager; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; BEDDDF5686472C2B2EE595C5E1034D8A /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F54A53A0CD8AD77A8F377AC93608438D /* ReactiveCocoa.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/ReactiveCocoa/ReactiveCocoa-prefix.pch"; INFOPLIST_FILE = "Target Support Files/ReactiveCocoa/ReactiveCocoa-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/ReactiveCocoa/ReactiveCocoa.modulemap"; PRODUCT_MODULE_NAME = ReactiveCocoa; PRODUCT_NAME = ReactiveCocoa; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -2618,76 +3631,9 @@ }; name = Debug; }; E38C12B01A34663D5A5A7C1E1CC5DD89 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = BF74743C7A7A330AC3A1799C8DAE8332 /* Pods-BuWanVideo2.0.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; E4D706C07034B41F27D8775A84846C7F /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7BA7BEF589982FD9C8B376EA994796DE /* Pods-BuWanVideo2.0.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; EBDAB536D8F4CDC1F80C7C6E3DC8BC97 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 1E2C2F03B2242AE5D58CC619ABB1933E /* SDAutoLayout.debug.xcconfig */; baseConfigurationReference = 4BEC12E61DF0F1EADC1216142661F863 /* SDAutoLayout.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2779,7 +3725,7 @@ }; F806DBC5F662DDA3B2B3A5D129A0906B /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 30F94E2C298157954AAB33D5AF87FD1A /* YYWebImage.release.xcconfig */; baseConfigurationReference = FC152C434115D656719FE2ABE32E5ABB /* YYWebImage.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2892,11 +3838,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 9DC28FA5F3E8F258C30D19CAC9A74AE6 /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */ = { A306AAA1A2C247285DD2A7973840843A /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */ = { isa = XCConfigurationList; buildConfigurations = ( E4D706C07034B41F27D8775A84846C7F /* Debug */, E38C12B01A34663D5A5A7C1E1CC5DD89 /* Release */, 917B528C031924B4AD5F35784F2A2997 /* Debug */, A2509F8FB4AEEC84B62686834A56B8E1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2910,6 +3856,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; E99E56B9296D32CB36D7FBE35E014198 /* Build configuration list for PBXNativeTarget "ReactiveCocoa" */ = { isa = XCConfigurationList; buildConfigurations = ( BEDDDF5686472C2B2EE595C5E1034D8A /* Debug */, 6C48F7C246EDDF539AD114B1F4815EB7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; F04C2EBACD8DF33710906EF20C3EE78E /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { isa = XCConfigurationList; buildConfigurations = ( Pods/Pods.xcodeproj/xcuserdata/aeline.xcuserdatad/xcschemes/ReactiveCocoa.xcscheme
New file @@ -0,0 +1,60 @@ <?xml version="1.0" encoding="UTF-8"?> <Scheme LastUpgradeVersion = "1100" version = "1.3"> <BuildAction parallelizeBuildables = "YES" buildImplicitDependencies = "YES"> <BuildActionEntries> <BuildActionEntry buildForAnalyzing = "YES" buildForTesting = "YES" buildForRunning = "YES" buildForProfiling = "YES" buildForArchiving = "YES"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "07B5C6907D09E767CDC5954A9468CA2E" BuildableName = "ReactiveCocoa.framework" BlueprintName = "ReactiveCocoa" ReferencedContainer = "container:Pods.xcodeproj"> </BuildableReference> </BuildActionEntry> </BuildActionEntries> </BuildAction> <TestAction selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" buildConfiguration = "Debug"> <AdditionalOptions> </AdditionalOptions> </TestAction> <LaunchAction selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" buildConfiguration = "Debug" allowLocationSimulation = "YES"> <AdditionalOptions> </AdditionalOptions> </LaunchAction> <ProfileAction savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES" buildConfiguration = "Release" shouldUseLaunchSchemeArgsEnv = "YES"> </ProfileAction> <AnalyzeAction buildConfiguration = "Debug"> </AnalyzeAction> <ArchiveAction buildConfiguration = "Release" revealArchiveInOrganizer = "YES"> </ArchiveAction> </Scheme> Pods/Pods.xcodeproj/xcuserdata/aeline.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -19,6 +19,11 @@ <key>isShown</key> <false/> </dict> <key>ReactiveCocoa.xcscheme</key> <dict> <key>isShown</key> <false/> </dict> <key>SDAutoLayout.xcscheme</key> <dict> <key>isShown</key> Pods/ReactiveCocoa/LICENSE.md
New file @@ -0,0 +1,19 @@ **Copyright (c) 2012 - 2015, GitHub, Inc.** **All rights reserved.** Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Pods/ReactiveCocoa/README.md
New file @@ -0,0 +1,553 @@ # ReactiveCocoa [](https://github.com/Carthage/Carthage) ReactiveCocoa (RAC) is an Objective-C framework inspired by [Functional Reactive Programming][]. It provides APIs for **composing and transforming streams of values**. If you're already familiar with functional reactive programming or know the basic premise of ReactiveCocoa, check out the [Documentation][] folder for a framework overview and more in-depth information about how it all works in practice. ## New to ReactiveCocoa? ReactiveCocoa is documented like crazy, and there's a wealth of introductory material available to explain what RAC is and how you can use it. If you want to learn more, we recommend these resources, roughly in order: 1. [Introduction](#introduction) 1. [When to use ReactiveCocoa](#when-to-use-reactivecocoa) 1. [Framework Overview][] 1. [Basic Operators][] 1. [Header documentation](ReactiveCocoa) 1. Previously answered [Stack Overflow](https://github.com/ReactiveCocoa/ReactiveCocoa/wiki) questions and [GitHub issues](https://github.com/ReactiveCocoa/ReactiveCocoa/issues?labels=question&state=closed) 1. The rest of the [Documentation][] folder 1. [Functional Reactive Programming on iOS](https://leanpub.com/iosfrp/) (eBook) If you have any further questions, please feel free to [file an issue](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/new). ## Introduction ReactiveCocoa is inspired by [functional reactive programming](http://blog.maybeapps.com/post/42894317939/input-and-output). Rather than using mutable variables which are replaced and modified in-place, RAC provides signals (represented by `RACSignal`) that capture present and future values. By chaining, combining, and reacting to signals, software can be written declaratively, without the need for code that continually observes and updates values. For example, a text field can be bound to the latest time, even as it changes, instead of using additional code that watches the clock and updates the text field every second. It works much like KVO, but with blocks instead of overriding `-observeValueForKeyPath:ofObject:change:context:`. Signals can also represent asynchronous operations, much like [futures and promises][]. This greatly simplifies asynchronous software, including networking code. One of the major advantages of RAC is that it provides a single, unified approach to dealing with asynchronous behaviors, including delegate methods, callback blocks, target-action mechanisms, notifications, and KVO. Here's a simple example: ```objc // When self.username changes, logs the new name to the console. // // RACObserve(self, username) creates a new RACSignal that sends the current // value of self.username, then the new value whenever it changes. // -subscribeNext: will execute the block whenever the signal sends a value. [RACObserve(self, username) subscribeNext:^(NSString *newName) { NSLog(@"%@", newName); }]; ``` But unlike KVO notifications, signals can be chained together and operated on: ```objc // Only logs names that starts with "j". // // -filter returns a new RACSignal that only sends a new value when its block // returns YES. [[RACObserve(self, username) filter:^(NSString *newName) { return [newName hasPrefix:@"j"]; }] subscribeNext:^(NSString *newName) { NSLog(@"%@", newName); }]; ``` Signals can also be used to derive state. Instead of observing properties and setting other properties in response to the new values, RAC makes it possible to express properties in terms of signals and operations: ```objc // Creates a one-way binding so that self.createEnabled will be // true whenever self.password and self.passwordConfirmation // are equal. // // RAC() is a macro that makes the binding look nicer. // // +combineLatest:reduce: takes an array of signals, executes the block with the // latest value from each signal whenever any of them changes, and returns a new // RACSignal that sends the return value of that block as values. RAC(self, createEnabled) = [RACSignal combineLatest:@[ RACObserve(self, password), RACObserve(self, passwordConfirmation) ] reduce:^(NSString *password, NSString *passwordConfirm) { return @([passwordConfirm isEqualToString:password]); }]; ``` Signals can be built on any stream of values over time, not just KVO. For example, they can also represent button presses: ```objc // Logs a message whenever the button is pressed. // // RACCommand creates signals to represent UI actions. Each signal can // represent a button press, for example, and have additional work associated // with it. // // -rac_command is an addition to NSButton. The button will send itself on that // command whenever it's pressed. self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) { NSLog(@"button was pressed!"); return [RACSignal empty]; }]; ``` Or asynchronous network operations: ```objc // Hooks up a "Log in" button to log in over the network. // // This block will be run whenever the login command is executed, starting // the login process. self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) { // The hypothetical -logIn method returns a signal that sends a value when // the network request finishes. return [client logIn]; }]; // -executionSignals returns a signal that includes the signals returned from // the above block, one for each time the command is executed. [self.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) { // Log a message whenever we log in successfully. [loginSignal subscribeCompleted:^{ NSLog(@"Logged in successfully!"); }]; }]; // Executes the login command when the button is pressed. self.loginButton.rac_command = self.loginCommand; ``` Signals can also represent timers, other UI events, or anything else that changes over time. Using signals for asynchronous operations makes it possible to build up more complex behavior by chaining and transforming those signals. Work can easily be triggered after a group of operations completes: ```objc // Performs 2 network operations and logs a message to the console when they are // both completed. // // +merge: takes an array of signals and returns a new RACSignal that passes // through the values of all of the signals and completes when all of the // signals complete. // // -subscribeCompleted: will execute the block when the signal completes. [[RACSignal merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]] subscribeCompleted:^{ NSLog(@"They're both done!"); }]; ``` Signals can be chained to sequentially execute asynchronous operations, instead of nesting callbacks with blocks. This is similar to how [futures and promises][] are usually used: ```objc // Logs in the user, then loads any cached messages, then fetches the remaining // messages from the server. After that's all done, logs a message to the // console. // // The hypothetical -logInUser methods returns a signal that completes after // logging in. // // -flattenMap: will execute its block whenever the signal sends a value, and // returns a new RACSignal that merges all of the signals returned from the block // into a single signal. [[[[client logInUser] flattenMap:^(User *user) { // Return a signal that loads cached messages for the user. return [client loadCachedMessagesForUser:user]; }] flattenMap:^(NSArray *messages) { // Return a signal that fetches any remaining messages. return [client fetchMessagesAfterMessage:messages.lastObject]; }] subscribeNext:^(NSArray *newMessages) { NSLog(@"New messages: %@", newMessages); } completed:^{ NSLog(@"Fetched all messages."); }]; ``` RAC even makes it easy to bind to the result of an asynchronous operation: ```objc // Creates a one-way binding so that self.imageView.image will be set as the user's // avatar as soon as it's downloaded. // // The hypothetical -fetchUserWithUsername: method returns a signal which sends // the user. // // -deliverOn: creates new signals that will do their work on other queues. In // this example, it's used to move work to a background queue and then back to the main thread. // // -map: calls its block with each user that's fetched and returns a new // RACSignal that sends values returned from the block. RAC(self.imageView, image) = [[[[client fetchUserWithUsername:@"joshaber"] deliverOn:[RACScheduler scheduler]] map:^(User *user) { // Download the avatar (this is done on a background queue). return [[NSImage alloc] initWithContentsOfURL:user.avatarURL]; }] // Now the assignment will be done on the main thread. deliverOn:RACScheduler.mainThreadScheduler]; ``` That demonstrates some of what RAC can do, but it doesn't demonstrate why RAC is so powerful. It's hard to appreciate RAC from README-sized examples, but it makes it possible to write code with less state, less boilerplate, better code locality, and better expression of intent. For more sample code, check out [C-41][] or [GroceryList][], which are real iOS apps written using ReactiveCocoa. Additional information about RAC can be found in the [Documentation][] folder. ## When to use ReactiveCocoa Upon first glance, ReactiveCocoa is very abstract, and it can be difficult to understand how to apply it to concrete problems. Here are some of the use cases that RAC excels at. ### Handling asynchronous or event-driven data sources Much of Cocoa programming is focused on reacting to user events or changes in application state. Code that deals with such events can quickly become very complex and spaghetti-like, with lots of callbacks and state variables to handle ordering issues. Patterns that seem superficially different, like UI callbacks, network responses, and KVO notifications, actually have a lot in common. [RACSignal][] unifies all these different APIs so that they can be composed together and manipulated in the same way. For example, the following code: ```objc static void *ObservationContext = &ObservationContext; - (void)viewDidLoad { [super viewDidLoad]; [LoginManager.sharedManager addObserver:self forKeyPath:@"loggingIn" options:NSKeyValueObservingOptionInitial context:&ObservationContext]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(loggedOut:) name:UserDidLogOutNotification object:LoginManager.sharedManager]; [self.usernameTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged]; [self.passwordTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged]; [self.logInButton addTarget:self action:@selector(logInPressed:) forControlEvents:UIControlEventTouchUpInside]; } - (void)dealloc { [LoginManager.sharedManager removeObserver:self forKeyPath:@"loggingIn" context:ObservationContext]; [NSNotificationCenter.defaultCenter removeObserver:self]; } - (void)updateLogInButton { BOOL textFieldsNonEmpty = self.usernameTextField.text.length > 0 && self.passwordTextField.text.length > 0; BOOL readyToLogIn = !LoginManager.sharedManager.isLoggingIn && !self.loggedIn; self.logInButton.enabled = textFieldsNonEmpty && readyToLogIn; } - (IBAction)logInPressed:(UIButton *)sender { [[LoginManager sharedManager] logInWithUsername:self.usernameTextField.text password:self.passwordTextField.text success:^{ self.loggedIn = YES; } failure:^(NSError *error) { [self presentError:error]; }]; } - (void)loggedOut:(NSNotification *)notification { self.loggedIn = NO; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == ObservationContext) { [self updateLogInButton]; } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } ``` … could be expressed in RAC like so: ```objc - (void)viewDidLoad { [super viewDidLoad]; @weakify(self); RAC(self.logInButton, enabled) = [RACSignal combineLatest:@[ self.usernameTextField.rac_textSignal, self.passwordTextField.rac_textSignal, RACObserve(LoginManager.sharedManager, loggingIn), RACObserve(self, loggedIn) ] reduce:^(NSString *username, NSString *password, NSNumber *loggingIn, NSNumber *loggedIn) { return @(username.length > 0 && password.length > 0 && !loggingIn.boolValue && !loggedIn.boolValue); }]; [[self.logInButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *sender) { @strongify(self); RACSignal *loginSignal = [LoginManager.sharedManager logInWithUsername:self.usernameTextField.text password:self.passwordTextField.text]; [loginSignal subscribeError:^(NSError *error) { @strongify(self); [self presentError:error]; } completed:^{ @strongify(self); self.loggedIn = YES; }]; }]; RAC(self, loggedIn) = [[NSNotificationCenter.defaultCenter rac_addObserverForName:UserDidLogOutNotification object:nil] mapReplace:@NO]; } ``` ### Chaining dependent operations Dependencies are most often found in network requests, where a previous request to the server needs to complete before the next one can be constructed, and so on: ```objc [client logInWithSuccess:^{ [client loadCachedMessagesWithSuccess:^(NSArray *messages) { [client fetchMessagesAfterMessage:messages.lastObject success:^(NSArray *nextMessages) { NSLog(@"Fetched all messages."); } failure:^(NSError *error) { [self presentError:error]; }]; } failure:^(NSError *error) { [self presentError:error]; }]; } failure:^(NSError *error) { [self presentError:error]; }]; ``` ReactiveCocoa makes this pattern particularly easy: ```objc [[[[client logIn] then:^{ return [client loadCachedMessages]; }] flattenMap:^(NSArray *messages) { return [client fetchMessagesAfterMessage:messages.lastObject]; }] subscribeError:^(NSError *error) { [self presentError:error]; } completed:^{ NSLog(@"Fetched all messages."); }]; ``` ### Parallelizing independent work Working with independent data sets in parallel and then combining them into a final result is non-trivial in Cocoa, and often involves a lot of synchronization: ```objc __block NSArray *databaseObjects; __block NSArray *fileContents; NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init]; NSBlockOperation *databaseOperation = [NSBlockOperation blockOperationWithBlock:^{ databaseObjects = [databaseClient fetchObjectsMatchingPredicate:predicate]; }]; NSBlockOperation *filesOperation = [NSBlockOperation blockOperationWithBlock:^{ NSMutableArray *filesInProgress = [NSMutableArray array]; for (NSString *path in files) { [filesInProgress addObject:[NSData dataWithContentsOfFile:path]]; } fileContents = [filesInProgress copy]; }]; NSBlockOperation *finishOperation = [NSBlockOperation blockOperationWithBlock:^{ [self finishProcessingDatabaseObjects:databaseObjects fileContents:fileContents]; NSLog(@"Done processing"); }]; [finishOperation addDependency:databaseOperation]; [finishOperation addDependency:filesOperation]; [backgroundQueue addOperation:databaseOperation]; [backgroundQueue addOperation:filesOperation]; [backgroundQueue addOperation:finishOperation]; ``` The above code can be cleaned up and optimized by simply composing signals: ```objc RACSignal *databaseSignal = [[databaseClient fetchObjectsMatchingPredicate:predicate] subscribeOn:[RACScheduler scheduler]]; RACSignal *fileSignal = [RACSignal startEagerlyWithScheduler:[RACScheduler scheduler] block:^(id<RACSubscriber> subscriber) { NSMutableArray *filesInProgress = [NSMutableArray array]; for (NSString *path in files) { [filesInProgress addObject:[NSData dataWithContentsOfFile:path]]; } [subscriber sendNext:[filesInProgress copy]]; [subscriber sendCompleted]; }]; [[RACSignal combineLatest:@[ databaseSignal, fileSignal ] reduce:^ id (NSArray *databaseObjects, NSArray *fileContents) { [self finishProcessingDatabaseObjects:databaseObjects fileContents:fileContents]; return nil; }] subscribeCompleted:^{ NSLog(@"Done processing"); }]; ``` ### Simplifying collection transformations Higher-order functions like `map`, `filter`, `fold`/`reduce` are sorely missing from Foundation, leading to loop-focused code like this: ```objc NSMutableArray *results = [NSMutableArray array]; for (NSString *str in strings) { if (str.length < 2) { continue; } NSString *newString = [str stringByAppendingString:@"foobar"]; [results addObject:newString]; } ``` [RACSequence][] allows any Cocoa collection to be manipulated in a uniform and declarative way: ```objc RACSequence *results = [[strings.rac_sequence filter:^ BOOL (NSString *str) { return str.length >= 2; }] map:^(NSString *str) { return [str stringByAppendingString:@"foobar"]; }]; ``` ## System Requirements ReactiveCocoa supports OS X 10.8+ and iOS 8.0+. ## Importing ReactiveCocoa To add RAC to your application: 1. Add the ReactiveCocoa repository as a submodule of your application's repository. 1. Run `script/bootstrap` from within the ReactiveCocoa folder. 1. Drag and drop `ReactiveCocoa.xcodeproj` into your application's Xcode project or workspace. 1. On the "Build Phases" tab of your application target, add RAC to the "Link Binary With Libraries" phase. * **On iOS**, add `libReactiveCocoa-iOS.a`. * **On OS X**, add `ReactiveCocoa.framework`. RAC must also be added to any "Copy Frameworks" build phase. If you don't already have one, simply add a "Copy Files" build phase and target the "Frameworks" destination. 1. Add `"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include" $(inherited)` to the "Header Search Paths" build setting (this is only necessary for archive builds, but it has no negative effect otherwise). 1. **For iOS targets**, add `-ObjC` to the "Other Linker Flags" build setting. 1. **If you added RAC to a project (not a workspace)**, you will also need to add the appropriate RAC target to the "Target Dependencies" of your application. If you would prefer to use [CocoaPods](http://cocoapods.org), there are some [ReactiveCocoa podspecs](https://github.com/CocoaPods/Specs/tree/master/Specs/ReactiveCocoa) that have been generously contributed by third parties. To see a project already set up with RAC, check out [C-41][] or [GroceryList][], which are real iOS apps written using ReactiveCocoa. ## Standalone Development If you’re working on RAC in isolation instead of integrating it into another project, you’ll want to open `ReactiveCocoa.xcworkspace` and not the `.xcodeproj`. ## More Info ReactiveCocoa is based on .NET's [Reactive Extensions](http://msdn.microsoft.com/en-us/data/gg577609) (Rx). Most of the principles of Rx apply to RAC as well. There are some really good Rx resources out there: * [Reactive Extensions MSDN entry](http://msdn.microsoft.com/en-us/library/hh242985.aspx) * [Reactive Extensions for .NET Introduction](http://leecampbell.blogspot.com/2010/08/reactive-extensions-for-net.html) * [Rx - Channel 9 videos](http://channel9.msdn.com/tags/Rx/) * [Reactive Extensions wiki](http://rxwiki.wikidot.com/) * [101 Rx Samples](http://rxwiki.wikidot.com/101samples) * [Programming Reactive Extensions and LINQ](http://www.amazon.com/Programming-Reactive-Extensions-Jesse-Liberty/dp/1430237473) RAC and Rx are both frameworks inspired by functional reactive programming. Here are some resources related to FRP: * [What is FRP? - Elm Language](http://elm-lang.org/learn/What-is-FRP.elm) * [What is Functional Reactive Programming - Stack Overflow](http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming/1030631#1030631) * [Specification for a Functional Reactive Language - Stack Overflow](http://stackoverflow.com/questions/5875929/specification-for-a-functional-reactive-programming-language#5878525) * [Escape from Callback Hell](http://elm-lang.org/learn/Escape-from-Callback-Hell.elm) * [Principles of Reactive Programming on Coursera](https://www.coursera.org/course/reactive) [Basic Operators]: Documentation/BasicOperators.md [Documentation]: Documentation [Framework Overview]: Documentation/FrameworkOverview.md [Functional Reactive Programming]: http://en.wikipedia.org/wiki/Functional_reactive_programming [GroceryList]: https://github.com/jspahrsummers/GroceryList [RACSequence]: ReactiveCocoa/RACSequence.h [RACSignal]: ReactiveCocoa/RACSignal.h [futures and promises]: http://en.wikipedia.org/wiki/Futures_and_promises [C-41]: https://github.com/AshFurrow/C-41 Pods/ReactiveCocoa/ReactiveCocoa/MKAnnotationView+RACSignalSupport.h
New file @@ -0,0 +1,29 @@ // // MKAnnotationView+RACSignalSupport.h // ReactiveCocoa // // Created by Zak Remer on 3/31/15. // Copyright (c) 2015 GitHub. All rights reserved. // #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> @class RACSignal; @interface MKAnnotationView (RACSignalSupport) /// A signal which will send a RACUnit whenever -prepareForReuse is invoked upon /// the receiver. /// /// Examples /// /// [[[self.cancelButton /// rac_signalForControlEvents:UIControlEventTouchUpInside] /// takeUntil:self.rac_prepareForReuseSignal] /// subscribeNext:^(UIButton *x) { /// // do other things /// }]; @property (nonatomic, strong, readonly) RACSignal *rac_prepareForReuseSignal; @end Pods/ReactiveCocoa/ReactiveCocoa/MKAnnotationView+RACSignalSupport.m
New file @@ -0,0 +1,31 @@ // // MKAnnotationView+RACSignalSupport.m // ReactiveCocoa // // Created by Zak Remer on 3/31/15. // Copyright (c) 2015 GitHub. All rights reserved. // #import "MKAnnotationView+RACSignalSupport.h" #import "NSObject+RACDescription.h" #import "NSObject+RACSelectorSignal.h" #import "RACSignal+Operations.h" #import "RACUnit.h" #import <objc/runtime.h> @implementation MKAnnotationView (RACSignalSupport) - (RACSignal *)rac_prepareForReuseSignal { RACSignal *signal = objc_getAssociatedObject(self, _cmd); if (signal != nil) return signal; signal = [[[self rac_signalForSelector:@selector(prepareForReuse)] mapReplace:RACUnit.defaultUnit] setNameWithFormat:@"%@ -rac_prepareForReuseSignal", self.rac_description]; objc_setAssociatedObject(self, _cmd, signal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return signal; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSArray+RACSequenceAdditions.h
New file @@ -0,0 +1,20 @@ // // NSArray+RACSequenceAdditions.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSArray (RACSequenceAdditions) /// Creates and returns a sequence corresponding to the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSArray+RACSequenceAdditions.m
New file @@ -0,0 +1,18 @@ // // NSArray+RACSequenceAdditions.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSArray+RACSequenceAdditions.h" #import "RACArraySequence.h" @implementation NSArray (RACSequenceAdditions) - (RACSequence *)rac_sequence { return [RACArraySequence sequenceWithArray:self offset:0]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSData+RACSupport.h
New file @@ -0,0 +1,22 @@ // // NSData+RACSupport.h // ReactiveCocoa // // Created by Josh Abernathy on 5/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACScheduler; @class RACSignal; @interface NSData (RACSupport) // Read the data at the URL using -[NSData initWithContentsOfURL:options:error:]. // Sends the data or the error. // // scheduler - cannot be nil. + (RACSignal *)rac_readContentsOfURL:(NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler; @end Pods/ReactiveCocoa/ReactiveCocoa/NSData+RACSupport.m
New file @@ -0,0 +1,35 @@ // // NSData+RACSupport.m // ReactiveCocoa // // Created by Josh Abernathy on 5/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "NSData+RACSupport.h" #import "RACReplaySubject.h" #import "RACScheduler.h" @implementation NSData (RACSupport) + (RACSignal *)rac_readContentsOfURL:(NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler { NSCParameterAssert(scheduler != nil); RACReplaySubject *subject = [RACReplaySubject subject]; [subject setNameWithFormat:@"+rac_readContentsOfURL: %@ options: %lu scheduler: %@", URL, (unsigned long)options, scheduler]; [scheduler schedule:^{ NSError *error = nil; NSData *data = [[NSData alloc] initWithContentsOfURL:URL options:options error:&error]; if (data == nil) { [subject sendError:error]; } else { [subject sendNext:data]; [subject sendCompleted]; } }]; return subject; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSDictionary+RACSequenceAdditions.h
New file @@ -0,0 +1,31 @@ // // NSDictionary+RACSequenceAdditions.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSDictionary (RACSequenceAdditions) /// Creates and returns a sequence of RACTuple key/value pairs. The key will be /// the first element in the tuple, and the value will be the second. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; /// Creates and returns a sequence corresponding to the keys in the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_keySequence; /// Creates and returns a sequence corresponding to the values in the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_valueSequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSDictionary+RACSequenceAdditions.m
New file @@ -0,0 +1,34 @@ // // NSDictionary+RACSequenceAdditions.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSDictionary+RACSequenceAdditions.h" #import "NSArray+RACSequenceAdditions.h" #import "RACSequence.h" #import "RACTuple.h" @implementation NSDictionary (RACSequenceAdditions) - (RACSequence *)rac_sequence { NSDictionary *immutableDict = [self copy]; // TODO: First class support for dictionary sequences. return [immutableDict.allKeys.rac_sequence map:^(id key) { id value = immutableDict[key]; return RACTuplePack(key, value); }]; } - (RACSequence *)rac_keySequence { return self.allKeys.rac_sequence; } - (RACSequence *)rac_valueSequence { return self.allValues.rac_sequence; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSEnumerator+RACSequenceAdditions.h
New file @@ -0,0 +1,20 @@ // // NSEnumerator+RACSequenceAdditions.h // ReactiveCocoa // // Created by Uri Baghin on 07/01/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSEnumerator (RACSequenceAdditions) /// Creates and returns a sequence corresponding to the receiver. /// /// The receiver is exhausted lazily as the sequence is enumerated. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSEnumerator+RACSequenceAdditions.m
New file @@ -0,0 +1,22 @@ // // NSEnumerator+RACSequenceAdditions.m // ReactiveCocoa // // Created by Uri Baghin on 07/01/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSEnumerator+RACSequenceAdditions.h" #import "RACSequence.h" @implementation NSEnumerator (RACSequenceAdditions) - (RACSequence *)rac_sequence { return [RACSequence sequenceWithHeadBlock:^{ return [self nextObject]; } tailBlock:^{ return self.rac_sequence; }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSFileHandle+RACSupport.h
New file @@ -0,0 +1,19 @@ // // NSFileHandle+RACSupport.h // ReactiveCocoa // // Created by Josh Abernathy on 5/10/12. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; @interface NSFileHandle (RACSupport) // Read any available data in the background and send it. Completes when data // length is <= 0. - (RACSignal *)rac_readInBackground; @end Pods/ReactiveCocoa/ReactiveCocoa/NSFileHandle+RACSupport.m
New file @@ -0,0 +1,40 @@ // // NSFileHandle+RACSupport.m // ReactiveCocoa // // Created by Josh Abernathy on 5/10/12. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSFileHandle+RACSupport.h" #import "NSNotificationCenter+RACSupport.h" #import "NSObject+RACDescription.h" #import "RACReplaySubject.h" #import "RACDisposable.h" @implementation NSFileHandle (RACSupport) - (RACSignal *)rac_readInBackground { RACReplaySubject *subject = [RACReplaySubject subject]; [subject setNameWithFormat:@"%@ -rac_readInBackground", self.rac_description]; RACSignal *dataNotification = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:NSFileHandleReadCompletionNotification object:self] map:^(NSNotification *note) { return note.userInfo[NSFileHandleNotificationDataItem]; }]; __block RACDisposable *subscription = [dataNotification subscribeNext:^(NSData *data) { if (data.length > 0) { [subject sendNext:data]; [self readInBackgroundAndNotify]; } else { [subject sendCompleted]; [subscription dispose]; } }]; [self readInBackgroundAndNotify]; return subject; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSIndexSet+RACSequenceAdditions.h
New file @@ -0,0 +1,21 @@ // // NSIndexSet+RACSequenceAdditions.h // ReactiveCocoa // // Created by Sergey Gavrilyuk on 12/17/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSIndexSet (RACSequenceAdditions) /// Creates and returns a sequence of indexes (as `NSNumber`s) corresponding to /// the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSIndexSet+RACSequenceAdditions.m
New file @@ -0,0 +1,18 @@ // // NSIndexSet+RACSequenceAdditions.m // ReactiveCocoa // // Created by Sergey Gavrilyuk on 12/17/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSIndexSet+RACSequenceAdditions.h" #import "RACIndexSetSequence.h" @implementation NSIndexSet (RACSequenceAdditions) - (RACSequence *)rac_sequence { return [RACIndexSetSequence sequenceWithIndexSet:self]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSInvocation+RACTypeParsing.h
New file @@ -0,0 +1,56 @@ // // NSInvocation+RACTypeParsing.h // ReactiveCocoa // // Created by Josh Abernathy on 11/17/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACTuple; // A private category of methods to handle wrapping and unwrapping of values. @interface NSInvocation (RACTypeParsing) // Sets the argument for the invocation at the given index by unboxing the given // object based on the type signature of the argument. // // This does not support C arrays or unions. // // Note that calling this on a char * or const char * argument can cause all // arguments to be retained. // // object - The object to unbox and set as the argument. // index - The index of the argument to set. - (void)rac_setArgument:(id)object atIndex:(NSUInteger)index; // Gets the argument for the invocation at the given index based on the // invocation's method signature. The value is then wrapped in the appropriate // object type. // // This does not support C arrays or unions. // // index - The index of the argument to get. // // Returns the argument of the invocation, wrapped in an object. - (id)rac_argumentAtIndex:(NSUInteger)index; // Arguments tuple for the invocation. // // The arguments tuple excludes implicit variables `self` and `_cmd`. // // See -rac_argumentAtIndex: and -rac_setArgumentAtIndex: for further // description of the underlying behavior. @property (nonatomic, copy) RACTuple *rac_argumentsTuple; // Gets the return value from the invocation based on the invocation's method // signature. The value is then wrapped in the appropriate object type. // // This does not support C arrays or unions. // // Returns the return value of the invocation, wrapped in an object. Voids are // returned as `RACUnit.defaultUnit`. - (id)rac_returnValue; @end Pods/ReactiveCocoa/ReactiveCocoa/NSInvocation+RACTypeParsing.m
New file @@ -0,0 +1,232 @@ // // NSInvocation+RACTypeParsing.m // ReactiveCocoa // // Created by Josh Abernathy on 11/17/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "NSInvocation+RACTypeParsing.h" #import "RACTuple.h" #import "RACUnit.h" #import <CoreGraphics/CoreGraphics.h> @implementation NSInvocation (RACTypeParsing) - (void)rac_setArgument:(id)object atIndex:(NSUInteger)index { #define PULL_AND_SET(type, selector) \ do { \ type val = [object selector]; \ [self setArgument:&val atIndex:(NSInteger)index]; \ } while (0) const char *argType = [self.methodSignature getArgumentTypeAtIndex:index]; // Skip const type qualifier. if (argType[0] == 'r') { argType++; } if (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) { [self setArgument:&object atIndex:(NSInteger)index]; } else if (strcmp(argType, @encode(char)) == 0) { PULL_AND_SET(char, charValue); } else if (strcmp(argType, @encode(int)) == 0) { PULL_AND_SET(int, intValue); } else if (strcmp(argType, @encode(short)) == 0) { PULL_AND_SET(short, shortValue); } else if (strcmp(argType, @encode(long)) == 0) { PULL_AND_SET(long, longValue); } else if (strcmp(argType, @encode(long long)) == 0) { PULL_AND_SET(long long, longLongValue); } else if (strcmp(argType, @encode(unsigned char)) == 0) { PULL_AND_SET(unsigned char, unsignedCharValue); } else if (strcmp(argType, @encode(unsigned int)) == 0) { PULL_AND_SET(unsigned int, unsignedIntValue); } else if (strcmp(argType, @encode(unsigned short)) == 0) { PULL_AND_SET(unsigned short, unsignedShortValue); } else if (strcmp(argType, @encode(unsigned long)) == 0) { PULL_AND_SET(unsigned long, unsignedLongValue); } else if (strcmp(argType, @encode(unsigned long long)) == 0) { PULL_AND_SET(unsigned long long, unsignedLongLongValue); } else if (strcmp(argType, @encode(float)) == 0) { PULL_AND_SET(float, floatValue); } else if (strcmp(argType, @encode(double)) == 0) { PULL_AND_SET(double, doubleValue); } else if (strcmp(argType, @encode(BOOL)) == 0) { PULL_AND_SET(BOOL, boolValue); } else if (strcmp(argType, @encode(char *)) == 0) { const char *cString = [object UTF8String]; [self setArgument:&cString atIndex:(NSInteger)index]; [self retainArguments]; } else if (strcmp(argType, @encode(void (^)(void))) == 0) { [self setArgument:&object atIndex:(NSInteger)index]; } else { NSCParameterAssert([object isKindOfClass:NSValue.class]); NSUInteger valueSize = 0; NSGetSizeAndAlignment([object objCType], &valueSize, NULL); #if DEBUG NSUInteger argSize = 0; NSGetSizeAndAlignment(argType, &argSize, NULL); NSCAssert(valueSize == argSize, @"Value size does not match argument size in -rac_setArgument: %@ atIndex: %lu", object, (unsigned long)index); #endif unsigned char valueBytes[valueSize]; [object getValue:valueBytes]; [self setArgument:valueBytes atIndex:(NSInteger)index]; } #undef PULL_AND_SET } - (id)rac_argumentAtIndex:(NSUInteger)index { #define WRAP_AND_RETURN(type) \ do { \ type val = 0; \ [self getArgument:&val atIndex:(NSInteger)index]; \ return @(val); \ } while (0) const char *argType = [self.methodSignature getArgumentTypeAtIndex:index]; // Skip const type qualifier. if (argType[0] == 'r') { argType++; } if (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) { __autoreleasing id returnObj; [self getArgument:&returnObj atIndex:(NSInteger)index]; return returnObj; } else if (strcmp(argType, @encode(char)) == 0) { WRAP_AND_RETURN(char); } else if (strcmp(argType, @encode(int)) == 0) { WRAP_AND_RETURN(int); } else if (strcmp(argType, @encode(short)) == 0) { WRAP_AND_RETURN(short); } else if (strcmp(argType, @encode(long)) == 0) { WRAP_AND_RETURN(long); } else if (strcmp(argType, @encode(long long)) == 0) { WRAP_AND_RETURN(long long); } else if (strcmp(argType, @encode(unsigned char)) == 0) { WRAP_AND_RETURN(unsigned char); } else if (strcmp(argType, @encode(unsigned int)) == 0) { WRAP_AND_RETURN(unsigned int); } else if (strcmp(argType, @encode(unsigned short)) == 0) { WRAP_AND_RETURN(unsigned short); } else if (strcmp(argType, @encode(unsigned long)) == 0) { WRAP_AND_RETURN(unsigned long); } else if (strcmp(argType, @encode(unsigned long long)) == 0) { WRAP_AND_RETURN(unsigned long long); } else if (strcmp(argType, @encode(float)) == 0) { WRAP_AND_RETURN(float); } else if (strcmp(argType, @encode(double)) == 0) { WRAP_AND_RETURN(double); } else if (strcmp(argType, @encode(BOOL)) == 0) { WRAP_AND_RETURN(BOOL); } else if (strcmp(argType, @encode(char *)) == 0) { WRAP_AND_RETURN(const char *); } else if (strcmp(argType, @encode(void (^)(void))) == 0) { __unsafe_unretained id block = nil; [self getArgument:&block atIndex:(NSInteger)index]; return [block copy]; } else { NSUInteger valueSize = 0; NSGetSizeAndAlignment(argType, &valueSize, NULL); unsigned char valueBytes[valueSize]; [self getArgument:valueBytes atIndex:(NSInteger)index]; return [NSValue valueWithBytes:valueBytes objCType:argType]; } return nil; #undef WRAP_AND_RETURN } - (RACTuple *)rac_argumentsTuple { NSUInteger numberOfArguments = self.methodSignature.numberOfArguments; NSMutableArray *argumentsArray = [NSMutableArray arrayWithCapacity:numberOfArguments - 2]; for (NSUInteger index = 2; index < numberOfArguments; index++) { [argumentsArray addObject:[self rac_argumentAtIndex:index] ?: RACTupleNil.tupleNil]; } return [RACTuple tupleWithObjectsFromArray:argumentsArray]; } - (void)setRac_argumentsTuple:(RACTuple *)arguments { NSCAssert(arguments.count == self.methodSignature.numberOfArguments - 2, @"Number of supplied arguments (%lu), does not match the number expected by the signature (%lu)", (unsigned long)arguments.count, (unsigned long)self.methodSignature.numberOfArguments - 2); NSUInteger index = 2; for (id arg in arguments) { [self rac_setArgument:(arg == RACTupleNil.tupleNil ? nil : arg) atIndex:index]; index++; } } - (id)rac_returnValue { #define WRAP_AND_RETURN(type) \ do { \ type val = 0; \ [self getReturnValue:&val]; \ return @(val); \ } while (0) const char *returnType = self.methodSignature.methodReturnType; // Skip const type qualifier. if (returnType[0] == 'r') { returnType++; } if (strcmp(returnType, @encode(id)) == 0 || strcmp(returnType, @encode(Class)) == 0 || strcmp(returnType, @encode(void (^)(void))) == 0) { __autoreleasing id returnObj; [self getReturnValue:&returnObj]; return returnObj; } else if (strcmp(returnType, @encode(char)) == 0) { WRAP_AND_RETURN(char); } else if (strcmp(returnType, @encode(int)) == 0) { WRAP_AND_RETURN(int); } else if (strcmp(returnType, @encode(short)) == 0) { WRAP_AND_RETURN(short); } else if (strcmp(returnType, @encode(long)) == 0) { WRAP_AND_RETURN(long); } else if (strcmp(returnType, @encode(long long)) == 0) { WRAP_AND_RETURN(long long); } else if (strcmp(returnType, @encode(unsigned char)) == 0) { WRAP_AND_RETURN(unsigned char); } else if (strcmp(returnType, @encode(unsigned int)) == 0) { WRAP_AND_RETURN(unsigned int); } else if (strcmp(returnType, @encode(unsigned short)) == 0) { WRAP_AND_RETURN(unsigned short); } else if (strcmp(returnType, @encode(unsigned long)) == 0) { WRAP_AND_RETURN(unsigned long); } else if (strcmp(returnType, @encode(unsigned long long)) == 0) { WRAP_AND_RETURN(unsigned long long); } else if (strcmp(returnType, @encode(float)) == 0) { WRAP_AND_RETURN(float); } else if (strcmp(returnType, @encode(double)) == 0) { WRAP_AND_RETURN(double); } else if (strcmp(returnType, @encode(BOOL)) == 0) { WRAP_AND_RETURN(BOOL); } else if (strcmp(returnType, @encode(char *)) == 0) { WRAP_AND_RETURN(const char *); } else if (strcmp(returnType, @encode(void)) == 0) { return RACUnit.defaultUnit; } else { NSUInteger valueSize = 0; NSGetSizeAndAlignment(returnType, &valueSize, NULL); unsigned char valueBytes[valueSize]; [self getReturnValue:valueBytes]; return [NSValue valueWithBytes:valueBytes objCType:returnType]; } return nil; #undef WRAP_AND_RETURN } @end Pods/ReactiveCocoa/ReactiveCocoa/NSNotificationCenter+RACSupport.h
New file @@ -0,0 +1,18 @@ // // NSNotificationCenter+RACSupport.h // ReactiveCocoa // // Created by Josh Abernathy on 5/10/12. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; @interface NSNotificationCenter (RACSupport) // Sends the NSNotification every time the notification is posted. - (RACSignal *)rac_addObserverForName:(NSString *)notificationName object:(id)object; @end Pods/ReactiveCocoa/ReactiveCocoa/NSNotificationCenter+RACSupport.m
New file @@ -0,0 +1,31 @@ // // NSNotificationCenter+RACSupport.m // ReactiveCocoa // // Created by Josh Abernathy on 5/10/12. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSNotificationCenter+RACSupport.h" #import "RACEXTScope.h" #import "RACSignal.h" #import "RACSubscriber.h" #import "RACDisposable.h" @implementation NSNotificationCenter (RACSupport) - (RACSignal *)rac_addObserverForName:(NSString *)notificationName object:(id)object { @unsafeify(object); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { @strongify(object); id observer = [self addObserverForName:notificationName object:object queue:nil usingBlock:^(NSNotification *note) { [subscriber sendNext:note]; }]; return [RACDisposable disposableWithBlock:^{ [self removeObserver:observer]; }]; }] setNameWithFormat:@"-rac_addObserverForName: %@ object: <%@: %p>", notificationName, [object class], object]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACDeallocating.h
New file @@ -0,0 +1,34 @@ // // NSObject+RACDeallocating.h // ReactiveCocoa // // Created by Kazuo Koga on 2013/03/15. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACCompoundDisposable; @class RACDisposable; @class RACSignal; @interface NSObject (RACDeallocating) /// The compound disposable which will be disposed of when the receiver is /// deallocated. @property (atomic, readonly, strong) RACCompoundDisposable *rac_deallocDisposable; /// Returns a signal that will complete immediately before the receiver is fully /// deallocated. If already deallocated when the signal is subscribed to, /// a `completed` event will be sent immediately. - (RACSignal *)rac_willDeallocSignal; @end @interface NSObject (RACDeallocatingDeprecated) - (RACSignal *)rac_didDeallocSignal __attribute__((deprecated("Use -rac_willDeallocSignal"))); - (void)rac_addDeallocDisposable:(RACDisposable *)disposable __attribute__((deprecated("Add disposables to -rac_deallocDisposable instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACDeallocating.m
New file @@ -0,0 +1,129 @@ // // NSObject+RACDeallocating.m // ReactiveCocoa // // Created by Kazuo Koga on 2013/03/15. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSObject+RACDeallocating.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACReplaySubject.h" #import <objc/message.h> #import <objc/runtime.h> static const void *RACObjectCompoundDisposable = &RACObjectCompoundDisposable; static NSMutableSet *swizzledClasses() { static dispatch_once_t onceToken; static NSMutableSet *swizzledClasses = nil; dispatch_once(&onceToken, ^{ swizzledClasses = [[NSMutableSet alloc] init]; }); return swizzledClasses; } static void swizzleDeallocIfNeeded(Class classToSwizzle) { @synchronized (swizzledClasses()) { NSString *className = NSStringFromClass(classToSwizzle); if ([swizzledClasses() containsObject:className]) return; SEL deallocSelector = sel_registerName("dealloc"); __block void (*originalDealloc)(__unsafe_unretained id, SEL) = NULL; id newDealloc = ^(__unsafe_unretained id self) { RACCompoundDisposable *compoundDisposable = objc_getAssociatedObject(self, RACObjectCompoundDisposable); [compoundDisposable dispose]; if (originalDealloc == NULL) { struct objc_super superInfo = { .receiver = self, .super_class = class_getSuperclass(classToSwizzle) }; void (*msgSend)(struct objc_super *, SEL) = (__typeof__(msgSend))objc_msgSendSuper; msgSend(&superInfo, deallocSelector); } else { originalDealloc(self, deallocSelector); } }; IMP newDeallocIMP = imp_implementationWithBlock(newDealloc); if (!class_addMethod(classToSwizzle, deallocSelector, newDeallocIMP, "v@:")) { // The class already contains a method implementation. Method deallocMethod = class_getInstanceMethod(classToSwizzle, deallocSelector); // We need to store original implementation before setting new implementation // in case method is called at the time of setting. originalDealloc = (__typeof__(originalDealloc))method_getImplementation(deallocMethod); // We need to store original implementation again, in case it just changed. originalDealloc = (__typeof__(originalDealloc))method_setImplementation(deallocMethod, newDeallocIMP); } [swizzledClasses() addObject:className]; } } @implementation NSObject (RACDeallocating) - (RACSignal *)rac_willDeallocSignal { RACSignal *signal = objc_getAssociatedObject(self, _cmd); if (signal != nil) return signal; RACReplaySubject *subject = [RACReplaySubject subject]; [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ [subject sendCompleted]; }]]; objc_setAssociatedObject(self, _cmd, subject, OBJC_ASSOCIATION_RETAIN); return subject; } - (RACCompoundDisposable *)rac_deallocDisposable { @synchronized (self) { RACCompoundDisposable *compoundDisposable = objc_getAssociatedObject(self, RACObjectCompoundDisposable); if (compoundDisposable != nil) return compoundDisposable; swizzleDeallocIfNeeded(self.class); compoundDisposable = [RACCompoundDisposable compoundDisposable]; objc_setAssociatedObject(self, RACObjectCompoundDisposable, compoundDisposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return compoundDisposable; } } @end @implementation NSObject (RACDeallocatingDeprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (RACSignal *)rac_didDeallocSignal { RACSubject *subject = [RACSubject subject]; RACScopedDisposable *disposable = [[RACDisposable disposableWithBlock:^{ [subject sendCompleted]; }] asScopedDisposable]; objc_setAssociatedObject(self, (__bridge void *)disposable, disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return subject; } - (void)rac_addDeallocDisposable:(RACDisposable *)disposable { [self.rac_deallocDisposable addDisposable:disposable]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACDescription.h
New file @@ -0,0 +1,21 @@ // // NSObject+RACDescription.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-05-13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> // A private category providing a terser but faster alternative to -description. @interface NSObject (RACDescription) // A simplified description of the receiver, which does not invoke -description // (and thus should be much faster in many cases). // // This is for debugging purposes only, and will return a constant string // unless the RAC_DEBUG_SIGNAL_NAMES environment variable is set. - (NSString *)rac_description; @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACDescription.m
New file @@ -0,0 +1,50 @@ // // NSObject+RACDescription.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-05-13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSObject+RACDescription.h" #import "RACTuple.h" @implementation NSObject (RACDescription) - (NSString *)rac_description { if (getenv("RAC_DEBUG_SIGNAL_NAMES") != NULL) { return [[NSString alloc] initWithFormat:@"<%@: %p>", self.class, self]; } else { return @"(description skipped)"; } } @end @implementation NSValue (RACDescription) - (NSString *)rac_description { return self.description; } @end @implementation NSString (RACDescription) - (NSString *)rac_description { return self.description; } @end @implementation RACTuple (RACDescription) - (NSString *)rac_description { if (getenv("RAC_DEBUG_SIGNAL_NAMES") != NULL) { return self.allObjects.description; } else { return @"(description skipped)"; } } @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACKVOWrapper.h
New file @@ -0,0 +1,46 @@ // // NSObject+RACKVOWrapper.h // ReactiveCocoa // // Created by Josh Abernathy on 10/11/11. // Copyright (c) 2011 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACDisposable; @class RACKVOTrampoline; // A private category providing a block based interface to KVO. @interface NSObject (RACKVOWrapper) // Adds the given block as the callbacks for when the key path changes. // // Unlike direct KVO observation, this handles deallocation of `weak` properties // by generating an appropriate notification. This will only occur if there is // an `@property` declaration visible in the observed class, with the `weak` // memory management attribute. // // The observation does not need to be explicitly removed. It will be removed // when the observer or the receiver deallocate. // // keyPath - The key path to observe. Must not be nil. // options - The KVO observation options. // observer - The object that requested the observation. May be nil. // block - The block called when the value at the key path changes. It is // passed the current value of the key path and the extended KVO // change dictionary including RAC-specific keys and values. Must not // be nil. // // Returns a disposable that can be used to stop the observation. - (RACDisposable *)rac_observeKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer block:(void (^)(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent))block; @end typedef void (^RACKVOBlock)(id target, id observer, NSDictionary *change); @interface NSObject (RACKVOWrapperDeprecated) - (RACKVOTrampoline *)rac_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block __attribute((deprecated("Use rac_observeKeyPath:options:observer:block: instead."))); @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACKVOWrapper.m
New file @@ -0,0 +1,213 @@ // // NSObject+RACKVOWrapper.m // ReactiveCocoa // // Created by Josh Abernathy on 10/11/11. // Copyright (c) 2011 GitHub. All rights reserved. // #import "NSObject+RACKVOWrapper.h" #import "RACEXTRuntimeExtensions.h" #import "RACEXTScope.h" #import "NSObject+RACDeallocating.h" #import "NSString+RACKeyPathUtilities.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACKVOTrampoline.h" #import "RACSerialDisposable.h" @implementation NSObject (RACKVOWrapper) - (RACDisposable *)rac_observeKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)weakObserver block:(void (^)(id, NSDictionary *, BOOL, BOOL))block { NSCParameterAssert(block != nil); NSCParameterAssert(keyPath.rac_keyPathComponents.count > 0); keyPath = [keyPath copy]; NSObject *strongObserver = weakObserver; NSArray *keyPathComponents = keyPath.rac_keyPathComponents; BOOL keyPathHasOneComponent = (keyPathComponents.count == 1); NSString *keyPathHead = keyPathComponents[0]; NSString *keyPathTail = keyPath.rac_keyPathByDeletingFirstKeyPathComponent; RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; // The disposable that groups all disposal necessary to clean up the callbacks // added to the value of the first key path component. RACSerialDisposable *firstComponentSerialDisposable = [RACSerialDisposable serialDisposableWithDisposable:[RACCompoundDisposable compoundDisposable]]; RACCompoundDisposable * (^firstComponentDisposable)(void) = ^{ return (RACCompoundDisposable *)firstComponentSerialDisposable.disposable; }; [disposable addDisposable:firstComponentSerialDisposable]; BOOL shouldAddDeallocObserver = NO; objc_property_t property = class_getProperty(object_getClass(self), keyPathHead.UTF8String); if (property != NULL) { rac_propertyAttributes *attributes = rac_copyPropertyAttributes(property); if (attributes != NULL) { @onExit { free(attributes); }; BOOL isObject = attributes->objectClass != nil || strstr(attributes->type, @encode(id)) == attributes->type; BOOL isProtocol = attributes->objectClass == NSClassFromString(@"Protocol"); BOOL isBlock = strcmp(attributes->type, @encode(void(^)())) == 0; BOOL isWeak = attributes->weak; // If this property isn't actually an object (or is a Class object), // no point in observing the deallocation of the wrapper returned by // KVC. // // If this property is an object, but not declared `weak`, we // don't need to watch for it spontaneously being set to nil. // // Attempting to observe non-weak properties will result in // broken behavior for dynamic getters, so don't even try. shouldAddDeallocObserver = isObject && isWeak && !isBlock && !isProtocol; } } // Adds the callback block to the value's deallocation. Also adds the logic to // clean up the callback to the firstComponentDisposable. void (^addDeallocObserverToPropertyValue)(NSObject *) = ^(NSObject *value) { if (!shouldAddDeallocObserver) return; // If a key path value is the observer, commonly when a key path begins // with "self", we prevent deallocation triggered callbacks for any such key // path components. Thus, the observer's deallocation is not considered a // change to the key path. if (value == weakObserver) return; NSDictionary *change = @{ NSKeyValueChangeKindKey: @(NSKeyValueChangeSetting), NSKeyValueChangeNewKey: NSNull.null, }; RACCompoundDisposable *valueDisposable = value.rac_deallocDisposable; RACDisposable *deallocDisposable = [RACDisposable disposableWithBlock:^{ block(nil, change, YES, keyPathHasOneComponent); }]; [valueDisposable addDisposable:deallocDisposable]; [firstComponentDisposable() addDisposable:[RACDisposable disposableWithBlock:^{ [valueDisposable removeDisposable:deallocDisposable]; }]]; }; // Adds the callback block to the remaining path components on the value. Also // adds the logic to clean up the callbacks to the firstComponentDisposable. void (^addObserverToValue)(NSObject *) = ^(NSObject *value) { RACDisposable *observerDisposable = [value rac_observeKeyPath:keyPathTail options:(options & ~NSKeyValueObservingOptionInitial) observer:weakObserver block:block]; [firstComponentDisposable() addDisposable:observerDisposable]; }; // Observe only the first key path component, when the value changes clean up // the callbacks on the old value, add callbacks to the new value and call the // callback block as needed. // // Note this does not use NSKeyValueObservingOptionInitial so this only // handles changes to the value, callbacks to the initial value must be added // separately. NSKeyValueObservingOptions trampolineOptions = (options | NSKeyValueObservingOptionPrior) & ~NSKeyValueObservingOptionInitial; RACKVOTrampoline *trampoline = [[RACKVOTrampoline alloc] initWithTarget:self observer:strongObserver keyPath:keyPathHead options:trampolineOptions block:^(id trampolineTarget, id trampolineObserver, NSDictionary *change) { // If this is a prior notification, clean up all the callbacks added to the // previous value and call the callback block. Everything else is deferred // until after we get the notification after the change. if ([change[NSKeyValueChangeNotificationIsPriorKey] boolValue]) { [firstComponentDisposable() dispose]; if ((options & NSKeyValueObservingOptionPrior) != 0) { block([trampolineTarget valueForKeyPath:keyPath], change, NO, keyPathHasOneComponent); } return; } // From here the notification is not prior. NSObject *value = [trampolineTarget valueForKey:keyPathHead]; // If the value has changed but is nil, there is no need to add callbacks to // it, just call the callback block. if (value == nil) { block(nil, change, NO, keyPathHasOneComponent); return; } // From here the notification is not prior and the value is not nil. // Create a new firstComponentDisposable while getting rid of the old one at // the same time, in case this is being called concurrently. RACDisposable *oldFirstComponentDisposable = [firstComponentSerialDisposable swapInDisposable:[RACCompoundDisposable compoundDisposable]]; [oldFirstComponentDisposable dispose]; addDeallocObserverToPropertyValue(value); // If there are no further key path components, there is no need to add the // other callbacks, just call the callback block with the value itself. if (keyPathHasOneComponent) { block(value, change, NO, keyPathHasOneComponent); return; } // The value has changed, is not nil, and there are more key path components // to consider. Add the callbacks to the value for the remaining key path // components and call the callback block with the current value of the full // key path. addObserverToValue(value); block([value valueForKeyPath:keyPathTail], change, NO, keyPathHasOneComponent); }]; // Stop the KVO observation when this one is disposed of. [disposable addDisposable:trampoline]; // Add the callbacks to the initial value if needed. NSObject *value = [self valueForKey:keyPathHead]; if (value != nil) { addDeallocObserverToPropertyValue(value); if (!keyPathHasOneComponent) { addObserverToValue(value); } } // Call the block with the initial value if needed. if ((options & NSKeyValueObservingOptionInitial) != 0) { id initialValue = [self valueForKeyPath:keyPath]; NSDictionary *initialChange = @{ NSKeyValueChangeKindKey: @(NSKeyValueChangeSetting), NSKeyValueChangeNewKey: initialValue ?: NSNull.null, }; block(initialValue, initialChange, NO, keyPathHasOneComponent); } RACCompoundDisposable *observerDisposable = strongObserver.rac_deallocDisposable; RACCompoundDisposable *selfDisposable = self.rac_deallocDisposable; // Dispose of this observation if the receiver or the observer deallocate. [observerDisposable addDisposable:disposable]; [selfDisposable addDisposable:disposable]; return [RACDisposable disposableWithBlock:^{ [disposable dispose]; [observerDisposable removeDisposable:disposable]; [selfDisposable removeDisposable:disposable]; }]; } @end @implementation NSObject (RACKVOWrapperDeprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (RACKVOTrampoline *)rac_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block { return [[RACKVOTrampoline alloc] initWithTarget:self observer:observer keyPath:keyPath options:options block:block]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACLifting.h
New file @@ -0,0 +1,61 @@ // // NSObject+RACLifting.h // ReactiveCocoa // // Created by Josh Abernathy on 10/13/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; @interface NSObject (RACLifting) /// Lifts the selector on the receiver into the reactive world. The selector will /// be invoked whenever any signal argument sends a value, but only after each /// signal has sent an initial value. /// /// It will replay the most recently sent value to new subscribers. /// /// This does not support C arrays or unions. /// /// selector - The selector on self to invoke. /// firstSignal - The signal corresponding to the first method argument. This /// must not be nil. /// ... - A list of RACSignals corresponding to the remaining arguments. /// There must be a non-nil signal for each method argument. /// /// Examples /// /// [button rac_liftSelector:@selector(setTitleColor:forState:) withSignals:textColorSignal, [RACSignal return:@(UIControlStateNormal)], nil]; /// /// Returns a signal which sends the return value from each invocation of the /// selector. If the selector returns void, it instead sends RACUnit.defaultUnit. /// It completes only after all the signal arguments complete. - (RACSignal *)rac_liftSelector:(SEL)selector withSignals:(RACSignal *)firstSignal, ... NS_REQUIRES_NIL_TERMINATION; /// Like -rac_liftSelector:withSignals:, but accepts an array instead of /// a variadic list of arguments. - (RACSignal *)rac_liftSelector:(SEL)selector withSignalsFromArray:(NSArray *)signals; /// Like -rac_liftSelector:withSignals:, but accepts a signal sending tuples of /// arguments instead of a variadic list of arguments. - (RACSignal *)rac_liftSelector:(SEL)selector withSignalOfArguments:(RACSignal *)arguments; @end @interface NSObject (RACLiftingDeprecated) - (RACSignal *)rac_liftSelector:(SEL)selector withObjects:(id)arg, ... __attribute__((deprecated("Use -rac_liftSelector:withSignals: instead"))); - (RACSignal *)rac_liftSelector:(SEL)selector withObjectsFromArray:(NSArray *)args __attribute__((deprecated("Use -rac_liftSelector:withSignalsFromArray: instead"))); - (RACSignal *)rac_liftBlock:(id)block withArguments:(id)arg, ... NS_REQUIRES_NIL_TERMINATION __attribute__((deprecated("Use +combineLatest:reduce: instead"))); - (RACSignal *)rac_liftBlock:(id)block withArgumentsFromArray:(NSArray *)args __attribute__((deprecated("Use +combineLatest:reduce: instead"))); @end @interface NSObject (RACLiftingUnavailable) - (instancetype)rac_lift __attribute__((unavailable("Use -rac_liftSelector:withSignals: instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACLifting.m
New file @@ -0,0 +1,142 @@ // // NSObject+RACLifting.m // ReactiveCocoa // // Created by Josh Abernathy on 10/13/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "NSObject+RACLifting.h" #import "RACEXTScope.h" #import "NSInvocation+RACTypeParsing.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import "RACSignal+Operations.h" #import "RACTuple.h" @implementation NSObject (RACLifting) - (RACSignal *)rac_liftSelector:(SEL)selector withSignalOfArguments:(RACSignal *)arguments { NSCParameterAssert(selector != NULL); NSCParameterAssert(arguments != nil); @unsafeify(self); NSMethodSignature *methodSignature = [self methodSignatureForSelector:selector]; NSCAssert(methodSignature != nil, @"%@ does not respond to %@", self, NSStringFromSelector(selector)); return [[[[arguments takeUntil:self.rac_willDeallocSignal] map:^(RACTuple *arguments) { @strongify(self); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; invocation.selector = selector; invocation.rac_argumentsTuple = arguments; [invocation invokeWithTarget:self]; return invocation.rac_returnValue; }] replayLast] setNameWithFormat:@"%@ -rac_liftSelector: %s withSignalsOfArguments: %@", self.rac_description, sel_getName(selector), arguments]; } - (RACSignal *)rac_liftSelector:(SEL)selector withSignalsFromArray:(NSArray *)signals { NSCParameterAssert(signals != nil); NSCParameterAssert(signals.count > 0); NSMethodSignature *methodSignature = [self methodSignatureForSelector:selector]; NSCAssert(methodSignature != nil, @"%@ does not respond to %@", self, NSStringFromSelector(selector)); NSUInteger numberOfArguments __attribute__((unused)) = methodSignature.numberOfArguments - 2; NSCAssert(numberOfArguments == signals.count, @"Wrong number of signals for %@ (expected %lu, got %lu)", NSStringFromSelector(selector), (unsigned long)numberOfArguments, (unsigned long)signals.count); return [[self rac_liftSelector:selector withSignalOfArguments:[RACSignal combineLatest:signals]] setNameWithFormat:@"%@ -rac_liftSelector: %s withSignalsFromArray: %@", self.rac_description, sel_getName(selector), signals]; } - (RACSignal *)rac_liftSelector:(SEL)selector withSignals:(RACSignal *)firstSignal, ... { NSCParameterAssert(firstSignal != nil); NSMutableArray *signals = [NSMutableArray array]; va_list args; va_start(args, firstSignal); for (id currentSignal = firstSignal; currentSignal != nil; currentSignal = va_arg(args, id)) { NSCAssert([currentSignal isKindOfClass:RACSignal.class], @"Argument %@ is not a RACSignal", currentSignal); [signals addObject:currentSignal]; } va_end(args); return [[self rac_liftSelector:selector withSignalsFromArray:signals] setNameWithFormat:@"%@ -rac_liftSelector: %s withSignals: %@", self.rac_description, sel_getName(selector), signals]; } @end @implementation NSObject (RACLiftingDeprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" static NSArray *RACMapArgumentsToSignals(NSArray *args) { NSMutableArray *mappedArgs = [NSMutableArray array]; for (id arg in args) { if ([arg isEqual:RACTupleNil.tupleNil]) { [mappedArgs addObject:[RACSignal return:nil]]; } else if ([arg isKindOfClass:RACSignal.class]) { [mappedArgs addObject:arg]; } else { [mappedArgs addObject:[RACSignal return:arg]]; } } return mappedArgs; } - (RACSignal *)rac_liftSelector:(SEL)selector withObjects:(id)arg, ... { NSMethodSignature *methodSignature = [self methodSignatureForSelector:selector]; NSMutableArray *arguments = [NSMutableArray array]; va_list args; va_start(args, arg); for (NSUInteger i = 2; i < methodSignature.numberOfArguments; i++) { id currentObject = (i == 2 ? arg : va_arg(args, id)); [arguments addObject:currentObject ?: RACTupleNil.tupleNil]; } va_end(args); return [self rac_liftSelector:selector withObjectsFromArray:arguments]; } - (RACSignal *)rac_liftSelector:(SEL)selector withObjectsFromArray:(NSArray *)args { return [self rac_liftSelector:selector withSignalsFromArray:RACMapArgumentsToSignals(args)]; } - (RACSignal *)rac_liftBlock:(id)block withArguments:(id)arg, ... { NSMutableArray *arguments = [NSMutableArray array]; va_list args; va_start(args, arg); for (id currentObject = arg; currentObject != nil; currentObject = va_arg(args, id)) { [arguments addObject:currentObject]; } va_end(args); return [self rac_liftBlock:block withArgumentsFromArray:arguments]; } - (RACSignal *)rac_liftBlock:(id)block withArgumentsFromArray:(NSArray *)args { return [[[[RACSignal combineLatest:RACMapArgumentsToSignals(args)] reduceEach:block] takeUntil:self.rac_willDeallocSignal] replayLast]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACPropertySubscribing.h
New file @@ -0,0 +1,105 @@ // // NSObject+RACPropertySubscribing.h // ReactiveCocoa // // Created by Josh Abernathy on 3/2/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACEXTKeyPathCoding.h" #import "RACmetamacros.h" /// Creates a signal which observes `KEYPATH` on `TARGET` for changes. /// /// In either case, the observation continues until `TARGET` _or self_ is /// deallocated. If any intermediate object is deallocated instead, it will be /// assumed to have been set to nil. /// /// Make sure to `@strongify(self)` when using this macro within a block! The /// macro will _always_ reference `self`, which can silently introduce a retain /// cycle within a block. As a result, you should make sure that `self` is a weak /// reference (e.g., created by `@weakify` and `@strongify`) before the /// expression that uses `RACObserve`. /// /// Examples /// /// // Observes self, and doesn't stop until self is deallocated. /// RACSignal *selfSignal = RACObserve(self, arrayController.items); /// /// // Observes the array controller, and stops when self _or_ the array /// // controller is deallocated. /// RACSignal *arrayControllerSignal = RACObserve(self.arrayController, items); /// /// // Observes obj.arrayController, and stops when self _or_ the array /// // controller is deallocated. /// RACSignal *signal2 = RACObserve(obj.arrayController, items); /// /// @weakify(self); /// RACSignal *signal3 = [anotherSignal flattenMap:^(NSArrayController *arrayController) { /// // Avoids a retain cycle because of RACObserve implicitly referencing /// // self. /// @strongify(self); /// return RACObserve(arrayController, items); /// }]; /// /// Returns a signal which sends the current value of the key path on /// subscription, then sends the new value every time it changes, and sends /// completed if self or observer is deallocated. #define RACObserve(TARGET, KEYPATH) \ ({ \ __weak id target_ = (TARGET); \ [target_ rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) observer:self]; \ }) @class RACDisposable; @class RACSignal; @interface NSObject (RACPropertySubscribing) /// Creates a signal to observe the value at the given key path. /// /// The initial value is sent on subscription, the subsequent values are sent /// from whichever thread the change occured on, even if it doesn't have a valid /// scheduler. /// /// Returns a signal that immediately sends the receiver's current value at the /// given keypath, then any changes thereafter. - (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer; /// Creates a signal to observe the changes of the given key path. /// /// The initial value is sent on subscription, the subsequent values are sent /// from whichever thread the change occured on, even if it doesn't have a valid /// scheduler. /// /// Returns a signal that sends tuples containing the current value at the key /// path and the change dictionary for each KVO callback. - (RACSignal *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer; @end #define RACAble(...) \ metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ (_RACAbleObject(self, __VA_ARGS__)) \ (_RACAbleObject(__VA_ARGS__)) #define _RACAbleObject(object, property) [object rac_signalForKeyPath:@keypath(object, property) observer:self] #define RACAbleWithStart(...) \ metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ (_RACAbleWithStartObject(self, __VA_ARGS__)) \ (_RACAbleWithStartObject(__VA_ARGS__)) #define _RACAbleWithStartObject(object, property) [object rac_signalWithStartingValueForKeyPath:@keypath(object, property) observer:self] @interface NSObject (RACPropertySubscribingDeprecated) + (RACSignal *)rac_signalFor:(NSObject *)object keyPath:(NSString *)keyPath observer:(NSObject *)observer __attribute__((deprecated("Use -rac_valuesForKeyPath:observer: or RACObserve() instead."))); + (RACSignal *)rac_signalWithStartingValueFor:(NSObject *)object keyPath:(NSString *)keyPath observer:(NSObject *)observer __attribute__((deprecated("Use -rac_valuesForKeyPath:observer: or RACObserve() instead."))); + (RACSignal *)rac_signalWithChangesFor:(NSObject *)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(NSObject *)observer __attribute__((deprecated("Use -rac_valuesAndChangesForKeyPath:options:observer: instead."))); - (RACSignal *)rac_signalForKeyPath:(NSString *)keyPath observer:(NSObject *)observer __attribute__((deprecated("Use -rac_valuesForKeyPath:observer: or RACObserve() instead."))); - (RACSignal *)rac_signalWithStartingValueForKeyPath:(NSString *)keyPath observer:(NSObject *)observer __attribute__((deprecated("Use -rac_valuesForKeyPath:observer: or RACObserve() instead."))); - (RACDisposable *)rac_deriveProperty:(NSString *)keyPath from:(RACSignal *)signal __attribute__((deprecated("Use -[RACSignal setKeyPath:onObject:] instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACPropertySubscribing.m
New file @@ -0,0 +1,159 @@ // // NSObject+RACPropertySubscribing.m // ReactiveCocoa // // Created by Josh Abernathy on 3/2/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "NSObject+RACPropertySubscribing.h" #import "RACEXTScope.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import "NSObject+RACKVOWrapper.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACKVOTrampoline.h" #import "RACSubscriber.h" #import "RACSignal+Operations.h" #import "RACTuple.h" #import <libkern/OSAtomic.h> @implementation NSObject (RACPropertySubscribing) - (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer { return [[[self rac_valuesAndChangesForKeyPath:keyPath options:NSKeyValueObservingOptionInitial observer:observer] map:^(RACTuple *value) { // -map: because it doesn't require the block trampoline that -reduceEach: uses return value[0]; }] setNameWithFormat:@"RACObserve(%@, %@)", self.rac_description, keyPath]; } - (RACSignal *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)weakObserver { NSObject *strongObserver = weakObserver; keyPath = [keyPath copy]; NSRecursiveLock *objectLock = [[NSRecursiveLock alloc] init]; objectLock.name = @"org.reactivecocoa.ReactiveCocoa.NSObjectRACPropertySubscribing"; __weak NSObject *weakSelf = self; RACSignal *deallocSignal = [[RACSignal zip:@[ self.rac_willDeallocSignal, strongObserver.rac_willDeallocSignal ?: [RACSignal never] ]] doCompleted:^{ // Forces deallocation to wait if the object variables are currently // being read on another thread. [objectLock lock]; @onExit { [objectLock unlock]; }; }]; return [[[RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { // Hold onto the lock the whole time we're setting up the KVO // observation, because any resurrection that might be caused by our // retaining below must be balanced out by the time -dealloc returns // (if another thread is waiting on the lock above). [objectLock lock]; @onExit { [objectLock unlock]; }; __strong NSObject *observer __attribute__((objc_precise_lifetime)) = weakObserver; __strong NSObject *self __attribute__((objc_precise_lifetime)) = weakSelf; if (self == nil) { [subscriber sendCompleted]; return nil; } return [self rac_observeKeyPath:keyPath options:options observer:observer block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) { [subscriber sendNext:RACTuplePack(value, change)]; }]; }] takeUntil:deallocSignal] setNameWithFormat:@"%@ -rac_valueAndChangesForKeyPath: %@ options: %lu observer: %@", self.rac_description, keyPath, (unsigned long)options, strongObserver.rac_description]; } @end static RACSignal *signalWithoutChangesFor(Class class, NSObject *object, NSString *keyPath, NSKeyValueObservingOptions options, NSObject *observer) { NSCParameterAssert(object != nil); NSCParameterAssert(keyPath != nil); NSCParameterAssert(observer != nil); keyPath = [keyPath copy]; @unsafeify(object); return [[class rac_signalWithChangesFor:object keyPath:keyPath options:options observer:observer] map:^(NSDictionary *change) { @strongify(object); return [object valueForKeyPath:keyPath]; }]; } @implementation NSObject (RACPropertySubscribingDeprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" + (RACSignal *)rac_signalFor:(NSObject *)object keyPath:(NSString *)keyPath observer:(NSObject *)observer { return signalWithoutChangesFor(self, object, keyPath, 0, observer); } + (RACSignal *)rac_signalWithStartingValueFor:(NSObject *)object keyPath:(NSString *)keyPath observer:(NSObject *)observer { return signalWithoutChangesFor(self, object, keyPath, NSKeyValueObservingOptionInitial, observer); } + (RACSignal *)rac_signalWithChangesFor:(NSObject *)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(NSObject *)observer { @unsafeify(observer, object); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { @strongify(observer, object); RACKVOTrampoline *KVOTrampoline = [object rac_addObserver:observer forKeyPath:keyPath options:options block:^(id target, id observer, NSDictionary *change) { [subscriber sendNext:change]; }]; @weakify(subscriber); RACDisposable *deallocDisposable = [RACDisposable disposableWithBlock:^{ @strongify(subscriber); [KVOTrampoline dispose]; [subscriber sendCompleted]; }]; [observer.rac_deallocDisposable addDisposable:deallocDisposable]; [object.rac_deallocDisposable addDisposable:deallocDisposable]; RACCompoundDisposable *observerDisposable = observer.rac_deallocDisposable; RACCompoundDisposable *objectDisposable = object.rac_deallocDisposable; return [RACDisposable disposableWithBlock:^{ [observerDisposable removeDisposable:deallocDisposable]; [objectDisposable removeDisposable:deallocDisposable]; [KVOTrampoline dispose]; }]; }] setNameWithFormat:@"RACAble(%@, %@)", object.rac_description, keyPath]; } - (RACSignal *)rac_signalForKeyPath:(NSString *)keyPath observer:(NSObject *)observer { return [self.class rac_signalFor:self keyPath:keyPath observer:observer]; } - (RACSignal *)rac_signalWithStartingValueForKeyPath:(NSString *)keyPath observer:(NSObject *)observer { return [self.class rac_signalWithStartingValueFor:self keyPath:keyPath observer:observer]; } - (RACDisposable *)rac_deriveProperty:(NSString *)keyPath from:(RACSignal *)signal { return [signal setKeyPath:keyPath onObject:self]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACSelectorSignal.h
New file @@ -0,0 +1,79 @@ // // NSObject+RACSelectorSignal.h // ReactiveCocoa // // Created by Josh Abernathy on 3/18/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; /// The domain for any errors originating from -rac_signalForSelector:. extern NSString * const RACSelectorSignalErrorDomain; /// -rac_signalForSelector: was going to add a new method implementation for /// `selector`, but another thread added an implementation before it was able to. /// /// This will _not_ occur for cases where a method implementation exists before /// -rac_signalForSelector: is invoked. extern const NSInteger RACSelectorSignalErrorMethodSwizzlingRace; @interface NSObject (RACSelectorSignal) /// Creates a signal associated with the receiver, which will send a tuple of the /// method's arguments each time the given selector is invoked. /// /// If the selector is already implemented on the receiver, the existing /// implementation will be invoked _before_ the signal fires. /// /// If the selector is not yet implemented on the receiver, the injected /// implementation will have a `void` return type and accept only object /// arguments. Invoking the added implementation with non-object values, or /// expecting a return value, will result in undefined behavior. /// /// This is useful for changing an event or delegate callback into a signal. For /// example, on an NSView: /// /// [[view rac_signalForSelector:@selector(mouseDown:)] subscribeNext:^(RACTuple *args) { /// NSEvent *event = args.first; /// NSLog(@"mouse button pressed: %@", event); /// }]; /// /// selector - The selector for whose invocations are to be observed. If it /// doesn't exist, it will be implemented to accept object arguments /// and return void. This cannot have C arrays or unions as arguments /// or C arrays, unions, structs, complex or vector types as return /// type. /// /// Returns a signal which will send a tuple of arguments upon each invocation of /// the selector, then completes when the receiver is deallocated. `next` events /// will be sent synchronously from the thread that invoked the method. If /// a runtime call fails, the signal will send an error in the /// RACSelectorSignalErrorDomain. - (RACSignal *)rac_signalForSelector:(SEL)selector; /// Behaves like -rac_signalForSelector:, but if the selector is not yet /// implemented on the receiver, its method signature is looked up within /// `protocol`, and may accept non-object arguments. /// /// If the selector is not yet implemented and has a return value, the injected /// method will return all zero bits (equal to `nil`, `NULL`, 0, 0.0f, etc.). /// /// selector - The selector for whose invocations are to be observed. If it /// doesn't exist, it will be implemented using information from /// `protocol`, and may accept non-object arguments and return /// a value. This cannot have C arrays or unions as arguments or /// return type. /// protocol - The protocol in which `selector` is declared. This will be used /// for type information if the selector is not already implemented on /// the receiver. This must not be `NULL`, and `selector` must exist /// in this protocol. /// /// Returns a signal which will send a tuple of arguments on each invocation of /// the selector, or an error in RACSelectorSignalErrorDomain if a runtime /// call fails. - (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol; @end Pods/ReactiveCocoa/ReactiveCocoa/NSObject+RACSelectorSignal.m
New file @@ -0,0 +1,330 @@ // // NSObject+RACSelectorSignal.m // ReactiveCocoa // // Created by Josh Abernathy on 3/18/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSObject+RACSelectorSignal.h" #import "RACEXTRuntimeExtensions.h" #import "NSInvocation+RACTypeParsing.h" #import "NSObject+RACDeallocating.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACObjCRuntime.h" #import "RACSubject.h" #import "RACTuple.h" #import "NSObject+RACDescription.h" #import <objc/message.h> #import <objc/runtime.h> NSString * const RACSelectorSignalErrorDomain = @"RACSelectorSignalErrorDomain"; const NSInteger RACSelectorSignalErrorMethodSwizzlingRace = 1; static NSString * const RACSignalForSelectorAliasPrefix = @"rac_alias_"; static NSString * const RACSubclassSuffix = @"_RACSelectorSignal"; static void *RACSubclassAssociationKey = &RACSubclassAssociationKey; static NSMutableSet *swizzledClasses() { static NSMutableSet *set; static dispatch_once_t pred; dispatch_once(&pred, ^{ set = [[NSMutableSet alloc] init]; }); return set; } @implementation NSObject (RACSelectorSignal) static BOOL RACForwardInvocation(id self, NSInvocation *invocation) { SEL aliasSelector = RACAliasForSelector(invocation.selector); RACSubject *subject = objc_getAssociatedObject(self, aliasSelector); Class class = object_getClass(invocation.target); BOOL respondsToAlias = [class instancesRespondToSelector:aliasSelector]; if (respondsToAlias) { invocation.selector = aliasSelector; [invocation invoke]; } if (subject == nil) return respondsToAlias; [subject sendNext:invocation.rac_argumentsTuple]; return YES; } static void RACSwizzleForwardInvocation(Class class) { SEL forwardInvocationSEL = @selector(forwardInvocation:); Method forwardInvocationMethod = class_getInstanceMethod(class, forwardInvocationSEL); // Preserve any existing implementation of -forwardInvocation:. void (*originalForwardInvocation)(id, SEL, NSInvocation *) = NULL; if (forwardInvocationMethod != NULL) { originalForwardInvocation = (__typeof__(originalForwardInvocation))method_getImplementation(forwardInvocationMethod); } // Set up a new version of -forwardInvocation:. // // If the selector has been passed to -rac_signalForSelector:, invoke // the aliased method, and forward the arguments to any attached signals. // // If the selector has not been passed to -rac_signalForSelector:, // invoke any existing implementation of -forwardInvocation:. If there // was no existing implementation, throw an unrecognized selector // exception. id newForwardInvocation = ^(id self, NSInvocation *invocation) { BOOL matched = RACForwardInvocation(self, invocation); if (matched) return; if (originalForwardInvocation == NULL) { [self doesNotRecognizeSelector:invocation.selector]; } else { originalForwardInvocation(self, forwardInvocationSEL, invocation); } }; class_replaceMethod(class, forwardInvocationSEL, imp_implementationWithBlock(newForwardInvocation), "v@:@"); } static void RACSwizzleRespondsToSelector(Class class) { SEL respondsToSelectorSEL = @selector(respondsToSelector:); // Preserve existing implementation of -respondsToSelector:. Method respondsToSelectorMethod = class_getInstanceMethod(class, respondsToSelectorSEL); BOOL (*originalRespondsToSelector)(id, SEL, SEL) = (__typeof__(originalRespondsToSelector))method_getImplementation(respondsToSelectorMethod); // Set up a new version of -respondsToSelector: that returns YES for methods // added by -rac_signalForSelector:. // // If the selector has a method defined on the receiver's actual class, and // if that method's implementation is _objc_msgForward, then returns whether // the instance has a signal for the selector. // Otherwise, call the original -respondsToSelector:. id newRespondsToSelector = ^ BOOL (id self, SEL selector) { Method method = rac_getImmediateInstanceMethod(class, selector); if (method != NULL && method_getImplementation(method) == _objc_msgForward) { SEL aliasSelector = RACAliasForSelector(selector); if (objc_getAssociatedObject(self, aliasSelector) != nil) return YES; } return originalRespondsToSelector(self, respondsToSelectorSEL, selector); }; class_replaceMethod(class, respondsToSelectorSEL, imp_implementationWithBlock(newRespondsToSelector), method_getTypeEncoding(respondsToSelectorMethod)); } static void RACSwizzleGetClass(Class class, Class statedClass) { SEL selector = @selector(class); Method method = class_getInstanceMethod(class, selector); IMP newIMP = imp_implementationWithBlock(^(id self) { return statedClass; }); class_replaceMethod(class, selector, newIMP, method_getTypeEncoding(method)); } static void RACSwizzleMethodSignatureForSelector(Class class) { IMP newIMP = imp_implementationWithBlock(^(id self, SEL selector) { // Don't send the -class message to the receiver because we've changed // that to return the original class. Class actualClass = object_getClass(self); Method method = class_getInstanceMethod(actualClass, selector); if (method == NULL) { // Messages that the original class dynamically implements fall // here. // // Call the original class' -methodSignatureForSelector:. struct objc_super target = { .super_class = class_getSuperclass(class), .receiver = self, }; NSMethodSignature * (*messageSend)(struct objc_super *, SEL, SEL) = (__typeof__(messageSend))objc_msgSendSuper; return messageSend(&target, @selector(methodSignatureForSelector:), selector); } char const *encoding = method_getTypeEncoding(method); return [NSMethodSignature signatureWithObjCTypes:encoding]; }); SEL selector = @selector(methodSignatureForSelector:); Method methodSignatureForSelectorMethod = class_getInstanceMethod(class, selector); class_replaceMethod(class, selector, newIMP, method_getTypeEncoding(methodSignatureForSelectorMethod)); } // It's hard to tell which struct return types use _objc_msgForward, and // which use _objc_msgForward_stret instead, so just exclude all struct, array, // union, complex and vector return types. static void RACCheckTypeEncoding(const char *typeEncoding) { #if !NS_BLOCK_ASSERTIONS // Some types, including vector types, are not encoded. In these cases the // signature starts with the size of the argument frame. NSCAssert(*typeEncoding < '1' || *typeEncoding > '9', @"unknown method return type not supported in type encoding: %s", typeEncoding); NSCAssert(strstr(typeEncoding, "(") != typeEncoding, @"union method return type not supported"); NSCAssert(strstr(typeEncoding, "{") != typeEncoding, @"struct method return type not supported"); NSCAssert(strstr(typeEncoding, "[") != typeEncoding, @"array method return type not supported"); NSCAssert(strstr(typeEncoding, @encode(_Complex float)) != typeEncoding, @"complex float method return type not supported"); NSCAssert(strstr(typeEncoding, @encode(_Complex double)) != typeEncoding, @"complex double method return type not supported"); NSCAssert(strstr(typeEncoding, @encode(_Complex long double)) != typeEncoding, @"complex long double method return type not supported"); #endif // !NS_BLOCK_ASSERTIONS } static RACSignal *NSObjectRACSignalForSelector(NSObject *self, SEL selector, Protocol *protocol) { SEL aliasSelector = RACAliasForSelector(selector); @synchronized (self) { RACSubject *subject = objc_getAssociatedObject(self, aliasSelector); if (subject != nil) return subject; Class class = RACSwizzleClass(self); NSCAssert(class != nil, @"Could not swizzle class of %@", self); subject = [[RACSubject subject] setNameWithFormat:@"%@ -rac_signalForSelector: %s", self.rac_description, sel_getName(selector)]; objc_setAssociatedObject(self, aliasSelector, subject, OBJC_ASSOCIATION_RETAIN); [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ [subject sendCompleted]; }]]; Method targetMethod = class_getInstanceMethod(class, selector); if (targetMethod == NULL) { const char *typeEncoding; if (protocol == NULL) { typeEncoding = RACSignatureForUndefinedSelector(selector); } else { // Look for the selector as an optional instance method. struct objc_method_description methodDescription = protocol_getMethodDescription(protocol, selector, NO, YES); if (methodDescription.name == NULL) { // Then fall back to looking for a required instance // method. methodDescription = protocol_getMethodDescription(protocol, selector, YES, YES); NSCAssert(methodDescription.name != NULL, @"Selector %@ does not exist in <%s>", NSStringFromSelector(selector), protocol_getName(protocol)); } typeEncoding = methodDescription.types; } RACCheckTypeEncoding(typeEncoding); // Define the selector to call -forwardInvocation:. if (!class_addMethod(class, selector, _objc_msgForward, typeEncoding)) { NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedString(@"A race condition occurred implementing %@ on class %@", nil), NSStringFromSelector(selector), class], NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Invoke -rac_signalForSelector: again to override the implementation.", nil) }; return [RACSignal error:[NSError errorWithDomain:RACSelectorSignalErrorDomain code:RACSelectorSignalErrorMethodSwizzlingRace userInfo:userInfo]]; } } else if (method_getImplementation(targetMethod) != _objc_msgForward) { // Make a method alias for the existing method implementation. const char *typeEncoding = method_getTypeEncoding(targetMethod); RACCheckTypeEncoding(typeEncoding); BOOL addedAlias __attribute__((unused)) = class_addMethod(class, aliasSelector, method_getImplementation(targetMethod), typeEncoding); NSCAssert(addedAlias, @"Original implementation for %@ is already copied to %@ on %@", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), class); // Redefine the selector to call -forwardInvocation:. class_replaceMethod(class, selector, _objc_msgForward, method_getTypeEncoding(targetMethod)); } return subject; } } static SEL RACAliasForSelector(SEL originalSelector) { NSString *selectorName = NSStringFromSelector(originalSelector); return NSSelectorFromString([RACSignalForSelectorAliasPrefix stringByAppendingString:selectorName]); } static const char *RACSignatureForUndefinedSelector(SEL selector) { const char *name = sel_getName(selector); NSMutableString *signature = [NSMutableString stringWithString:@"v@:"]; while ((name = strchr(name, ':')) != NULL) { [signature appendString:@"@"]; name++; } return signature.UTF8String; } static Class RACSwizzleClass(NSObject *self) { Class statedClass = self.class; Class baseClass = object_getClass(self); // The "known dynamic subclass" is the subclass generated by RAC. // It's stored as an associated object on every instance that's already // been swizzled, so that even if something else swizzles the class of // this instance, we can still access the RAC generated subclass. Class knownDynamicSubclass = objc_getAssociatedObject(self, RACSubclassAssociationKey); if (knownDynamicSubclass != Nil) return knownDynamicSubclass; NSString *className = NSStringFromClass(baseClass); if (statedClass != baseClass) { // If the class is already lying about what it is, it's probably a KVO // dynamic subclass or something else that we shouldn't subclass // ourselves. // // Just swizzle -forwardInvocation: in-place. Since the object's class // was almost certainly dynamically changed, we shouldn't see another of // these classes in the hierarchy. // // Additionally, swizzle -respondsToSelector: because the default // implementation may be ignorant of methods added to this class. @synchronized (swizzledClasses()) { if (![swizzledClasses() containsObject:className]) { RACSwizzleForwardInvocation(baseClass); RACSwizzleRespondsToSelector(baseClass); RACSwizzleGetClass(baseClass, statedClass); RACSwizzleGetClass(object_getClass(baseClass), statedClass); RACSwizzleMethodSignatureForSelector(baseClass); [swizzledClasses() addObject:className]; } } return baseClass; } const char *subclassName = [className stringByAppendingString:RACSubclassSuffix].UTF8String; Class subclass = objc_getClass(subclassName); if (subclass == nil) { subclass = [RACObjCRuntime createClass:subclassName inheritingFromClass:baseClass]; if (subclass == nil) return nil; RACSwizzleForwardInvocation(subclass); RACSwizzleRespondsToSelector(subclass); RACSwizzleGetClass(subclass, statedClass); RACSwizzleGetClass(object_getClass(subclass), statedClass); RACSwizzleMethodSignatureForSelector(subclass); objc_registerClassPair(subclass); } object_setClass(self, subclass); objc_setAssociatedObject(self, RACSubclassAssociationKey, subclass, OBJC_ASSOCIATION_ASSIGN); return subclass; } - (RACSignal *)rac_signalForSelector:(SEL)selector { NSCParameterAssert(selector != NULL); return NSObjectRACSignalForSelector(self, selector, NULL); } - (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol { NSCParameterAssert(selector != NULL); NSCParameterAssert(protocol != NULL); return NSObjectRACSignalForSelector(self, selector, protocol); } @end Pods/ReactiveCocoa/ReactiveCocoa/NSOrderedSet+RACSequenceAdditions.h
New file @@ -0,0 +1,20 @@ // // NSOrderedSet+RACSequenceAdditions.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSOrderedSet (RACSequenceAdditions) /// Creates and returns a sequence corresponding to the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSOrderedSet+RACSequenceAdditions.m
New file @@ -0,0 +1,19 @@ // // NSOrderedSet+RACSequenceAdditions.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSOrderedSet+RACSequenceAdditions.h" #import "NSArray+RACSequenceAdditions.h" @implementation NSOrderedSet (RACSequenceAdditions) - (RACSequence *)rac_sequence { // TODO: First class support for ordered set sequences. return self.array.rac_sequence; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSSet+RACSequenceAdditions.h
New file @@ -0,0 +1,20 @@ // // NSSet+RACSequenceAdditions.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSSet (RACSequenceAdditions) /// Creates and returns a sequence corresponding to the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSSet+RACSequenceAdditions.m
New file @@ -0,0 +1,19 @@ // // NSSet+RACSequenceAdditions.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSSet+RACSequenceAdditions.h" #import "NSArray+RACSequenceAdditions.h" @implementation NSSet (RACSequenceAdditions) - (RACSequence *)rac_sequence { // TODO: First class support for set sequences. return self.allObjects.rac_sequence; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSString+RACKeyPathUtilities.h
New file @@ -0,0 +1,34 @@ // // NSString+RACKeyPathUtilities.h // ReactiveCocoa // // Created by Uri Baghin on 05/05/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> // A private category of methods to extract parts of a key path. @interface NSString (RACKeyPathUtilities) // Returns an array of the components of the receiver. // // Calling this method on a string that isn't a key path is considered undefined // behavior. - (NSArray *)rac_keyPathComponents; // Returns a key path with all the components of the receiver except for the // last one. // // Calling this method on a string that isn't a key path is considered undefined // behavior. - (NSString *)rac_keyPathByDeletingLastKeyPathComponent; // Returns a key path with all the components of the receiver expect for the // first one. // // Calling this method on a string that isn't a key path is considered undefined // behavior. - (NSString *)rac_keyPathByDeletingFirstKeyPathComponent; @end Pods/ReactiveCocoa/ReactiveCocoa/NSString+RACKeyPathUtilities.m
New file @@ -0,0 +1,36 @@ // // NSString+RACKeyPathUtilities.m // ReactiveCocoa // // Created by Uri Baghin on 05/05/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSString+RACKeyPathUtilities.h" @implementation NSString (RACKeyPathUtilities) - (NSArray *)rac_keyPathComponents { if (self.length == 0) { return nil; } return [self componentsSeparatedByString:@"."]; } - (NSString *)rac_keyPathByDeletingLastKeyPathComponent { NSUInteger lastDotIndex = [self rangeOfString:@"." options:NSBackwardsSearch].location; if (lastDotIndex == NSNotFound) { return nil; } return [self substringToIndex:lastDotIndex]; } - (NSString *)rac_keyPathByDeletingFirstKeyPathComponent { NSUInteger firstDotIndex = [self rangeOfString:@"."].location; if (firstDotIndex == NSNotFound) { return nil; } return [self substringFromIndex:firstDotIndex + 1]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSString+RACSequenceAdditions.h
New file @@ -0,0 +1,21 @@ // // NSString+RACSequenceAdditions.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> @class RACSequence; @interface NSString (RACSequenceAdditions) /// Creates and returns a sequence containing strings corresponding to each /// composed character sequence in the receiver. /// /// Mutating the receiver will not affect the sequence after it's been created. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end Pods/ReactiveCocoa/ReactiveCocoa/NSString+RACSequenceAdditions.m
New file @@ -0,0 +1,18 @@ // // NSString+RACSequenceAdditions.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "NSString+RACSequenceAdditions.h" #import "RACStringSequence.h" @implementation NSString (RACSequenceAdditions) - (RACSequence *)rac_sequence { return [RACStringSequence sequenceWithString:self offset:0]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSString+RACSupport.h
New file @@ -0,0 +1,22 @@ // // NSString+RACSupport.h // ReactiveCocoa // // Created by Josh Abernathy on 5/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACScheduler; @class RACSignal; @interface NSString (RACSupport) // Reads in the contents of the file using +[NSString stringWithContentsOfURL:usedEncoding:error:]. // Note that encoding won't be valid until the signal completes successfully. // // scheduler - cannot be nil. + (RACSignal *)rac_readContentsOfURL:(NSURL *)URL usedEncoding:(NSStringEncoding *)encoding scheduler:(RACScheduler *)scheduler; @end Pods/ReactiveCocoa/ReactiveCocoa/NSString+RACSupport.m
New file @@ -0,0 +1,35 @@ // // NSString+RACSupport.m // ReactiveCocoa // // Created by Josh Abernathy on 5/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "NSString+RACSupport.h" #import "RACReplaySubject.h" #import "RACScheduler.h" @implementation NSString (RACSupport) + (RACSignal *)rac_readContentsOfURL:(NSURL *)URL usedEncoding:(NSStringEncoding *)encoding scheduler:(RACScheduler *)scheduler { NSCParameterAssert(scheduler != nil); RACReplaySubject *subject = [RACReplaySubject subject]; [subject setNameWithFormat:@"+rac_readContentsOfURL: %@ usedEncoding:scheduler: %@", URL, scheduler]; [scheduler schedule:^{ NSError *error = nil; NSString *string = [NSString stringWithContentsOfURL:URL usedEncoding:encoding error:&error]; if (string == nil) { [subject sendError:error]; } else { [subject sendNext:string]; [subject sendCompleted]; } }]; return subject; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSURLConnection+RACSupport.h
New file @@ -0,0 +1,25 @@ // // NSURLConnection+RACSupport.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-01. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; @interface NSURLConnection (RACSupport) // Lazily loads data for the given request in the background. // // request - The URL request to load. This must not be nil. // // Returns a signal which will begin loading the request upon each subscription, // then send a `RACTuple` of the received `NSURLResponse` and downloaded // `NSData`, and complete on a background thread. If any errors occur, the // returned signal will error out. + (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request; @end Pods/ReactiveCocoa/ReactiveCocoa/NSURLConnection+RACSupport.m
New file @@ -0,0 +1,52 @@ // // NSURLConnection+RACSupport.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-01. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSURLConnection+RACSupport.h" #import "RACDisposable.h" #import "RACSignal.h" #import "RACSubscriber.h" #import "RACTuple.h" @implementation NSURLConnection (RACSupport) + (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request { NSCParameterAssert(request != nil); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.name = @"org.reactivecocoa.ReactiveCocoa.NSURLConnectionRACSupport"; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // The docs say that `nil` data means an error occurred, but // `nil` responses can also occur in practice (circumstances // unknown). Consider either to be an error. // // Note that _empty_ data is not necessarily erroneous, as there // may be headers but no HTTP body. if (response == nil || data == nil) { [subscriber sendError:error]; } else { [subscriber sendNext:RACTuplePack(response, data)]; [subscriber sendCompleted]; } }]; return [RACDisposable disposableWithBlock:^{ // It's not clear if this will actually cancel the connection, // but we can at least prevent _some_ unnecessary work -- // without writing all the code for a proper delegate, which // doesn't really belong in RAC. queue.suspended = YES; [queue cancelAllOperations]; }]; }] setNameWithFormat:@"+rac_sendAsynchronousRequest: %@", request]; } @end Pods/ReactiveCocoa/ReactiveCocoa/NSUserDefaults+RACSupport.h
New file @@ -0,0 +1,27 @@ // // NSUserDefaults+RACSupport.h // ReactiveCocoa // // Created by Matt Diephouse on 12/19/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACChannelTerminal; @interface NSUserDefaults (RACSupport) /// Creates and returns a terminal for binding the user defaults key. /// /// **Note:** The value in the user defaults is *asynchronously* updated with /// values sent to the channel. /// /// key - The user defaults key to create the channel terminal for. /// /// Returns a channel terminal that sends the value of the user defaults key /// upon subscription, sends an updated value whenever the default changes, and /// updates the default asynchronously with values it receives. - (RACChannelTerminal *)rac_channelTerminalForKey:(NSString *)key; @end Pods/ReactiveCocoa/ReactiveCocoa/NSUserDefaults+RACSupport.m
New file @@ -0,0 +1,56 @@ // // NSUserDefaults+RACSupport.m // ReactiveCocoa // // Created by Matt Diephouse on 12/19/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "NSUserDefaults+RACSupport.h" #import "RACEXTScope.h" #import "NSNotificationCenter+RACSupport.h" #import "NSObject+RACDeallocating.h" #import "RACChannel.h" #import "RACScheduler.h" #import "RACSignal+Operations.h" @implementation NSUserDefaults (RACSupport) - (RACChannelTerminal *)rac_channelTerminalForKey:(NSString *)key { RACChannel *channel = [RACChannel new]; RACScheduler *scheduler = [RACScheduler scheduler]; __block BOOL ignoreNextValue = NO; @weakify(self); [[[[[[[NSNotificationCenter.defaultCenter rac_addObserverForName:NSUserDefaultsDidChangeNotification object:self] map:^(id _) { @strongify(self); return [self objectForKey:key]; }] startWith:[self objectForKey:key]] // Don't send values that were set on the other side of the terminal. filter:^ BOOL (id _) { if (RACScheduler.currentScheduler == scheduler && ignoreNextValue) { ignoreNextValue = NO; return NO; } return YES; }] distinctUntilChanged] takeUntil:self.rac_willDeallocSignal] subscribe:channel.leadingTerminal]; [[channel.leadingTerminal deliverOn:scheduler] subscribeNext:^(id value) { @strongify(self); ignoreNextValue = YES; [self setObject:value forKey:key]; }]; return channel.followingTerminal; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACArraySequence.h
New file @@ -0,0 +1,18 @@ // // RACArraySequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACSequence.h" // Private class that adapts an array to the RACSequence interface. @interface RACArraySequence : RACSequence // Returns a sequence for enumerating over the given array, starting from the // given offset. The array will be copied to prevent mutation. + (instancetype)sequenceWithArray:(NSArray *)array offset:(NSUInteger)offset; @end Pods/ReactiveCocoa/ReactiveCocoa/RACArraySequence.m
New file @@ -0,0 +1,125 @@ // // RACArraySequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACArraySequence.h" @interface RACArraySequence () // Redeclared from the superclass and marked deprecated to prevent using `array` // where `backingArray` is intended. @property (nonatomic, copy, readonly) NSArray *array __attribute__((deprecated)); // The array being sequenced. @property (nonatomic, copy, readonly) NSArray *backingArray; // The index in the array from which the sequence starts. @property (nonatomic, assign, readonly) NSUInteger offset; @end @implementation RACArraySequence #pragma mark Lifecycle + (instancetype)sequenceWithArray:(NSArray *)array offset:(NSUInteger)offset { NSCParameterAssert(offset <= array.count); if (offset == array.count) return self.empty; RACArraySequence *seq = [[self alloc] init]; seq->_backingArray = [array copy]; seq->_offset = offset; return seq; } #pragma mark RACSequence - (id)head { return self.backingArray[self.offset]; } - (RACSequence *)tail { RACSequence *sequence = [self.class sequenceWithArray:self.backingArray offset:self.offset + 1]; sequence.name = self.name; return sequence; } #pragma mark NSFastEnumeration - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id[])stackbuf count:(NSUInteger)len { NSCParameterAssert(len > 0); if (state->state >= self.backingArray.count) { // Enumeration has completed. return 0; } if (state->state == 0) { state->state = self.offset; // Since a sequence doesn't mutate, this just needs to be set to // something non-NULL. state->mutationsPtr = state->extra; } state->itemsPtr = stackbuf; NSUInteger startIndex = state->state; NSUInteger index = 0; for (id value in self.backingArray) { // Constructing an index set for -enumerateObjectsAtIndexes: can actually be // slower than just skipping the items we don't care about. if (index < startIndex) { ++index; continue; } stackbuf[index - startIndex] = value; ++index; if (index - startIndex >= len) break; } NSCAssert(index > startIndex, @"Final index (%lu) should be greater than start index (%lu)", (unsigned long)index, (unsigned long)startIndex); state->state = index; return index - startIndex; } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (NSArray *)array { return [self.backingArray subarrayWithRange:NSMakeRange(self.offset, self.backingArray.count - self.offset)]; } #pragma clang diagnostic pop #pragma mark NSCoding - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self == nil) return nil; _backingArray = [coder decodeObjectForKey:@"array"]; _offset = 0; return self; } - (void)encodeWithCoder:(NSCoder *)coder { // Encoding is handled in RACSequence. [super encodeWithCoder:coder]; } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>{ name = %@, array = %@ }", self.class, self, self.name, self.backingArray]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACBehaviorSubject.h
New file @@ -0,0 +1,18 @@ // // RACBehaviorSubject.h // ReactiveCocoa // // Created by Josh Abernathy on 3/16/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubject.h" /// A behavior subject sends the last value it received when it is subscribed to. @interface RACBehaviorSubject : RACSubject /// Creates a new behavior subject with a default value. If it hasn't received /// any values when it gets subscribed to, it sends the default value. + (instancetype)behaviorSubjectWithDefaultValue:(id)value; @end Pods/ReactiveCocoa/ReactiveCocoa/RACBehaviorSubject.m
New file @@ -0,0 +1,56 @@ // // RACBehaviorSubject.m // ReactiveCocoa // // Created by Josh Abernathy on 3/16/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACBehaviorSubject.h" #import "RACDisposable.h" #import "RACScheduler+Private.h" @interface RACBehaviorSubject () // This property should only be used while synchronized on self. @property (nonatomic, strong) id currentValue; @end @implementation RACBehaviorSubject #pragma mark Lifecycle + (instancetype)behaviorSubjectWithDefaultValue:(id)value { RACBehaviorSubject *subject = [self subject]; subject.currentValue = value; return subject; } #pragma mark RACSignal - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { RACDisposable *subscriptionDisposable = [super subscribe:subscriber]; RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{ @synchronized (self) { [subscriber sendNext:self.currentValue]; } }]; return [RACDisposable disposableWithBlock:^{ [subscriptionDisposable dispose]; [schedulingDisposable dispose]; }]; } #pragma mark RACSubscriber - (void)sendNext:(id)value { @synchronized (self) { self.currentValue = value; [super sendNext:value]; } } @end Pods/ReactiveCocoa/ReactiveCocoa/RACBlockTrampoline.h
New file @@ -0,0 +1,30 @@ // // RACBlockTrampoline.h // ReactiveCocoa // // Created by Josh Abernathy on 10/21/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACTuple; // A private class that allows a limited type of dynamic block invocation. @interface RACBlockTrampoline : NSObject // Invokes the given block with the given arguments. All of the block's // argument types must be objects and it must be typed to return an object. // // At this time, it only supports blocks that take up to 15 arguments. Any more // is just cray. // // block - The block to invoke. Must accept as many arguments as are given in // the arguments array. Cannot be nil. // arguments - The arguments with which to invoke the block. `RACTupleNil`s will // be passed as nils. // // Returns the return value of invoking the block. + (id)invokeBlock:(id)block withArguments:(RACTuple *)arguments; @end Pods/ReactiveCocoa/ReactiveCocoa/RACBlockTrampoline.m
New file @@ -0,0 +1,156 @@ // // RACBlockTrampoline.m // ReactiveCocoa // // Created by Josh Abernathy on 10/21/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACBlockTrampoline.h" #import "RACTuple.h" @interface RACBlockTrampoline () @property (nonatomic, readonly, copy) id block; @end @implementation RACBlockTrampoline #pragma mark API - (id)initWithBlock:(id)block { self = [super init]; if (self == nil) return nil; _block = [block copy]; return self; } + (id)invokeBlock:(id)block withArguments:(RACTuple *)arguments { NSCParameterAssert(block != NULL); RACBlockTrampoline *trampoline = [[self alloc] initWithBlock:block]; return [trampoline invokeWithArguments:arguments]; } - (id)invokeWithArguments:(RACTuple *)arguments { SEL selector = [self selectorForArgumentCount:arguments.count]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:selector]]; invocation.selector = selector; invocation.target = self; for (NSUInteger i = 0; i < arguments.count; i++) { id arg = arguments[i]; NSInteger argIndex = (NSInteger)(i + 2); [invocation setArgument:&arg atIndex:argIndex]; } [invocation invoke]; __unsafe_unretained id returnVal; [invocation getReturnValue:&returnVal]; return returnVal; } - (SEL)selectorForArgumentCount:(NSUInteger)count { NSCParameterAssert(count > 0); switch (count) { case 0: return NULL; case 1: return @selector(performWith:); case 2: return @selector(performWith::); case 3: return @selector(performWith:::); case 4: return @selector(performWith::::); case 5: return @selector(performWith:::::); case 6: return @selector(performWith::::::); case 7: return @selector(performWith:::::::); case 8: return @selector(performWith::::::::); case 9: return @selector(performWith:::::::::); case 10: return @selector(performWith::::::::::); case 11: return @selector(performWith:::::::::::); case 12: return @selector(performWith::::::::::::); case 13: return @selector(performWith:::::::::::::); case 14: return @selector(performWith::::::::::::::); case 15: return @selector(performWith:::::::::::::::); } NSCAssert(NO, @"The argument count is too damn high! Only blocks of up to 15 arguments are currently supported."); return NULL; } - (id)performWith:(id)obj1 { id (^block)(id) = self.block; return block(obj1); } - (id)performWith:(id)obj1 :(id)obj2 { id (^block)(id, id) = self.block; return block(obj1, obj2); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 { id (^block)(id, id, id) = self.block; return block(obj1, obj2, obj3); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 { id (^block)(id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 { id (^block)(id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 { id (^block)(id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 { id (^block)(id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 { id (^block)(id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 { id (^block)(id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 { id (^block)(id, id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 { id (^block)(id, id, id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 { id (^block)(id, id, id, id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 :(id)obj13 { id (^block)(id, id, id, id, id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 :(id)obj13 :(id)obj14 { id (^block)(id, id, id, id, id, id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14); } - (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 :(id)obj13 :(id)obj14 :(id)obj15 { id (^block)(id, id, id, id, id, id, id, id, id, id, id, id, id, id, id) = self.block; return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15); } @end Pods/ReactiveCocoa/ReactiveCocoa/RACChannel.h
New file @@ -0,0 +1,70 @@ // // RACChannel.h // ReactiveCocoa // // Created by Uri Baghin on 01/01/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSignal.h" #import "RACSubscriber.h" @class RACChannelTerminal; /// A two-way channel. /// /// Conceptually, RACChannel can be thought of as a bidirectional connection, /// composed of two controllable signals that work in parallel. /// /// For example, when connecting between a view and a model: /// /// Model View /// `leadingTerminal` ------> `followingTerminal` /// `leadingTerminal` <------ `followingTerminal` /// /// The initial value of the model and all future changes to it are _sent on_ the /// `leadingTerminal`, and _received by_ subscribers of the `followingTerminal`. /// /// Likewise, whenever the user changes the value of the view, that value is sent /// on the `followingTerminal`, and received in the model from the /// `leadingTerminal`. However, the initial value of the view is not received /// from the `leadingTerminal` (only future changes). @interface RACChannel : NSObject /// The terminal which "leads" the channel, by sending its latest value /// immediately to new subscribers of the `followingTerminal`. /// /// New subscribers to this terminal will not receive a starting value, but will /// receive all future values that are sent to the `followingTerminal`. @property (nonatomic, strong, readonly) RACChannelTerminal *leadingTerminal; /// The terminal which "follows" the lead of the other terminal, only sending /// _future_ values to the subscribers of the `leadingTerminal`. /// /// The latest value sent to the `leadingTerminal` (if any) will be sent /// immediately to new subscribers of this terminal, and then all future values /// as well. @property (nonatomic, strong, readonly) RACChannelTerminal *followingTerminal; @end /// Represents one end of a RACChannel. /// /// An terminal is similar to a socket or pipe -- it represents one end of /// a connection (the RACChannel, in this case). Values sent to this terminal /// will _not_ be received by its subscribers. Instead, the values will be sent /// to the subscribers of the RACChannel's _other_ terminal. /// /// For example, when using the `followingTerminal`, _sent_ values can only be /// _received_ from the `leadingTerminal`, and vice versa. /// /// To make it easy to terminate a RACChannel, `error` and `completed` events /// sent to either terminal will be received by the subscribers of _both_ /// terminals. /// /// Do not instantiate this class directly. Create a RACChannel instead. @interface RACChannelTerminal : RACSignal <RACSubscriber> - (id)init __attribute__((unavailable("Instantiate a RACChannel instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACChannel.m
New file @@ -0,0 +1,90 @@ // // RACChannel.m // ReactiveCocoa // // Created by Uri Baghin on 01/01/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACChannel.h" #import "RACDisposable.h" #import "RACReplaySubject.h" #import "RACSignal+Operations.h" @interface RACChannelTerminal () // The values for this terminal. @property (nonatomic, strong, readonly) RACSignal *values; // A subscriber will will send values to the other terminal. @property (nonatomic, strong, readonly) id<RACSubscriber> otherTerminal; - (id)initWithValues:(RACSignal *)values otherTerminal:(id<RACSubscriber>)otherTerminal; @end @implementation RACChannel - (id)init { self = [super init]; if (self == nil) return nil; // We don't want any starting value from the leadingSubject, but we do want // error and completion to be replayed. RACReplaySubject *leadingSubject = [[RACReplaySubject replaySubjectWithCapacity:0] setNameWithFormat:@"leadingSubject"]; RACReplaySubject *followingSubject = [[RACReplaySubject replaySubjectWithCapacity:1] setNameWithFormat:@"followingSubject"]; // Propagate errors and completion to everything. [[leadingSubject ignoreValues] subscribe:followingSubject]; [[followingSubject ignoreValues] subscribe:leadingSubject]; _leadingTerminal = [[[RACChannelTerminal alloc] initWithValues:leadingSubject otherTerminal:followingSubject] setNameWithFormat:@"leadingTerminal"]; _followingTerminal = [[[RACChannelTerminal alloc] initWithValues:followingSubject otherTerminal:leadingSubject] setNameWithFormat:@"followingTerminal"]; return self; } @end @implementation RACChannelTerminal #pragma mark Lifecycle - (id)initWithValues:(RACSignal *)values otherTerminal:(id<RACSubscriber>)otherTerminal { NSCParameterAssert(values != nil); NSCParameterAssert(otherTerminal != nil); self = [super init]; if (self == nil) return nil; _values = values; _otherTerminal = otherTerminal; return self; } #pragma mark RACSignal - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { return [self.values subscribe:subscriber]; } #pragma mark <RACSubscriber> - (void)sendNext:(id)value { [self.otherTerminal sendNext:value]; } - (void)sendError:(NSError *)error { [self.otherTerminal sendError:error]; } - (void)sendCompleted { [self.otherTerminal sendCompleted]; } - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable { [self.otherTerminal didSubscribeWithDisposable:disposable]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACCommand.h
New file @@ -0,0 +1,123 @@ // // RACCommand.h // ReactiveCocoa // // Created by Josh Abernathy on 3/3/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; /// The domain for errors originating within `RACCommand`. extern NSString * const RACCommandErrorDomain; /// -execute: was invoked while the command was disabled. extern const NSInteger RACCommandErrorNotEnabled; /// A `userInfo` key for an error, associated with the `RACCommand` that the /// error originated from. /// /// This is included only when the error code is `RACCommandErrorNotEnabled`. extern NSString * const RACUnderlyingCommandErrorKey; /// A command is a signal triggered in response to some action, typically /// UI-related. @interface RACCommand : NSObject /// A signal of the signals returned by successful invocations of -execute: /// (i.e., while the receiver is `enabled`). /// /// Errors will be automatically caught upon the inner signals, and sent upon /// `errors` instead. If you _want_ to receive inner errors, use -execute: or /// -[RACSignal materialize]. /// /// Only executions that begin _after_ subscription will be sent upon this /// signal. All inner signals will arrive upon the main thread. @property (nonatomic, strong, readonly) RACSignal *executionSignals; /// A signal of whether this command is currently executing. /// /// This will send YES whenever -execute: is invoked and the created signal has /// not yet terminated. Once all executions have terminated, `executing` will /// send NO. /// /// This signal will send its current value upon subscription, and then all /// future values on the main thread. @property (nonatomic, strong, readonly) RACSignal *executing; /// A signal of whether this command is able to execute. /// /// This will send NO if: /// /// - The command was created with an `enabledSignal`, and NO is sent upon that /// signal, or /// - `allowsConcurrentExecution` is NO and the command has started executing. /// /// Once the above conditions are no longer met, the signal will send YES. /// /// This signal will send its current value upon subscription, and then all /// future values on the main thread. @property (nonatomic, strong, readonly) RACSignal *enabled; /// Forwards any errors that occur within signals returned by -execute:. /// /// When an error occurs on a signal returned from -execute:, this signal will /// send the associated NSError value as a `next` event (since an `error` event /// would terminate the stream). /// /// After subscription, this signal will send all future errors on the main /// thread. @property (nonatomic, strong, readonly) RACSignal *errors; /// Whether the command allows multiple executions to proceed concurrently. /// /// The default value for this property is NO. @property (atomic, assign) BOOL allowsConcurrentExecution; /// Invokes -initWithEnabled:signalBlock: with a nil `enabledSignal`. - (id)initWithSignalBlock:(RACSignal * (^)(id input))signalBlock; /// Initializes a command that is conditionally enabled. /// /// This is the designated initializer for this class. /// /// enabledSignal - A signal of BOOLs which indicate whether the command should /// be enabled. `enabled` will be based on the latest value sent /// from this signal. Before any values are sent, `enabled` will /// default to YES. This argument may be nil. /// signalBlock - A block which will map each input value (passed to -execute:) /// to a signal of work. The returned signal will be multicasted /// to a replay subject, sent on `executionSignals`, then /// subscribed to synchronously. Neither the block nor the /// returned signal may be nil. - (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock; /// If the receiver is enabled, this method will: /// /// 1. Invoke the `signalBlock` given at the time of initialization. /// 2. Multicast the returned signal to a RACReplaySubject. /// 3. Send the multicasted signal on `executionSignals`. /// 4. Subscribe (connect) to the original signal on the main thread. /// /// input - The input value to pass to the receiver's `signalBlock`. This may be /// nil. /// /// Returns the multicasted signal, after subscription. If the receiver is not /// enabled, returns a signal that will send an error with code /// RACCommandErrorNotEnabled. - (RACSignal *)execute:(id)input; @end @interface RACCommand (Unavailable) @property (atomic, readonly) BOOL canExecute __attribute__((unavailable("Use the 'enabled' signal instead"))); + (instancetype)command __attribute__((unavailable("Use -initWithSignalBlock: instead"))); + (instancetype)commandWithCanExecuteSignal:(RACSignal *)canExecuteSignal __attribute__((unavailable("Use -initWithEnabled:signalBlock: instead"))); - (id)initWithCanExecuteSignal:(RACSignal *)canExecuteSignal __attribute__((unavailable("Use -initWithEnabled:signalBlock: instead"))); - (RACSignal *)addSignalBlock:(RACSignal * (^)(id value))signalBlock __attribute__((unavailable("Pass the signalBlock to -initWithSignalBlock: instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACCommand.m
New file @@ -0,0 +1,267 @@ // // RACCommand.m // ReactiveCocoa // // Created by Josh Abernathy on 3/3/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACCommand.h" #import "RACEXTScope.h" #import "NSArray+RACSequenceAdditions.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import "NSObject+RACPropertySubscribing.h" #import "RACMulticastConnection.h" #import "RACReplaySubject.h" #import "RACScheduler.h" #import "RACSequence.h" #import "RACSignal+Operations.h" #import <libkern/OSAtomic.h> NSString * const RACCommandErrorDomain = @"RACCommandErrorDomain"; NSString * const RACUnderlyingCommandErrorKey = @"RACUnderlyingCommandErrorKey"; const NSInteger RACCommandErrorNotEnabled = 1; @interface RACCommand () { // The mutable array backing `activeExecutionSignals`. // // This should only be used while synchronized on `self`. NSMutableArray *_activeExecutionSignals; // Atomic backing variable for `allowsConcurrentExecution`. volatile uint32_t _allowsConcurrentExecution; } // An array of signals representing in-flight executions, in the order they // began. // // This property is KVO-compliant. @property (atomic, copy, readonly) NSArray *activeExecutionSignals; // `enabled`, but without a hop to the main thread. // // Values from this signal may arrive on any thread. @property (nonatomic, strong, readonly) RACSignal *immediateEnabled; // The signal block that the receiver was initialized with. @property (nonatomic, copy, readonly) RACSignal * (^signalBlock)(id input); // Adds a signal to `activeExecutionSignals` and generates a KVO notification. - (void)addActiveExecutionSignal:(RACSignal *)signal; // Removes a signal from `activeExecutionSignals` and generates a KVO // notification. - (void)removeActiveExecutionSignal:(RACSignal *)signal; @end @implementation RACCommand #pragma mark Properties - (BOOL)allowsConcurrentExecution { return _allowsConcurrentExecution != 0; } - (void)setAllowsConcurrentExecution:(BOOL)allowed { [self willChangeValueForKey:@keypath(self.allowsConcurrentExecution)]; if (allowed) { OSAtomicOr32Barrier(1, &_allowsConcurrentExecution); } else { OSAtomicAnd32Barrier(0, &_allowsConcurrentExecution); } [self didChangeValueForKey:@keypath(self.allowsConcurrentExecution)]; } - (NSArray *)activeExecutionSignals { @synchronized (self) { return [_activeExecutionSignals copy]; } } - (void)addActiveExecutionSignal:(RACSignal *)signal { NSCParameterAssert([signal isKindOfClass:RACSignal.class]); @synchronized (self) { // The KVO notification has to be generated while synchronized, because // it depends on the index remaining consistent. NSIndexSet *indexes = [NSIndexSet indexSetWithIndex:_activeExecutionSignals.count]; [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:@keypath(self.activeExecutionSignals)]; [_activeExecutionSignals addObject:signal]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:@keypath(self.activeExecutionSignals)]; } } - (void)removeActiveExecutionSignal:(RACSignal *)signal { NSCParameterAssert([signal isKindOfClass:RACSignal.class]); @synchronized (self) { // The indexes have to be calculated and the notification generated // while synchronized, because they depend on the indexes remaining // consistent. NSIndexSet *indexes = [_activeExecutionSignals indexesOfObjectsPassingTest:^ BOOL (RACSignal *obj, NSUInteger index, BOOL *stop) { return obj == signal; }]; if (indexes.count == 0) return; [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@keypath(self.activeExecutionSignals)]; [_activeExecutionSignals removeObjectsAtIndexes:indexes]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@keypath(self.activeExecutionSignals)]; } } #pragma mark Lifecycle - (id)init { NSCAssert(NO, @"Use -initWithSignalBlock: instead"); return nil; } - (id)initWithSignalBlock:(RACSignal * (^)(id input))signalBlock { return [self initWithEnabled:nil signalBlock:signalBlock]; } - (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock { NSCParameterAssert(signalBlock != nil); self = [super init]; if (self == nil) return nil; _activeExecutionSignals = [[NSMutableArray alloc] init]; _signalBlock = [signalBlock copy]; // A signal of additions to `activeExecutionSignals`. RACSignal *newActiveExecutionSignals = [[[[[self rac_valuesAndChangesForKeyPath:@keypath(self.activeExecutionSignals) options:NSKeyValueObservingOptionNew observer:nil] reduceEach:^(id _, NSDictionary *change) { NSArray *signals = change[NSKeyValueChangeNewKey]; if (signals == nil) return [RACSignal empty]; return [signals.rac_sequence signalWithScheduler:RACScheduler.immediateScheduler]; }] concat] publish] autoconnect]; _executionSignals = [[[newActiveExecutionSignals map:^(RACSignal *signal) { return [signal catchTo:[RACSignal empty]]; }] deliverOn:RACScheduler.mainThreadScheduler] setNameWithFormat:@"%@ -executionSignals", self]; // `errors` needs to be multicasted so that it picks up all // `activeExecutionSignals` that are added. // // In other words, if someone subscribes to `errors` _after_ an execution // has started, it should still receive any error from that execution. RACMulticastConnection *errorsConnection = [[[newActiveExecutionSignals flattenMap:^(RACSignal *signal) { return [[signal ignoreValues] catch:^(NSError *error) { return [RACSignal return:error]; }]; }] deliverOn:RACScheduler.mainThreadScheduler] publish]; _errors = [errorsConnection.signal setNameWithFormat:@"%@ -errors", self]; [errorsConnection connect]; RACSignal *immediateExecuting = [RACObserve(self, activeExecutionSignals) map:^(NSArray *activeSignals) { return @(activeSignals.count > 0); }]; _executing = [[[[[immediateExecuting deliverOn:RACScheduler.mainThreadScheduler] // This is useful before the first value arrives on the main thread. startWith:@NO] distinctUntilChanged] replayLast] setNameWithFormat:@"%@ -executing", self]; RACSignal *moreExecutionsAllowed = [RACSignal if:RACObserve(self, allowsConcurrentExecution) then:[RACSignal return:@YES] else:[immediateExecuting not]]; if (enabledSignal == nil) { enabledSignal = [RACSignal return:@YES]; } else { enabledSignal = [[[enabledSignal startWith:@YES] takeUntil:self.rac_willDeallocSignal] replayLast]; } _immediateEnabled = [[RACSignal combineLatest:@[ enabledSignal, moreExecutionsAllowed ]] and]; _enabled = [[[[[self.immediateEnabled take:1] concat:[[self.immediateEnabled skip:1] deliverOn:RACScheduler.mainThreadScheduler]] distinctUntilChanged] replayLast] setNameWithFormat:@"%@ -enabled", self]; return self; } #pragma mark Execution - (RACSignal *)execute:(id)input { // `immediateEnabled` is guaranteed to send a value upon subscription, so // -first is acceptable here. BOOL enabled = [[self.immediateEnabled first] boolValue]; if (!enabled) { NSError *error = [NSError errorWithDomain:RACCommandErrorDomain code:RACCommandErrorNotEnabled userInfo:@{ NSLocalizedDescriptionKey: NSLocalizedString(@"The command is disabled and cannot be executed", nil), RACUnderlyingCommandErrorKey: self }]; return [RACSignal error:error]; } RACSignal *signal = self.signalBlock(input); NSCAssert(signal != nil, @"nil signal returned from signal block for value: %@", input); // We subscribe to the signal on the main thread so that it occurs _after_ // -addActiveExecutionSignal: completes below. // // This means that `executing` and `enabled` will send updated values before // the signal actually starts performing work. RACMulticastConnection *connection = [[signal subscribeOn:RACScheduler.mainThreadScheduler] multicast:[RACReplaySubject subject]]; @weakify(self); [self addActiveExecutionSignal:connection.signal]; [connection.signal subscribeError:^(NSError *error) { @strongify(self); [self removeActiveExecutionSignal:connection.signal]; } completed:^{ @strongify(self); [self removeActiveExecutionSignal:connection.signal]; }]; [connection connect]; return [connection.signal setNameWithFormat:@"%@ -execute: %@", self, [input rac_description]]; } #pragma mark NSKeyValueObserving + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key { // Generate all KVO notifications manually to avoid the performance impact // of unnecessary swizzling. return NO; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACCompoundDisposable.h
New file @@ -0,0 +1,48 @@ // // RACCompoundDisposable.h // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACDisposable.h" /// A disposable of disposables. When it is disposed, it disposes of all its /// contained disposables. /// /// If -addDisposable: is called after the compound disposable has been disposed /// of, the given disposable is immediately disposed. This allows a compound /// disposable to act as a stand-in for a disposable that will be delivered /// asynchronously. @interface RACCompoundDisposable : RACDisposable /// Creates and returns a new compound disposable. + (instancetype)compoundDisposable; /// Creates and returns a new compound disposable containing the given /// disposables. + (instancetype)compoundDisposableWithDisposables:(NSArray *)disposables; /// Adds the given disposable. If the receiving disposable has already been /// disposed of, the given disposable is disposed immediately. /// /// This method is thread-safe. /// /// disposable - The disposable to add. This may be nil, in which case nothing /// happens. - (void)addDisposable:(RACDisposable *)disposable; /// Removes the specified disposable from the compound disposable (regardless of /// its disposed status), or does nothing if it's not in the compound disposable. /// /// This is mainly useful for limiting the memory usage of the compound /// disposable for long-running operations. /// /// This method is thread-safe. /// /// disposable - The disposable to remove. This argument may be nil (to make the /// use of weak references easier). - (void)removeDisposable:(RACDisposable *)disposable; @end Pods/ReactiveCocoa/ReactiveCocoa/RACCompoundDisposable.m
New file @@ -0,0 +1,239 @@ // // RACCompoundDisposable.m // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACCompoundDisposable.h" #import "RACCompoundDisposableProvider.h" #import <libkern/OSAtomic.h> // The number of child disposables for which space will be reserved directly in // `RACCompoundDisposable`. // // This number has been empirically determined to provide a good tradeoff // between performance, memory usage, and `RACCompoundDisposable` instance size // in a moderately complex GUI application. // // Profile any change! #define RACCompoundDisposableInlineCount 2 static CFMutableArrayRef RACCreateDisposablesArray(void) { // Compare values using only pointer equality. CFArrayCallBacks callbacks = kCFTypeArrayCallBacks; callbacks.equal = NULL; return CFArrayCreateMutable(NULL, 0, &callbacks); } @interface RACCompoundDisposable () { // Used for synchronization. OSSpinLock _spinLock; #if RACCompoundDisposableInlineCount // A fast array to the first N of the receiver's disposables. // // Once this is full, `_disposables` will be created and used for additional // disposables. // // This array should only be manipulated while _spinLock is held. RACDisposable *_inlineDisposables[RACCompoundDisposableInlineCount]; #endif // Contains the receiver's disposables. // // This array should only be manipulated while _spinLock is held. If // `_disposed` is YES, this may be NULL. CFMutableArrayRef _disposables; // Whether the receiver has already been disposed. // // This ivar should only be accessed while _spinLock is held. BOOL _disposed; } @end @implementation RACCompoundDisposable #pragma mark Properties - (BOOL)isDisposed { OSSpinLockLock(&_spinLock); BOOL disposed = _disposed; OSSpinLockUnlock(&_spinLock); return disposed; } #pragma mark Lifecycle + (instancetype)compoundDisposable { return [[self alloc] initWithDisposables:nil]; } + (instancetype)compoundDisposableWithDisposables:(NSArray *)disposables { return [[self alloc] initWithDisposables:disposables]; } - (id)initWithDisposables:(NSArray *)otherDisposables { self = [self init]; if (self == nil) return nil; #if RACCompoundDisposableInlineCount [otherDisposables enumerateObjectsUsingBlock:^(RACDisposable *disposable, NSUInteger index, BOOL *stop) { _inlineDisposables[index] = disposable; // Stop after this iteration if we've reached the end of the inlined // array. if (index == RACCompoundDisposableInlineCount - 1) *stop = YES; }]; #endif if (otherDisposables.count > RACCompoundDisposableInlineCount) { _disposables = RACCreateDisposablesArray(); CFRange range = CFRangeMake(RACCompoundDisposableInlineCount, (CFIndex)otherDisposables.count - RACCompoundDisposableInlineCount); CFArrayAppendArray(_disposables, (__bridge CFArrayRef)otherDisposables, range); } return self; } - (id)initWithBlock:(void (^)(void))block { RACDisposable *disposable = [RACDisposable disposableWithBlock:block]; return [self initWithDisposables:@[ disposable ]]; } - (void)dealloc { #if RACCompoundDisposableInlineCount for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { _inlineDisposables[i] = nil; } #endif if (_disposables != NULL) { CFRelease(_disposables); _disposables = NULL; } } #pragma mark Addition and Removal - (void)addDisposable:(RACDisposable *)disposable { NSCParameterAssert(disposable != self); if (disposable == nil || disposable.disposed) return; BOOL shouldDispose = NO; OSSpinLockLock(&_spinLock); { if (_disposed) { shouldDispose = YES; } else { #if RACCompoundDisposableInlineCount for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { if (_inlineDisposables[i] == nil) { _inlineDisposables[i] = disposable; goto foundSlot; } } #endif if (_disposables == NULL) _disposables = RACCreateDisposablesArray(); CFArrayAppendValue(_disposables, (__bridge void *)disposable); if (RACCOMPOUNDDISPOSABLE_ADDED_ENABLED()) { RACCOMPOUNDDISPOSABLE_ADDED(self.description.UTF8String, disposable.description.UTF8String, CFArrayGetCount(_disposables) + RACCompoundDisposableInlineCount); } #if RACCompoundDisposableInlineCount foundSlot:; #endif } } OSSpinLockUnlock(&_spinLock); // Performed outside of the lock in case the compound disposable is used // recursively. if (shouldDispose) [disposable dispose]; } - (void)removeDisposable:(RACDisposable *)disposable { if (disposable == nil) return; OSSpinLockLock(&_spinLock); { if (!_disposed) { #if RACCompoundDisposableInlineCount for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { if (_inlineDisposables[i] == disposable) _inlineDisposables[i] = nil; } #endif if (_disposables != NULL) { CFIndex count = CFArrayGetCount(_disposables); for (CFIndex i = count - 1; i >= 0; i--) { const void *item = CFArrayGetValueAtIndex(_disposables, i); if (item == (__bridge void *)disposable) { CFArrayRemoveValueAtIndex(_disposables, i); } } if (RACCOMPOUNDDISPOSABLE_REMOVED_ENABLED()) { RACCOMPOUNDDISPOSABLE_REMOVED(self.description.UTF8String, disposable.description.UTF8String, CFArrayGetCount(_disposables) + RACCompoundDisposableInlineCount); } } } } OSSpinLockUnlock(&_spinLock); } #pragma mark RACDisposable static void disposeEach(const void *value, void *context) { RACDisposable *disposable = (__bridge id)value; [disposable dispose]; } - (void)dispose { #if RACCompoundDisposableInlineCount RACDisposable *inlineCopy[RACCompoundDisposableInlineCount]; #endif CFArrayRef remainingDisposables = NULL; OSSpinLockLock(&_spinLock); { _disposed = YES; #if RACCompoundDisposableInlineCount for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { inlineCopy[i] = _inlineDisposables[i]; _inlineDisposables[i] = nil; } #endif remainingDisposables = _disposables; _disposables = NULL; } OSSpinLockUnlock(&_spinLock); #if RACCompoundDisposableInlineCount // Dispose outside of the lock in case the compound disposable is used // recursively. for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { [inlineCopy[i] dispose]; } #endif if (remainingDisposables == NULL) return; CFIndex count = CFArrayGetCount(remainingDisposables); CFArrayApplyFunction(remainingDisposables, CFRangeMake(0, count), &disposeEach, NULL); CFRelease(remainingDisposables); } @end Pods/ReactiveCocoa/ReactiveCocoa/RACCompoundDisposableProvider.d
New file @@ -0,0 +1,4 @@ provider RACCompoundDisposable { probe added(char *compoundDisposable, char *disposable, long newTotal); probe removed(char *compoundDisposable, char *disposable, long newTotal); }; Pods/ReactiveCocoa/ReactiveCocoa/RACDelegateProxy.h
New file @@ -0,0 +1,28 @@ // // RACDelegateProxy.h // ReactiveCocoa // // Created by Cody Krieger on 5/19/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACSignal; // A private delegate object suitable for using // -rac_signalForSelector:fromProtocol: upon. @interface RACDelegateProxy : NSObject // The delegate to which messages should be forwarded if not handled by // any -signalForSelector: applications. @property (nonatomic, unsafe_unretained) id rac_proxiedDelegate; // Creates a delegate proxy capable of responding to selectors from `protocol`. - (instancetype)initWithProtocol:(Protocol *)protocol; // Calls -rac_signalForSelector:fromProtocol: using the `protocol` specified // during initialization. - (RACSignal *)signalForSelector:(SEL)selector; @end Pods/ReactiveCocoa/ReactiveCocoa/RACDelegateProxy.m
New file @@ -0,0 +1,76 @@ // // RACDelegateProxy.m // ReactiveCocoa // // Created by Cody Krieger on 5/19/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACDelegateProxy.h" #import "NSObject+RACSelectorSignal.h" #import <objc/runtime.h> @interface RACDelegateProxy () { // Declared as an ivar to avoid method naming conflicts. Protocol *_protocol; } @end @implementation RACDelegateProxy #pragma mark Lifecycle - (instancetype)initWithProtocol:(Protocol *)protocol { NSCParameterAssert(protocol != NULL); self = [super init]; if (self == nil) return nil; class_addProtocol(self.class, protocol); _protocol = protocol; return self; } #pragma mark API - (RACSignal *)signalForSelector:(SEL)selector { return [self rac_signalForSelector:selector fromProtocol:_protocol]; } #pragma mark NSObject - (BOOL)isProxy { return YES; } - (void)forwardInvocation:(NSInvocation *)invocation { [invocation invokeWithTarget:self.rac_proxiedDelegate]; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { // Look for the selector as an optional instance method. struct objc_method_description methodDescription = protocol_getMethodDescription(_protocol, selector, NO, YES); if (methodDescription.name == NULL) { // Then fall back to looking for a required instance // method. methodDescription = protocol_getMethodDescription(_protocol, selector, YES, YES); if (methodDescription.name == NULL) return [super methodSignatureForSelector:selector]; } return [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; } - (BOOL)respondsToSelector:(SEL)selector { // Add the delegate to the autorelease pool, so it doesn't get deallocated // between this method call and -forwardInvocation:. __autoreleasing id delegate = self.rac_proxiedDelegate; if ([delegate respondsToSelector:selector]) return YES; return [super respondsToSelector:selector]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACDisposable.h
New file @@ -0,0 +1,35 @@ // // RACDisposable.h // ReactiveCocoa // // Created by Josh Abernathy on 3/16/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACScopedDisposable; /// A disposable encapsulates the work necessary to tear down and cleanup a /// subscription. @interface RACDisposable : NSObject /// Whether the receiver has been disposed. /// /// Use of this property is discouraged, since it may be set to `YES` /// concurrently at any time. /// /// This property is not KVO-compliant. @property (atomic, assign, getter = isDisposed, readonly) BOOL disposed; + (instancetype)disposableWithBlock:(void (^)(void))block; /// Performs the disposal work. Can be called multiple times, though subsequent /// calls won't do anything. - (void)dispose; /// Returns a new disposable which will dispose of this disposable when it gets /// dealloc'd. - (RACScopedDisposable *)asScopedDisposable; @end Pods/ReactiveCocoa/ReactiveCocoa/RACDisposable.m
New file @@ -0,0 +1,92 @@ // // RACDisposable.m // ReactiveCocoa // // Created by Josh Abernathy on 3/16/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACDisposable.h" #import "RACScopedDisposable.h" #import <libkern/OSAtomic.h> @interface RACDisposable () { // A copied block of type void (^)(void) containing the logic for disposal, // a pointer to `self` if no logic should be performed upon disposal, or // NULL if the receiver is already disposed. // // This should only be used atomically. void * volatile _disposeBlock; } @end @implementation RACDisposable #pragma mark Properties - (BOOL)isDisposed { return _disposeBlock == NULL; } #pragma mark Lifecycle - (id)init { self = [super init]; if (self == nil) return nil; _disposeBlock = (__bridge void *)self; OSMemoryBarrier(); return self; } - (id)initWithBlock:(void (^)(void))block { NSCParameterAssert(block != nil); self = [super init]; if (self == nil) return nil; _disposeBlock = (void *)CFBridgingRetain([block copy]); OSMemoryBarrier(); return self; } + (instancetype)disposableWithBlock:(void (^)(void))block { return [[self alloc] initWithBlock:block]; } - (void)dealloc { if (_disposeBlock == NULL || _disposeBlock == (__bridge void *)self) return; CFRelease(_disposeBlock); _disposeBlock = NULL; } #pragma mark Disposal - (void)dispose { void (^disposeBlock)(void) = NULL; while (YES) { void *blockPtr = _disposeBlock; if (OSAtomicCompareAndSwapPtrBarrier(blockPtr, NULL, &_disposeBlock)) { if (blockPtr != (__bridge void *)self) { disposeBlock = CFBridgingRelease(blockPtr); } break; } } if (disposeBlock != nil) disposeBlock(); } #pragma mark Scoped Disposables - (RACScopedDisposable *)asScopedDisposable { return [RACScopedDisposable scopedDisposableWithDisposable:self]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACDynamicSequence.h
New file @@ -0,0 +1,20 @@ // // RACDynamicSequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACSequence.h" // Private class that implements a sequence dynamically using blocks. @interface RACDynamicSequence : RACSequence // Returns a sequence which evaluates `dependencyBlock` only once, the first // time either `headBlock` or `tailBlock` is evaluated. The result of // `dependencyBlock` will be passed into `headBlock` and `tailBlock` when // invoked. + (RACSequence *)sequenceWithLazyDependency:(id (^)(void))dependencyBlock headBlock:(id (^)(id dependency))headBlock tailBlock:(RACSequence *(^)(id dependency))tailBlock; @end Pods/ReactiveCocoa/ReactiveCocoa/RACDynamicSequence.m
New file @@ -0,0 +1,197 @@ // // RACDynamicSequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACDynamicSequence.h" #import <libkern/OSAtomic.h> // Determines how RACDynamicSequences will be deallocated before the next one is // shifted onto the autorelease pool. // // This avoids stack overflows when deallocating long chains of dynamic // sequences. #define DEALLOC_OVERFLOW_GUARD 100 @interface RACDynamicSequence () { // The value for the "head" property, if it's been evaluated already. // // Because it's legal for head to be nil, this ivar is valid any time // headBlock is nil. // // This ivar should only be accessed while synchronized on self. id _head; // The value for the "tail" property, if it's been evaluated already. // // Because it's legal for tail to be nil, this ivar is valid any time // tailBlock is nil. // // This ivar should only be accessed while synchronized on self. RACSequence *_tail; // The result of an evaluated `dependencyBlock`. // // This ivar is valid any time `hasDependency` is YES and `dependencyBlock` // is nil. // // This ivar should only be accessed while synchronized on self. id _dependency; } // A block used to evaluate head. This should be set to nil after `_head` has been // initialized. // // This is marked `strong` instead of `copy` because of some bizarre block // copying bug. See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/506. // // The signature of this block varies based on the value of `hasDependency`: // // - If YES, this block is of type `id (^)(id)`. // - If NO, this block is of type `id (^)(void)`. // // This property should only be accessed while synchronized on self. @property (nonatomic, strong) id headBlock; // A block used to evaluate tail. This should be set to nil after `_tail` has been // initialized. // // This is marked `strong` instead of `copy` because of some bizarre block // copying bug. See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/506. // // The signature of this block varies based on the value of `hasDependency`: // // - If YES, this block is of type `RACSequence * (^)(id)`. // - If NO, this block is of type `RACSequence * (^)(void)`. // // This property should only be accessed while synchronized on self. @property (nonatomic, strong) id tailBlock; // Whether the receiver was initialized with a `dependencyBlock`. // // This property should only be accessed while synchronized on self. @property (nonatomic, assign) BOOL hasDependency; // A dependency which must be evaluated before `headBlock` and `tailBlock`. This // should be set to nil after `_dependency` and `dependencyBlockExecuted` have // been set. // // This is marked `strong` instead of `copy` because of some bizarre block // copying bug. See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/506. // // This property should only be accessed while synchronized on self. @property (nonatomic, strong) id (^dependencyBlock)(void); @end @implementation RACDynamicSequence #pragma mark Lifecycle + (RACSequence *)sequenceWithHeadBlock:(id (^)(void))headBlock tailBlock:(RACSequence *(^)(void))tailBlock { NSCParameterAssert(headBlock != nil); RACDynamicSequence *seq = [[RACDynamicSequence alloc] init]; seq.headBlock = [headBlock copy]; seq.tailBlock = [tailBlock copy]; seq.hasDependency = NO; return seq; } + (RACSequence *)sequenceWithLazyDependency:(id (^)(void))dependencyBlock headBlock:(id (^)(id dependency))headBlock tailBlock:(RACSequence *(^)(id dependency))tailBlock { NSCParameterAssert(dependencyBlock != nil); NSCParameterAssert(headBlock != nil); RACDynamicSequence *seq = [[RACDynamicSequence alloc] init]; seq.headBlock = [headBlock copy]; seq.tailBlock = [tailBlock copy]; seq.dependencyBlock = [dependencyBlock copy]; seq.hasDependency = YES; return seq; } - (void)dealloc { static volatile int32_t directDeallocCount = 0; if (OSAtomicIncrement32(&directDeallocCount) >= DEALLOC_OVERFLOW_GUARD) { OSAtomicAdd32(-DEALLOC_OVERFLOW_GUARD, &directDeallocCount); // Put this sequence's tail onto the autorelease pool so we stop // recursing. __autoreleasing RACSequence *tail __attribute__((unused)) = _tail; } _tail = nil; } #pragma mark RACSequence - (id)head { @synchronized (self) { id untypedHeadBlock = self.headBlock; if (untypedHeadBlock == nil) return _head; if (self.hasDependency) { if (self.dependencyBlock != nil) { _dependency = self.dependencyBlock(); self.dependencyBlock = nil; } id (^headBlock)(id) = untypedHeadBlock; _head = headBlock(_dependency); } else { id (^headBlock)(void) = untypedHeadBlock; _head = headBlock(); } self.headBlock = nil; return _head; } } - (RACSequence *)tail { @synchronized (self) { id untypedTailBlock = self.tailBlock; if (untypedTailBlock == nil) return _tail; if (self.hasDependency) { if (self.dependencyBlock != nil) { _dependency = self.dependencyBlock(); self.dependencyBlock = nil; } RACSequence * (^tailBlock)(id) = untypedTailBlock; _tail = tailBlock(_dependency); } else { RACSequence * (^tailBlock)(void) = untypedTailBlock; _tail = tailBlock(); } if (_tail.name == nil) _tail.name = self.name; self.tailBlock = nil; return _tail; } } #pragma mark NSObject - (NSString *)description { id head = @"(unresolved)"; id tail = @"(unresolved)"; @synchronized (self) { if (self.headBlock == nil) head = _head; if (self.tailBlock == nil) { tail = _tail; if (tail == self) tail = @"(self)"; } } return [NSString stringWithFormat:@"<%@: %p>{ name = %@, head = %@, tail = %@ }", self.class, self, self.name, head, tail]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACDynamicSignal.h
New file @@ -0,0 +1,17 @@ // // RACDynamicSignal.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSignal.h" // A private `RACSignal` subclasses that implements its subscription behavior // using a block. @interface RACDynamicSignal : RACSignal + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe; @end Pods/ReactiveCocoa/ReactiveCocoa/RACDynamicSignal.m
New file @@ -0,0 +1,54 @@ // // RACDynamicSignal.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACDynamicSignal.h" #import "RACEXTScope.h" #import "RACCompoundDisposable.h" #import "RACPassthroughSubscriber.h" #import "RACScheduler+Private.h" #import "RACSubscriber.h" #import <libkern/OSAtomic.h> @interface RACDynamicSignal () // The block to invoke for each subscriber. @property (nonatomic, copy, readonly) RACDisposable * (^didSubscribe)(id<RACSubscriber> subscriber); @end @implementation RACDynamicSignal #pragma mark Lifecycle + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe { RACDynamicSignal *signal = [[self alloc] init]; signal->_didSubscribe = [didSubscribe copy]; return [signal setNameWithFormat:@"+createSignal:"]; } #pragma mark Managing Subscribers - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { NSCParameterAssert(subscriber != nil); RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable]; if (self.didSubscribe != NULL) { RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{ RACDisposable *innerDisposable = self.didSubscribe(subscriber); [disposable addDisposable:innerDisposable]; }]; [disposable addDisposable:schedulingDisposable]; } return disposable; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACEagerSequence.h
New file @@ -0,0 +1,14 @@ // // RACEagerSequence.h // ReactiveCocoa // // Created by Uri Baghin on 02/01/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACArraySequence.h" // Private class that implements an eager sequence. @interface RACEagerSequence : RACArraySequence @end Pods/ReactiveCocoa/ReactiveCocoa/RACEagerSequence.m
New file @@ -0,0 +1,66 @@ // // RACEagerSequence.m // ReactiveCocoa // // Created by Uri Baghin on 02/01/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACEagerSequence.h" #import "NSObject+RACDescription.h" #import "RACArraySequence.h" @implementation RACEagerSequence #pragma mark RACStream + (instancetype)return:(id)value { return [[self sequenceWithArray:@[ value ] offset:0] setNameWithFormat:@"+return: %@", [value rac_description]]; } - (instancetype)bind:(RACStreamBindBlock (^)(void))block { NSCParameterAssert(block != nil); RACStreamBindBlock bindBlock = block(); NSArray *currentArray = self.array; NSMutableArray *resultArray = [NSMutableArray arrayWithCapacity:currentArray.count]; for (id value in currentArray) { BOOL stop = NO; RACSequence *boundValue = (id)bindBlock(value, &stop); if (boundValue == nil) break; for (id x in boundValue) { [resultArray addObject:x]; } if (stop) break; } return [[self.class sequenceWithArray:resultArray offset:0] setNameWithFormat:@"[%@] -bind:", self.name]; } - (instancetype)concat:(RACSequence *)sequence { NSCParameterAssert(sequence != nil); NSCParameterAssert([sequence isKindOfClass:RACSequence.class]); NSArray *array = [self.array arrayByAddingObjectsFromArray:sequence.array]; return [[self.class sequenceWithArray:array offset:0] setNameWithFormat:@"[%@] -concat: %@", self.name, sequence]; } #pragma mark Extended methods - (RACSequence *)eagerSequence { return self; } - (RACSequence *)lazySequence { return [RACArraySequence sequenceWithArray:self.array offset:0]; } - (id)foldRightWithStart:(id)start reduce:(id (^)(id, RACSequence *rest))reduce { return [super foldRightWithStart:start reduce:^(id first, RACSequence *rest) { return reduce(first, rest.eagerSequence); }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACEmptySequence.h
New file @@ -0,0 +1,14 @@ // // RACEmptySequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACSequence.h" // Private class representing an empty sequence. @interface RACEmptySequence : RACSequence @end Pods/ReactiveCocoa/ReactiveCocoa/RACEmptySequence.m
New file @@ -0,0 +1,71 @@ // // RACEmptySequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACEmptySequence.h" @implementation RACEmptySequence #pragma mark Lifecycle + (instancetype)empty { static id singleton; static dispatch_once_t pred; dispatch_once(&pred, ^{ singleton = [[self alloc] init]; }); return singleton; } #pragma mark RACSequence - (id)head { return nil; } - (RACSequence *)tail { return nil; } - (RACSequence *)bind:(RACStreamBindBlock)bindBlock passingThroughValuesFromSequence:(RACSequence *)passthroughSequence { return passthroughSequence ?: self; } #pragma mark NSCoding - (Class)classForCoder { // Empty sequences should be encoded as themselves, not array sequences. return self.class; } - (id)initWithCoder:(NSCoder *)coder { // Return the singleton. return self.class.empty; } - (void)encodeWithCoder:(NSCoder *)coder { } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>{ name = %@ }", self.class, self, self.name]; } - (NSUInteger)hash { // This hash isn't ideal, but it's better than -[RACSequence hash], which // would just be zero because we have no head. return (NSUInteger)(__bridge void *)self; } - (BOOL)isEqual:(RACSequence *)seq { return (self == seq); } @end Pods/ReactiveCocoa/ReactiveCocoa/RACEmptySignal.h
New file @@ -0,0 +1,17 @@ // // RACEmptySignal.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSignal.h" // A private `RACSignal` subclasses that synchronously sends completed to any // subscribers. @interface RACEmptySignal : RACSignal + (RACSignal *)empty; @end Pods/ReactiveCocoa/ReactiveCocoa/RACEmptySignal.m
New file @@ -0,0 +1,62 @@ // // RACEmptySignal.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACEmptySignal.h" #import "RACScheduler+Private.h" #import "RACSubscriber.h" @implementation RACEmptySignal #pragma mark Properties // Only allow this signal's name to be customized in DEBUG, since it's // a singleton in release builds (see +empty). - (void)setName:(NSString *)name { #ifdef DEBUG [super setName:name]; #endif } - (NSString *)name { #ifdef DEBUG return super.name; #else return @"+empty"; #endif } #pragma mark Lifecycle + (RACSignal *)empty { #ifdef DEBUG // Create multiple instances of this class in DEBUG so users can set custom // names on each. return [[[self alloc] init] setNameWithFormat:@"+empty"]; #else static id singleton; static dispatch_once_t pred; dispatch_once(&pred, ^{ singleton = [[self alloc] init]; }); return singleton; #endif } #pragma mark Subscription - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { NSCParameterAssert(subscriber != nil); return [RACScheduler.subscriptionScheduler schedule:^{ [subscriber sendCompleted]; }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACErrorSignal.h
New file @@ -0,0 +1,17 @@ // // RACErrorSignal.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSignal.h" // A private `RACSignal` subclasses that synchronously sends an error to any // subscribers. @interface RACErrorSignal : RACSignal + (RACSignal *)error:(NSError *)error; @end Pods/ReactiveCocoa/ReactiveCocoa/RACErrorSignal.m
New file @@ -0,0 +1,47 @@ // // RACErrorSignal.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACErrorSignal.h" #import "RACScheduler+Private.h" #import "RACSubscriber.h" @interface RACErrorSignal () // The error to send upon subscription. @property (nonatomic, strong, readonly) NSError *error; @end @implementation RACErrorSignal #pragma mark Lifecycle + (RACSignal *)error:(NSError *)error { RACErrorSignal *signal = [[self alloc] init]; signal->_error = error; #ifdef DEBUG [signal setNameWithFormat:@"+error: %@", error]; #else signal.name = @"+error:"; #endif return signal; } #pragma mark Subscription - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { NSCParameterAssert(subscriber != nil); return [RACScheduler.subscriptionScheduler schedule:^{ [subscriber sendError:self.error]; }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACEvent.h
New file @@ -0,0 +1,51 @@ // // RACEvent.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-01-07. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> /// Describes the type of a RACEvent. /// /// RACEventTypeCompleted - A `completed` event. /// RACEventTypeError - An `error` event. /// RACEventTypeNext - A `next` event. typedef enum : NSUInteger { RACEventTypeCompleted, RACEventTypeError, RACEventTypeNext } RACEventType; /// Represents an event sent by a RACSignal. /// /// This corresponds to the `Notification` class in Rx. @interface RACEvent : NSObject <NSCopying> /// Returns a singleton RACEvent representing the `completed` event. + (instancetype)completedEvent; /// Returns a new event of type RACEventTypeError, containing the given error. + (instancetype)eventWithError:(NSError *)error; /// Returns a new event of type RACEventTypeNext, containing the given value. + (instancetype)eventWithValue:(id)value; /// The type of event represented by the receiver. @property (nonatomic, assign, readonly) RACEventType eventType; /// Returns whether the receiver is of type RACEventTypeCompleted or /// RACEventTypeError. @property (nonatomic, getter = isFinished, assign, readonly) BOOL finished; /// The error associated with an event of type RACEventTypeError. This will be /// nil for all other event types. @property (nonatomic, strong, readonly) NSError *error; /// The value associated with an event of type RACEventTypeNext. This will be /// nil for all other event types. @property (nonatomic, strong, readonly) id value; @end Pods/ReactiveCocoa/ReactiveCocoa/RACEvent.m
New file @@ -0,0 +1,113 @@ // // RACEvent.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-01-07. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACEvent.h" @interface RACEvent () // An object associated with this event. This will be used for the error and // value properties. @property (nonatomic, strong, readonly) id object; // Initializes the receiver with the given type and object. - (id)initWithEventType:(RACEventType)type object:(id)object; @end @implementation RACEvent #pragma mark Properties - (BOOL)isFinished { return self.eventType == RACEventTypeCompleted || self.eventType == RACEventTypeError; } - (NSError *)error { return (self.eventType == RACEventTypeError ? self.object : nil); } - (id)value { return (self.eventType == RACEventTypeNext ? self.object : nil); } #pragma mark Lifecycle + (instancetype)completedEvent { static dispatch_once_t pred; static id singleton; dispatch_once(&pred, ^{ singleton = [[self alloc] initWithEventType:RACEventTypeCompleted object:nil]; }); return singleton; } + (instancetype)eventWithError:(NSError *)error { return [[self alloc] initWithEventType:RACEventTypeError object:error]; } + (instancetype)eventWithValue:(id)value { return [[self alloc] initWithEventType:RACEventTypeNext object:value]; } - (id)initWithEventType:(RACEventType)type object:(id)object { self = [super init]; if (self == nil) return nil; _eventType = type; _object = object; return self; } #pragma mark NSCopying - (id)copyWithZone:(NSZone *)zone { return self; } #pragma mark NSObject - (NSString *)description { NSString *eventDescription = nil; switch (self.eventType) { case RACEventTypeCompleted: eventDescription = @"completed"; break; case RACEventTypeError: eventDescription = [NSString stringWithFormat:@"error = %@", self.object]; break; case RACEventTypeNext: eventDescription = [NSString stringWithFormat:@"next = %@", self.object]; break; default: NSCAssert(NO, @"Unrecognized event type: %i", (int)self.eventType); } return [NSString stringWithFormat:@"<%@: %p>{ %@ }", self.class, self, eventDescription]; } - (NSUInteger)hash { return self.eventType ^ [self.object hash]; } - (BOOL)isEqual:(id)event { if (event == self) return YES; if (![event isKindOfClass:RACEvent.class]) return NO; if (self.eventType != [event eventType]) return NO; // Catches the nil case too. return self.object == [event object] || [self.object isEqual:[event object]]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACGroupedSignal.h
New file @@ -0,0 +1,19 @@ // // RACGroupedSignal.h // ReactiveCocoa // // Created by Josh Abernathy on 5/2/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubject.h" /// A grouped signal is used by -[RACSignal groupBy:transform:]. @interface RACGroupedSignal : RACSubject /// The key shared by the group. @property (nonatomic, readonly, copy) id<NSCopying> key; + (instancetype)signalWithKey:(id<NSCopying>)key; @end Pods/ReactiveCocoa/ReactiveCocoa/RACGroupedSignal.m
New file @@ -0,0 +1,25 @@ // // RACGroupedSignal.m // ReactiveCocoa // // Created by Josh Abernathy on 5/2/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACGroupedSignal.h" @interface RACGroupedSignal () @property (nonatomic, copy) id<NSCopying> key; @end @implementation RACGroupedSignal #pragma mark API + (instancetype)signalWithKey:(id<NSCopying>)key { RACGroupedSignal *subject = [self subject]; subject.key = key; return subject; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACImmediateScheduler.h
New file @@ -0,0 +1,14 @@ // // RACImmediateScheduler.h // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACScheduler.h" // A private scheduler which immediately executes its scheduled blocks. @interface RACImmediateScheduler : RACScheduler @end Pods/ReactiveCocoa/ReactiveCocoa/RACImmediateScheduler.m
New file @@ -0,0 +1,54 @@ // // RACImmediateScheduler.m // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACImmediateScheduler.h" #import "RACScheduler+Private.h" @implementation RACImmediateScheduler #pragma mark Lifecycle - (id)init { return [super initWithName:@"com.ReactiveCocoa.RACScheduler.immediateScheduler"]; } #pragma mark RACScheduler - (RACDisposable *)schedule:(void (^)(void))block { NSCParameterAssert(block != NULL); block(); return nil; } - (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { NSCParameterAssert(date != nil); NSCParameterAssert(block != NULL); [NSThread sleepUntilDate:date]; block(); return nil; } - (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { NSCAssert(NO, @"+[RACScheduler immediateScheduler] does not support %@.", NSStringFromSelector(_cmd)); return nil; } - (RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock { for (__block NSUInteger remaining = 1; remaining > 0; remaining--) { recursiveBlock(^{ remaining++; }); } return nil; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACIndexSetSequence.h
New file @@ -0,0 +1,16 @@ // // RACIndexSetSequence.h // ReactiveCocoa // // Created by Sergey Gavrilyuk on 12/18/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSequence.h" // Private class that adapts an array to the RACSequence interface. @interface RACIndexSetSequence : RACSequence + (instancetype)sequenceWithIndexSet:(NSIndexSet *)indexSet; @end Pods/ReactiveCocoa/ReactiveCocoa/RACIndexSetSequence.m
New file @@ -0,0 +1,111 @@ // // RACIndexSetSequence.m // ReactiveCocoa // // Created by Sergey Gavrilyuk on 12/18/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACIndexSetSequence.h" @interface RACIndexSetSequence () // A buffer holding the `NSUInteger` values to enumerate over. // // This is mostly used for memory management. Most access should go through // `indexes` instead. @property (nonatomic, strong, readonly) NSData *data; // The indexes that this sequence should enumerate. @property (nonatomic, readonly) const NSUInteger *indexes; // The number of indexes to enumerate. @property (nonatomic, readonly) NSUInteger count; @end @implementation RACIndexSetSequence #pragma mark Lifecycle + (instancetype)sequenceWithIndexSet:(NSIndexSet *)indexSet { NSUInteger count = indexSet.count; if (count == 0) return self.empty; NSUInteger sizeInBytes = sizeof(NSUInteger) * count; NSMutableData *data = [[NSMutableData alloc] initWithCapacity:sizeInBytes]; [indexSet getIndexes:data.mutableBytes maxCount:count inIndexRange:NULL]; RACIndexSetSequence *seq = [[self alloc] init]; seq->_data = data; seq->_indexes = data.bytes; seq->_count = count; return seq; } + (instancetype)sequenceWithIndexSetSequence:(RACIndexSetSequence *)indexSetSequence offset:(NSUInteger)offset { NSCParameterAssert(offset < indexSetSequence.count); RACIndexSetSequence *seq = [[self alloc] init]; seq->_data = indexSetSequence.data; seq->_indexes = indexSetSequence.indexes + offset; seq->_count = indexSetSequence.count - offset; return seq; } #pragma mark RACSequence - (id)head { return @(self.indexes[0]); } - (RACSequence *)tail { if (self.count <= 1) return [RACSequence empty]; return [self.class sequenceWithIndexSetSequence:self offset:1]; } #pragma mark NSFastEnumeration - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id[])stackbuf count:(NSUInteger)len { NSCParameterAssert(len > 0); if (state->state >= self.count) { // Enumeration has completed. return 0; } if (state->state == 0) { // Enumeration begun, mark the mutation flag. state->mutationsPtr = state->extra; } state->itemsPtr = stackbuf; unsigned long index = 0; while (index < MIN(self.count - state->state, len)) { stackbuf[index] = @(self.indexes[index + state->state]); ++index; } state->state += index; return index; } #pragma mark NSObject - (NSString *)description { NSMutableString *indexesStr = [NSMutableString string]; for (unsigned int i = 0; i < self.count; ++i) { if (i > 0) [indexesStr appendString:@", "]; [indexesStr appendFormat:@"%lu", (unsigned long)self.indexes[i]]; } return [NSString stringWithFormat:@"<%@: %p>{ name = %@, indexes = %@ }", self.class, self, self.name, indexesStr]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACKVOChannel.h
New file @@ -0,0 +1,97 @@ // // RACKVOChannel.h // ReactiveCocoa // // Created by Uri Baghin on 27/12/2012. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACChannel.h" #import "RACEXTKeyPathCoding.h" #import "RACmetamacros.h" /// Creates a RACKVOChannel to the given key path. When the targeted object /// deallocates, the channel will complete. /// /// If RACChannelTo() is used as an expression, it returns a RACChannelTerminal that /// can be used to watch the specified property for changes, and set new values /// for it. The terminal will start with the property's current value upon /// subscription. /// /// If RACChannelTo() is used on the left-hand side of an assignment, there must a /// RACChannelTerminal on the right-hand side of the assignment. The two will be /// subscribed to one another: the property's value is immediately set to the /// value of the channel terminal on the right-hand side, and subsequent changes /// to either terminal will be reflected on the other. /// /// There are two different versions of this macro: /// /// - RACChannelTo(TARGET, KEYPATH, NILVALUE) will create a channel to the `KEYPATH` /// of `TARGET`. If the terminal is ever sent a `nil` value, the property will /// be set to `NILVALUE` instead. `NILVALUE` may itself be `nil` for object /// properties, but an NSValue should be used for primitive properties, to /// avoid an exception if `nil` is sent (which might occur if an intermediate /// object is set to `nil`). /// - RACChannelTo(TARGET, KEYPATH) is the same as the above, but `NILVALUE` defaults to /// `nil`. /// /// Examples /// /// RACChannelTerminal *integerChannel = RACChannelTo(self, integerProperty, @42); /// /// // Sets self.integerProperty to 5. /// [integerChannel sendNext:@5]; /// /// // Logs the current value of self.integerProperty, and all future changes. /// [integerChannel subscribeNext:^(id value) { /// NSLog(@"value: %@", value); /// }]; /// /// // Binds properties to each other, taking the initial value from the right /// side. /// RACChannelTo(view, objectProperty) = RACChannelTo(model, objectProperty); /// RACChannelTo(view, integerProperty, @2) = RACChannelTo(model, integerProperty, @10); #define RACChannelTo(TARGET, ...) \ metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ (RACChannelTo_(TARGET, __VA_ARGS__, nil)) \ (RACChannelTo_(TARGET, __VA_ARGS__)) /// Do not use this directly. Use the RACChannelTo macro above. #define RACChannelTo_(TARGET, KEYPATH, NILVALUE) \ [[RACKVOChannel alloc] initWithTarget:(TARGET) keyPath:@keypath(TARGET, KEYPATH) nilValue:(NILVALUE)][@keypath(RACKVOChannel.new, followingTerminal)] /// A RACChannel that observes a KVO-compliant key path for changes. @interface RACKVOChannel : RACChannel /// Initializes a channel that will observe the given object and key path. /// /// The current value of the key path, and future KVO notifications for the given /// key path, will be sent to subscribers of the channel's `followingTerminal`. /// Values sent to the `followingTerminal` will be set at the given key path using /// key-value coding. /// /// When the target object deallocates, the channel will complete. Signal errors /// are considered undefined behavior. /// /// This is the designated initializer for this class. /// /// target - The object to bind to. /// keyPath - The key path to observe and set the value of. /// nilValue - The value to set at the key path whenever a `nil` value is /// received. This may be nil when connecting to object properties, but /// an NSValue should be used for primitive properties, to avoid an /// exception if `nil` is received (which might occur if an intermediate /// object is set to `nil`). - (id)initWithTarget:(__weak NSObject *)target keyPath:(NSString *)keyPath nilValue:(id)nilValue; - (id)init __attribute__((unavailable("Use -initWithTarget:keyPath:nilValue: instead"))); @end /// Methods needed for the convenience macro. Do not call explicitly. @interface RACKVOChannel (RACChannelTo) - (RACChannelTerminal *)objectForKeyedSubscript:(NSString *)key; - (void)setObject:(RACChannelTerminal *)otherTerminal forKeyedSubscript:(NSString *)key; @end Pods/ReactiveCocoa/ReactiveCocoa/RACKVOChannel.m
New file @@ -0,0 +1,208 @@ // // RACKVOChannel.m // ReactiveCocoa // // Created by Uri Baghin on 27/12/2012. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACKVOChannel.h" #import "RACEXTScope.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACKVOWrapper.h" #import "NSString+RACKeyPathUtilities.h" #import "RACChannel.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACSignal+Operations.h" // Key for the array of RACKVOChannel's additional thread local // data in the thread dictionary. static NSString * const RACKVOChannelDataDictionaryKey = @"RACKVOChannelKey"; // Wrapper class for additional thread local data. @interface RACKVOChannelData : NSObject // The flag used to ignore updates the channel itself has triggered. @property (nonatomic, assign) BOOL ignoreNextUpdate; // A pointer to the owner of the data. Only use this for pointer comparison, // never as an object reference. @property (nonatomic, assign) void *owner; + (instancetype)dataForChannel:(RACKVOChannel *)channel; @end @interface RACKVOChannel () // The object whose key path the channel is wrapping. @property (atomic, weak) NSObject *target; // The key path the channel is wrapping. @property (nonatomic, copy, readonly) NSString *keyPath; // Returns the existing thread local data container or nil if none exists. @property (nonatomic, strong, readonly) RACKVOChannelData *currentThreadData; // Creates the thread local data container for the channel. - (void)createCurrentThreadData; // Destroy the thread local data container for the channel. - (void)destroyCurrentThreadData; @end @implementation RACKVOChannel #pragma mark Properties - (RACKVOChannelData *)currentThreadData { NSMutableArray *dataArray = NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey]; for (RACKVOChannelData *data in dataArray) { if (data.owner == (__bridge void *)self) return data; } return nil; } #pragma mark Lifecycle - (id)initWithTarget:(__weak NSObject *)target keyPath:(NSString *)keyPath nilValue:(id)nilValue { NSCParameterAssert(keyPath.rac_keyPathComponents.count > 0); NSObject *strongTarget = target; self = [super init]; if (self == nil) return nil; _target = target; _keyPath = [keyPath copy]; [self.leadingTerminal setNameWithFormat:@"[-initWithTarget: %@ keyPath: %@ nilValue: %@] -leadingTerminal", target, keyPath, nilValue]; [self.followingTerminal setNameWithFormat:@"[-initWithTarget: %@ keyPath: %@ nilValue: %@] -followingTerminal", target, keyPath, nilValue]; if (strongTarget == nil) { [self.leadingTerminal sendCompleted]; return self; } // Observe the key path on target for changes and forward the changes to the // terminal. // // Intentionally capturing `self` strongly in the blocks below, so the // channel object stays alive while observing. RACDisposable *observationDisposable = [strongTarget rac_observeKeyPath:keyPath options:NSKeyValueObservingOptionInitial observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) { // If the change wasn't triggered by deallocation, only affects the last // path component, and ignoreNextUpdate is set, then it was triggered by // this channel and should not be forwarded. if (!causedByDealloc && affectedOnlyLastComponent && self.currentThreadData.ignoreNextUpdate) { [self destroyCurrentThreadData]; return; } [self.leadingTerminal sendNext:value]; }]; NSString *keyPathByDeletingLastKeyPathComponent = keyPath.rac_keyPathByDeletingLastKeyPathComponent; NSArray *keyPathComponents = keyPath.rac_keyPathComponents; NSUInteger keyPathComponentsCount = keyPathComponents.count; NSString *lastKeyPathComponent = keyPathComponents.lastObject; // Update the value of the property with the values received. [[self.leadingTerminal finally:^{ [observationDisposable dispose]; }] subscribeNext:^(id x) { // Check the value of the second to last key path component. Since the // channel can only update the value of a property on an object, and not // update intermediate objects, it can only update the value of the whole // key path if this object is not nil. NSObject *object = (keyPathComponentsCount > 1 ? [self.target valueForKeyPath:keyPathByDeletingLastKeyPathComponent] : self.target); if (object == nil) return; // Set the ignoreNextUpdate flag before setting the value so this channel // ignores the value in the subsequent -didChangeValueForKey: callback. [self createCurrentThreadData]; self.currentThreadData.ignoreNextUpdate = YES; [object setValue:x ?: nilValue forKey:lastKeyPathComponent]; } error:^(NSError *error) { NSCAssert(NO, @"Received error in %@: %@", self, error); // Log the error if we're running with assertions disabled. NSLog(@"Received error in %@: %@", self, error); }]; // Capture `self` weakly for the target's deallocation disposable, so we can // freely deallocate if we complete before then. @weakify(self); [strongTarget.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ @strongify(self); [self.leadingTerminal sendCompleted]; self.target = nil; }]]; return self; } - (void)createCurrentThreadData { NSMutableArray *dataArray = NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey]; if (dataArray == nil) { dataArray = [NSMutableArray array]; NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey] = dataArray; [dataArray addObject:[RACKVOChannelData dataForChannel:self]]; return; } for (RACKVOChannelData *data in dataArray) { if (data.owner == (__bridge void *)self) return; } [dataArray addObject:[RACKVOChannelData dataForChannel:self]]; } - (void)destroyCurrentThreadData { NSMutableArray *dataArray = NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey]; NSUInteger index = [dataArray indexOfObjectPassingTest:^ BOOL (RACKVOChannelData *data, NSUInteger idx, BOOL *stop) { return data.owner == (__bridge void *)self; }]; if (index != NSNotFound) [dataArray removeObjectAtIndex:index]; } @end @implementation RACKVOChannel (RACChannelTo) - (RACChannelTerminal *)objectForKeyedSubscript:(NSString *)key { NSCParameterAssert(key != nil); RACChannelTerminal *terminal = [self valueForKey:key]; NSCAssert([terminal isKindOfClass:RACChannelTerminal.class], @"Key \"%@\" does not identify a channel terminal", key); return terminal; } - (void)setObject:(RACChannelTerminal *)otherTerminal forKeyedSubscript:(NSString *)key { NSCParameterAssert(otherTerminal != nil); RACChannelTerminal *selfTerminal = [self objectForKeyedSubscript:key]; [otherTerminal subscribe:selfTerminal]; [[selfTerminal skip:1] subscribe:otherTerminal]; } @end @implementation RACKVOChannelData + (instancetype)dataForChannel:(RACKVOChannel *)channel { RACKVOChannelData *data = [[self alloc] init]; data->_owner = (__bridge void *)channel; return data; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACKVOProxy.h
New file @@ -0,0 +1,34 @@ // // RACKVOProxy.h // ReactiveCocoa // // Created by Richard Speyer on 4/10/14. // Copyright (c) 2014 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> /// A singleton that can act as a proxy between a KVO observation and a RAC /// subscriber, in order to protect against KVO lifetime issues. @interface RACKVOProxy : NSObject /// Returns the singleton KVO proxy object. + (instancetype)sharedProxy; /// Registers an observer with the proxy, such that when the proxy receives a /// KVO change with the given context, it forwards it to the observer. /// /// observer - True observer of the KVO change. Must not be nil. /// context - Arbitrary context object used to differentiate multiple /// observations of the same keypath. Must be unique, cannot be nil. - (void)addObserver:(__weak NSObject *)observer forContext:(void *)context; /// Removes an observer from the proxy. Parameters must match those passed to /// addObserver:forContext:. /// /// observer - True observer of the KVO change. Must not be nil. /// context - Arbitrary context object used to differentiate multiple /// observations of the same keypath. Must be unique, cannot be nil. - (void)removeObserver:(NSObject *)observer forContext:(void *)context; @end Pods/ReactiveCocoa/ReactiveCocoa/RACKVOProxy.m
New file @@ -0,0 +1,70 @@ // // RACKVOProxy.m // ReactiveCocoa // // Created by Richard Speyer on 4/10/14. // Copyright (c) 2014 GitHub, Inc. All rights reserved. // #import "RACKVOProxy.h" @interface RACKVOProxy() @property (strong, nonatomic, readonly) NSMapTable *trampolines; @property (strong, nonatomic, readonly) dispatch_queue_t queue; @end @implementation RACKVOProxy + (instancetype)sharedProxy { static RACKVOProxy *proxy; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ proxy = [[self alloc] init]; }); return proxy; } - (instancetype)init { self = [super init]; if (self == nil) return nil; _queue = dispatch_queue_create("org.reactivecocoa.ReactiveCocoa.RACKVOProxy", DISPATCH_QUEUE_SERIAL); _trampolines = [NSMapTable strongToWeakObjectsMapTable]; return self; } - (void)addObserver:(__weak NSObject *)observer forContext:(void *)context { NSValue *valueContext = [NSValue valueWithPointer:context]; dispatch_sync(self.queue, ^{ [self.trampolines setObject:observer forKey:valueContext]; }); } - (void)removeObserver:(NSObject *)observer forContext:(void *)context { NSValue *valueContext = [NSValue valueWithPointer:context]; dispatch_sync(self.queue, ^{ [self.trampolines removeObjectForKey:valueContext]; }); } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSValue *valueContext = [NSValue valueWithPointer:context]; __block NSObject *trueObserver; dispatch_sync(self.queue, ^{ trueObserver = [self.trampolines objectForKey:valueContext]; }); if (trueObserver != nil) { [trueObserver observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } @end Pods/ReactiveCocoa/ReactiveCocoa/RACKVOTrampoline.h
New file @@ -0,0 +1,31 @@ // // RACKVOTrampoline.h // ReactiveCocoa // // Created by Josh Abernathy on 1/15/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "NSObject+RACKVOWrapper.h" #import "RACDisposable.h" // A private trampoline object that represents a KVO observation. // // Disposing of the trampoline will stop observation. @interface RACKVOTrampoline : RACDisposable // Initializes the receiver with the given parameters. // // target - The object whose key path should be observed. Cannot be nil. // observer - The object that gets notified when the value at the key path // changes. Can be nil. // keyPath - The key path on `target` to observe. Cannot be nil. // options - Any key value observing options to use in the observation. // block - The block to call when the value at the observed key path changes. // Cannot be nil. // // Returns the initialized object. - (id)initWithTarget:(__weak NSObject *)target observer:(__weak NSObject *)observer keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block; @end Pods/ReactiveCocoa/ReactiveCocoa/RACKVOTrampoline.m
New file @@ -0,0 +1,110 @@ // // RACKVOTrampoline.m // ReactiveCocoa // // Created by Josh Abernathy on 1/15/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACKVOTrampoline.h" #import "NSObject+RACDeallocating.h" #import "RACCompoundDisposable.h" #import "RACKVOProxy.h" @interface RACKVOTrampoline () // The keypath which the trampoline is observing. @property (nonatomic, readonly, copy) NSString *keyPath; // These properties should only be manipulated while synchronized on the // receiver. @property (nonatomic, readonly, copy) RACKVOBlock block; @property (nonatomic, readonly, unsafe_unretained) NSObject *unsafeTarget; @property (nonatomic, readonly, weak) NSObject *weakTarget; @property (nonatomic, readonly, weak) NSObject *observer; @end @implementation RACKVOTrampoline #pragma mark Lifecycle - (id)initWithTarget:(__weak NSObject *)target observer:(__weak NSObject *)observer keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block { NSCParameterAssert(keyPath != nil); NSCParameterAssert(block != nil); NSObject *strongTarget = target; if (strongTarget == nil) return nil; self = [super init]; if (self == nil) return nil; _keyPath = [keyPath copy]; _block = [block copy]; _weakTarget = target; _unsafeTarget = strongTarget; _observer = observer; [RACKVOProxy.sharedProxy addObserver:self forContext:(__bridge void *)self]; [strongTarget addObserver:RACKVOProxy.sharedProxy forKeyPath:self.keyPath options:options context:(__bridge void *)self]; [strongTarget.rac_deallocDisposable addDisposable:self]; [self.observer.rac_deallocDisposable addDisposable:self]; return self; } - (void)dealloc { [self dispose]; } #pragma mark Observation - (void)dispose { NSObject *target; NSObject *observer; @synchronized (self) { _block = nil; // The target should still exist at this point, because we still need to // tear down its KVO observation. Therefore, we can use the unsafe // reference (and need to, because the weak one will have been zeroed by // now). target = self.unsafeTarget; observer = self.observer; _unsafeTarget = nil; _observer = nil; } [target.rac_deallocDisposable removeDisposable:self]; [observer.rac_deallocDisposable removeDisposable:self]; [target removeObserver:RACKVOProxy.sharedProxy forKeyPath:self.keyPath context:(__bridge void *)self]; [RACKVOProxy.sharedProxy removeObserver:self forContext:(__bridge void *)self]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context != (__bridge void *)self) { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; return; } RACKVOBlock block; id observer; id target; @synchronized (self) { block = self.block; observer = self.observer; target = self.weakTarget; } if (block == nil || target == nil) return; block(target, observer, change); } @end Pods/ReactiveCocoa/ReactiveCocoa/RACMulticastConnection+Private.h
New file @@ -0,0 +1,17 @@ // // RACMulticastConnection+Private.h // ReactiveCocoa // // Created by Josh Abernathy on 4/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACMulticastConnection.h" @class RACSubject; @interface RACMulticastConnection () - (id)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject; @end Pods/ReactiveCocoa/ReactiveCocoa/RACMulticastConnection.h
New file @@ -0,0 +1,48 @@ // // RACMulticastConnection.h // ReactiveCocoa // // Created by Josh Abernathy on 4/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACDisposable; @class RACSignal; /// A multicast connection encapsulates the idea of sharing one subscription to a /// signal to many subscribers. This is most often needed if the subscription to /// the underlying signal involves side-effects or shouldn't be called more than /// once. /// /// The multicasted signal is only subscribed to when /// -[RACMulticastConnection connect] is called. Until that happens, no values /// will be sent on `signal`. See -[RACMulticastConnection autoconnect] for how /// -[RACMulticastConnection connect] can be called automatically. /// /// Note that you shouldn't create RACMulticastConnection manually. Instead use /// -[RACSignal publish] or -[RACSignal multicast:]. @interface RACMulticastConnection : NSObject /// The multicasted signal. @property (nonatomic, strong, readonly) RACSignal *signal; /// Connect to the underlying signal by subscribing to it. Calling this multiple /// times does nothing but return the existing connection's disposable. /// /// Returns the disposable for the subscription to the multicasted signal. - (RACDisposable *)connect; /// Connects to the underlying signal when the returned signal is first /// subscribed to, and disposes of the subscription to the multicasted signal /// when the returned signal has no subscribers. /// /// If new subscribers show up after being disposed, they'll subscribe and then /// be immediately disposed of. The returned signal will never re-connect to the /// multicasted signal. /// /// Returns the autoconnecting signal. - (RACSignal *)autoconnect; @end Pods/ReactiveCocoa/ReactiveCocoa/RACMulticastConnection.m
New file @@ -0,0 +1,85 @@ // // RACMulticastConnection.m // ReactiveCocoa // // Created by Josh Abernathy on 4/11/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACMulticastConnection.h" #import "RACMulticastConnection+Private.h" #import "RACDisposable.h" #import "RACSerialDisposable.h" #import "RACSubject.h" #import <libkern/OSAtomic.h> @interface RACMulticastConnection () { RACSubject *_signal; // When connecting, a caller should attempt to atomically swap the value of this // from `0` to `1`. // // If the swap is successful the caller is resposible for subscribing `_signal` // to `sourceSignal` and storing the returned disposable in `serialDisposable`. // // If the swap is unsuccessful it means that `_sourceSignal` has already been // connected and the caller has no action to take. int32_t volatile _hasConnected; } @property (nonatomic, readonly, strong) RACSignal *sourceSignal; @property (strong) RACSerialDisposable *serialDisposable; @end @implementation RACMulticastConnection #pragma mark Lifecycle - (id)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject { NSCParameterAssert(source != nil); NSCParameterAssert(subject != nil); self = [super init]; if (self == nil) return nil; _sourceSignal = source; _serialDisposable = [[RACSerialDisposable alloc] init]; _signal = subject; return self; } #pragma mark Connecting - (RACDisposable *)connect { BOOL shouldConnect = OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected); if (shouldConnect) { self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal]; } return self.serialDisposable; } - (RACSignal *)autoconnect { __block volatile int32_t subscriberCount = 0; return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { OSAtomicIncrement32Barrier(&subscriberCount); RACDisposable *subscriptionDisposable = [self.signal subscribe:subscriber]; RACDisposable *connectionDisposable = [self connect]; return [RACDisposable disposableWithBlock:^{ [subscriptionDisposable dispose]; if (OSAtomicDecrement32Barrier(&subscriberCount) == 0) { [connectionDisposable dispose]; } }]; }] setNameWithFormat:@"[%@] -autoconnect", self.signal.name]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACObjCRuntime.h
New file @@ -0,0 +1,17 @@ // // RACObjCRuntime.h // ReactiveCocoa // // Created by Cody Krieger on 5/19/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> // A private class containing wrappers to runtime functions. @interface RACObjCRuntime : NSObject // Invokes objc_allocateClassPair(). Can be called from ARC code. + (Class)createClass:(const char *)className inheritingFromClass:(Class)superclass; @end Pods/ReactiveCocoa/ReactiveCocoa/RACObjCRuntime.m
New file @@ -0,0 +1,22 @@ // // RACObjCRuntime.m // ReactiveCocoa // // Created by Cody Krieger on 5/19/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACObjCRuntime.h" #import <objc/runtime.h> #if __has_feature(objc_arc) #error "This file must be compiled without ARC." #endif @implementation RACObjCRuntime + (Class)createClass:(const char *)className inheritingFromClass:(Class)superclass { return objc_allocateClassPair(superclass, className, 0); } @end Pods/ReactiveCocoa/ReactiveCocoa/RACPassthroughSubscriber.h
New file @@ -0,0 +1,29 @@ // // RACPassthroughSubscriber.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-06-13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACSubscriber.h" @class RACCompoundDisposable; @class RACSignal; // A private subscriber that passes through all events to another subscriber // while not disposed. @interface RACPassthroughSubscriber : NSObject <RACSubscriber> // Initializes the receiver to pass through events until disposed. // // subscriber - The subscriber to forward events to. This must not be nil. // signal - The signal that will be sending events to the receiver. // disposable - When this disposable is disposed, no more events will be // forwarded. This must not be nil. // // Returns an initialized passthrough subscriber. - (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable; @end Pods/ReactiveCocoa/ReactiveCocoa/RACPassthroughSubscriber.m
New file @@ -0,0 +1,103 @@ // // RACPassthroughSubscriber.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-06-13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACPassthroughSubscriber.h" #import "RACCompoundDisposable.h" #import "RACSignal.h" #import "RACSignalProvider.h" static const char *cleanedDTraceString(NSString *original) { return [original stringByReplacingOccurrencesOfString:@"\\s+" withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, original.length)].UTF8String; } static const char *cleanedSignalDescription(RACSignal *signal) { NSString *desc = signal.description; NSRange range = [desc rangeOfString:@" name:"]; if (range.location != NSNotFound) { desc = [desc stringByReplacingCharactersInRange:range withString:@""]; } return cleanedDTraceString(desc); } @interface RACPassthroughSubscriber () // The subscriber to which events should be forwarded. @property (nonatomic, strong, readonly) id<RACSubscriber> innerSubscriber; // The signal sending events to this subscriber. // // This property isn't `weak` because it's only used for DTrace probes, so // a zeroing weak reference would incur an unnecessary performance penalty in // normal usage. @property (nonatomic, unsafe_unretained, readonly) RACSignal *signal; // A disposable representing the subscription. When disposed, no further events // should be sent to the `innerSubscriber`. @property (nonatomic, strong, readonly) RACCompoundDisposable *disposable; @end @implementation RACPassthroughSubscriber #pragma mark Lifecycle - (instancetype)initWithSubscriber:(id<RACSubscriber>)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable { NSCParameterAssert(subscriber != nil); self = [super init]; if (self == nil) return nil; _innerSubscriber = subscriber; _signal = signal; _disposable = disposable; [self.innerSubscriber didSubscribeWithDisposable:self.disposable]; return self; } #pragma mark RACSubscriber - (void)sendNext:(id)value { if (self.disposable.disposed) return; if (RACSIGNAL_NEXT_ENABLED()) { RACSIGNAL_NEXT(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString([value description])); } [self.innerSubscriber sendNext:value]; } - (void)sendError:(NSError *)error { if (self.disposable.disposed) return; if (RACSIGNAL_ERROR_ENABLED()) { RACSIGNAL_ERROR(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString(error.description)); } [self.innerSubscriber sendError:error]; } - (void)sendCompleted { if (self.disposable.disposed) return; if (RACSIGNAL_COMPLETED_ENABLED()) { RACSIGNAL_COMPLETED(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description)); } [self.innerSubscriber sendCompleted]; } - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable { if (disposable != self.disposable) { [self.disposable addDisposable:disposable]; } } @end Pods/ReactiveCocoa/ReactiveCocoa/RACQueueScheduler+Subclass.h
New file @@ -0,0 +1,40 @@ // // RACQueueScheduler+Subclass.h // ReactiveCocoa // // Created by Josh Abernathy on 6/6/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACQueueScheduler.h" #import "RACScheduler+Subclass.h" /// An interface for use by GCD queue-based subclasses. /// /// See RACScheduler+Subclass.h for subclassing notes. @interface RACQueueScheduler () /// The queue on which blocks are enqueued. #if OS_OBJECT_HAVE_OBJC_SUPPORT @property (nonatomic, strong, readonly) dispatch_queue_t queue; #else // Swift builds with OS_OBJECT_HAVE_OBJC_SUPPORT=0 for Playgrounds and LLDB :( @property (nonatomic, assign, readonly) dispatch_queue_t queue; #endif /// Initializes the receiver with the name of the scheduler and the queue which /// the scheduler should use. /// /// name - The name of the scheduler. If nil, a default name will be used. /// queue - The queue upon which the receiver should enqueue scheduled blocks. /// This argument must not be NULL. /// /// Returns the initialized object. - (id)initWithName:(NSString *)name queue:(dispatch_queue_t)queue; /// Converts a date into a GCD time using dispatch_walltime(). /// /// date - The date to convert. This must not be nil. + (dispatch_time_t)wallTimeWithDate:(NSDate *)date; @end Pods/ReactiveCocoa/ReactiveCocoa/RACQueueScheduler.h
New file @@ -0,0 +1,18 @@ // // RACQueueScheduler.h // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACScheduler.h" /// An abstract scheduler which asynchronously enqueues all its work to a Grand /// Central Dispatch queue. /// /// Because RACQueueScheduler is abstract, it should not be instantiated /// directly. Create a subclass using the `RACQueueScheduler+Subclass.h` /// interface and use that instead. @interface RACQueueScheduler : RACScheduler @end Pods/ReactiveCocoa/ReactiveCocoa/RACQueueScheduler.m
New file @@ -0,0 +1,107 @@ // // RACQueueScheduler.m // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACQueueScheduler.h" #import "RACDisposable.h" #import "RACQueueScheduler+Subclass.h" #import "RACScheduler+Private.h" @implementation RACQueueScheduler #pragma mark Lifecycle - (id)initWithName:(NSString *)name queue:(dispatch_queue_t)queue { NSCParameterAssert(queue != NULL); self = [super initWithName:name]; if (self == nil) return nil; _queue = queue; #if !OS_OBJECT_HAVE_OBJC_SUPPORT dispatch_retain(_queue); #endif return self; } #if !OS_OBJECT_HAVE_OBJC_SUPPORT - (void)dealloc { if (_queue != NULL) { dispatch_release(_queue); _queue = NULL; } } #endif #pragma mark Date Conversions + (dispatch_time_t)wallTimeWithDate:(NSDate *)date { NSCParameterAssert(date != nil); double seconds = 0; double frac = modf(date.timeIntervalSince1970, &seconds); struct timespec walltime = { .tv_sec = (time_t)fmin(fmax(seconds, LONG_MIN), LONG_MAX), .tv_nsec = (long)fmin(fmax(frac * NSEC_PER_SEC, LONG_MIN), LONG_MAX) }; return dispatch_walltime(&walltime, 0); } #pragma mark RACScheduler - (RACDisposable *)schedule:(void (^)(void))block { NSCParameterAssert(block != NULL); RACDisposable *disposable = [[RACDisposable alloc] init]; dispatch_async(self.queue, ^{ if (disposable.disposed) return; [self performAsCurrentScheduler:block]; }); return disposable; } - (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { NSCParameterAssert(date != nil); NSCParameterAssert(block != NULL); RACDisposable *disposable = [[RACDisposable alloc] init]; dispatch_after([self.class wallTimeWithDate:date], self.queue, ^{ if (disposable.disposed) return; [self performAsCurrentScheduler:block]; }); return disposable; } - (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { NSCParameterAssert(date != nil); NSCParameterAssert(interval > 0.0 && interval < INT64_MAX / NSEC_PER_SEC); NSCParameterAssert(leeway >= 0.0 && leeway < INT64_MAX / NSEC_PER_SEC); NSCParameterAssert(block != NULL); uint64_t intervalInNanoSecs = (uint64_t)(interval * NSEC_PER_SEC); uint64_t leewayInNanoSecs = (uint64_t)(leeway * NSEC_PER_SEC); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue); dispatch_source_set_timer(timer, [self.class wallTimeWithDate:date], intervalInNanoSecs, leewayInNanoSecs); dispatch_source_set_event_handler(timer, block); dispatch_resume(timer); return [RACDisposable disposableWithBlock:^{ dispatch_source_cancel(timer); }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACReplaySubject.h
New file @@ -0,0 +1,22 @@ // // RACReplaySubject.h // ReactiveCocoa // // Created by Josh Abernathy on 3/14/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubject.h" extern const NSUInteger RACReplaySubjectUnlimitedCapacity; /// A replay subject saves the values it is sent (up to its defined capacity) /// and resends those to new subscribers. It will also replay an error or /// completion. @interface RACReplaySubject : RACSubject /// Creates a new replay subject with the given capacity. A capacity of /// RACReplaySubjectUnlimitedCapacity means values are never trimmed. + (instancetype)replaySubjectWithCapacity:(NSUInteger)capacity; @end Pods/ReactiveCocoa/ReactiveCocoa/RACReplaySubject.m
New file @@ -0,0 +1,112 @@ // // RACReplaySubject.m // ReactiveCocoa // // Created by Josh Abernathy on 3/14/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACReplaySubject.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACScheduler+Private.h" #import "RACSubscriber.h" #import "RACTuple.h" const NSUInteger RACReplaySubjectUnlimitedCapacity = NSUIntegerMax; @interface RACReplaySubject () @property (nonatomic, assign, readonly) NSUInteger capacity; // These properties should only be modified while synchronized on self. @property (nonatomic, strong, readonly) NSMutableArray *valuesReceived; @property (nonatomic, assign) BOOL hasCompleted; @property (nonatomic, assign) BOOL hasError; @property (nonatomic, strong) NSError *error; @end @implementation RACReplaySubject #pragma mark Lifecycle + (instancetype)replaySubjectWithCapacity:(NSUInteger)capacity { return [(RACReplaySubject *)[self alloc] initWithCapacity:capacity]; } - (instancetype)init { return [self initWithCapacity:RACReplaySubjectUnlimitedCapacity]; } - (instancetype)initWithCapacity:(NSUInteger)capacity { self = [super init]; if (self == nil) return nil; _capacity = capacity; _valuesReceived = (capacity == RACReplaySubjectUnlimitedCapacity ? [NSMutableArray array] : [NSMutableArray arrayWithCapacity:capacity]); return self; } #pragma mark RACSignal - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{ @synchronized (self) { for (id value in self.valuesReceived) { if (compoundDisposable.disposed) return; [subscriber sendNext:(value == RACTupleNil.tupleNil ? nil : value)]; } if (compoundDisposable.disposed) return; if (self.hasCompleted) { [subscriber sendCompleted]; } else if (self.hasError) { [subscriber sendError:self.error]; } else { RACDisposable *subscriptionDisposable = [super subscribe:subscriber]; [compoundDisposable addDisposable:subscriptionDisposable]; } } }]; [compoundDisposable addDisposable:schedulingDisposable]; return compoundDisposable; } #pragma mark RACSubscriber - (void)sendNext:(id)value { @synchronized (self) { [self.valuesReceived addObject:value ?: RACTupleNil.tupleNil]; [super sendNext:value]; if (self.capacity != RACReplaySubjectUnlimitedCapacity && self.valuesReceived.count > self.capacity) { [self.valuesReceived removeObjectsInRange:NSMakeRange(0, self.valuesReceived.count - self.capacity)]; } } } - (void)sendCompleted { @synchronized (self) { self.hasCompleted = YES; [super sendCompleted]; } } - (void)sendError:(NSError *)e { @synchronized (self) { self.hasError = YES; self.error = e; [super sendError:e]; } } @end Pods/ReactiveCocoa/ReactiveCocoa/RACReturnSignal.h
New file @@ -0,0 +1,17 @@ // // RACReturnSignal.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSignal.h" // A private `RACSignal` subclasses that synchronously sends a value to any // subscribers, then completes. @interface RACReturnSignal : RACSignal + (RACSignal *)return:(id)value; @end Pods/ReactiveCocoa/ReactiveCocoa/RACReturnSignal.m
New file @@ -0,0 +1,90 @@ // // RACReturnSignal.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-10-10. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACReturnSignal.h" #import "RACScheduler+Private.h" #import "RACSubscriber.h" #import "RACUnit.h" @interface RACReturnSignal () // The value to send upon subscription. @property (nonatomic, strong, readonly) id value; @end @implementation RACReturnSignal #pragma mark Properties // Only allow this signal's name to be customized in DEBUG, since it's // potentially a singleton in release builds (see +return:). - (void)setName:(NSString *)name { #ifdef DEBUG [super setName:name]; #endif } - (NSString *)name { #ifdef DEBUG return super.name; #else return @"+return:"; #endif } #pragma mark Lifecycle + (RACSignal *)return:(id)value { #ifndef DEBUG // In release builds, use singletons for two very common cases. if (value == RACUnit.defaultUnit) { static RACReturnSignal *unitSingleton; static dispatch_once_t unitPred; dispatch_once(&unitPred, ^{ unitSingleton = [[self alloc] init]; unitSingleton->_value = RACUnit.defaultUnit; }); return unitSingleton; } else if (value == nil) { static RACReturnSignal *nilSingleton; static dispatch_once_t nilPred; dispatch_once(&nilPred, ^{ nilSingleton = [[self alloc] init]; nilSingleton->_value = nil; }); return nilSingleton; } #endif RACReturnSignal *signal = [[self alloc] init]; signal->_value = value; #ifdef DEBUG [signal setNameWithFormat:@"+return: %@", value]; #endif return signal; } #pragma mark Subscription - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { NSCParameterAssert(subscriber != nil); return [RACScheduler.subscriptionScheduler schedule:^{ [subscriber sendNext:self.value]; [subscriber sendCompleted]; }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACScheduler+Private.h
New file @@ -0,0 +1,34 @@ // // RACScheduler+Private.h // ReactiveCocoa // // Created by Josh Abernathy on 11/29/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACScheduler.h" // The thread-specific current scheduler key. extern NSString * const RACSchedulerCurrentSchedulerKey; // A private interface for internal RAC use only. @interface RACScheduler () // A dedicated scheduler that fills two requirements: // // 1. By the time subscription happens, we need a valid +currentScheduler. // 2. Subscription should happen as soon as possible. // // To fulfill those two, if we already have a valid +currentScheduler, it // immediately executes scheduled blocks. If we don't, it will execute scheduled // blocks with a private background scheduler. + (instancetype)subscriptionScheduler; // Initializes the receiver with the given name. // // name - The name of the scheduler. If nil, a default name will be used. // // Returns the initialized object. - (id)initWithName:(NSString *)name; @end Pods/ReactiveCocoa/ReactiveCocoa/RACScheduler+Subclass.h
New file @@ -0,0 +1,29 @@ // // RACScheduler.m // ReactiveCocoa // // Created by Miķelis Vindavs on 5/27/14. // Copyright (c) 2014 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACScheduler.h" /// An interface for use by subclasses. /// /// Subclasses should use `-performAsCurrentScheduler:` to do the actual block /// invocation so that +[RACScheduler currentScheduler] behaves as expected. /// /// **Note that RACSchedulers are expected to be serial**. Subclasses must honor /// that contract. See `RACTargetQueueScheduler` for a queue-based scheduler /// which will enforce the serialization guarantee. @interface RACScheduler () /// Performs the given block with the receiver as the current scheduler for /// its thread. This should only be called by subclasses to perform their /// scheduled blocks. /// /// block - The block to execute. Cannot be NULL. - (void)performAsCurrentScheduler:(void (^)(void))block; @end Pods/ReactiveCocoa/ReactiveCocoa/RACScheduler.h
New file @@ -0,0 +1,148 @@ // // RACScheduler.h // ReactiveCocoa // // Created by Josh Abernathy on 4/16/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> /// The priority for the scheduler. /// /// RACSchedulerPriorityHigh - High priority. /// RACSchedulerPriorityDefault - Default priority. /// RACSchedulerPriorityLow - Low priority. /// RACSchedulerPriorityBackground - Background priority. typedef enum : long { RACSchedulerPriorityHigh = DISPATCH_QUEUE_PRIORITY_HIGH, RACSchedulerPriorityDefault = DISPATCH_QUEUE_PRIORITY_DEFAULT, RACSchedulerPriorityLow = DISPATCH_QUEUE_PRIORITY_LOW, RACSchedulerPriorityBackground = DISPATCH_QUEUE_PRIORITY_BACKGROUND, } RACSchedulerPriority; /// Scheduled with -scheduleRecursiveBlock:, this type of block is passed a block /// with which it can call itself recursively. typedef void (^RACSchedulerRecursiveBlock)(void (^reschedule)(void)); @class RACDisposable; /// Schedulers are used to control when and where work is performed. @interface RACScheduler : NSObject /// A singleton scheduler that immediately executes the blocks it is given. /// /// **Note:** Unlike most other schedulers, this does not set the current /// scheduler. There may still be a valid +currentScheduler if this is used /// within a block scheduled on a different scheduler. + (RACScheduler *)immediateScheduler; /// A singleton scheduler that executes blocks in the main thread. + (RACScheduler *)mainThreadScheduler; /// Creates and returns a new background scheduler with the given priority and /// name. The name is for debug and instrumentation purposes only. /// /// Scheduler creation is cheap. It's unnecessary to save the result of this /// method call unless you want to serialize some actions on the same background /// scheduler. + (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority name:(NSString *)name; /// Invokes +schedulerWithPriority:name: with a default name. + (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority; /// Invokes +schedulerWithPriority: with RACSchedulerPriorityDefault. + (RACScheduler *)scheduler; /// The current scheduler. This will only be valid when used from within a /// -[RACScheduler schedule:] block or when on the main thread. + (RACScheduler *)currentScheduler; /// Schedule the given block for execution on the scheduler. /// /// Scheduled blocks will be executed in the order in which they were scheduled. /// /// block - The block to schedule for execution. Cannot be nil. /// /// Returns a disposable which can be used to cancel the scheduled block before /// it begins executing, or nil if cancellation is not supported. - (RACDisposable *)schedule:(void (^)(void))block; /// Schedule the given block for execution on the scheduler at or after /// a specific time. /// /// Note that blocks scheduled for a certain time will not preempt any other /// scheduled work that is executing at the time. /// /// When invoked on the +immediateScheduler, the calling thread **will block** /// until the specified time. /// /// date - The earliest time at which `block` should begin executing. The block /// may not execute immediately at this time, whether due to system load /// or another block on the scheduler currently being run. Cannot be nil. /// block - The block to schedule for execution. Cannot be nil. /// /// Returns a disposable which can be used to cancel the scheduled block before /// it begins executing, or nil if cancellation is not supported. - (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block; /// Schedule the given block for execution on the scheduler after the delay. /// /// Converts the delay into an NSDate, then invokes `-after:schedule:`. - (RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block; /// Reschedule the given block at a particular interval, starting at a specific /// time, and with a given leeway for deferral. /// /// Note that blocks scheduled for a certain time will not preempt any other /// scheduled work that is executing at the time. /// /// Regardless of the value of `leeway`, the given block may not execute exactly /// at `when` or exactly on successive intervals, whether due to system load or /// because another block is currently being run on the scheduler. /// /// It is considered undefined behavior to invoke this method on the /// +immediateScheduler. /// /// date - The earliest time at which `block` should begin executing. The /// block may not execute immediately at this time, whether due to /// system load or another block on the scheduler currently being /// run. Cannot be nil. /// interval - The interval at which the block should be rescheduled, starting /// from `date`. This will use the system wall clock, to avoid /// skew when the computer goes to sleep. /// leeway - A hint to the system indicating the number of seconds that each /// scheduling can be deferred. Note that this is just a hint, and /// there may be some additional latency no matter what. /// block - The block to repeatedly schedule for execution. Cannot be nil. /// /// Returns a disposable which can be used to cancel the automatic scheduling and /// rescheduling, or nil if cancellation is not supported. - (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block; /// Schedule the given recursive block for execution on the scheduler. The /// scheduler will automatically flatten any recursive scheduling into iteration /// instead, so this can be used without issue for blocks that may keep invoking /// themselves forever. /// /// Scheduled blocks will be executed in the order in which they were scheduled. /// /// recursiveBlock - The block to schedule for execution. When invoked, the /// recursive block will be passed a `void (^)(void)` block /// which will reschedule the recursive block at the end of the /// receiver's queue. This passed-in block will automatically /// skip scheduling if the scheduling of the `recursiveBlock` /// was disposed in the meantime. /// /// Returns a disposable which can be used to cancel the scheduled block before /// it begins executing, or to stop it from rescheduling if it's already begun /// execution. - (RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock; @end @interface RACScheduler (Deprecated) + (RACScheduler *)schedulerWithQueue:(dispatch_queue_t)queue name:(NSString *)name __attribute__((deprecated("Use -[RACTargetQueueScheduler initWithName:targetQueue:] instead."))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACScheduler.m
New file @@ -0,0 +1,227 @@ // // RACScheduler.m // ReactiveCocoa // // Created by Josh Abernathy on 4/16/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACScheduler.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACImmediateScheduler.h" #import "RACScheduler+Private.h" #import "RACSubscriptionScheduler.h" #import "RACTargetQueueScheduler.h" // The key for the thread-specific current scheduler. NSString * const RACSchedulerCurrentSchedulerKey = @"RACSchedulerCurrentSchedulerKey"; @interface RACScheduler () @property (nonatomic, readonly, copy) NSString *name; @end @implementation RACScheduler #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, self.name]; } #pragma mark Initializers - (id)initWithName:(NSString *)name { self = [super init]; if (self == nil) return nil; if (name == nil) { _name = [NSString stringWithFormat:@"com.ReactiveCocoa.%@.anonymousScheduler", self.class]; } else { _name = [name copy]; } return self; } #pragma mark Schedulers + (instancetype)immediateScheduler { static dispatch_once_t onceToken; static RACScheduler *immediateScheduler; dispatch_once(&onceToken, ^{ immediateScheduler = [[RACImmediateScheduler alloc] init]; }); return immediateScheduler; } + (instancetype)mainThreadScheduler { static dispatch_once_t onceToken; static RACScheduler *mainThreadScheduler; dispatch_once(&onceToken, ^{ mainThreadScheduler = [[RACTargetQueueScheduler alloc] initWithName:@"com.ReactiveCocoa.RACScheduler.mainThreadScheduler" targetQueue:dispatch_get_main_queue()]; }); return mainThreadScheduler; } + (instancetype)schedulerWithPriority:(RACSchedulerPriority)priority name:(NSString *)name { return [[RACTargetQueueScheduler alloc] initWithName:name targetQueue:dispatch_get_global_queue(priority, 0)]; } + (instancetype)schedulerWithPriority:(RACSchedulerPriority)priority { return [self schedulerWithPriority:priority name:@"com.ReactiveCocoa.RACScheduler.backgroundScheduler"]; } + (instancetype)scheduler { return [self schedulerWithPriority:RACSchedulerPriorityDefault]; } + (instancetype)subscriptionScheduler { static dispatch_once_t onceToken; static RACScheduler *subscriptionScheduler; dispatch_once(&onceToken, ^{ subscriptionScheduler = [[RACSubscriptionScheduler alloc] init]; }); return subscriptionScheduler; } + (BOOL)isOnMainThread { return [NSOperationQueue.currentQueue isEqual:NSOperationQueue.mainQueue] || [NSThread isMainThread]; } + (instancetype)currentScheduler { RACScheduler *scheduler = NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey]; if (scheduler != nil) return scheduler; if ([self.class isOnMainThread]) return RACScheduler.mainThreadScheduler; return nil; } #pragma mark Scheduling - (RACDisposable *)schedule:(void (^)(void))block { NSCAssert(NO, @"%@ must be implemented by subclasses.", NSStringFromSelector(_cmd)); return nil; } - (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { NSCAssert(NO, @"%@ must be implemented by subclasses.", NSStringFromSelector(_cmd)); return nil; } - (RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block { return [self after:[NSDate dateWithTimeIntervalSinceNow:delay] schedule:block]; } - (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { NSCAssert(NO, @"%@ must be implemented by subclasses.", NSStringFromSelector(_cmd)); return nil; } - (RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock { RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; [self scheduleRecursiveBlock:[recursiveBlock copy] addingToDisposable:disposable]; return disposable; } - (void)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock addingToDisposable:(RACCompoundDisposable *)disposable { @autoreleasepool { RACCompoundDisposable *selfDisposable = [RACCompoundDisposable compoundDisposable]; [disposable addDisposable:selfDisposable]; __weak RACDisposable *weakSelfDisposable = selfDisposable; RACDisposable *schedulingDisposable = [self schedule:^{ @autoreleasepool { // At this point, we've been invoked, so our disposable is now useless. [disposable removeDisposable:weakSelfDisposable]; } if (disposable.disposed) return; void (^reallyReschedule)(void) = ^{ if (disposable.disposed) return; [self scheduleRecursiveBlock:recursiveBlock addingToDisposable:disposable]; }; // Protects the variables below. // // This doesn't actually need to be __block qualified, but Clang // complains otherwise. :C __block NSLock *lock = [[NSLock alloc] init]; lock.name = [NSString stringWithFormat:@"%@ %s", self, sel_getName(_cmd)]; __block NSUInteger rescheduleCount = 0; // Set to YES once synchronous execution has finished. Further // rescheduling should occur immediately (rather than being // flattened). __block BOOL rescheduleImmediately = NO; @autoreleasepool { recursiveBlock(^{ [lock lock]; BOOL immediate = rescheduleImmediately; if (!immediate) ++rescheduleCount; [lock unlock]; if (immediate) reallyReschedule(); }); } [lock lock]; NSUInteger synchronousCount = rescheduleCount; rescheduleImmediately = YES; [lock unlock]; for (NSUInteger i = 0; i < synchronousCount; i++) { reallyReschedule(); } }]; [selfDisposable addDisposable:schedulingDisposable]; } } - (void)performAsCurrentScheduler:(void (^)(void))block { NSCParameterAssert(block != NULL); // If we're using a concurrent queue, we could end up in here concurrently, // in which case we *don't* want to clear the current scheduler immediately // after our block is done executing, but only *after* all our concurrent // invocations are done. RACScheduler *previousScheduler = RACScheduler.currentScheduler; NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = self; @autoreleasepool { block(); } if (previousScheduler != nil) { NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = previousScheduler; } else { [NSThread.currentThread.threadDictionary removeObjectForKey:RACSchedulerCurrentSchedulerKey]; } } @end @implementation RACScheduler (Deprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" + (instancetype)schedulerWithQueue:(dispatch_queue_t)queue name:(NSString *)name { NSCParameterAssert(queue != NULL); return [[RACTargetQueueScheduler alloc] initWithName:name targetQueue:queue]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/RACScopedDisposable.h
New file @@ -0,0 +1,18 @@ // // RACScopedDisposable.h // ReactiveCocoa // // Created by Josh Abernathy on 3/28/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACDisposable.h" /// A disposable that calls its own -dispose when it is dealloc'd. @interface RACScopedDisposable : RACDisposable /// Creates a new scoped disposable that will also dispose of the given /// disposable when it is dealloc'd. + (instancetype)scopedDisposableWithDisposable:(RACDisposable *)disposable; @end Pods/ReactiveCocoa/ReactiveCocoa/RACScopedDisposable.m
New file @@ -0,0 +1,32 @@ // // RACScopedDisposable.m // ReactiveCocoa // // Created by Josh Abernathy on 3/28/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACScopedDisposable.h" @implementation RACScopedDisposable #pragma mark Lifecycle + (instancetype)scopedDisposableWithDisposable:(RACDisposable *)disposable { return [self disposableWithBlock:^{ [disposable dispose]; }]; } - (void)dealloc { [self dispose]; } #pragma mark RACDisposable - (RACScopedDisposable *)asScopedDisposable { // totally already are return self; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACSequence.h
New file @@ -0,0 +1,154 @@ // // RACSequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import <Foundation/Foundation.h> #import "RACStream.h" @class RACScheduler; @class RACSignal; /// Represents an immutable sequence of values. Unless otherwise specified, the /// sequences' values are evaluated lazily on demand. Like Cocoa collections, /// sequences cannot contain nil. /// /// Most inherited RACStream methods that accept a block will execute the block /// _at most_ once for each value that is evaluated in the returned sequence. /// Side effects are subject to the behavior described in /// +sequenceWithHeadBlock:tailBlock:. /// /// Implemented as a class cluster. A minimal implementation for a subclass /// consists simply of -head and -tail. @interface RACSequence : RACStream <NSCoding, NSCopying, NSFastEnumeration> /// The first object in the sequence, or nil if the sequence is empty. /// /// Subclasses must provide an implementation of this method. @property (nonatomic, strong, readonly) id head; /// All but the first object in the sequence, or nil if the sequence is empty. /// /// Subclasses must provide an implementation of this method. @property (nonatomic, strong, readonly) RACSequence *tail; /// Evaluates the full sequence to produce an equivalently-sized array. @property (nonatomic, copy, readonly) NSArray *array; /// Returns an enumerator of all objects in the sequence. @property (nonatomic, copy, readonly) NSEnumerator *objectEnumerator; /// Converts a sequence into an eager sequence. /// /// An eager sequence fully evaluates all of its values immediately. Sequences /// derived from an eager sequence will also be eager. /// /// Returns a new eager sequence, or the receiver if the sequence is already /// eager. @property (nonatomic, copy, readonly) RACSequence *eagerSequence; /// Converts a sequence into a lazy sequence. /// /// A lazy sequence evaluates its values on demand, as they are accessed. /// Sequences derived from a lazy sequence will also be lazy. /// /// Returns a new lazy sequence, or the receiver if the sequence is already lazy. @property (nonatomic, copy, readonly) RACSequence *lazySequence; /// Invokes -signalWithScheduler: with a new RACScheduler. - (RACSignal *)signal; /// Evaluates the full sequence on the given scheduler. /// /// Each item is evaluated in its own scheduled block, such that control of the /// scheduler is yielded between each value. /// /// Returns a signal which sends the receiver's values on the given scheduler as /// they're evaluated. - (RACSignal *)signalWithScheduler:(RACScheduler *)scheduler; /// Applies a left fold to the sequence. /// /// This is the same as iterating the sequence along with a provided start value. /// This uses a constant amount of memory. A left fold is left-associative so in /// the sequence [1,2,3] the block would applied in the following order: /// reduce(reduce(reduce(start, 1), 2), 3) /// /// start - The starting value for the fold. Used as `accumulator` for the /// first fold. /// reduce - The block used to combine the accumulated value and the next value. /// Cannot be nil. /// /// Returns a reduced value. - (id)foldLeftWithStart:(id)start reduce:(id (^)(id accumulator, id value))reduce; /// Applies a right fold to the sequence. /// /// A right fold is equivalent to recursion on the list. The block is evaluated /// from the right to the left in list. It is right associative so it's applied /// to the rightmost elements first. For example, in the sequence [1,2,3] the /// block is applied in the order: /// reduce(1, reduce(2, reduce(3, start))) /// /// start - The starting value for the fold. /// reduce - The block used to combine the accumulated value and the next head. /// The block is given the accumulated value and the value of the rest /// of the computation (result of the recursion). This is computed when /// you retrieve its value using `rest.head`. This allows you to /// prevent unnecessary computation by not accessing `rest.head` if you /// don't need to. /// /// Returns a reduced value. - (id)foldRightWithStart:(id)start reduce:(id (^)(id first, RACSequence *rest))reduce; /// Check if any value in sequence passes the block. /// /// block - The block predicate used to check each item. Cannot be nil. /// /// Returns a boolean indiciating if any value in the sequence passed. - (BOOL)any:(BOOL (^)(id value))block; /// Check if all values in the sequence pass the block. /// /// block - The block predicate used to check each item. Cannot be nil. /// /// Returns a boolean indicating if all values in the sequence passed. - (BOOL)all:(BOOL (^)(id value))block; /// Returns the first object that passes the block. /// /// block - The block predicate used to check each item. Cannot be nil. /// /// Returns an object that passes the block or nil if no objects passed. - (id)objectPassingTest:(BOOL (^)(id value))block; /// Creates a sequence that dynamically generates its values. /// /// headBlock - Invoked the first time -head is accessed. /// tailBlock - Invoked the first time -tail is accessed. /// /// The results from each block are memoized, so each block will be invoked at /// most once, no matter how many times the head and tail properties of the /// sequence are accessed. /// /// Any side effects in `headBlock` or `tailBlock` should be thread-safe, since /// the sequence may be evaluated at any time from any thread. Not only that, but /// -tail may be accessed before -head, or both may be accessed simultaneously. /// As noted above, side effects will only be triggered the _first_ time -head or /// -tail is invoked. /// /// Returns a sequence that lazily invokes the given blocks to provide head and /// tail. `headBlock` must not be nil. + (RACSequence *)sequenceWithHeadBlock:(id (^)(void))headBlock tailBlock:(RACSequence *(^)(void))tailBlock; @end @interface RACSequence (Deprecated) - (id)foldLeftWithStart:(id)start combine:(id (^)(id accumulator, id value))combine __attribute__((deprecated("Renamed to -foldLeftWithStart:reduce:"))); - (id)foldRightWithStart:(id)start combine:(id (^)(id first, RACSequence *rest))combine __attribute__((deprecated("Renamed to -foldRightWithStart:reduce:"))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACSequence.m
New file @@ -0,0 +1,384 @@ // // RACSequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACSequence.h" #import "RACArraySequence.h" #import "RACDynamicSequence.h" #import "RACEagerSequence.h" #import "RACEmptySequence.h" #import "RACScheduler.h" #import "RACSignal.h" #import "RACSubscriber.h" #import "RACTuple.h" #import "RACUnarySequence.h" // An enumerator over sequences. @interface RACSequenceEnumerator : NSEnumerator // The sequence the enumerator is enumerating. // // This will change as the enumerator is exhausted. This property should only be // accessed while synchronized on self. @property (nonatomic, strong) RACSequence *sequence; @end @interface RACSequence () // Performs one iteration of lazy binding, passing through values from `current` // until the sequence is exhausted, then recursively binding the remaining // values in the receiver. // // Returns a new sequence which contains `current`, followed by the combined // result of all applications of `block` to the remaining values in the receiver. - (instancetype)bind:(RACStreamBindBlock)block passingThroughValuesFromSequence:(RACSequence *)current; @end @implementation RACSequenceEnumerator - (id)nextObject { id object = nil; @synchronized (self) { object = self.sequence.head; self.sequence = self.sequence.tail; } return object; } @end @implementation RACSequence #pragma mark Lifecycle + (RACSequence *)sequenceWithHeadBlock:(id (^)(void))headBlock tailBlock:(RACSequence *(^)(void))tailBlock { return [[RACDynamicSequence sequenceWithHeadBlock:headBlock tailBlock:tailBlock] setNameWithFormat:@"+sequenceWithHeadBlock:tailBlock:"]; } #pragma mark Class cluster primitives - (id)head { NSCAssert(NO, @"%s must be overridden by subclasses", __func__); return nil; } - (RACSequence *)tail { NSCAssert(NO, @"%s must be overridden by subclasses", __func__); return nil; } #pragma mark RACStream + (instancetype)empty { return RACEmptySequence.empty; } + (instancetype)return:(id)value { return [RACUnarySequence return:value]; } - (instancetype)bind:(RACStreamBindBlock (^)(void))block { RACStreamBindBlock bindBlock = block(); return [[self bind:bindBlock passingThroughValuesFromSequence:nil] setNameWithFormat:@"[%@] -bind:", self.name]; } - (instancetype)bind:(RACStreamBindBlock)bindBlock passingThroughValuesFromSequence:(RACSequence *)passthroughSequence { // Store values calculated in the dependency here instead, avoiding any kind // of temporary collection and boxing. // // This relies on the implementation of RACDynamicSequence synchronizing // access to its head, tail, and dependency, and we're only doing it because // we really need the performance. __block RACSequence *valuesSeq = self; __block RACSequence *current = passthroughSequence; __block BOOL stop = NO; RACSequence *sequence = [RACDynamicSequence sequenceWithLazyDependency:^ id { while (current.head == nil) { if (stop) return nil; // We've exhausted the current sequence, create a sequence from the // next value. id value = valuesSeq.head; if (value == nil) { // We've exhausted all the sequences. stop = YES; return nil; } current = (id)bindBlock(value, &stop); if (current == nil) { stop = YES; return nil; } valuesSeq = valuesSeq.tail; } NSCAssert([current isKindOfClass:RACSequence.class], @"-bind: block returned an object that is not a sequence: %@", current); return nil; } headBlock:^(id _) { return current.head; } tailBlock:^ id (id _) { if (stop) return nil; return [valuesSeq bind:bindBlock passingThroughValuesFromSequence:current.tail]; }]; sequence.name = self.name; return sequence; } - (instancetype)concat:(RACStream *)stream { NSCParameterAssert(stream != nil); return [[[RACArraySequence sequenceWithArray:@[ self, stream ] offset:0] flatten] setNameWithFormat:@"[%@] -concat: %@", self.name, stream]; } - (instancetype)zipWith:(RACSequence *)sequence { NSCParameterAssert(sequence != nil); return [[RACSequence sequenceWithHeadBlock:^ id { if (self.head == nil || sequence.head == nil) return nil; return RACTuplePack(self.head, sequence.head); } tailBlock:^ id { if (self.tail == nil || [[RACSequence empty] isEqual:self.tail]) return nil; if (sequence.tail == nil || [[RACSequence empty] isEqual:sequence.tail]) return nil; return [self.tail zipWith:sequence.tail]; }] setNameWithFormat:@"[%@] -zipWith: %@", self.name, sequence]; } #pragma mark Extended methods - (NSArray *)array { NSMutableArray *array = [NSMutableArray array]; for (id obj in self) { [array addObject:obj]; } return [array copy]; } - (NSEnumerator *)objectEnumerator { RACSequenceEnumerator *enumerator = [[RACSequenceEnumerator alloc] init]; enumerator.sequence = self; return enumerator; } - (RACSignal *)signal { return [[self signalWithScheduler:[RACScheduler scheduler]] setNameWithFormat:@"[%@] -signal", self.name]; } - (RACSignal *)signalWithScheduler:(RACScheduler *)scheduler { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { __block RACSequence *sequence = self; return [scheduler scheduleRecursiveBlock:^(void (^reschedule)(void)) { if (sequence.head == nil) { [subscriber sendCompleted]; return; } [subscriber sendNext:sequence.head]; sequence = sequence.tail; reschedule(); }]; }] setNameWithFormat:@"[%@] -signalWithScheduler: %@", self.name, scheduler]; } - (id)foldLeftWithStart:(id)start reduce:(id (^)(id, id))reduce { NSCParameterAssert(reduce != NULL); if (self.head == nil) return start; for (id value in self) { start = reduce(start, value); } return start; } - (id)foldRightWithStart:(id)start reduce:(id (^)(id, RACSequence *))reduce { NSCParameterAssert(reduce != NULL); if (self.head == nil) return start; RACSequence *rest = [RACSequence sequenceWithHeadBlock:^{ return [self.tail foldRightWithStart:start reduce:reduce]; } tailBlock:nil]; return reduce(self.head, rest); } - (BOOL)any:(BOOL (^)(id))block { NSCParameterAssert(block != NULL); return [self objectPassingTest:block] != nil; } - (BOOL)all:(BOOL (^)(id))block { NSCParameterAssert(block != NULL); NSNumber *result = [self foldLeftWithStart:@YES reduce:^(NSNumber *accumulator, id value) { return @(accumulator.boolValue && block(value)); }]; return result.boolValue; } - (id)objectPassingTest:(BOOL (^)(id))block { NSCParameterAssert(block != NULL); return [self filter:block].head; } - (RACSequence *)eagerSequence { return [RACEagerSequence sequenceWithArray:self.array offset:0]; } - (RACSequence *)lazySequence { return self; } #pragma mark NSCopying - (id)copyWithZone:(NSZone *)zone { return self; } #pragma mark NSCoding - (Class)classForCoder { // Most sequences should be archived as RACArraySequences. return RACArraySequence.class; } - (id)initWithCoder:(NSCoder *)coder { if (![self isKindOfClass:RACArraySequence.class]) return [[RACArraySequence alloc] initWithCoder:coder]; // Decoding is handled in RACArraySequence. return [super init]; } - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.array forKey:@"array"]; } #pragma mark NSFastEnumeration - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id *)stackbuf count:(NSUInteger)len { if (state->state == ULONG_MAX) { // Enumeration has completed. return 0; } // We need to traverse the sequence itself on repeated calls to this // method, so use the 'state' field to track the current head. RACSequence *(^getSequence)(void) = ^{ return (__bridge RACSequence *)(void *)state->state; }; void (^setSequence)(RACSequence *) = ^(RACSequence *sequence) { // Release the old sequence and retain the new one. CFBridgingRelease((void *)state->state); state->state = (unsigned long)CFBridgingRetain(sequence); }; void (^complete)(void) = ^{ // Release any stored sequence. setSequence(nil); state->state = ULONG_MAX; }; if (state->state == 0) { // Since a sequence doesn't mutate, this just needs to be set to // something non-NULL. state->mutationsPtr = state->extra; setSequence(self); } state->itemsPtr = stackbuf; NSUInteger enumeratedCount = 0; while (enumeratedCount < len) { RACSequence *seq = getSequence(); // Because the objects in a sequence may be generated lazily, we want to // prevent them from being released until the enumerator's used them. __autoreleasing id obj = seq.head; if (obj == nil) { complete(); break; } stackbuf[enumeratedCount++] = obj; if (seq.tail == nil) { complete(); break; } setSequence(seq.tail); } return enumeratedCount; } #pragma mark NSObject - (NSUInteger)hash { return [self.head hash]; } - (BOOL)isEqual:(RACSequence *)seq { if (self == seq) return YES; if (![seq isKindOfClass:RACSequence.class]) return NO; for (id<NSObject> selfObj in self) { id<NSObject> seqObj = seq.head; // Handles the nil case too. if (![seqObj isEqual:selfObj]) return NO; seq = seq.tail; } // self is now depleted -- the argument should be too. return (seq.head == nil); } @end @implementation RACSequence (Deprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (id)foldLeftWithStart:(id)start combine:(id (^)(id accumulator, id value))combine { return [self foldLeftWithStart:start reduce:combine]; } - (id)foldRightWithStart:(id)start combine:(id (^)(id first, RACSequence *rest))combine { return [self foldRightWithStart:start reduce:combine]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/RACSerialDisposable.h
New file @@ -0,0 +1,43 @@ // // RACSerialDisposable.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-07-22. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACDisposable.h" /// A disposable that contains exactly one other disposable and allows it to be /// swapped out atomically. @interface RACSerialDisposable : RACDisposable /// The inner disposable managed by the serial disposable. /// /// This property is thread-safe for reading and writing. However, if you want to /// read the current value _and_ write a new one atomically, use /// -swapInDisposable: instead. /// /// Disposing of the receiver will also dispose of the current disposable set for /// this property, then set the property to nil. If any new disposable is set /// after the receiver is disposed, it will be disposed immediately and this /// property will remain set to nil. @property (atomic, strong) RACDisposable *disposable; /// Creates a serial disposable which will wrap the given disposable. /// /// disposable - The value to set for `disposable`. This may be nil. /// /// Returns a RACSerialDisposable, or nil if an error occurs. + (instancetype)serialDisposableWithDisposable:(RACDisposable *)disposable; /// Atomically swaps the receiver's `disposable` for `newDisposable`. /// /// newDisposable - The new value for `disposable`. If the receiver has already /// been disposed, this disposable will be too, and `disposable` /// will remain set to nil. This argument may be nil. /// /// Returns the previous value for the `disposable` property. - (RACDisposable *)swapInDisposable:(RACDisposable *)newDisposable; @end Pods/ReactiveCocoa/ReactiveCocoa/RACSerialDisposable.m
New file @@ -0,0 +1,107 @@ // // RACSerialDisposable.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-07-22. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSerialDisposable.h" #import <libkern/OSAtomic.h> @interface RACSerialDisposable () { // The receiver's `disposable`. This variable must only be referenced while // _spinLock is held. RACDisposable * _disposable; // YES if the receiver has been disposed. This variable must only be modified // while _spinLock is held. BOOL _disposed; // A spinlock to protect access to _disposable and _disposed. // // It must be used when _disposable is mutated or retained and when _disposed // is mutated. OSSpinLock _spinLock; } @end @implementation RACSerialDisposable #pragma mark Properties - (BOOL)isDisposed { return _disposed; } - (RACDisposable *)disposable { RACDisposable *result; OSSpinLockLock(&_spinLock); result = _disposable; OSSpinLockUnlock(&_spinLock); return result; } - (void)setDisposable:(RACDisposable *)disposable { [self swapInDisposable:disposable]; } #pragma mark Lifecycle + (instancetype)serialDisposableWithDisposable:(RACDisposable *)disposable { RACSerialDisposable *serialDisposable = [[self alloc] init]; serialDisposable.disposable = disposable; return serialDisposable; } - (id)initWithBlock:(void (^)(void))block { self = [self init]; if (self == nil) return nil; self.disposable = [RACDisposable disposableWithBlock:block]; return self; } #pragma mark Inner Disposable - (RACDisposable *)swapInDisposable:(RACDisposable *)newDisposable { RACDisposable *existingDisposable; BOOL alreadyDisposed; OSSpinLockLock(&_spinLock); alreadyDisposed = _disposed; if (!alreadyDisposed) { existingDisposable = _disposable; _disposable = newDisposable; } OSSpinLockUnlock(&_spinLock); if (alreadyDisposed) { [newDisposable dispose]; return nil; } return existingDisposable; } #pragma mark Disposal - (void)dispose { RACDisposable *existingDisposable; OSSpinLockLock(&_spinLock); if (!_disposed) { existingDisposable = _disposable; _disposed = YES; _disposable = nil; } OSSpinLockUnlock(&_spinLock); [existingDisposable dispose]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACSignal+Operations.h
New file @@ -0,0 +1,709 @@ // // RACSignal+Operations.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-09-06. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACSignal.h" /// The domain for errors originating in RACSignal operations. extern NSString * const RACSignalErrorDomain; /// The error code used with -timeout:. extern const NSInteger RACSignalErrorTimedOut; /// The error code used when a value passed into +switch:cases:default: does not /// match any of the cases, and no default was given. extern const NSInteger RACSignalErrorNoMatchingCase; @class RACCommand; @class RACDisposable; @class RACMulticastConnection; @class RACScheduler; @class RACSequence; @class RACSubject; @class RACTuple; @protocol RACSubscriber; @interface RACSignal (Operations) /// Do the given block on `next`. This should be used to inject side effects into /// the signal. - (RACSignal *)doNext:(void (^)(id x))block; /// Do the given block on `error`. This should be used to inject side effects /// into the signal. - (RACSignal *)doError:(void (^)(NSError *error))block; /// Do the given block on `completed`. This should be used to inject side effects /// into the signal. - (RACSignal *)doCompleted:(void (^)(void))block; /// Sends `next`s only if we don't receive another `next` in `interval` seconds. /// /// If a `next` is received, and then another `next` is received before /// `interval` seconds have passed, the first value is discarded. /// /// After `interval` seconds have passed since the most recent `next` was sent, /// the most recent `next` is forwarded on the scheduler that the value was /// originally received on. If +[RACScheduler currentScheduler] was nil at the /// time, a private background scheduler is used. /// /// Returns a signal which sends throttled and delayed `next` events. Completion /// and errors are always forwarded immediately. - (RACSignal *)throttle:(NSTimeInterval)interval; /// Throttles `next`s for which `predicate` returns YES. /// /// When `predicate` returns YES for a `next`: /// /// 1. If another `next` is received before `interval` seconds have passed, the /// prior value is discarded. This happens regardless of whether the new /// value will be throttled. /// 2. After `interval` seconds have passed since the value was originally /// received, it will be forwarded on the scheduler that it was received /// upon. If +[RACScheduler currentScheduler] was nil at the time, a private /// background scheduler is used. /// /// When `predicate` returns NO for a `next`, it is forwarded immediately, /// without any throttling. /// /// interval - The number of seconds for which to buffer the latest value that /// passes `predicate`. /// predicate - Passed each `next` from the receiver, this block returns /// whether the given value should be throttled. This argument must /// not be nil. /// /// Returns a signal which sends `next` events, throttled when `predicate` /// returns YES. Completion and errors are always forwarded immediately. - (RACSignal *)throttle:(NSTimeInterval)interval valuesPassingTest:(BOOL (^)(id next))predicate; /// Forwards `next` and `completed` events after delaying for `interval` seconds /// on the current scheduler (on which the events were delivered). /// /// If +[RACScheduler currentScheduler] is nil when `next` or `completed` is /// received, a private background scheduler is used. /// /// Returns a signal which sends delayed `next` and `completed` events. Errors /// are always forwarded immediately. - (RACSignal *)delay:(NSTimeInterval)interval; /// Resubscribes when the signal completes. - (RACSignal *)repeat; /// Executes the given block each time a subscription is created. /// /// block - A block which defines the subscription side effects. Cannot be `nil`. /// /// Example: /// /// // Write new file, with backup. /// [[[[fileManager /// rac_createFileAtPath:path contents:data] /// initially:^{ /// // 2. Second, backup current file /// [fileManager moveItemAtPath:path toPath:backupPath error:nil]; /// }] /// initially:^{ /// // 1. First, acquire write lock. /// [writeLock lock]; /// }] /// finally:^{ /// [writeLock unlock]; /// }]; /// /// Returns a signal that passes through all events of the receiver, plus /// introduces side effects which occur prior to any subscription side effects /// of the receiver. - (RACSignal *)initially:(void (^)(void))block; /// Executes the given block when the signal completes or errors. - (RACSignal *)finally:(void (^)(void))block; /// Divides the receiver's `next`s into buffers which deliver every `interval` /// seconds. /// /// interval - The interval in which values are grouped into one buffer. /// scheduler - The scheduler upon which the returned signal will deliver its /// values. This must not be nil or +[RACScheduler /// immediateScheduler]. /// /// Returns a signal which sends RACTuples of the buffered values at each /// interval on `scheduler`. When the receiver completes, any currently-buffered /// values will be sent immediately. - (RACSignal *)bufferWithTime:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler; /// Collects all receiver's `next`s into a NSArray. Nil values will be converted /// to NSNull. /// /// This corresponds to the `ToArray` method in Rx. /// /// Returns a signal which sends a single NSArray when the receiver completes /// successfully. - (RACSignal *)collect; /// Takes the last `count` `next`s after the receiving signal completes. - (RACSignal *)takeLast:(NSUInteger)count; /// Combines the latest values from the receiver and the given signal into /// RACTuples, once both have sent at least one `next`. /// /// Any additional `next`s will result in a new RACTuple with the latest values /// from both signals. /// /// signal - The signal to combine with. This argument must not be nil. /// /// Returns a signal which sends RACTuples of the combined values, forwards any /// `error` events, and completes when both input signals complete. - (RACSignal *)combineLatestWith:(RACSignal *)signal; /// Combines the latest values from the given signals into RACTuples, once all /// the signals have sent at least one `next`. /// /// Any additional `next`s will result in a new RACTuple with the latest values /// from all signals. /// /// signals - The signals to combine. If this collection is empty, the returned /// signal will immediately complete upon subscription. /// /// Returns a signal which sends RACTuples of the combined values, forwards any /// `error` events, and completes when all input signals complete. + (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals; /// Combines signals using +combineLatest:, then reduces the resulting tuples /// into a single value using -reduceEach:. /// /// signals - The signals to combine. If this collection is empty, the /// returned signal will immediately complete upon subscription. /// reduceBlock - The block which reduces the latest values from all the /// signals into one value. It must take as many arguments as the /// number of signals given. Each argument will be an object /// argument. The return value must be an object. This argument /// must not be nil. /// /// Example: /// /// [RACSignal combineLatest:@[ stringSignal, intSignal ] reduce:^(NSString *string, NSNumber *number) { /// return [NSString stringWithFormat:@"%@: %@", string, number]; /// }]; /// /// Returns a signal which sends the results from each invocation of /// `reduceBlock`. + (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock; /// Merges the receiver and the given signal with `+merge:` and returns the /// resulting signal. - (RACSignal *)merge:(RACSignal *)signal; /// Sends the latest `next` from any of the signals. /// /// Returns a signal that passes through values from each of the given signals, /// and sends `completed` when all of them complete. If any signal sends an error, /// the returned signal sends `error` immediately. + (RACSignal *)merge:(id<NSFastEnumeration>)signals; /// Merges the signals sent by the receiver into a flattened signal, but only /// subscribes to `maxConcurrent` number of signals at a time. New signals are /// queued and subscribed to as other signals complete. /// /// If an error occurs on any of the signals, it is sent on the returned signal. /// It completes only after the receiver and all sent signals have completed. /// /// This corresponds to `Merge<TSource>(IObservable<IObservable<TSource>>, Int32)` /// in Rx. /// /// maxConcurrent - the maximum number of signals to subscribe to at a /// time. If 0, it subscribes to an unlimited number of /// signals. - (RACSignal *)flatten:(NSUInteger)maxConcurrent; /// Ignores all `next`s from the receiver, waits for the receiver to complete, /// then subscribes to a new signal. /// /// block - A block which will create or obtain a new signal to subscribe to, /// executed only after the receiver completes. This block must not be /// nil, and it must not return a nil signal. /// /// Returns a signal which will pass through the events of the signal created in /// `block`. If the receiver errors out, the returned signal will error as well. - (RACSignal *)then:(RACSignal * (^)(void))block; /// Concats the inner signals of a signal of signals. - (RACSignal *)concat; /// Aggregates the `next` values of the receiver into a single combined value. /// /// The algorithm proceeds as follows: /// /// 1. `start` is passed into the block as the `running` value, and the first /// element of the receiver is passed into the block as the `next` value. /// 2. The result of the invocation (`running`) and the next element of the /// receiver (`next`) is passed into `reduceBlock`. /// 3. Steps 2 and 3 are repeated until all values have been processed. /// 4. The last result of `reduceBlock` is sent on the returned signal. /// /// This method is similar to -scanWithStart:reduce:, except that only the /// final result is sent on the returned signal. /// /// start - The value to be combined with the first element of the /// receiver. This value may be `nil`. /// reduceBlock - The block that describes how to combine values of the /// receiver. If the receiver is empty, this block will never be /// invoked. Cannot be nil. /// /// Returns a signal that will send the aggregated value when the receiver /// completes, then itself complete. If the receiver never sends any values, /// `start` will be sent instead. - (RACSignal *)aggregateWithStart:(id)start reduce:(id (^)(id running, id next))reduceBlock; /// Aggregates the `next` values of the receiver into a single combined value. /// This is indexed version of -aggregateWithStart:reduce:. /// /// start - The value to be combined with the first element of the /// receiver. This value may be `nil`. /// reduceBlock - The block that describes how to combine values of the /// receiver. This block takes zero-based index value as the last /// parameter. If the receiver is empty, this block will never be /// invoked. Cannot be nil. /// /// Returns a signal that will send the aggregated value when the receiver /// completes, then itself complete. If the receiver never sends any values, /// `start` will be sent instead. - (RACSignal *)aggregateWithStart:(id)start reduceWithIndex:(id (^)(id running, id next, NSUInteger index))reduceBlock; /// Aggregates the `next` values of the receiver into a single combined value. /// /// This invokes `startFactory` block on each subscription, then calls /// -aggregateWithStart:reduce: with the return value of the block as start value. /// /// startFactory - The block that returns start value which will be combined /// with the first element of the receiver. Cannot be nil. /// reduceBlock - The block that describes how to combine values of the /// receiver. If the receiver is empty, this block will never be /// invoked. Cannot be nil. /// /// Returns a signal that will send the aggregated value when the receiver /// completes, then itself complete. If the receiver never sends any values, /// the return value of `startFactory` will be sent instead. - (RACSignal *)aggregateWithStartFactory:(id (^)(void))startFactory reduce:(id (^)(id running, id next))reduceBlock; /// Invokes -setKeyPath:onObject:nilValue: with `nil` for the nil value. /// /// WARNING: Under certain conditions, this method is known to be thread-unsafe. /// See the description in -setKeyPath:onObject:nilValue:. - (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object; /// Binds the receiver to an object, automatically setting the given key path on /// every `next`. When the signal completes, the binding is automatically /// disposed of. /// /// WARNING: Under certain conditions, this method is known to be thread-unsafe. /// A crash can result if `object` is deallocated concurrently on /// another thread within a window of time between a value being sent /// on this signal and immediately prior to the invocation of /// -setValue:forKeyPath:, which sets the property. To prevent this, /// ensure `object` is deallocated on the same thread the receiver /// sends on, or ensure that the returned disposable is disposed of /// before `object` deallocates. /// See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/1184 /// /// Sending an error on the signal is considered undefined behavior, and will /// generate an assertion failure in Debug builds. /// /// A given key on an object should only have one active signal bound to it at any /// given time. Binding more than one signal to the same property is considered /// undefined behavior. /// /// keyPath - The key path to update with `next`s from the receiver. /// object - The object that `keyPath` is relative to. /// nilValue - The value to set at the key path whenever `nil` is sent by the /// receiver. This may be nil when binding to object properties, but /// an NSValue should be used for primitive properties, to avoid an /// exception if `nil` is sent (which might occur if an intermediate /// object is set to `nil`). /// /// Returns a disposable which can be used to terminate the binding. - (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object nilValue:(id)nilValue; /// Sends NSDate.date every `interval` seconds. /// /// interval - The time interval in seconds at which the current time is sent. /// scheduler - The scheduler upon which the current NSDate should be sent. This /// must not be nil or +[RACScheduler immediateScheduler]. /// /// Returns a signal that sends the current date/time every `interval` on /// `scheduler`. + (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler; /// Sends NSDate.date at intervals of at least `interval` seconds, up to /// approximately `interval` + `leeway` seconds. /// /// The created signal will defer sending each `next` for at least `interval` /// seconds, and for an additional amount of time up to `leeway` seconds in the /// interest of performance or power consumption. Note that some additional /// latency is to be expected, even when specifying a `leeway` of 0. /// /// interval - The base interval between `next`s. /// scheduler - The scheduler upon which the current NSDate should be sent. This /// must not be nil or +[RACScheduler immediateScheduler]. /// leeway - The maximum amount of additional time the `next` can be deferred. /// /// Returns a signal that sends the current date/time at intervals of at least /// `interval seconds` up to approximately `interval` + `leeway` seconds on /// `scheduler`. + (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler withLeeway:(NSTimeInterval)leeway; /// Takes `next`s until the `signalTrigger` sends `next` or `completed`. /// /// Returns a signal which passes through all events from the receiver until /// `signalTrigger` sends `next` or `completed`, at which point the returned signal /// will send `completed`. - (RACSignal *)takeUntil:(RACSignal *)signalTrigger; /// Takes `next`s until the `replacement` sends an event. /// /// replacement - The signal which replaces the receiver as soon as it sends an /// event. /// /// Returns a signal which passes through `next`s and `error` from the receiver /// until `replacement` sends an event, at which point the returned signal will /// send that event and switch to passing through events from `replacement` /// instead, regardless of whether the receiver has sent events already. - (RACSignal *)takeUntilReplacement:(RACSignal *)replacement; /// Subscribes to the returned signal when an error occurs. - (RACSignal *)catch:(RACSignal * (^)(NSError *error))catchBlock; /// Subscribes to the given signal when an error occurs. - (RACSignal *)catchTo:(RACSignal *)signal; /// Runs `tryBlock` against each of the receiver's values, passing values /// until `tryBlock` returns NO, or the receiver completes. /// /// tryBlock - An action to run against each of the receiver's values. /// The block should return YES to indicate that the action was /// successful. This block must not be nil. /// /// Example: /// /// // The returned signal will send an error if data values cannot be /// // written to `someFileURL`. /// [signal try:^(NSData *data, NSError **errorPtr) { /// return [data writeToURL:someFileURL options:NSDataWritingAtomic error:errorPtr]; /// }]; /// /// Returns a signal which passes through all the values of the receiver. If /// `tryBlock` fails for any value, the returned signal will error using the /// `NSError` passed out from the block. - (RACSignal *)try:(BOOL (^)(id value, NSError **errorPtr))tryBlock; /// Runs `mapBlock` against each of the receiver's values, mapping values until /// `mapBlock` returns nil, or the receiver completes. /// /// mapBlock - An action to map each of the receiver's values. The block should /// return a non-nil value to indicate that the action was successful. /// This block must not be nil. /// /// Example: /// /// // The returned signal will send an error if data cannot be read from /// // `fileURL`. /// [signal tryMap:^(NSURL *fileURL, NSError **errorPtr) { /// return [NSData dataWithContentsOfURL:fileURL options:0 error:errorPtr]; /// }]; /// /// Returns a signal which transforms all the values of the receiver. If /// `mapBlock` returns nil for any value, the returned signal will error using /// the `NSError` passed out from the block. - (RACSignal *)tryMap:(id (^)(id value, NSError **errorPtr))mapBlock; /// Returns the first `next`. Note that this is a blocking call. - (id)first; /// Returns the first `next` or `defaultValue` if the signal completes or errors /// without sending a `next`. Note that this is a blocking call. - (id)firstOrDefault:(id)defaultValue; /// Returns the first `next` or `defaultValue` if the signal completes or errors /// without sending a `next`. If an error occurs success will be NO and error /// will be populated. Note that this is a blocking call. /// /// Both success and error may be NULL. - (id)firstOrDefault:(id)defaultValue success:(BOOL *)success error:(NSError **)error; /// Blocks the caller and waits for the signal to complete. /// /// error - If not NULL, set to any error that occurs. /// /// Returns whether the signal completed successfully. If NO, `error` will be set /// to the error that occurred. - (BOOL)waitUntilCompleted:(NSError **)error; /// Defers creation of a signal until the signal's actually subscribed to. /// /// This can be used to effectively turn a hot signal into a cold signal. + (RACSignal *)defer:(RACSignal * (^)(void))block; /// Every time the receiver sends a new RACSignal, subscribes and sends `next`s and /// `error`s only for that signal. /// /// The receiver must be a signal of signals. /// /// Returns a signal which passes through `next`s and `error`s from the latest /// signal sent by the receiver, and sends `completed` when both the receiver and /// the last sent signal complete. - (RACSignal *)switchToLatest; /// Switches between the signals in `cases` as well as `defaultSignal` based on /// the latest value sent by `signal`. /// /// signal - A signal of objects used as keys in the `cases` dictionary. /// This argument must not be nil. /// cases - A dictionary that has signals as values. This argument must /// not be nil. A RACTupleNil key in this dictionary will match /// nil `next` events that are received on `signal`. /// defaultSignal - The signal to pass through after `signal` sends a value for /// which `cases` does not contain a signal. If nil, any /// unmatched values will result in /// a RACSignalErrorNoMatchingCase error. /// /// Returns a signal which passes through `next`s and `error`s from one of the /// the signals in `cases` or `defaultSignal`, and sends `completed` when both /// `signal` and the last used signal complete. If no `defaultSignal` is given, /// an unmatched `next` will result in an error on the returned signal. + (RACSignal *)switch:(RACSignal *)signal cases:(NSDictionary *)cases default:(RACSignal *)defaultSignal; /// Switches between `trueSignal` and `falseSignal` based on the latest value /// sent by `boolSignal`. /// /// boolSignal - A signal of BOOLs determining whether `trueSignal` or /// `falseSignal` should be active. This argument must not be nil. /// trueSignal - The signal to pass through after `boolSignal` has sent YES. /// This argument must not be nil. /// falseSignal - The signal to pass through after `boolSignal` has sent NO. This /// argument must not be nil. /// /// Returns a signal which passes through `next`s and `error`s from `trueSignal` /// and/or `falseSignal`, and sends `completed` when both `boolSignal` and the /// last switched signal complete. + (RACSignal *)if:(RACSignal *)boolSignal then:(RACSignal *)trueSignal else:(RACSignal *)falseSignal; /// Adds every `next` to an array. Nils are represented by NSNulls. Note that /// this is a blocking call. /// /// **This is not the same as the `ToArray` method in Rx.** See -collect for /// that behavior instead. /// /// Returns the array of `next` values, or nil if an error occurs. - (NSArray *)toArray; /// Adds every `next` to a sequence. Nils are represented by NSNulls. /// /// This corresponds to the `ToEnumerable` method in Rx. /// /// Returns a sequence which provides values from the signal as they're sent. /// Trying to retrieve a value from the sequence which has not yet been sent will /// block. @property (nonatomic, strong, readonly) RACSequence *sequence; /// Creates and returns a multicast connection. This allows you to share a single /// subscription to the underlying signal. - (RACMulticastConnection *)publish; /// Creates and returns a multicast connection that pushes values into the given /// subject. This allows you to share a single subscription to the underlying /// signal. - (RACMulticastConnection *)multicast:(RACSubject *)subject; /// Multicasts the signal to a RACReplaySubject of unlimited capacity, and /// immediately connects to the resulting RACMulticastConnection. /// /// Returns the connected, multicasted signal. - (RACSignal *)replay; /// Multicasts the signal to a RACReplaySubject of capacity 1, and immediately /// connects to the resulting RACMulticastConnection. /// /// Returns the connected, multicasted signal. - (RACSignal *)replayLast; /// Multicasts the signal to a RACReplaySubject of unlimited capacity, and /// lazily connects to the resulting RACMulticastConnection. /// /// This means the returned signal will subscribe to the multicasted signal only /// when the former receives its first subscription. /// /// Returns the lazily connected, multicasted signal. - (RACSignal *)replayLazily; /// Sends an error after `interval` seconds if the source doesn't complete /// before then. /// /// The error will be in the RACSignalErrorDomain and have a code of /// RACSignalErrorTimedOut. /// /// interval - The number of seconds after which the signal should error out. /// scheduler - The scheduler upon which any timeout error should be sent. This /// must not be nil or +[RACScheduler immediateScheduler]. /// /// Returns a signal that passes through the receiver's events, until the stream /// finishes or times out, at which point an error will be sent on `scheduler`. - (RACSignal *)timeout:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler; /// Creates and returns a signal that delivers its events on the given scheduler. /// Any side effects of the receiver will still be performed on the original /// thread. /// /// This is ideal when the signal already performs its work on the desired /// thread, but you want to handle its events elsewhere. /// /// This corresponds to the `ObserveOn` method in Rx. - (RACSignal *)deliverOn:(RACScheduler *)scheduler; /// Creates and returns a signal that executes its side effects and delivers its /// events on the given scheduler. /// /// Use of this operator should be avoided whenever possible, because the /// receiver's side effects may not be safe to run on another thread. If you just /// want to receive the signal's events on `scheduler`, use -deliverOn: instead. - (RACSignal *)subscribeOn:(RACScheduler *)scheduler; /// Creates and returns a signal that delivers its events on the main thread. /// If events are already being sent on the main thread, they may be passed on /// without delay. An event will instead be queued for later delivery on the main /// thread if sent on another thread, or if a previous event is already being /// processed, or has been queued. /// /// Any side effects of the receiver will still be performed on the original /// thread. /// /// This can be used when a signal will cause UI updates, to avoid potential /// flicker caused by delayed delivery of events, such as the first event from /// a RACObserve at view instantiation. - (RACSignal *)deliverOnMainThread; /// Groups each received object into a group, as determined by calling `keyBlock` /// with that object. The object sent is transformed by calling `transformBlock` /// with the object. If `transformBlock` is nil, it sends the original object. /// /// The returned signal is a signal of RACGroupedSignal. - (RACSignal *)groupBy:(id<NSCopying> (^)(id object))keyBlock transform:(id (^)(id object))transformBlock; /// Calls -[RACSignal groupBy:keyBlock transform:nil]. - (RACSignal *)groupBy:(id<NSCopying> (^)(id object))keyBlock; /// Sends an [NSNumber numberWithBool:YES] if the receiving signal sends any /// objects. - (RACSignal *)any; /// Sends an [NSNumber numberWithBool:YES] if the receiving signal sends any /// objects that pass `predicateBlock`. /// /// predicateBlock - cannot be nil. - (RACSignal *)any:(BOOL (^)(id object))predicateBlock; /// Sends an [NSNumber numberWithBool:YES] if all the objects the receiving /// signal sends pass `predicateBlock`. /// /// predicateBlock - cannot be nil. - (RACSignal *)all:(BOOL (^)(id object))predicateBlock; /// Resubscribes to the receiving signal if an error occurs, up until it has /// retried the given number of times. /// /// retryCount - if 0, it keeps retrying until it completes. - (RACSignal *)retry:(NSInteger)retryCount; /// Resubscribes to the receiving signal if an error occurs. - (RACSignal *)retry; /// Sends the latest value from the receiver only when `sampler` sends a value. /// The returned signal could repeat values if `sampler` fires more often than /// the receiver. Values from `sampler` are ignored before the receiver sends /// its first value. /// /// sampler - The signal that controls when the latest value from the receiver /// is sent. Cannot be nil. - (RACSignal *)sample:(RACSignal *)sampler; /// Ignores all `next`s from the receiver. /// /// Returns a signal which only passes through `error` or `completed` events from /// the receiver. - (RACSignal *)ignoreValues; /// Converts each of the receiver's events into a RACEvent object. /// /// Returns a signal which sends the receiver's events as RACEvents, and /// completes after the receiver sends `completed` or `error`. - (RACSignal *)materialize; /// Converts each RACEvent in the receiver back into "real" RACSignal events. /// /// Returns a signal which sends `next` for each value RACEvent, `error` for each /// error RACEvent, and `completed` for each completed RACEvent. - (RACSignal *)dematerialize; /// Inverts each NSNumber-wrapped BOOL sent by the receiver. It will assert if /// the receiver sends anything other than NSNumbers. /// /// Returns a signal of inverted NSNumber-wrapped BOOLs. - (RACSignal *)not; /// Performs a boolean AND on all of the RACTuple of NSNumbers in sent by the receiver. /// /// Asserts if the receiver sends anything other than a RACTuple of one or more NSNumbers. /// /// Returns a signal that applies AND to each NSNumber in the tuple. - (RACSignal *)and; /// Performs a boolean OR on all of the RACTuple of NSNumbers in sent by the receiver. /// /// Asserts if the receiver sends anything other than a RACTuple of one or more NSNumbers. /// /// Returns a signal that applies OR to each NSNumber in the tuple. - (RACSignal *)or; /// Sends the result of calling the block with arguments as packed in each RACTuple /// sent by the receiver. /// /// The receiver must send tuple values, where the first element of the tuple is /// a block, taking a number of parameters equal to the count of the remaining /// elements of the tuple, and returning an object. Each block must take at least /// one argument, so each tuple must contain at least 2 elements. /// /// Example: /// /// RACSignal *adder = [RACSignal return:^(NSNumber *a, NSNumber *b) { /// return @(a.intValue + b.intValue); /// }]; /// RACSignal *sums = [[RACSignal /// combineLatest:@[ adder, as, bs ]] /// reduceApply]; /// /// Returns a signal of the result of applying the first element of each tuple /// to the remaining elements. - (RACSignal *)reduceApply; @end @interface RACSignal (OperationsDeprecated) - (RACSignal *)windowWithStart:(RACSignal *)openSignal close:(RACSignal * (^)(RACSignal *start))closeBlock __attribute__((deprecated("See https://github.com/ReactiveCocoa/ReactiveCocoa/issues/587"))); - (RACSignal *)buffer:(NSUInteger)bufferCount __attribute__((deprecated("See https://github.com/ReactiveCocoa/ReactiveCocoa/issues/587"))); - (RACSignal *)let:(RACSignal * (^)(RACSignal *sharedSignal))letBlock __attribute__((deprecated("Use -publish instead"))); + (RACSignal *)interval:(NSTimeInterval)interval __attribute__((deprecated("Use +interval:onScheduler: instead"))); + (RACSignal *)interval:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway __attribute__((deprecated("Use +interval:onScheduler:withLeeway: instead"))); - (RACSignal *)bufferWithTime:(NSTimeInterval)interval __attribute__((deprecated("Use -bufferWithTime:onScheduler: instead"))); - (RACSignal *)timeout:(NSTimeInterval)interval __attribute__((deprecated("Use -timeout:onScheduler: instead"))); - (RACDisposable *)toProperty:(NSString *)keyPath onObject:(NSObject *)object __attribute__((deprecated("Renamed to -setKeyPath:onObject:"))); - (RACSignal *)ignoreElements __attribute__((deprecated("Renamed to -ignoreValues"))); - (RACSignal *)sequenceNext:(RACSignal * (^)(void))block __attribute__((deprecated("Renamed to -then:"))); - (RACSignal *)aggregateWithStart:(id)start combine:(id (^)(id running, id next))combineBlock __attribute__((deprecated("Renamed to -aggregateWithStart:reduce:"))); - (RACSignal *)aggregateWithStartFactory:(id (^)(void))startFactory combine:(id (^)(id running, id next))combineBlock __attribute__((deprecated("Renamed to -aggregateWithStartFactory:reduce:"))); - (RACDisposable *)executeCommand:(RACCommand *)command __attribute__((deprecated("Use -flattenMap: or -subscribeNext: instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACSignal+Operations.m
New file @@ -0,0 +1,1482 @@ // // RACSignal+Operations.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-09-06. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSignal+Operations.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import "RACBlockTrampoline.h" #import "RACCommand.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACEvent.h" #import "RACGroupedSignal.h" #import "RACMulticastConnection+Private.h" #import "RACReplaySubject.h" #import "RACScheduler.h" #import "RACSerialDisposable.h" #import "RACSignalSequence.h" #import "RACStream+Private.h" #import "RACSubject.h" #import "RACSubscriber+Private.h" #import "RACSubscriber.h" #import "RACTuple.h" #import "RACUnit.h" #import <libkern/OSAtomic.h> #import <objc/runtime.h> NSString * const RACSignalErrorDomain = @"RACSignalErrorDomain"; const NSInteger RACSignalErrorTimedOut = 1; const NSInteger RACSignalErrorNoMatchingCase = 2; // Subscribes to the given signal with the given blocks. // // If the signal errors or completes, the corresponding block is invoked. If the // disposable passed to the block is _not_ disposed, then the signal is // subscribed to again. static RACDisposable *subscribeForever (RACSignal *signal, void (^next)(id), void (^error)(NSError *, RACDisposable *), void (^completed)(RACDisposable *)) { next = [next copy]; error = [error copy]; completed = [completed copy]; RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; RACSchedulerRecursiveBlock recursiveBlock = ^(void (^recurse)(void)) { RACCompoundDisposable *selfDisposable = [RACCompoundDisposable compoundDisposable]; [compoundDisposable addDisposable:selfDisposable]; __weak RACDisposable *weakSelfDisposable = selfDisposable; RACDisposable *subscriptionDisposable = [signal subscribeNext:next error:^(NSError *e) { @autoreleasepool { error(e, compoundDisposable); [compoundDisposable removeDisposable:weakSelfDisposable]; } recurse(); } completed:^{ @autoreleasepool { completed(compoundDisposable); [compoundDisposable removeDisposable:weakSelfDisposable]; } recurse(); }]; [selfDisposable addDisposable:subscriptionDisposable]; }; // Subscribe once immediately, and then use recursive scheduling for any // further resubscriptions. recursiveBlock(^{ RACScheduler *recursiveScheduler = RACScheduler.currentScheduler ?: [RACScheduler scheduler]; RACDisposable *schedulingDisposable = [recursiveScheduler scheduleRecursiveBlock:recursiveBlock]; [compoundDisposable addDisposable:schedulingDisposable]; }); return compoundDisposable; } @implementation RACSignal (Operations) - (RACSignal *)doNext:(void (^)(id x))block { NSCParameterAssert(block != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [self subscribeNext:^(id x) { block(x); [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ [subscriber sendCompleted]; }]; }] setNameWithFormat:@"[%@] -doNext:", self.name]; } - (RACSignal *)doError:(void (^)(NSError *error))block { NSCParameterAssert(block != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { block(error); [subscriber sendError:error]; } completed:^{ [subscriber sendCompleted]; }]; }] setNameWithFormat:@"[%@] -doError:", self.name]; } - (RACSignal *)doCompleted:(void (^)(void))block { NSCParameterAssert(block != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ block(); [subscriber sendCompleted]; }]; }] setNameWithFormat:@"[%@] -doCompleted:", self.name]; } - (RACSignal *)throttle:(NSTimeInterval)interval { return [[self throttle:interval valuesPassingTest:^(id _) { return YES; }] setNameWithFormat:@"[%@] -throttle: %f", self.name, (double)interval]; } - (RACSignal *)throttle:(NSTimeInterval)interval valuesPassingTest:(BOOL (^)(id next))predicate { NSCParameterAssert(interval >= 0); NSCParameterAssert(predicate != nil); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; // We may never use this scheduler, but we need to set it up ahead of // time so that our scheduled blocks are run serially if we do. RACScheduler *scheduler = [RACScheduler scheduler]; // Information about any currently-buffered `next` event. __block id nextValue = nil; __block BOOL hasNextValue = NO; RACSerialDisposable *nextDisposable = [[RACSerialDisposable alloc] init]; void (^flushNext)(BOOL send) = ^(BOOL send) { @synchronized (compoundDisposable) { [nextDisposable.disposable dispose]; if (!hasNextValue) return; if (send) [subscriber sendNext:nextValue]; nextValue = nil; hasNextValue = NO; } }; RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { RACScheduler *delayScheduler = RACScheduler.currentScheduler ?: scheduler; BOOL shouldThrottle = predicate(x); @synchronized (compoundDisposable) { flushNext(NO); if (!shouldThrottle) { [subscriber sendNext:x]; return; } nextValue = x; hasNextValue = YES; nextDisposable.disposable = [delayScheduler afterDelay:interval schedule:^{ flushNext(YES); }]; } } error:^(NSError *error) { [compoundDisposable dispose]; [subscriber sendError:error]; } completed:^{ flushNext(YES); [subscriber sendCompleted]; }]; [compoundDisposable addDisposable:subscriptionDisposable]; return compoundDisposable; }] setNameWithFormat:@"[%@] -throttle: %f valuesPassingTest:", self.name, (double)interval]; } - (RACSignal *)delay:(NSTimeInterval)interval { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; // We may never use this scheduler, but we need to set it up ahead of // time so that our scheduled blocks are run serially if we do. RACScheduler *scheduler = [RACScheduler scheduler]; void (^schedule)(dispatch_block_t) = ^(dispatch_block_t block) { RACScheduler *delayScheduler = RACScheduler.currentScheduler ?: scheduler; RACDisposable *schedulerDisposable = [delayScheduler afterDelay:interval schedule:block]; [disposable addDisposable:schedulerDisposable]; }; RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { schedule(^{ [subscriber sendNext:x]; }); } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ schedule(^{ [subscriber sendCompleted]; }); }]; [disposable addDisposable:subscriptionDisposable]; return disposable; }] setNameWithFormat:@"[%@] -delay: %f", self.name, (double)interval]; } - (RACSignal *)repeat { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return subscribeForever(self, ^(id x) { [subscriber sendNext:x]; }, ^(NSError *error, RACDisposable *disposable) { [disposable dispose]; [subscriber sendError:error]; }, ^(RACDisposable *disposable) { // Resubscribe. }); }] setNameWithFormat:@"[%@] -repeat", self.name]; } - (RACSignal *)catch:(RACSignal * (^)(NSError *error))catchBlock { NSCParameterAssert(catchBlock != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACSerialDisposable *catchDisposable = [[RACSerialDisposable alloc] init]; RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { RACSignal *signal = catchBlock(error); NSCAssert(signal != nil, @"Expected non-nil signal from catch block on %@", self); catchDisposable.disposable = [signal subscribe:subscriber]; } completed:^{ [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{ [catchDisposable dispose]; [subscriptionDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -catch:", self.name]; } - (RACSignal *)catchTo:(RACSignal *)signal { return [[self catch:^(NSError *error) { return signal; }] setNameWithFormat:@"[%@] -catchTo: %@", self.name, signal]; } - (RACSignal *)try:(BOOL (^)(id value, NSError **errorPtr))tryBlock { NSCParameterAssert(tryBlock != NULL); return [[self flattenMap:^(id value) { NSError *error = nil; BOOL passed = tryBlock(value, &error); return (passed ? [RACSignal return:value] : [RACSignal error:error]); }] setNameWithFormat:@"[%@] -try:", self.name]; } - (RACSignal *)tryMap:(id (^)(id value, NSError **errorPtr))mapBlock { NSCParameterAssert(mapBlock != NULL); return [[self flattenMap:^(id value) { NSError *error = nil; id mappedValue = mapBlock(value, &error); return (mappedValue == nil ? [RACSignal error:error] : [RACSignal return:mappedValue]); }] setNameWithFormat:@"[%@] -tryMap:", self.name]; } - (RACSignal *)initially:(void (^)(void))block { NSCParameterAssert(block != NULL); return [[RACSignal defer:^{ block(); return self; }] setNameWithFormat:@"[%@] -initially:", self.name]; } - (RACSignal *)finally:(void (^)(void))block { NSCParameterAssert(block != NULL); return [[[self doError:^(NSError *error) { block(); }] doCompleted:^{ block(); }] setNameWithFormat:@"[%@] -finally:", self.name]; } - (RACSignal *)bufferWithTime:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler { NSCParameterAssert(scheduler != nil); NSCParameterAssert(scheduler != RACScheduler.immediateScheduler); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACSerialDisposable *timerDisposable = [[RACSerialDisposable alloc] init]; NSMutableArray *values = [NSMutableArray array]; void (^flushValues)() = ^{ @synchronized (values) { [timerDisposable.disposable dispose]; if (values.count == 0) return; RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:values]; [values removeAllObjects]; [subscriber sendNext:tuple]; } }; RACDisposable *selfDisposable = [self subscribeNext:^(id x) { @synchronized (values) { if (values.count == 0) { timerDisposable.disposable = [scheduler afterDelay:interval schedule:flushValues]; } [values addObject:x ?: RACTupleNil.tupleNil]; } } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ flushValues(); [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{ [selfDisposable dispose]; [timerDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -bufferWithTime: %f onScheduler: %@", self.name, (double)interval, scheduler]; } - (RACSignal *)collect { return [[self aggregateWithStartFactory:^{ return [[NSMutableArray alloc] init]; } reduce:^(NSMutableArray *collectedValues, id x) { [collectedValues addObject:(x ?: NSNull.null)]; return collectedValues; }] setNameWithFormat:@"[%@] -collect", self.name]; } - (RACSignal *)takeLast:(NSUInteger)count { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { NSMutableArray *valuesTaken = [NSMutableArray arrayWithCapacity:count]; return [self subscribeNext:^(id x) { [valuesTaken addObject:x ? : RACTupleNil.tupleNil]; while (valuesTaken.count > count) { [valuesTaken removeObjectAtIndex:0]; } } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ for (id value in valuesTaken) { [subscriber sendNext:value == RACTupleNil.tupleNil ? nil : value]; } [subscriber sendCompleted]; }]; }] setNameWithFormat:@"[%@] -takeLast: %lu", self.name, (unsigned long)count]; } - (RACSignal *)combineLatestWith:(RACSignal *)signal { NSCParameterAssert(signal != nil); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; __block id lastSelfValue = nil; __block BOOL selfCompleted = NO; __block id lastOtherValue = nil; __block BOOL otherCompleted = NO; void (^sendNext)(void) = ^{ @synchronized (disposable) { if (lastSelfValue == nil || lastOtherValue == nil) return; [subscriber sendNext:RACTuplePack(lastSelfValue, lastOtherValue)]; } }; RACDisposable *selfDisposable = [self subscribeNext:^(id x) { @synchronized (disposable) { lastSelfValue = x ?: RACTupleNil.tupleNil; sendNext(); } } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ @synchronized (disposable) { selfCompleted = YES; if (otherCompleted) [subscriber sendCompleted]; } }]; [disposable addDisposable:selfDisposable]; RACDisposable *otherDisposable = [signal subscribeNext:^(id x) { @synchronized (disposable) { lastOtherValue = x ?: RACTupleNil.tupleNil; sendNext(); } } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ @synchronized (disposable) { otherCompleted = YES; if (selfCompleted) [subscriber sendCompleted]; } }]; [disposable addDisposable:otherDisposable]; return disposable; }] setNameWithFormat:@"[%@] -combineLatestWith: %@", self.name, signal]; } + (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals { return [[self join:signals block:^(RACSignal *left, RACSignal *right) { return [left combineLatestWith:right]; }] setNameWithFormat:@"+combineLatest: %@", signals]; } + (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock { NSCParameterAssert(reduceBlock != nil); RACSignal *result = [self combineLatest:signals]; // Although we assert this condition above, older versions of this method // supported this argument being nil. Avoid crashing Release builds of // apps that depended on that. if (reduceBlock != nil) result = [result reduceEach:reduceBlock]; return [result setNameWithFormat:@"+combineLatest: %@ reduce:", signals]; } - (RACSignal *)merge:(RACSignal *)signal { return [[RACSignal merge:@[ self, signal ]] setNameWithFormat:@"[%@] -merge: %@", self.name, signal]; } + (RACSignal *)merge:(id<NSFastEnumeration>)signals { NSMutableArray *copiedSignals = [[NSMutableArray alloc] init]; for (RACSignal *signal in signals) { [copiedSignals addObject:signal]; } return [[[RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { for (RACSignal *signal in copiedSignals) { [subscriber sendNext:signal]; } [subscriber sendCompleted]; return nil; }] flatten] setNameWithFormat:@"+merge: %@", copiedSignals]; } - (RACSignal *)flatten:(NSUInteger)maxConcurrent { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *compoundDisposable = [[RACCompoundDisposable alloc] init]; // Contains disposables for the currently active subscriptions. // // This should only be used while synchronized on `subscriber`. NSMutableArray *activeDisposables = [[NSMutableArray alloc] initWithCapacity:maxConcurrent]; // Whether the signal-of-signals has completed yet. // // This should only be used while synchronized on `subscriber`. __block BOOL selfCompleted = NO; // Subscribes to the given signal. __block void (^subscribeToSignal)(RACSignal *); // Weak reference to the above, to avoid a leak. __weak __block void (^recur)(RACSignal *); // Sends completed to the subscriber if all signals are finished. // // This should only be used while synchronized on `subscriber`. void (^completeIfAllowed)(void) = ^{ if (selfCompleted && activeDisposables.count == 0) { [subscriber sendCompleted]; // A strong reference is held to `subscribeToSignal` until completion, // preventing it from deallocating early. subscribeToSignal = nil; } }; // The signals waiting to be started. // // This array should only be used while synchronized on `subscriber`. NSMutableArray *queuedSignals = [NSMutableArray array]; recur = subscribeToSignal = ^(RACSignal *signal) { RACSerialDisposable *serialDisposable = [[RACSerialDisposable alloc] init]; @synchronized (subscriber) { [compoundDisposable addDisposable:serialDisposable]; [activeDisposables addObject:serialDisposable]; } serialDisposable.disposable = [signal subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ __strong void (^subscribeToSignal)(RACSignal *) = recur; RACSignal *nextSignal; @synchronized (subscriber) { [compoundDisposable removeDisposable:serialDisposable]; [activeDisposables removeObjectIdenticalTo:serialDisposable]; if (queuedSignals.count == 0) { completeIfAllowed(); return; } nextSignal = queuedSignals[0]; [queuedSignals removeObjectAtIndex:0]; } subscribeToSignal(nextSignal); }]; }; [compoundDisposable addDisposable:[self subscribeNext:^(RACSignal *signal) { if (signal == nil) return; NSCAssert([signal isKindOfClass:RACSignal.class], @"Expected a RACSignal, got %@", signal); @synchronized (subscriber) { if (maxConcurrent > 0 && activeDisposables.count >= maxConcurrent) { [queuedSignals addObject:signal]; // If we need to wait, skip subscribing to this // signal. return; } } subscribeToSignal(signal); } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ @synchronized (subscriber) { selfCompleted = YES; completeIfAllowed(); } }]]; return compoundDisposable; }] setNameWithFormat:@"[%@] -flatten: %lu", self.name, (unsigned long)maxConcurrent]; } - (RACSignal *)then:(RACSignal * (^)(void))block { NSCParameterAssert(block != nil); return [[[self ignoreValues] concat:[RACSignal defer:block]] setNameWithFormat:@"[%@] -then:", self.name]; } - (RACSignal *)concat { return [[self flatten:1] setNameWithFormat:@"[%@] -concat", self.name]; } - (RACSignal *)aggregateWithStartFactory:(id (^)(void))startFactory reduce:(id (^)(id running, id next))reduceBlock { NSCParameterAssert(startFactory != NULL); NSCParameterAssert(reduceBlock != NULL); return [[RACSignal defer:^{ return [self aggregateWithStart:startFactory() reduce:reduceBlock]; }] setNameWithFormat:@"[%@] -aggregateWithStartFactory:reduce:", self.name]; } - (RACSignal *)aggregateWithStart:(id)start reduce:(id (^)(id running, id next))reduceBlock { return [[self aggregateWithStart:start reduceWithIndex:^(id running, id next, NSUInteger index) { return reduceBlock(running, next); }] setNameWithFormat:@"[%@] -aggregateWithStart: %@ reduce:", self.name, [start rac_description]]; } - (RACSignal *)aggregateWithStart:(id)start reduceWithIndex:(id (^)(id, id, NSUInteger))reduceBlock { return [[[[self scanWithStart:start reduceWithIndex:reduceBlock] startWith:start] takeLast:1] setNameWithFormat:@"[%@] -aggregateWithStart: %@ reduceWithIndex:", self.name, [start rac_description]]; } - (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object { return [self setKeyPath:keyPath onObject:object nilValue:nil]; } - (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object nilValue:(id)nilValue { NSCParameterAssert(keyPath != nil); NSCParameterAssert(object != nil); keyPath = [keyPath copy]; RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; // Purposely not retaining 'object', since we want to tear down the binding // when it deallocates normally. __block void * volatile objectPtr = (__bridge void *)object; RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { // Possibly spec, possibly compiler bug, but this __bridge cast does not // result in a retain here, effectively an invisible __unsafe_unretained // qualifier. Using objc_precise_lifetime gives the __strong reference // desired. The explicit use of __strong is strictly defensive. __strong NSObject *object __attribute__((objc_precise_lifetime)) = (__bridge __strong id)objectPtr; [object setValue:x ?: nilValue forKeyPath:keyPath]; } error:^(NSError *error) { __strong NSObject *object __attribute__((objc_precise_lifetime)) = (__bridge __strong id)objectPtr; NSCAssert(NO, @"Received error from %@ in binding for key path \"%@\" on %@: %@", self, keyPath, object, error); // Log the error if we're running with assertions disabled. NSLog(@"Received error from %@ in binding for key path \"%@\" on %@: %@", self, keyPath, object, error); [disposable dispose]; } completed:^{ [disposable dispose]; }]; [disposable addDisposable:subscriptionDisposable]; #if DEBUG static void *bindingsKey = &bindingsKey; NSMutableDictionary *bindings; @synchronized (object) { bindings = objc_getAssociatedObject(object, bindingsKey); if (bindings == nil) { bindings = [NSMutableDictionary dictionary]; objc_setAssociatedObject(object, bindingsKey, bindings, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } } @synchronized (bindings) { NSCAssert(bindings[keyPath] == nil, @"Signal %@ is already bound to key path \"%@\" on object %@, adding signal %@ is undefined behavior", [bindings[keyPath] nonretainedObjectValue], keyPath, object, self); bindings[keyPath] = [NSValue valueWithNonretainedObject:self]; } #endif RACDisposable *clearPointerDisposable = [RACDisposable disposableWithBlock:^{ #if DEBUG @synchronized (bindings) { [bindings removeObjectForKey:keyPath]; } #endif while (YES) { void *ptr = objectPtr; if (OSAtomicCompareAndSwapPtrBarrier(ptr, NULL, &objectPtr)) { break; } } }]; [disposable addDisposable:clearPointerDisposable]; [object.rac_deallocDisposable addDisposable:disposable]; RACCompoundDisposable *objectDisposable = object.rac_deallocDisposable; return [RACDisposable disposableWithBlock:^{ [objectDisposable removeDisposable:disposable]; [disposable dispose]; }]; } + (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler { return [[RACSignal interval:interval onScheduler:scheduler withLeeway:0.0] setNameWithFormat:@"+interval: %f onScheduler: %@", (double)interval, scheduler]; } + (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler withLeeway:(NSTimeInterval)leeway { NSCParameterAssert(scheduler != nil); NSCParameterAssert(scheduler != RACScheduler.immediateScheduler); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [scheduler after:[NSDate dateWithTimeIntervalSinceNow:interval] repeatingEvery:interval withLeeway:leeway schedule:^{ [subscriber sendNext:[NSDate date]]; }]; }] setNameWithFormat:@"+interval: %f onScheduler: %@ withLeeway: %f", (double)interval, scheduler, (double)leeway]; } - (RACSignal *)takeUntil:(RACSignal *)signalTrigger { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; void (^triggerCompletion)(void) = ^{ [disposable dispose]; [subscriber sendCompleted]; }; RACDisposable *triggerDisposable = [signalTrigger subscribeNext:^(id _) { triggerCompletion(); } completed:^{ triggerCompletion(); }]; [disposable addDisposable:triggerDisposable]; if (!disposable.disposed) { RACDisposable *selfDisposable = [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ [disposable dispose]; [subscriber sendCompleted]; }]; [disposable addDisposable:selfDisposable]; } return disposable; }] setNameWithFormat:@"[%@] -takeUntil: %@", self.name, signalTrigger]; } - (RACSignal *)takeUntilReplacement:(RACSignal *)replacement { return [RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACSerialDisposable *selfDisposable = [[RACSerialDisposable alloc] init]; RACDisposable *replacementDisposable = [replacement subscribeNext:^(id x) { [selfDisposable dispose]; [subscriber sendNext:x]; } error:^(NSError *error) { [selfDisposable dispose]; [subscriber sendError:error]; } completed:^{ [selfDisposable dispose]; [subscriber sendCompleted]; }]; if (!selfDisposable.disposed) { selfDisposable.disposable = [[self concat:[RACSignal never]] subscribe:subscriber]; } return [RACDisposable disposableWithBlock:^{ [selfDisposable dispose]; [replacementDisposable dispose]; }]; }]; } - (RACSignal *)switchToLatest { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACMulticastConnection *connection = [self publish]; RACDisposable *subscriptionDisposable = [[connection.signal flattenMap:^(RACSignal *x) { NSCAssert(x == nil || [x isKindOfClass:RACSignal.class], @"-switchToLatest requires that the source signal (%@) send signals. Instead we got: %@", self, x); // -concat:[RACSignal never] prevents completion of the receiver from // prematurely terminating the inner signal. return [x takeUntil:[connection.signal concat:[RACSignal never]]]; }] subscribe:subscriber]; RACDisposable *connectionDisposable = [connection connect]; return [RACDisposable disposableWithBlock:^{ [subscriptionDisposable dispose]; [connectionDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -switchToLatest", self.name]; } + (RACSignal *)switch:(RACSignal *)signal cases:(NSDictionary *)cases default:(RACSignal *)defaultSignal { NSCParameterAssert(signal != nil); NSCParameterAssert(cases != nil); for (id key in cases) { id value __attribute__((unused)) = cases[key]; NSCAssert([value isKindOfClass:RACSignal.class], @"Expected all cases to be RACSignals, %@ isn't", value); } NSDictionary *copy = [cases copy]; return [[[signal map:^(id key) { if (key == nil) key = RACTupleNil.tupleNil; RACSignal *signal = copy[key] ?: defaultSignal; if (signal == nil) { NSString *description = [NSString stringWithFormat:NSLocalizedString(@"No matching signal found for value %@", @""), key]; return [RACSignal error:[NSError errorWithDomain:RACSignalErrorDomain code:RACSignalErrorNoMatchingCase userInfo:@{ NSLocalizedDescriptionKey: description }]]; } return signal; }] switchToLatest] setNameWithFormat:@"+switch: %@ cases: %@ default: %@", signal, cases, defaultSignal]; } + (RACSignal *)if:(RACSignal *)boolSignal then:(RACSignal *)trueSignal else:(RACSignal *)falseSignal { NSCParameterAssert(boolSignal != nil); NSCParameterAssert(trueSignal != nil); NSCParameterAssert(falseSignal != nil); return [[[boolSignal map:^(NSNumber *value) { NSCAssert([value isKindOfClass:NSNumber.class], @"Expected %@ to send BOOLs, not %@", boolSignal, value); return (value.boolValue ? trueSignal : falseSignal); }] switchToLatest] setNameWithFormat:@"+if: %@ then: %@ else: %@", boolSignal, trueSignal, falseSignal]; } - (id)first { return [self firstOrDefault:nil]; } - (id)firstOrDefault:(id)defaultValue { return [self firstOrDefault:defaultValue success:NULL error:NULL]; } - (id)firstOrDefault:(id)defaultValue success:(BOOL *)success error:(NSError **)error { NSCondition *condition = [[NSCondition alloc] init]; condition.name = [NSString stringWithFormat:@"[%@] -firstOrDefault: %@ success:error:", self.name, defaultValue]; __block id value = defaultValue; __block BOOL done = NO; // Ensures that we don't pass values across thread boundaries by reference. __block NSError *localError; __block BOOL localSuccess; [[self take:1] subscribeNext:^(id x) { [condition lock]; value = x; localSuccess = YES; done = YES; [condition broadcast]; [condition unlock]; } error:^(NSError *e) { [condition lock]; if (!done) { localSuccess = NO; localError = e; done = YES; [condition broadcast]; } [condition unlock]; } completed:^{ [condition lock]; localSuccess = YES; done = YES; [condition broadcast]; [condition unlock]; }]; [condition lock]; while (!done) { [condition wait]; } if (success != NULL) *success = localSuccess; if (error != NULL) *error = localError; [condition unlock]; return value; } - (BOOL)waitUntilCompleted:(NSError **)error { BOOL success = NO; [[[self ignoreValues] setNameWithFormat:@"[%@] -waitUntilCompleted:", self.name] firstOrDefault:nil success:&success error:error]; return success; } + (RACSignal *)defer:(RACSignal * (^)(void))block { NSCParameterAssert(block != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [block() subscribe:subscriber]; }] setNameWithFormat:@"+defer:"]; } - (NSArray *)toArray { return [[[self collect] first] copy]; } - (RACSequence *)sequence { return [[RACSignalSequence sequenceWithSignal:self] setNameWithFormat:@"[%@] -sequence", self.name]; } - (RACMulticastConnection *)publish { RACSubject *subject = [[RACSubject subject] setNameWithFormat:@"[%@] -publish", self.name]; RACMulticastConnection *connection = [self multicast:subject]; return connection; } - (RACMulticastConnection *)multicast:(RACSubject *)subject { [subject setNameWithFormat:@"[%@] -multicast: %@", self.name, subject.name]; RACMulticastConnection *connection = [[RACMulticastConnection alloc] initWithSourceSignal:self subject:subject]; return connection; } - (RACSignal *)replay { RACReplaySubject *subject = [[RACReplaySubject subject] setNameWithFormat:@"[%@] -replay", self.name]; RACMulticastConnection *connection = [self multicast:subject]; [connection connect]; return connection.signal; } - (RACSignal *)replayLast { RACReplaySubject *subject = [[RACReplaySubject replaySubjectWithCapacity:1] setNameWithFormat:@"[%@] -replayLast", self.name]; RACMulticastConnection *connection = [self multicast:subject]; [connection connect]; return connection.signal; } - (RACSignal *)replayLazily { RACMulticastConnection *connection = [self multicast:[RACReplaySubject subject]]; return [[RACSignal defer:^{ [connection connect]; return connection.signal; }] setNameWithFormat:@"[%@] -replayLazily", self.name]; } - (RACSignal *)timeout:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler { NSCParameterAssert(scheduler != nil); NSCParameterAssert(scheduler != RACScheduler.immediateScheduler); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; RACDisposable *timeoutDisposable = [scheduler afterDelay:interval schedule:^{ [disposable dispose]; [subscriber sendError:[NSError errorWithDomain:RACSignalErrorDomain code:RACSignalErrorTimedOut userInfo:nil]]; }]; [disposable addDisposable:timeoutDisposable]; RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [disposable dispose]; [subscriber sendError:error]; } completed:^{ [disposable dispose]; [subscriber sendCompleted]; }]; [disposable addDisposable:subscriptionDisposable]; return disposable; }] setNameWithFormat:@"[%@] -timeout: %f onScheduler: %@", self.name, (double)interval, scheduler]; } - (RACSignal *)deliverOn:(RACScheduler *)scheduler { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [self subscribeNext:^(id x) { [scheduler schedule:^{ [subscriber sendNext:x]; }]; } error:^(NSError *error) { [scheduler schedule:^{ [subscriber sendError:error]; }]; } completed:^{ [scheduler schedule:^{ [subscriber sendCompleted]; }]; }]; }] setNameWithFormat:@"[%@] -deliverOn: %@", self.name, scheduler]; } - (RACSignal *)subscribeOn:(RACScheduler *)scheduler { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; RACDisposable *schedulingDisposable = [scheduler schedule:^{ RACDisposable *subscriptionDisposable = [self subscribe:subscriber]; [disposable addDisposable:subscriptionDisposable]; }]; [disposable addDisposable:schedulingDisposable]; return disposable; }] setNameWithFormat:@"[%@] -subscribeOn: %@", self.name, scheduler]; } - (RACSignal *)deliverOnMainThread { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { __block volatile int32_t queueLength = 0; void (^performOnMainThread)(dispatch_block_t) = ^(dispatch_block_t block) { int32_t queued = OSAtomicIncrement32(&queueLength); if (NSThread.isMainThread && queued == 1) { block(); OSAtomicDecrement32(&queueLength); } else { dispatch_async(dispatch_get_main_queue(), ^{ block(); OSAtomicDecrement32(&queueLength); }); } }; return [self subscribeNext:^(id x) { performOnMainThread(^{ [subscriber sendNext:x]; }); } error:^(NSError *error) { performOnMainThread(^{ [subscriber sendError:error]; }); } completed:^{ performOnMainThread(^{ [subscriber sendCompleted]; }); }]; }] setNameWithFormat:@"[%@] -deliverOnMainThread", self.name]; } - (RACSignal *)groupBy:(id<NSCopying> (^)(id object))keyBlock transform:(id (^)(id object))transformBlock { NSCParameterAssert(keyBlock != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { NSMutableDictionary *groups = [NSMutableDictionary dictionary]; NSMutableArray *orderedGroups = [NSMutableArray array]; return [self subscribeNext:^(id x) { id<NSCopying> key = keyBlock(x); RACGroupedSignal *groupSubject = nil; @synchronized(groups) { groupSubject = groups[key]; if (groupSubject == nil) { groupSubject = [RACGroupedSignal signalWithKey:key]; groups[key] = groupSubject; [orderedGroups addObject:groupSubject]; [subscriber sendNext:groupSubject]; } } [groupSubject sendNext:transformBlock != NULL ? transformBlock(x) : x]; } error:^(NSError *error) { [subscriber sendError:error]; [orderedGroups makeObjectsPerformSelector:@selector(sendError:) withObject:error]; } completed:^{ [subscriber sendCompleted]; [orderedGroups makeObjectsPerformSelector:@selector(sendCompleted)]; }]; }] setNameWithFormat:@"[%@] -groupBy:transform:", self.name]; } - (RACSignal *)groupBy:(id<NSCopying> (^)(id object))keyBlock { return [[self groupBy:keyBlock transform:nil] setNameWithFormat:@"[%@] -groupBy:", self.name]; } - (RACSignal *)any { return [[self any:^(id x) { return YES; }] setNameWithFormat:@"[%@] -any", self.name]; } - (RACSignal *)any:(BOOL (^)(id object))predicateBlock { NSCParameterAssert(predicateBlock != NULL); return [[[self materialize] bind:^{ return ^(RACEvent *event, BOOL *stop) { if (event.finished) { *stop = YES; return [RACSignal return:@NO]; } if (predicateBlock(event.value)) { *stop = YES; return [RACSignal return:@YES]; } return [RACSignal empty]; }; }] setNameWithFormat:@"[%@] -any:", self.name]; } - (RACSignal *)all:(BOOL (^)(id object))predicateBlock { NSCParameterAssert(predicateBlock != NULL); return [[[self materialize] bind:^{ return ^(RACEvent *event, BOOL *stop) { if (event.eventType == RACEventTypeCompleted) { *stop = YES; return [RACSignal return:@YES]; } if (event.eventType == RACEventTypeError || !predicateBlock(event.value)) { *stop = YES; return [RACSignal return:@NO]; } return [RACSignal empty]; }; }] setNameWithFormat:@"[%@] -all:", self.name]; } - (RACSignal *)retry:(NSInteger)retryCount { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { __block NSInteger currentRetryCount = 0; return subscribeForever(self, ^(id x) { [subscriber sendNext:x]; }, ^(NSError *error, RACDisposable *disposable) { if (retryCount == 0 || currentRetryCount < retryCount) { // Resubscribe. currentRetryCount++; return; } [disposable dispose]; [subscriber sendError:error]; }, ^(RACDisposable *disposable) { [disposable dispose]; [subscriber sendCompleted]; }); }] setNameWithFormat:@"[%@] -retry: %lu", self.name, (unsigned long)retryCount]; } - (RACSignal *)retry { return [[self retry:0] setNameWithFormat:@"[%@] -retry", self.name]; } - (RACSignal *)sample:(RACSignal *)sampler { NSCParameterAssert(sampler != nil); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { NSLock *lock = [[NSLock alloc] init]; __block id lastValue; __block BOOL hasValue = NO; RACSerialDisposable *samplerDisposable = [[RACSerialDisposable alloc] init]; RACDisposable *sourceDisposable = [self subscribeNext:^(id x) { [lock lock]; hasValue = YES; lastValue = x; [lock unlock]; } error:^(NSError *error) { [samplerDisposable dispose]; [subscriber sendError:error]; } completed:^{ [samplerDisposable dispose]; [subscriber sendCompleted]; }]; samplerDisposable.disposable = [sampler subscribeNext:^(id _) { BOOL shouldSend = NO; id value; [lock lock]; shouldSend = hasValue; value = lastValue; [lock unlock]; if (shouldSend) { [subscriber sendNext:value]; } } error:^(NSError *error) { [sourceDisposable dispose]; [subscriber sendError:error]; } completed:^{ [sourceDisposable dispose]; [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{ [samplerDisposable dispose]; [sourceDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -sample: %@", self.name, sampler]; } - (RACSignal *)ignoreValues { return [[self filter:^(id _) { return NO; }] setNameWithFormat:@"[%@] -ignoreValues", self.name]; } - (RACSignal *)materialize { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { return [self subscribeNext:^(id x) { [subscriber sendNext:[RACEvent eventWithValue:x]]; } error:^(NSError *error) { [subscriber sendNext:[RACEvent eventWithError:error]]; [subscriber sendCompleted]; } completed:^{ [subscriber sendNext:RACEvent.completedEvent]; [subscriber sendCompleted]; }]; }] setNameWithFormat:@"[%@] -materialize", self.name]; } - (RACSignal *)dematerialize { return [[self bind:^{ return ^(RACEvent *event, BOOL *stop) { switch (event.eventType) { case RACEventTypeCompleted: *stop = YES; return [RACSignal empty]; case RACEventTypeError: *stop = YES; return [RACSignal error:event.error]; case RACEventTypeNext: return [RACSignal return:event.value]; } }; }] setNameWithFormat:@"[%@] -dematerialize", self.name]; } - (RACSignal *)not { return [[self map:^(NSNumber *value) { NSCAssert([value isKindOfClass:NSNumber.class], @"-not must only be used on a signal of NSNumbers. Instead, got: %@", value); return @(!value.boolValue); }] setNameWithFormat:@"[%@] -not", self.name]; } - (RACSignal *)and { return [[self map:^(RACTuple *tuple) { NSCAssert([tuple isKindOfClass:RACTuple.class], @"-and must only be used on a signal of RACTuples of NSNumbers. Instead, received: %@", tuple); NSCAssert(tuple.count > 0, @"-and must only be used on a signal of RACTuples of NSNumbers, with at least 1 value in the tuple"); return @([tuple.rac_sequence all:^(NSNumber *number) { NSCAssert([number isKindOfClass:NSNumber.class], @"-and must only be used on a signal of RACTuples of NSNumbers. Instead, tuple contains a non-NSNumber value: %@", tuple); return number.boolValue; }]); }] setNameWithFormat:@"[%@] -and", self.name]; } - (RACSignal *)or { return [[self map:^(RACTuple *tuple) { NSCAssert([tuple isKindOfClass:RACTuple.class], @"-or must only be used on a signal of RACTuples of NSNumbers. Instead, received: %@", tuple); NSCAssert(tuple.count > 0, @"-or must only be used on a signal of RACTuples of NSNumbers, with at least 1 value in the tuple"); return @([tuple.rac_sequence any:^(NSNumber *number) { NSCAssert([number isKindOfClass:NSNumber.class], @"-or must only be used on a signal of RACTuples of NSNumbers. Instead, tuple contains a non-NSNumber value: %@", tuple); return number.boolValue; }]); }] setNameWithFormat:@"[%@] -or", self.name]; } - (RACSignal *)reduceApply { return [[self map:^(RACTuple *tuple) { NSCAssert([tuple isKindOfClass:RACTuple.class], @"-reduceApply must only be used on a signal of RACTuples. Instead, received: %@", tuple); NSCAssert(tuple.count > 1, @"-reduceApply must only be used on a signal of RACTuples, with at least a block in tuple[0] and its first argument in tuple[1]"); // We can't use -array, because we need to preserve RACTupleNil NSMutableArray *tupleArray = [NSMutableArray arrayWithCapacity:tuple.count]; for (id val in tuple) { [tupleArray addObject:val]; } RACTuple *arguments = [RACTuple tupleWithObjectsFromArray:[tupleArray subarrayWithRange:NSMakeRange(1, tupleArray.count - 1)]]; return [RACBlockTrampoline invokeBlock:tuple[0] withArguments:arguments]; }] setNameWithFormat:@"[%@] -reduceApply", self.name]; } @end @implementation RACSignal (OperationsDeprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (RACSignal *)windowWithStart:(RACSignal *)openSignal close:(RACSignal * (^)(RACSignal *start))closeBlock { NSCParameterAssert(openSignal != nil); NSCParameterAssert(closeBlock != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { __block RACSubject *currentWindow = nil; __block RACSignal *currentCloseWindow = nil; __block RACDisposable *closeObserverDisposable = NULL; void (^closeCurrentWindow)(void) = ^{ [currentWindow sendCompleted]; currentWindow = nil; currentCloseWindow = nil; [closeObserverDisposable dispose], closeObserverDisposable = nil; }; RACDisposable *openObserverDisposable = [openSignal subscribe:[RACSubscriber subscriberWithNext:^(id x) { if(currentWindow == nil) { currentWindow = [RACSubject subject]; [subscriber sendNext:currentWindow]; currentCloseWindow = closeBlock(currentWindow); closeObserverDisposable = [currentCloseWindow subscribe:[RACSubscriber subscriberWithNext:^(id x) { closeCurrentWindow(); } error:^(NSError *error) { closeCurrentWindow(); } completed:^{ closeCurrentWindow(); }]]; } } error:^(NSError *error) { } completed:^{ }]]; RACDisposable *selfObserverDisposable = [self subscribeNext:^(id x) { [currentWindow sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{ [closeObserverDisposable dispose]; [openObserverDisposable dispose]; [selfObserverDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -windowWithStart: %@ close:", self.name, openSignal]; } - (RACSignal *)buffer:(NSUInteger)bufferCount { NSCParameterAssert(bufferCount > 0); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { NSMutableArray *values = [NSMutableArray arrayWithCapacity:bufferCount]; RACSubject *windowCloseSubject = [RACSubject subject]; RACDisposable *closeDisposable = [windowCloseSubject subscribeNext:^(id x) { [subscriber sendNext:[RACTuple tupleWithObjectsFromArray:values]]; [values removeAllObjects]; }]; __block RACDisposable *innerDisposable = nil; RACDisposable *outerDisposable = [[self windowWithStart:self close:^(RACSignal *start) { return windowCloseSubject; }] subscribeNext:^(id x) { innerDisposable = [x subscribeNext:^(id x) { [values addObject:x ? : [RACTupleNil tupleNil]]; if(values.count % bufferCount == 0) { [windowCloseSubject sendNext:[RACUnit defaultUnit]]; } }]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ [subscriber sendCompleted]; }]; return [RACDisposable disposableWithBlock:^{ [innerDisposable dispose]; [outerDisposable dispose]; [closeDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -buffer: %lu", self.name, (unsigned long)bufferCount]; } - (RACSignal *)let:(RACSignal * (^)(RACSignal *sharedSignal))letBlock { NSCParameterAssert(letBlock != NULL); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACMulticastConnection *connection = [self publish]; RACDisposable *finalDisposable = [letBlock(connection.signal) subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ [subscriber sendCompleted]; }]; RACDisposable *connectionDisposable = [connection connect]; return [RACDisposable disposableWithBlock:^{ [connectionDisposable dispose]; [finalDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -let:", self.name]; } + (RACSignal *)interval:(NSTimeInterval)interval { return [RACSignal interval:interval onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityHigh]]; } + (RACSignal *)interval:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway { return [RACSignal interval:interval onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityHigh] withLeeway:leeway]; } - (RACSignal *)timeout:(NSTimeInterval)interval { return [self timeout:interval onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityHigh]]; } - (RACSignal *)bufferWithTime:(NSTimeInterval)interval { return [self bufferWithTime:interval onScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityHigh]]; } - (RACDisposable *)toProperty:(NSString *)keyPath onObject:(NSObject *)object { return [self setKeyPath:keyPath onObject:object]; } - (RACSignal *)ignoreElements { return [self ignoreValues]; } - (RACSignal *)sequenceNext:(RACSignal * (^)(void))block { return [self then:block]; } - (RACSignal *)aggregateWithStart:(id)start combine:(id (^)(id running, id next))combineBlock { return [self aggregateWithStart:start reduce:combineBlock]; } - (RACSignal *)aggregateWithStartFactory:(id (^)(void))startFactory combine:(id (^)(id running, id next))combineBlock { return [self aggregateWithStartFactory:startFactory reduce:combineBlock]; } - (RACDisposable *)executeCommand:(RACCommand *)command { NSCParameterAssert(command != nil); return [self subscribeNext:^(id x) { [command execute:x]; }]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/RACSignal.h
New file @@ -0,0 +1,219 @@ // // RACSignal.h // ReactiveCocoa // // Created by Josh Abernathy on 3/1/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACStream.h" @class RACDisposable; @class RACScheduler; @class RACSubject; @protocol RACSubscriber; @interface RACSignal : RACStream /// Creates a new signal. This is the preferred way to create a new signal /// operation or behavior. /// /// Events can be sent to new subscribers immediately in the `didSubscribe` /// block, but the subscriber will not be able to dispose of the signal until /// a RACDisposable is returned from `didSubscribe`. In the case of infinite /// signals, this won't _ever_ happen if events are sent immediately. /// /// To ensure that the signal is disposable, events can be scheduled on the /// +[RACScheduler currentScheduler] (so that they're deferred, not sent /// immediately), or they can be sent in the background. The RACDisposable /// returned by the `didSubscribe` block should cancel any such scheduling or /// asynchronous work. /// /// didSubscribe - Called when the signal is subscribed to. The new subscriber is /// passed in. You can then manually control the <RACSubscriber> by /// sending it -sendNext:, -sendError:, and -sendCompleted, /// as defined by the operation you're implementing. This block /// should return a RACDisposable which cancels any ongoing work /// triggered by the subscription, and cleans up any resources or /// disposables created as part of it. When the disposable is /// disposed of, the signal must not send any more events to the /// `subscriber`. If no cleanup is necessary, return nil. /// /// **Note:** The `didSubscribe` block is called every time a new subscriber /// subscribes. Any side effects within the block will thus execute once for each /// subscription, not necessarily on one thread, and possibly even /// simultaneously! + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe; /// Returns a signal that immediately sends the given error. + (RACSignal *)error:(NSError *)error; /// Returns a signal that never completes. + (RACSignal *)never; /// Immediately schedules the given block on the given scheduler. The block is /// given a subscriber to which it can send events. /// /// scheduler - The scheduler on which `block` will be scheduled and results /// delivered. Cannot be nil. /// block - The block to invoke. Cannot be NULL. /// /// Returns a signal which will send all events sent on the subscriber given to /// `block`. All events will be sent on `scheduler` and it will replay any missed /// events to new subscribers. + (RACSignal *)startEagerlyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id<RACSubscriber> subscriber))block; /// Invokes the given block only on the first subscription. The block is given a /// subscriber to which it can send events. /// /// Note that disposing of the subscription to the returned signal will *not* /// dispose of the underlying subscription. If you need that behavior, see /// -[RACMulticastConnection autoconnect]. The underlying subscription will never /// be disposed of. Because of this, `block` should never return an infinite /// signal since there would be no way of ending it. /// /// scheduler - The scheduler on which the block should be scheduled. Note that /// if given +[RACScheduler immediateScheduler], the block will be /// invoked synchronously on the first subscription. Cannot be nil. /// block - The block to invoke on the first subscription. Cannot be NULL. /// /// Returns a signal which will pass through the events sent to the subscriber /// given to `block` and replay any missed events to new subscribers. + (RACSignal *)startLazilyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id<RACSubscriber> subscriber))block; @end @interface RACSignal (RACStream) /// Returns a signal that immediately sends the given value and then completes. + (RACSignal *)return:(id)value; /// Returns a signal that immediately completes. + (RACSignal *)empty; /// Subscribes to `signal` when the source signal completes. - (RACSignal *)concat:(RACSignal *)signal; /// Zips the values in the receiver with those of the given signal to create /// RACTuples. /// /// The first `next` of each stream will be combined, then the second `next`, and /// so forth, until either signal completes or errors. /// /// signal - The signal to zip with. This must not be `nil`. /// /// Returns a new signal of RACTuples, representing the combined values of the /// two signals. Any error from one of the original signals will be forwarded on /// the returned signal. - (RACSignal *)zipWith:(RACSignal *)signal; @end @interface RACSignal (Subscription) /// Subscribes `subscriber` to changes on the receiver. The receiver defines which /// events it actually sends and in what situations the events are sent. /// /// Subscription will always happen on a valid RACScheduler. If the /// +[RACScheduler currentScheduler] cannot be determined at the time of /// subscription (e.g., because the calling code is running on a GCD queue or /// NSOperationQueue), subscription will occur on a private background scheduler. /// On the main thread, subscriptions will always occur immediately, with a /// +[RACScheduler currentScheduler] of +[RACScheduler mainThreadScheduler]. /// /// This method must be overridden by any subclasses. /// /// Returns nil or a disposable. You can call -[RACDisposable dispose] if you /// need to end your subscription before it would "naturally" end, either by /// completing or erroring. Once the disposable has been disposed, the subscriber /// won't receive any more events from the subscription. - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber; /// Convenience method to subscribe to the `next` event. /// /// This corresponds to `IObserver<T>.OnNext` in Rx. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock; /// Convenience method to subscribe to the `next` and `completed` events. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock completed:(void (^)(void))completedBlock; /// Convenience method to subscribe to the `next`, `completed`, and `error` events. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock; /// Convenience method to subscribe to `error` events. /// /// This corresponds to the `IObserver<T>.OnError` in Rx. - (RACDisposable *)subscribeError:(void (^)(NSError *error))errorBlock; /// Convenience method to subscribe to `completed` events. /// /// This corresponds to the `IObserver<T>.OnCompleted` in Rx. - (RACDisposable *)subscribeCompleted:(void (^)(void))completedBlock; /// Convenience method to subscribe to `next` and `error` events. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock; /// Convenience method to subscribe to `error` and `completed` events. - (RACDisposable *)subscribeError:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock; @end /// Additional methods to assist with debugging. @interface RACSignal (Debugging) /// Logs all events that the receiver sends. - (RACSignal *)logAll; /// Logs each `next` that the receiver sends. - (RACSignal *)logNext; /// Logs any error that the receiver sends. - (RACSignal *)logError; /// Logs any `completed` event that the receiver sends. - (RACSignal *)logCompleted; @end /// Additional methods to assist with unit testing. /// /// **These methods should never ship in production code.** @interface RACSignal (Testing) /// Spins the main run loop for a short while, waiting for the receiver to send a `next`. /// /// **Because this method executes the run loop recursively, it should only be used /// on the main thread, and only from a unit test.** /// /// defaultValue - Returned if the receiver completes or errors before sending /// a `next`, or if the method times out. This argument may be /// nil. /// success - If not NULL, set to whether the receiver completed /// successfully. /// error - If not NULL, set to any error that occurred. /// /// Returns the first value received, or `defaultValue` if no value is received /// before the signal finishes or the method times out. - (id)asynchronousFirstOrDefault:(id)defaultValue success:(BOOL *)success error:(NSError **)error; /// Spins the main run loop for a short while, waiting for the receiver to complete. /// /// **Because this method executes the run loop recursively, it should only be used /// on the main thread, and only from a unit test.** /// /// error - If not NULL, set to any error that occurs. /// /// Returns whether the signal completed successfully before timing out. If NO, /// `error` will be set to any error that occurred. - (BOOL)asynchronouslyWaitUntilCompleted:(NSError **)error; @end @interface RACSignal (Deprecated) + (RACSignal *)start:(id (^)(BOOL *success, NSError **error))block __attribute__((deprecated("Use +startEagerlyWithScheduler:block: instead"))); + (RACSignal *)startWithScheduler:(RACScheduler *)scheduler subjectBlock:(void (^)(RACSubject *subject))block __attribute__((deprecated("Use +startEagerlyWithScheduler:block: instead"))); + (RACSignal *)startWithScheduler:(RACScheduler *)scheduler block:(id (^)(BOOL *success, NSError **error))block __attribute__((deprecated("Use +startEagerlyWithScheduler:block: instead"))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACSignal.m
New file @@ -0,0 +1,450 @@ // // RACSignal.m // ReactiveCocoa // // Created by Josh Abernathy on 3/15/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSignal.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACDynamicSignal.h" #import "RACEmptySignal.h" #import "RACErrorSignal.h" #import "RACMulticastConnection.h" #import "RACReplaySubject.h" #import "RACReturnSignal.h" #import "RACScheduler.h" #import "RACSerialDisposable.h" #import "RACSignal+Operations.h" #import "RACSubject.h" #import "RACSubscriber+Private.h" #import "RACTuple.h" @implementation RACSignal #pragma mark Lifecycle + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe { return [RACDynamicSignal createSignal:didSubscribe]; } + (RACSignal *)error:(NSError *)error { return [RACErrorSignal error:error]; } + (RACSignal *)never { return [[self createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { return nil; }] setNameWithFormat:@"+never"]; } + (RACSignal *)startEagerlyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id<RACSubscriber> subscriber))block { NSCParameterAssert(scheduler != nil); NSCParameterAssert(block != NULL); RACSignal *signal = [self startLazilyWithScheduler:scheduler block:block]; // Subscribe to force the lazy signal to call its block. [[signal publish] connect]; return [signal setNameWithFormat:@"+startEagerlyWithScheduler: %@ block:", scheduler]; } + (RACSignal *)startLazilyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id<RACSubscriber> subscriber))block { NSCParameterAssert(scheduler != nil); NSCParameterAssert(block != NULL); RACMulticastConnection *connection = [[RACSignal createSignal:^ id (id<RACSubscriber> subscriber) { block(subscriber); return nil; }] multicast:[RACReplaySubject subject]]; return [[[RACSignal createSignal:^ id (id<RACSubscriber> subscriber) { [connection.signal subscribe:subscriber]; [connection connect]; return nil; }] subscribeOn:scheduler] setNameWithFormat:@"+startLazilyWithScheduler: %@ block:", scheduler]; } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p> name: %@", self.class, self, self.name]; } @end @implementation RACSignal (RACStream) + (RACSignal *)empty { return [RACEmptySignal empty]; } + (RACSignal *)return:(id)value { return [RACReturnSignal return:value]; } - (RACSignal *)bind:(RACStreamBindBlock (^)(void))block { NSCParameterAssert(block != NULL); /* * -bind: should: * * 1. Subscribe to the original signal of values. * 2. Any time the original signal sends a value, transform it using the binding block. * 3. If the binding block returns a signal, subscribe to it, and pass all of its values through to the subscriber as they're received. * 4. If the binding block asks the bind to terminate, complete the _original_ signal. * 5. When _all_ signals complete, send completed to the subscriber. * * If any signal sends an error at any point, send that to the subscriber. */ return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACStreamBindBlock bindingBlock = block(); NSMutableArray *signals = [NSMutableArray arrayWithObject:self]; RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; void (^completeSignal)(RACSignal *, RACDisposable *) = ^(RACSignal *signal, RACDisposable *finishedDisposable) { BOOL removeDisposable = NO; @synchronized (signals) { [signals removeObject:signal]; if (signals.count == 0) { [subscriber sendCompleted]; [compoundDisposable dispose]; } else { removeDisposable = YES; } } if (removeDisposable) [compoundDisposable removeDisposable:finishedDisposable]; }; void (^addSignal)(RACSignal *) = ^(RACSignal *signal) { @synchronized (signals) { [signals addObject:signal]; } RACSerialDisposable *selfDisposable = [[RACSerialDisposable alloc] init]; [compoundDisposable addDisposable:selfDisposable]; RACDisposable *disposable = [signal subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [compoundDisposable dispose]; [subscriber sendError:error]; } completed:^{ @autoreleasepool { completeSignal(signal, selfDisposable); } }]; selfDisposable.disposable = disposable; }; @autoreleasepool { RACSerialDisposable *selfDisposable = [[RACSerialDisposable alloc] init]; [compoundDisposable addDisposable:selfDisposable]; RACDisposable *bindingDisposable = [self subscribeNext:^(id x) { // Manually check disposal to handle synchronous errors. if (compoundDisposable.disposed) return; BOOL stop = NO; id signal = bindingBlock(x, &stop); @autoreleasepool { if (signal != nil) addSignal(signal); if (signal == nil || stop) { [selfDisposable dispose]; completeSignal(self, selfDisposable); } } } error:^(NSError *error) { [compoundDisposable dispose]; [subscriber sendError:error]; } completed:^{ @autoreleasepool { completeSignal(self, selfDisposable); } }]; selfDisposable.disposable = bindingDisposable; } return compoundDisposable; }] setNameWithFormat:@"[%@] -bind:", self.name]; } - (RACSignal *)concat:(RACSignal *)signal { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACSerialDisposable *serialDisposable = [[RACSerialDisposable alloc] init]; RACDisposable *sourceDisposable = [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ RACDisposable *concattedDisposable = [signal subscribe:subscriber]; serialDisposable.disposable = concattedDisposable; }]; serialDisposable.disposable = sourceDisposable; return serialDisposable; }] setNameWithFormat:@"[%@] -concat: %@", self.name, signal]; } - (RACSignal *)zipWith:(RACSignal *)signal { NSCParameterAssert(signal != nil); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { __block BOOL selfCompleted = NO; NSMutableArray *selfValues = [NSMutableArray array]; __block BOOL otherCompleted = NO; NSMutableArray *otherValues = [NSMutableArray array]; void (^sendCompletedIfNecessary)(void) = ^{ @synchronized (selfValues) { BOOL selfEmpty = (selfCompleted && selfValues.count == 0); BOOL otherEmpty = (otherCompleted && otherValues.count == 0); if (selfEmpty || otherEmpty) [subscriber sendCompleted]; } }; void (^sendNext)(void) = ^{ @synchronized (selfValues) { if (selfValues.count == 0) return; if (otherValues.count == 0) return; RACTuple *tuple = RACTuplePack(selfValues[0], otherValues[0]); [selfValues removeObjectAtIndex:0]; [otherValues removeObjectAtIndex:0]; [subscriber sendNext:tuple]; sendCompletedIfNecessary(); } }; RACDisposable *selfDisposable = [self subscribeNext:^(id x) { @synchronized (selfValues) { [selfValues addObject:x ?: RACTupleNil.tupleNil]; sendNext(); } } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ @synchronized (selfValues) { selfCompleted = YES; sendCompletedIfNecessary(); } }]; RACDisposable *otherDisposable = [signal subscribeNext:^(id x) { @synchronized (selfValues) { [otherValues addObject:x ?: RACTupleNil.tupleNil]; sendNext(); } } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ @synchronized (selfValues) { otherCompleted = YES; sendCompletedIfNecessary(); } }]; return [RACDisposable disposableWithBlock:^{ [selfDisposable dispose]; [otherDisposable dispose]; }]; }] setNameWithFormat:@"[%@] -zipWith: %@", self.name, signal]; } @end @implementation RACSignal (Subscription) - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { NSCAssert(NO, @"This method must be overridden by subclasses"); return nil; } - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock { NSCParameterAssert(nextBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL]; return [self subscribe:o]; } - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock completed:(void (^)(void))completedBlock { NSCParameterAssert(nextBlock != NULL); NSCParameterAssert(completedBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:completedBlock]; return [self subscribe:o]; } - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock { NSCParameterAssert(nextBlock != NULL); NSCParameterAssert(errorBlock != NULL); NSCParameterAssert(completedBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:errorBlock completed:completedBlock]; return [self subscribe:o]; } - (RACDisposable *)subscribeError:(void (^)(NSError *error))errorBlock { NSCParameterAssert(errorBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:NULL error:errorBlock completed:NULL]; return [self subscribe:o]; } - (RACDisposable *)subscribeCompleted:(void (^)(void))completedBlock { NSCParameterAssert(completedBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:NULL error:NULL completed:completedBlock]; return [self subscribe:o]; } - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock { NSCParameterAssert(nextBlock != NULL); NSCParameterAssert(errorBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:errorBlock completed:NULL]; return [self subscribe:o]; } - (RACDisposable *)subscribeError:(void (^)(NSError *))errorBlock completed:(void (^)(void))completedBlock { NSCParameterAssert(completedBlock != NULL); NSCParameterAssert(errorBlock != NULL); RACSubscriber *o = [RACSubscriber subscriberWithNext:NULL error:errorBlock completed:completedBlock]; return [self subscribe:o]; } @end @implementation RACSignal (Debugging) - (RACSignal *)logAll { return [[[self logNext] logError] logCompleted]; } - (RACSignal *)logNext { return [[self doNext:^(id x) { NSLog(@"%@ next: %@", self, x); }] setNameWithFormat:@"%@", self.name]; } - (RACSignal *)logError { return [[self doError:^(NSError *error) { NSLog(@"%@ error: %@", self, error); }] setNameWithFormat:@"%@", self.name]; } - (RACSignal *)logCompleted { return [[self doCompleted:^{ NSLog(@"%@ completed", self); }] setNameWithFormat:@"%@", self.name]; } @end @implementation RACSignal (Testing) static const NSTimeInterval RACSignalAsynchronousWaitTimeout = 10; - (id)asynchronousFirstOrDefault:(id)defaultValue success:(BOOL *)success error:(NSError **)error { NSCAssert([NSThread isMainThread], @"%s should only be used from the main thread", __func__); __block id result = defaultValue; __block BOOL done = NO; // Ensures that we don't pass values across thread boundaries by reference. __block NSError *localError; __block BOOL localSuccess = YES; [[[[self take:1] timeout:RACSignalAsynchronousWaitTimeout onScheduler:[RACScheduler scheduler]] deliverOn:RACScheduler.mainThreadScheduler] subscribeNext:^(id x) { result = x; done = YES; } error:^(NSError *e) { if (!done) { localSuccess = NO; localError = e; done = YES; } } completed:^{ done = YES; }]; do { [NSRunLoop.mainRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; } while (!done); if (success != NULL) *success = localSuccess; if (error != NULL) *error = localError; return result; } - (BOOL)asynchronouslyWaitUntilCompleted:(NSError **)error { BOOL success = NO; [[self ignoreValues] asynchronousFirstOrDefault:nil success:&success error:error]; return success; } @end @implementation RACSignal (Deprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" + (RACSignal *)startWithScheduler:(RACScheduler *)scheduler subjectBlock:(void (^)(RACSubject *subject))block { NSCParameterAssert(block != NULL); RACReplaySubject *subject = [[RACReplaySubject subject] setNameWithFormat:@"+startWithScheduler:subjectBlock:"]; [scheduler schedule:^{ block(subject); }]; return subject; } + (RACSignal *)start:(id (^)(BOOL *success, NSError **error))block { return [[self startWithScheduler:[RACScheduler scheduler] block:block] setNameWithFormat:@"+start:"]; } + (RACSignal *)startWithScheduler:(RACScheduler *)scheduler block:(id (^)(BOOL *success, NSError **error))block { return [[self startWithScheduler:scheduler subjectBlock:^(id<RACSubscriber> subscriber) { BOOL success = YES; NSError *error = nil; id returned = block(&success, &error); if (!success) { [subscriber sendError:error]; } else { [subscriber sendNext:returned]; [subscriber sendCompleted]; } }] setNameWithFormat:@"+startWithScheduler:block:"]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/RACSignalProvider.d
New file @@ -0,0 +1,5 @@ provider RACSignal { probe next(char *signal, char *subscriber, char *valueDescription); probe completed(char *signal, char *subscriber); probe error(char *signal, char *subscriber, char *errorDescription); }; Pods/ReactiveCocoa/ReactiveCocoa/RACSignalSequence.h
New file @@ -0,0 +1,19 @@ // // RACSignalSequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-11-09. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSequence.h" @class RACSignal; // Private class that adapts a RACSignal to the RACSequence interface. @interface RACSignalSequence : RACSequence // Returns a sequence for enumerating over the given signal. + (RACSequence *)sequenceWithSignal:(RACSignal *)signal; @end Pods/ReactiveCocoa/ReactiveCocoa/RACSignalSequence.m
New file @@ -0,0 +1,79 @@ // // RACSignalSequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-11-09. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSignalSequence.h" #import "RACDisposable.h" #import "RACReplaySubject.h" #import "RACSignal+Operations.h" @interface RACSignalSequence () // Replays the signal given on initialization. @property (nonatomic, strong, readonly) RACReplaySubject *subject; @end @implementation RACSignalSequence #pragma mark Lifecycle + (RACSequence *)sequenceWithSignal:(RACSignal *)signal { RACSignalSequence *seq = [[self alloc] init]; RACReplaySubject *subject = [RACReplaySubject subject]; [signal subscribeNext:^(id value) { [subject sendNext:value]; } error:^(NSError *error) { [subject sendError:error]; } completed:^{ [subject sendCompleted]; }]; seq->_subject = subject; return seq; } #pragma mark RACSequence - (id)head { id value = [self.subject firstOrDefault:self]; if (value == self) { return nil; } else { return value ?: NSNull.null; } } - (RACSequence *)tail { RACSequence *sequence = [self.class sequenceWithSignal:[self.subject skip:1]]; sequence.name = self.name; return sequence; } - (NSArray *)array { return self.subject.toArray; } #pragma mark NSObject - (NSString *)description { // Synchronously accumulate the values that have been sent so far. NSMutableArray *values = [NSMutableArray array]; RACDisposable *disposable = [self.subject subscribeNext:^(id value) { @synchronized (values) { [values addObject:value ?: NSNull.null]; } }]; [disposable dispose]; return [NSString stringWithFormat:@"<%@: %p>{ name = %@, values = %@ … }", self.class, self, self.name, values]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACStream+Private.h
New file @@ -0,0 +1,23 @@ // // RACStream+Private.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-07-22. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACStream.h" @interface RACStream () // Combines a list of streams using the logic of the given block. // // streams - The streams to combine. // block - An operator that combines two streams and returns a new one. The // returned stream should contain 2-tuples of the streams' combined // values. // // Returns a combined stream. + (instancetype)join:(id<NSFastEnumeration>)streams block:(RACStream * (^)(id, id))block; @end Pods/ReactiveCocoa/ReactiveCocoa/RACStream.h
New file @@ -0,0 +1,335 @@ // // RACStream.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-31. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACStream; /// A block which accepts a value from a RACStream and returns a new instance /// of the same stream class. /// /// Setting `stop` to `YES` will cause the bind to terminate after the returned /// value. Returning `nil` will result in immediate termination. typedef RACStream * (^RACStreamBindBlock)(id value, BOOL *stop); /// An abstract class representing any stream of values. /// /// This class represents a monad, upon which many stream-based operations can /// be built. /// /// When subclassing RACStream, only the methods in the main @interface body need /// to be overridden. @interface RACStream : NSObject /// Returns an empty stream. + (instancetype)empty; /// Lifts `value` into the stream monad. /// /// Returns a stream containing only the given value. + (instancetype)return:(id)value; /// Lazily binds a block to the values in the receiver. /// /// This should only be used if you need to terminate the bind early, or close /// over some state. -flattenMap: is more appropriate for all other cases. /// /// block - A block returning a RACStreamBindBlock. This block will be invoked /// each time the bound stream is re-evaluated. This block must not be /// nil or return nil. /// /// Returns a new stream which represents the combined result of all lazy /// applications of `block`. - (instancetype)bind:(RACStreamBindBlock (^)(void))block; /// Appends the values of `stream` to the values in the receiver. /// /// stream - A stream to concatenate. This must be an instance of the same /// concrete class as the receiver, and should not be `nil`. /// /// Returns a new stream representing the receiver followed by `stream`. - (instancetype)concat:(RACStream *)stream; /// Zips the values in the receiver with those of the given stream to create /// RACTuples. /// /// The first value of each stream will be combined, then the second value, and /// so forth, until at least one of the streams is exhausted. /// /// stream - The stream to zip with. This must be an instance of the same /// concrete class as the receiver, and should not be `nil`. /// /// Returns a new stream of RACTuples, representing the zipped values of the /// two streams. - (instancetype)zipWith:(RACStream *)stream; @end /// This extension contains functionality to support naming streams for /// debugging. /// /// Subclasses do not need to override the methods here. @interface RACStream () /// The name of the stream. This is for debugging/human purposes only. @property (copy) NSString *name; /// Sets the name of the receiver to the given format string. /// /// This is for debugging purposes only, and won't do anything unless the /// RAC_DEBUG_SIGNAL_NAMES environment variable is set. /// /// Returns the receiver, for easy method chaining. - (instancetype)setNameWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); @end /// Operations built on the RACStream primitives. /// /// These methods do not need to be overridden, although subclasses may /// occasionally gain better performance from doing so. @interface RACStream (Operations) /// Maps `block` across the values in the receiver and flattens the result. /// /// Note that operators applied _after_ -flattenMap: behave differently from /// operators _within_ -flattenMap:. See the Examples section below. /// /// This corresponds to the `SelectMany` method in Rx. /// /// block - A block which accepts the values in the receiver and returns a new /// instance of the receiver's class. Returning `nil` from this block is /// equivalent to returning an empty signal. /// /// Examples /// /// [signal flattenMap:^(id x) { /// // Logs each time a returned signal completes. /// return [[RACSignal return:x] logCompleted]; /// }]; /// /// [[signal /// flattenMap:^(id x) { /// return [RACSignal return:x]; /// }] /// // Logs only once, when all of the signals complete. /// logCompleted]; /// /// Returns a new stream which represents the combined streams resulting from /// mapping `block`. - (instancetype)flattenMap:(RACStream * (^)(id value))block; /// Flattens a stream of streams. /// /// This corresponds to the `Merge` method in Rx. /// /// Returns a stream consisting of the combined streams obtained from the /// receiver. - (instancetype)flatten; /// Maps `block` across the values in the receiver. /// /// This corresponds to the `Select` method in Rx. /// /// Returns a new stream with the mapped values. - (instancetype)map:(id (^)(id value))block; /// Replaces each value in the receiver with the given object. /// /// Returns a new stream which includes the given object once for each value in /// the receiver. - (instancetype)mapReplace:(id)object; /// Filters out values in the receiver that don't pass the given test. /// /// This corresponds to the `Where` method in Rx. /// /// Returns a new stream with only those values that passed. - (instancetype)filter:(BOOL (^)(id value))block; /// Filters out values in the receiver that equal (via -isEqual:) the provided value. /// /// value - The value can be `nil`, in which case it ignores `nil` values. /// /// Returns a new stream containing only the values which did not compare equal /// to `value`. - (instancetype)ignore:(id)value; /// Unpacks each RACTuple in the receiver and maps the values to a new value. /// /// reduceBlock - The block which reduces each RACTuple's values into one value. /// It must take as many arguments as the number of tuple elements /// to process. Each argument will be an object argument. The /// return value must be an object. This argument cannot be nil. /// /// Returns a new stream of reduced tuple values. - (instancetype)reduceEach:(id (^)())reduceBlock; /// Returns a stream consisting of `value`, followed by the values in the /// receiver. - (instancetype)startWith:(id)value; /// Skips the first `skipCount` values in the receiver. /// /// Returns the receiver after skipping the first `skipCount` values. If /// `skipCount` is greater than the number of values in the stream, an empty /// stream is returned. - (instancetype)skip:(NSUInteger)skipCount; /// Returns a stream of the first `count` values in the receiver. If `count` is /// greater than or equal to the number of values in the stream, a stream /// equivalent to the receiver is returned. - (instancetype)take:(NSUInteger)count; /// Zips the values in the given streams to create RACTuples. /// /// The first value of each stream will be combined, then the second value, and /// so forth, until at least one of the streams is exhausted. /// /// streams - The streams to combine. These must all be instances of the same /// concrete class implementing the protocol. If this collection is /// empty, the returned stream will be empty. /// /// Returns a new stream containing RACTuples of the zipped values from the /// streams. + (instancetype)zip:(id<NSFastEnumeration>)streams; /// Zips streams using +zip:, then reduces the resulting tuples into a single /// value using -reduceEach: /// /// streams - The streams to combine. These must all be instances of the /// same concrete class implementing the protocol. If this /// collection is empty, the returned stream will be empty. /// reduceBlock - The block which reduces the values from all the streams /// into one value. It must take as many arguments as the /// number of streams given. Each argument will be an object /// argument. The return value must be an object. This argument /// must not be nil. /// /// Example: /// /// [RACStream zip:@[ stringSignal, intSignal ] reduce:^(NSString *string, NSNumber *number) { /// return [NSString stringWithFormat:@"%@: %@", string, number]; /// }]; /// /// Returns a new stream containing the results from each invocation of /// `reduceBlock`. + (instancetype)zip:(id<NSFastEnumeration>)streams reduce:(id (^)())reduceBlock; /// Returns a stream obtained by concatenating `streams` in order. + (instancetype)concat:(id<NSFastEnumeration>)streams; /// Combines values in the receiver from left to right using the given block. /// /// The algorithm proceeds as follows: /// /// 1. `startingValue` is passed into the block as the `running` value, and the /// first element of the receiver is passed into the block as the `next` value. /// 2. The result of the invocation is added to the returned stream. /// 3. The result of the invocation (`running`) and the next element of the /// receiver (`next`) is passed into `block`. /// 4. Steps 2 and 3 are repeated until all values have been processed. /// /// startingValue - The value to be combined with the first element of the /// receiver. This value may be `nil`. /// reduceBlock - The block that describes how to combine values of the /// receiver. If the receiver is empty, this block will never be /// invoked. Cannot be nil. /// /// Examples /// /// RACSequence *numbers = @[ @1, @2, @3, @4 ].rac_sequence; /// /// // Contains 1, 3, 6, 10 /// RACSequence *sums = [numbers scanWithStart:@0 reduce:^(NSNumber *sum, NSNumber *next) { /// return @(sum.integerValue + next.integerValue); /// }]; /// /// Returns a new stream that consists of each application of `reduceBlock`. If the /// receiver is empty, an empty stream is returned. - (instancetype)scanWithStart:(id)startingValue reduce:(id (^)(id running, id next))reduceBlock; /// Combines values in the receiver from left to right using the given block /// which also takes zero-based index of the values. /// /// startingValue - The value to be combined with the first element of the /// receiver. This value may be `nil`. /// reduceBlock - The block that describes how to combine values of the /// receiver. This block takes zero-based index value as the last /// parameter. If the receiver is empty, this block will never /// be invoked. Cannot be nil. /// /// Returns a new stream that consists of each application of `reduceBlock`. If the /// receiver is empty, an empty stream is returned. - (instancetype)scanWithStart:(id)startingValue reduceWithIndex:(id (^)(id running, id next, NSUInteger index))reduceBlock; /// Combines each previous and current value into one object. /// /// This method is similar to -scanWithStart:reduce:, but only ever operates on /// the previous and current values (instead of the whole stream), and does not /// pass the return value of `reduceBlock` into the next invocation of it. /// /// start - The value passed into `reduceBlock` as `previous` for the /// first value. /// reduceBlock - The block that combines the previous value and the current /// value to create the reduced value. Cannot be nil. /// /// Examples /// /// RACSequence *numbers = @[ @1, @2, @3, @4 ].rac_sequence; /// /// // Contains 1, 3, 5, 7 /// RACSequence *sums = [numbers combinePreviousWithStart:@0 reduce:^(NSNumber *previous, NSNumber *next) { /// return @(previous.integerValue + next.integerValue); /// }]; /// /// Returns a new stream consisting of the return values from each application of /// `reduceBlock`. - (instancetype)combinePreviousWithStart:(id)start reduce:(id (^)(id previous, id current))reduceBlock; /// Takes values until the given block returns `YES`. /// /// Returns a stream of the initial values in the receiver that fail `predicate`. /// If `predicate` never returns `YES`, a stream equivalent to the receiver is /// returned. - (instancetype)takeUntilBlock:(BOOL (^)(id x))predicate; /// Takes values until the given block returns `NO`. /// /// Returns a stream of the initial values in the receiver that pass `predicate`. /// If `predicate` never returns `NO`, a stream equivalent to the receiver is /// returned. - (instancetype)takeWhileBlock:(BOOL (^)(id x))predicate; /// Skips values until the given block returns `YES`. /// /// Returns a stream containing the values of the receiver that follow any /// initial values failing `predicate`. If `predicate` never returns `YES`, /// an empty stream is returned. - (instancetype)skipUntilBlock:(BOOL (^)(id x))predicate; /// Skips values until the given block returns `NO`. /// /// Returns a stream containing the values of the receiver that follow any /// initial values passing `predicate`. If `predicate` never returns `NO`, an /// empty stream is returned. - (instancetype)skipWhileBlock:(BOOL (^)(id x))predicate; /// Returns a stream of values for which -isEqual: returns NO when compared to the /// previous value. - (instancetype)distinctUntilChanged; @end @interface RACStream (Deprecated) - (instancetype)sequenceMany:(RACStream * (^)(void))block __attribute__((deprecated("Use -flattenMap: instead"))); - (instancetype)scanWithStart:(id)startingValue combine:(id (^)(id running, id next))block __attribute__((deprecated("Renamed to -scanWithStart:reduce:"))); - (instancetype)mapPreviousWithStart:(id)start reduce:(id (^)(id previous, id current))combineBlock __attribute__((deprecated("Renamed to -combinePreviousWithStart:reduce:"))); @end Pods/ReactiveCocoa/ReactiveCocoa/RACStream.m
New file @@ -0,0 +1,377 @@ // // RACStream.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-31. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACStream.h" #import "NSObject+RACDescription.h" #import "RACBlockTrampoline.h" #import "RACTuple.h" @implementation RACStream #pragma mark Lifecycle - (id)init { self = [super init]; if (self == nil) return nil; self.name = @""; return self; } #pragma mark Abstract methods + (instancetype)empty { return nil; } - (instancetype)bind:(RACStreamBindBlock (^)(void))block { return nil; } + (instancetype)return:(id)value { return nil; } - (instancetype)concat:(RACStream *)stream { return nil; } - (instancetype)zipWith:(RACStream *)stream { return nil; } #pragma mark Naming - (instancetype)setNameWithFormat:(NSString *)format, ... { if (getenv("RAC_DEBUG_SIGNAL_NAMES") == NULL) return self; NSCParameterAssert(format != nil); va_list args; va_start(args, format); NSString *str = [[NSString alloc] initWithFormat:format arguments:args]; va_end(args); self.name = str; return self; } @end @implementation RACStream (Operations) - (instancetype)flattenMap:(RACStream * (^)(id value))block { Class class = self.class; return [[self bind:^{ return ^(id value, BOOL *stop) { id stream = block(value) ?: [class empty]; NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream); return stream; }; }] setNameWithFormat:@"[%@] -flattenMap:", self.name]; } - (instancetype)flatten { __weak RACStream *stream __attribute__((unused)) = self; return [[self flattenMap:^(id value) { return value; }] setNameWithFormat:@"[%@] -flatten", self.name]; } - (instancetype)map:(id (^)(id value))block { NSCParameterAssert(block != nil); Class class = self.class; return [[self flattenMap:^(id value) { return [class return:block(value)]; }] setNameWithFormat:@"[%@] -map:", self.name]; } - (instancetype)mapReplace:(id)object { return [[self map:^(id _) { return object; }] setNameWithFormat:@"[%@] -mapReplace: %@", self.name, [object rac_description]]; } - (instancetype)combinePreviousWithStart:(id)start reduce:(id (^)(id previous, id next))reduceBlock { NSCParameterAssert(reduceBlock != NULL); return [[[self scanWithStart:RACTuplePack(start) reduce:^(RACTuple *previousTuple, id next) { id value = reduceBlock(previousTuple[0], next); return RACTuplePack(next, value); }] map:^(RACTuple *tuple) { return tuple[1]; }] setNameWithFormat:@"[%@] -combinePreviousWithStart: %@ reduce:", self.name, [start rac_description]]; } - (instancetype)filter:(BOOL (^)(id value))block { NSCParameterAssert(block != nil); Class class = self.class; return [[self flattenMap:^ id (id value) { if (block(value)) { return [class return:value]; } else { return class.empty; } }] setNameWithFormat:@"[%@] -filter:", self.name]; } - (instancetype)ignore:(id)value { return [[self filter:^ BOOL (id innerValue) { return innerValue != value && ![innerValue isEqual:value]; }] setNameWithFormat:@"[%@] -ignore: %@", self.name, [value rac_description]]; } - (instancetype)reduceEach:(id (^)())reduceBlock { NSCParameterAssert(reduceBlock != nil); __weak RACStream *stream __attribute__((unused)) = self; return [[self map:^(RACTuple *t) { NSCAssert([t isKindOfClass:RACTuple.class], @"Value from stream %@ is not a tuple: %@", stream, t); return [RACBlockTrampoline invokeBlock:reduceBlock withArguments:t]; }] setNameWithFormat:@"[%@] -reduceEach:", self.name]; } - (instancetype)startWith:(id)value { return [[[self.class return:value] concat:self] setNameWithFormat:@"[%@] -startWith: %@", self.name, [value rac_description]]; } - (instancetype)skip:(NSUInteger)skipCount { Class class = self.class; return [[self bind:^{ __block NSUInteger skipped = 0; return ^(id value, BOOL *stop) { if (skipped >= skipCount) return [class return:value]; skipped++; return class.empty; }; }] setNameWithFormat:@"[%@] -skip: %lu", self.name, (unsigned long)skipCount]; } - (instancetype)take:(NSUInteger)count { Class class = self.class; if (count == 0) return class.empty; return [[self bind:^{ __block NSUInteger taken = 0; return ^ id (id value, BOOL *stop) { if (taken < count) { ++taken; if (taken == count) *stop = YES; return [class return:value]; } else { return nil; } }; }] setNameWithFormat:@"[%@] -take: %lu", self.name, (unsigned long)count]; } + (instancetype)join:(id<NSFastEnumeration>)streams block:(RACStream * (^)(id, id))block { RACStream *current = nil; // Creates streams of successively larger tuples by combining the input // streams one-by-one. for (RACStream *stream in streams) { // For the first stream, just wrap its values in a RACTuple. That way, // if only one stream is given, the result is still a stream of tuples. if (current == nil) { current = [stream map:^(id x) { return RACTuplePack(x); }]; continue; } current = block(current, stream); } if (current == nil) return [self empty]; return [current map:^(RACTuple *xs) { // Right now, each value is contained in its own tuple, sorta like: // // (((1), 2), 3) // // We need to unwrap all the layers and create a tuple out of the result. NSMutableArray *values = [[NSMutableArray alloc] init]; while (xs != nil) { [values insertObject:xs.last ?: RACTupleNil.tupleNil atIndex:0]; xs = (xs.count > 1 ? xs.first : nil); } return [RACTuple tupleWithObjectsFromArray:values]; }]; } + (instancetype)zip:(id<NSFastEnumeration>)streams { return [[self join:streams block:^(RACStream *left, RACStream *right) { return [left zipWith:right]; }] setNameWithFormat:@"+zip: %@", streams]; } + (instancetype)zip:(id<NSFastEnumeration>)streams reduce:(id (^)())reduceBlock { NSCParameterAssert(reduceBlock != nil); RACStream *result = [self zip:streams]; // Although we assert this condition above, older versions of this method // supported this argument being nil. Avoid crashing Release builds of // apps that depended on that. if (reduceBlock != nil) result = [result reduceEach:reduceBlock]; return [result setNameWithFormat:@"+zip: %@ reduce:", streams]; } + (instancetype)concat:(id<NSFastEnumeration>)streams { RACStream *result = self.empty; for (RACStream *stream in streams) { result = [result concat:stream]; } return [result setNameWithFormat:@"+concat: %@", streams]; } - (instancetype)scanWithStart:(id)startingValue reduce:(id (^)(id running, id next))reduceBlock { NSCParameterAssert(reduceBlock != nil); return [[self scanWithStart:startingValue reduceWithIndex:^(id running, id next, NSUInteger index) { return reduceBlock(running, next); }] setNameWithFormat:@"[%@] -scanWithStart: %@ reduce:", self.name, [startingValue rac_description]]; } - (instancetype)scanWithStart:(id)startingValue reduceWithIndex:(id (^)(id, id, NSUInteger))reduceBlock { NSCParameterAssert(reduceBlock != nil); Class class = self.class; return [[self bind:^{ __block id running = startingValue; __block NSUInteger index = 0; return ^(id value, BOOL *stop) { running = reduceBlock(running, value, index++); return [class return:running]; }; }] setNameWithFormat:@"[%@] -scanWithStart: %@ reduceWithIndex:", self.name, [startingValue rac_description]]; } - (instancetype)takeUntilBlock:(BOOL (^)(id x))predicate { NSCParameterAssert(predicate != nil); Class class = self.class; return [[self bind:^{ return ^ id (id value, BOOL *stop) { if (predicate(value)) return nil; return [class return:value]; }; }] setNameWithFormat:@"[%@] -takeUntilBlock:", self.name]; } - (instancetype)takeWhileBlock:(BOOL (^)(id x))predicate { NSCParameterAssert(predicate != nil); return [[self takeUntilBlock:^ BOOL (id x) { return !predicate(x); }] setNameWithFormat:@"[%@] -takeWhileBlock:", self.name]; } - (instancetype)skipUntilBlock:(BOOL (^)(id x))predicate { NSCParameterAssert(predicate != nil); Class class = self.class; return [[self bind:^{ __block BOOL skipping = YES; return ^ id (id value, BOOL *stop) { if (skipping) { if (predicate(value)) { skipping = NO; } else { return class.empty; } } return [class return:value]; }; }] setNameWithFormat:@"[%@] -skipUntilBlock:", self.name]; } - (instancetype)skipWhileBlock:(BOOL (^)(id x))predicate { NSCParameterAssert(predicate != nil); return [[self skipUntilBlock:^ BOOL (id x) { return !predicate(x); }] setNameWithFormat:@"[%@] -skipWhileBlock:", self.name]; } - (instancetype)distinctUntilChanged { Class class = self.class; return [[self bind:^{ __block id lastValue = nil; __block BOOL initial = YES; return ^(id x, BOOL *stop) { if (!initial && (lastValue == x || [x isEqual:lastValue])) return [class empty]; initial = NO; lastValue = x; return [class return:x]; }; }] setNameWithFormat:@"[%@] -distinctUntilChanged", self.name]; } @end @implementation RACStream (Deprecated) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" - (instancetype)sequenceMany:(RACStream * (^)(void))block { NSCParameterAssert(block != NULL); return [[self flattenMap:^(id _) { return block(); }] setNameWithFormat:@"[%@] -sequenceMany:", self.name]; } - (instancetype)scanWithStart:(id)startingValue combine:(id (^)(id running, id next))block { return [self scanWithStart:startingValue reduce:block]; } - (instancetype)mapPreviousWithStart:(id)start reduce:(id (^)(id previous, id current))combineBlock { return [self combinePreviousWithStart:start reduce:combineBlock]; } #pragma clang diagnostic pop @end Pods/ReactiveCocoa/ReactiveCocoa/RACStringSequence.h
New file @@ -0,0 +1,18 @@ // // RACStringSequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACSequence.h" // Private class that adapts a string to the RACSequence interface. @interface RACStringSequence : RACSequence // Returns a sequence for enumerating over the given string, starting from the // given character offset. The string will be copied to prevent mutation. + (RACSequence *)sequenceWithString:(NSString *)string offset:(NSUInteger)offset; @end Pods/ReactiveCocoa/ReactiveCocoa/RACStringSequence.m
New file @@ -0,0 +1,65 @@ // // RACStringSequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2012-10-29. // Copyright (c) 2012 GitHub. All rights reserved. // #import "RACStringSequence.h" @interface RACStringSequence () // The string being sequenced. @property (nonatomic, copy, readonly) NSString *string; // The index in the string from which the sequence starts. @property (nonatomic, assign, readonly) NSUInteger offset; @end @implementation RACStringSequence #pragma mark Lifecycle + (RACSequence *)sequenceWithString:(NSString *)string offset:(NSUInteger)offset { NSCParameterAssert(offset <= string.length); if (offset == string.length) return self.empty; RACStringSequence *seq = [[self alloc] init]; seq->_string = [string copy]; seq->_offset = offset; return seq; } #pragma mark RACSequence - (id)head { return [self.string substringWithRange:NSMakeRange(self.offset, 1)]; } - (RACSequence *)tail { RACSequence *sequence = [self.class sequenceWithString:self.string offset:self.offset + 1]; sequence.name = self.name; return sequence; } - (NSArray *)array { NSUInteger substringLength = self.string.length - self.offset; NSMutableArray *array = [NSMutableArray arrayWithCapacity:substringLength]; [self.string enumerateSubstringsInRange:NSMakeRange(self.offset, substringLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { [array addObject:substring]; }]; return [array copy]; } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>{ name = %@, string = %@ }", self.class, self, self.name, [self.string substringFromIndex:self.offset]]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubject.h
New file @@ -0,0 +1,22 @@ // // RACSubject.h // ReactiveCocoa // // Created by Josh Abernathy on 3/9/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSignal.h" #import "RACSubscriber.h" /// A subject can be thought of as a signal that you can manually control by /// sending next, completed, and error. /// /// They're most helpful in bridging the non-RAC world to RAC, since they let you /// manually control the sending of events. @interface RACSubject : RACSignal <RACSubscriber> /// Returns a new subject. + (instancetype)subject; @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubject.m
New file @@ -0,0 +1,124 @@ // // RACSubject.m // ReactiveCocoa // // Created by Josh Abernathy on 3/9/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubject.h" #import "RACEXTScope.h" #import "RACCompoundDisposable.h" #import "RACPassthroughSubscriber.h" @interface RACSubject () // Contains all current subscribers to the receiver. // // This should only be used while synchronized on `self`. @property (nonatomic, strong, readonly) NSMutableArray *subscribers; // Contains all of the receiver's subscriptions to other signals. @property (nonatomic, strong, readonly) RACCompoundDisposable *disposable; // Enumerates over each of the receiver's `subscribers` and invokes `block` for // each. - (void)enumerateSubscribersUsingBlock:(void (^)(id<RACSubscriber> subscriber))block; @end @implementation RACSubject #pragma mark Lifecycle + (instancetype)subject { return [[self alloc] init]; } - (id)init { self = [super init]; if (self == nil) return nil; _disposable = [RACCompoundDisposable compoundDisposable]; _subscribers = [[NSMutableArray alloc] initWithCapacity:1]; return self; } - (void)dealloc { [self.disposable dispose]; } #pragma mark Subscription - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber { NSCParameterAssert(subscriber != nil); RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable]; NSMutableArray *subscribers = self.subscribers; @synchronized (subscribers) { [subscribers addObject:subscriber]; } return [RACDisposable disposableWithBlock:^{ @synchronized (subscribers) { // Since newer subscribers are generally shorter-lived, search // starting from the end of the list. NSUInteger index = [subscribers indexOfObjectWithOptions:NSEnumerationReverse passingTest:^ BOOL (id<RACSubscriber> obj, NSUInteger index, BOOL *stop) { return obj == subscriber; }]; if (index != NSNotFound) [subscribers removeObjectAtIndex:index]; } }]; } - (void)enumerateSubscribersUsingBlock:(void (^)(id<RACSubscriber> subscriber))block { NSArray *subscribers; @synchronized (self.subscribers) { subscribers = [self.subscribers copy]; } for (id<RACSubscriber> subscriber in subscribers) { block(subscriber); } } #pragma mark RACSubscriber - (void)sendNext:(id)value { [self enumerateSubscribersUsingBlock:^(id<RACSubscriber> subscriber) { [subscriber sendNext:value]; }]; } - (void)sendError:(NSError *)error { [self.disposable dispose]; [self enumerateSubscribersUsingBlock:^(id<RACSubscriber> subscriber) { [subscriber sendError:error]; }]; } - (void)sendCompleted { [self.disposable dispose]; [self enumerateSubscribersUsingBlock:^(id<RACSubscriber> subscriber) { [subscriber sendCompleted]; }]; } - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)d { if (d.disposed) return; [self.disposable addDisposable:d]; @weakify(self, d); [d addDisposable:[RACDisposable disposableWithBlock:^{ @strongify(self, d); [self.disposable removeDisposable:d]; }]]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriber+Private.h
New file @@ -0,0 +1,17 @@ // // RACSubscriber+Private.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-06-13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSubscriber.h" // A simple block-based subscriber. @interface RACSubscriber : NSObject <RACSubscriber> // Creates a new subscriber with the given blocks. + (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed; @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriber.h
New file @@ -0,0 +1,51 @@ // // RACSubscriber.h // ReactiveCocoa // // Created by Josh Abernathy on 3/1/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> @class RACCompoundDisposable; /// Represents any object which can directly receive values from a RACSignal. /// /// You generally shouldn't need to implement this protocol. +[RACSignal /// createSignal:], RACSignal's subscription methods, or RACSubject should work /// for most uses. /// /// Implementors of this protocol may receive messages and values from multiple /// threads simultaneously, and so should be thread-safe. Subscribers will also /// be weakly referenced so implementations must allow that. @protocol RACSubscriber <NSObject> @required /// Sends the next value to subscribers. /// /// value - The value to send. This can be `nil`. - (void)sendNext:(id)value; /// Sends the error to subscribers. /// /// error - The error to send. This can be `nil`. /// /// This terminates the subscription, and invalidates the subscriber (such that /// it cannot subscribe to anything else in the future). - (void)sendError:(NSError *)error; /// Sends completed to subscribers. /// /// This terminates the subscription, and invalidates the subscriber (such that /// it cannot subscribe to anything else in the future). - (void)sendCompleted; /// Sends the subscriber a disposable that represents one of its subscriptions. /// /// A subscriber may receive multiple disposables if it gets subscribed to /// multiple signals; however, any error or completed events must terminate _all_ /// subscriptions. - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable; @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriber.m
New file @@ -0,0 +1,112 @@ // // RACSubscriber.m // ReactiveCocoa // // Created by Josh Abernathy on 3/1/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubscriber.h" #import "RACSubscriber+Private.h" #import "RACEXTScope.h" #import "RACCompoundDisposable.h" @interface RACSubscriber () // These callbacks should only be accessed while synchronized on self. @property (nonatomic, copy) void (^next)(id value); @property (nonatomic, copy) void (^error)(NSError *error); @property (nonatomic, copy) void (^completed)(void); @property (nonatomic, strong, readonly) RACCompoundDisposable *disposable; @end @implementation RACSubscriber #pragma mark Lifecycle + (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed { RACSubscriber *subscriber = [[self alloc] init]; subscriber->_next = [next copy]; subscriber->_error = [error copy]; subscriber->_completed = [completed copy]; return subscriber; } - (id)init { self = [super init]; if (self == nil) return nil; @unsafeify(self); RACDisposable *selfDisposable = [RACDisposable disposableWithBlock:^{ @strongify(self); @synchronized (self) { self.next = nil; self.error = nil; self.completed = nil; } }]; _disposable = [RACCompoundDisposable compoundDisposable]; [_disposable addDisposable:selfDisposable]; return self; } - (void)dealloc { [self.disposable dispose]; } #pragma mark RACSubscriber - (void)sendNext:(id)value { @synchronized (self) { void (^nextBlock)(id) = [self.next copy]; if (nextBlock == nil) return; nextBlock(value); } } - (void)sendError:(NSError *)e { @synchronized (self) { void (^errorBlock)(NSError *) = [self.error copy]; [self.disposable dispose]; if (errorBlock == nil) return; errorBlock(e); } } - (void)sendCompleted { @synchronized (self) { void (^completedBlock)(void) = [self.completed copy]; [self.disposable dispose]; if (completedBlock == nil) return; completedBlock(); } } - (void)didSubscribeWithDisposable:(RACCompoundDisposable *)otherDisposable { if (otherDisposable.disposed) return; RACCompoundDisposable *selfDisposable = self.disposable; [selfDisposable addDisposable:otherDisposable]; @unsafeify(otherDisposable); // If this subscription terminates, purge its disposable to avoid unbounded // memory growth. [otherDisposable addDisposable:[RACDisposable disposableWithBlock:^{ @strongify(otherDisposable); [selfDisposable removeDisposable:otherDisposable]; }]]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriptingAssignmentTrampoline.h
New file @@ -0,0 +1,54 @@ // // RACSubscriptingAssignmentTrampoline.h // ReactiveCocoa // // Created by Josh Abernathy on 9/24/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACEXTKeyPathCoding.h" @class RACSignal; /// Assigns a signal to an object property, automatically setting the given key /// path on every `next`. When the signal completes, the binding is automatically /// disposed of. /// /// There are two different versions of this macro: /// /// - RAC(TARGET, KEYPATH, NILVALUE) will bind the `KEYPATH` of `TARGET` to the /// given signal. If the signal ever sends a `nil` value, the property will be /// set to `NILVALUE` instead. `NILVALUE` may itself be `nil` for object /// properties, but an NSValue should be used for primitive properties, to /// avoid an exception if `nil` is sent (which might occur if an intermediate /// object is set to `nil`). /// - RAC(TARGET, KEYPATH) is the same as the above, but `NILVALUE` defaults to /// `nil`. /// /// See -[RACSignal setKeyPath:onObject:nilValue:] for more information about the /// binding's semantics. /// /// Examples /// /// RAC(self, objectProperty) = objectSignal; /// RAC(self, stringProperty, @"foobar") = stringSignal; /// RAC(self, integerProperty, @42) = integerSignal; /// /// WARNING: Under certain conditions, use of this macro can be thread-unsafe. /// See the documentation of -setKeyPath:onObject:nilValue:. #define RAC(TARGET, ...) \ metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ (RAC_(TARGET, __VA_ARGS__, nil)) \ (RAC_(TARGET, __VA_ARGS__)) /// Do not use this directly. Use the RAC macro above. #define RAC_(TARGET, KEYPATH, NILVALUE) \ [[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(TARGET) nilValue:(NILVALUE)][@keypath(TARGET, KEYPATH)] @interface RACSubscriptingAssignmentTrampoline : NSObject - (id)initWithTarget:(id)target nilValue:(id)nilValue; - (void)setObject:(RACSignal *)signal forKeyedSubscript:(NSString *)keyPath; @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriptingAssignmentTrampoline.m
New file @@ -0,0 +1,42 @@ // // RACSubscriptingAssignmentTrampoline.m // ReactiveCocoa // // Created by Josh Abernathy on 9/24/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubscriptingAssignmentTrampoline.h" #import "RACSignal+Operations.h" @interface RACSubscriptingAssignmentTrampoline () // The object to bind to. @property (nonatomic, strong, readonly) id target; // A value to use when `nil` is sent on the bound signal. @property (nonatomic, strong, readonly) id nilValue; @end @implementation RACSubscriptingAssignmentTrampoline - (id)initWithTarget:(id)target nilValue:(id)nilValue { // This is often a programmer error, but this prevents crashes if the target // object has unexpectedly deallocated. if (target == nil) return nil; self = [super init]; if (self == nil) return nil; _target = target; _nilValue = nilValue; return self; } - (void)setObject:(RACSignal *)signal forKeyedSubscript:(NSString *)keyPath { [signal setKeyPath:keyPath onObject:self.target nilValue:self.nilValue]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriptionScheduler.h
New file @@ -0,0 +1,15 @@ // // RACSubscriptionScheduler.h // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACScheduler.h" // A private scheduler used only for subscriptions. See the private // +[RACScheduler subscriptionScheduler] method for more information. @interface RACSubscriptionScheduler : RACScheduler @end Pods/ReactiveCocoa/ReactiveCocoa/RACSubscriptionScheduler.m
New file @@ -0,0 +1,54 @@ // // RACSubscriptionScheduler.m // ReactiveCocoa // // Created by Josh Abernathy on 11/30/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACSubscriptionScheduler.h" #import "RACScheduler+Private.h" @interface RACSubscriptionScheduler () // A private background scheduler on which to subscribe if the +currentScheduler // is unknown. @property (nonatomic, strong, readonly) RACScheduler *backgroundScheduler; @end @implementation RACSubscriptionScheduler #pragma mark Lifecycle - (id)init { self = [super initWithName:@"com.ReactiveCocoa.RACScheduler.subscriptionScheduler"]; if (self == nil) return nil; _backgroundScheduler = [RACScheduler scheduler]; return self; } #pragma mark RACScheduler - (RACDisposable *)schedule:(void (^)(void))block { NSCParameterAssert(block != NULL); if (RACScheduler.currentScheduler == nil) return [self.backgroundScheduler schedule:block]; block(); return nil; } - (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { RACScheduler *scheduler = RACScheduler.currentScheduler ?: self.backgroundScheduler; return [scheduler after:date schedule:block]; } - (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { RACScheduler *scheduler = RACScheduler.currentScheduler ?: self.backgroundScheduler; return [scheduler after:date repeatingEvery:interval withLeeway:leeway schedule:block]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACTargetQueueScheduler.h
New file @@ -0,0 +1,24 @@ // // RACTargetQueueScheduler.h // ReactiveCocoa // // Created by Josh Abernathy on 6/6/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACQueueScheduler.h" /// A scheduler that enqueues blocks on a private serial queue, targeting an /// arbitrary GCD queue. @interface RACTargetQueueScheduler : RACQueueScheduler /// Initializes the receiver with a serial queue that will target the given /// `targetQueue`. /// /// name - The name of the scheduler. If nil, a default name will be used. /// targetQueue - The queue to target. Cannot be NULL. /// /// Returns the initialized object. - (id)initWithName:(NSString *)name targetQueue:(dispatch_queue_t)targetQueue; @end Pods/ReactiveCocoa/ReactiveCocoa/RACTargetQueueScheduler.m
New file @@ -0,0 +1,31 @@ // // RACTargetQueueScheduler.m // ReactiveCocoa // // Created by Josh Abernathy on 6/6/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACTargetQueueScheduler.h" #import "RACQueueScheduler+Subclass.h" @implementation RACTargetQueueScheduler #pragma mark Lifecycle - (id)initWithName:(NSString *)name targetQueue:(dispatch_queue_t)targetQueue { NSCParameterAssert(targetQueue != NULL); if (name == nil) { name = [NSString stringWithFormat:@"com.ReactiveCocoa.RACTargetQueueScheduler(%s)", dispatch_queue_get_label(targetQueue)]; } dispatch_queue_t queue = dispatch_queue_create(name.UTF8String, DISPATCH_QUEUE_SERIAL); if (queue == NULL) return nil; dispatch_set_target_queue(queue, targetQueue); return [super initWithName:name queue:queue]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACTestScheduler.h
New file @@ -0,0 +1,42 @@ // // RACTestScheduler.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-07-06. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACScheduler.h" /// A special kind of scheduler that steps through virtualized time. /// /// This scheduler class can be used in unit tests to verify asynchronous /// behaviors without spending significant time waiting. /// /// This class can be used from multiple threads, but only one thread can `step` /// through the enqueued actions at a time. Other threads will wait while the /// scheduled blocks are being executed. @interface RACTestScheduler : RACScheduler /// Initializes a new test scheduler. - (instancetype)init; /// Executes the next scheduled block, if any. /// /// This method will block until the scheduled action has completed. - (void)step; /// Executes up to the next `ticks` scheduled blocks. /// /// This method will block until the scheduled actions have completed. /// /// ticks - The number of scheduled blocks to execute. If there aren't this many /// blocks enqueued, all scheduled blocks are executed. - (void)step:(NSUInteger)ticks; /// Executes all of the scheduled blocks on the receiver. /// /// This method will block until the scheduled actions have completed. - (void)stepAll; @end Pods/ReactiveCocoa/ReactiveCocoa/RACTestScheduler.m
New file @@ -0,0 +1,223 @@ // // RACTestScheduler.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-07-06. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACTestScheduler.h" #import "RACEXTScope.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACScheduler+Private.h" @interface RACTestSchedulerAction : NSObject // The date at which the action should be executed. // // This absolute time will not actually be honored. This date is only used for // comparison, to determine which block should be run _next_. @property (nonatomic, copy, readonly) NSDate *date; // The scheduled block. @property (nonatomic, copy, readonly) void (^block)(void); // A disposable for this action. // // When disposed, the action should not start executing if it hasn't already. @property (nonatomic, strong, readonly) RACDisposable *disposable; // Initializes a new scheduler action. - (id)initWithDate:(NSDate *)date block:(void (^)(void))block; @end static CFComparisonResult RACCompareScheduledActions(const void *ptr1, const void *ptr2, void *info) { RACTestSchedulerAction *action1 = (__bridge id)ptr1; RACTestSchedulerAction *action2 = (__bridge id)ptr2; return CFDateCompare((__bridge CFDateRef)action1.date, (__bridge CFDateRef)action2.date, NULL); } static const void *RACRetainScheduledAction(CFAllocatorRef allocator, const void *ptr) { return CFRetain(ptr); } static void RACReleaseScheduledAction(CFAllocatorRef allocator, const void *ptr) { CFRelease(ptr); } @interface RACTestScheduler () // All of the RACTestSchedulerActions that have been enqueued and not yet // executed. // // The minimum value in the heap represents the action to execute next. // // This property should only be used while synchronized on self. @property (nonatomic, assign, readonly) CFBinaryHeapRef scheduledActions; // The number of blocks that have been directly enqueued with -schedule: so // far. // // This is used to ensure unique dates when two blocks are enqueued // simultaneously. // // This property should only be used while synchronized on self. @property (nonatomic, assign) NSUInteger numberOfDirectlyScheduledBlocks; @end @implementation RACTestScheduler #pragma mark Lifecycle - (instancetype)init { self = [super initWithName:@"org.reactivecocoa.ReactiveCocoa.RACTestScheduler"]; if (self == nil) return nil; CFBinaryHeapCallBacks callbacks = (CFBinaryHeapCallBacks){ .version = 0, .retain = &RACRetainScheduledAction, .release = &RACReleaseScheduledAction, .copyDescription = &CFCopyDescription, .compare = &RACCompareScheduledActions }; _scheduledActions = CFBinaryHeapCreate(NULL, 0, &callbacks, NULL); return self; } - (void)dealloc { [self stepAll]; if (_scheduledActions != NULL) { CFRelease(_scheduledActions); _scheduledActions = NULL; } } #pragma mark Execution - (void)step { [self step:1]; } - (void)step:(NSUInteger)ticks { @synchronized (self) { for (NSUInteger i = 0; i < ticks; i++) { const void *actionPtr = NULL; if (!CFBinaryHeapGetMinimumIfPresent(self.scheduledActions, &actionPtr)) break; RACTestSchedulerAction *action = (__bridge id)actionPtr; CFBinaryHeapRemoveMinimumValue(self.scheduledActions); if (action.disposable.disposed) continue; RACScheduler *previousScheduler = RACScheduler.currentScheduler; NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = self; action.block(); if (previousScheduler != nil) { NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = previousScheduler; } else { [NSThread.currentThread.threadDictionary removeObjectForKey:RACSchedulerCurrentSchedulerKey]; } } } } - (void)stepAll { [self step:NSUIntegerMax]; } #pragma mark RACScheduler - (RACDisposable *)schedule:(void (^)(void))block { NSCParameterAssert(block != nil); @synchronized (self) { NSDate *uniqueDate = [NSDate dateWithTimeIntervalSinceReferenceDate:self.numberOfDirectlyScheduledBlocks]; self.numberOfDirectlyScheduledBlocks++; RACTestSchedulerAction *action = [[RACTestSchedulerAction alloc] initWithDate:uniqueDate block:block]; CFBinaryHeapAddValue(self.scheduledActions, (__bridge void *)action); return action.disposable; } } - (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { NSCParameterAssert(date != nil); NSCParameterAssert(block != nil); @synchronized (self) { RACTestSchedulerAction *action = [[RACTestSchedulerAction alloc] initWithDate:date block:block]; CFBinaryHeapAddValue(self.scheduledActions, (__bridge void *)action); return action.disposable; } } - (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { NSCParameterAssert(date != nil); NSCParameterAssert(block != nil); NSCParameterAssert(interval >= 0); NSCParameterAssert(leeway >= 0); RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; @weakify(self); @synchronized (self) { __block RACDisposable *thisDisposable = nil; void (^reschedulingBlock)(void) = ^{ @strongify(self); [compoundDisposable removeDisposable:thisDisposable]; // Schedule the next interval. RACDisposable *schedulingDisposable = [self after:[date dateByAddingTimeInterval:interval] repeatingEvery:interval withLeeway:leeway schedule:block]; [compoundDisposable addDisposable:schedulingDisposable]; block(); }; RACTestSchedulerAction *action = [[RACTestSchedulerAction alloc] initWithDate:date block:reschedulingBlock]; CFBinaryHeapAddValue(self.scheduledActions, (__bridge void *)action); thisDisposable = action.disposable; [compoundDisposable addDisposable:thisDisposable]; } return compoundDisposable; } @end @implementation RACTestSchedulerAction #pragma mark Lifecycle - (id)initWithDate:(NSDate *)date block:(void (^)(void))block { NSCParameterAssert(date != nil); NSCParameterAssert(block != nil); self = [super init]; if (self == nil) return nil; _date = [date copy]; _block = [block copy]; _disposable = [[RACDisposable alloc] init]; return self; } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>{ date: %@ }", self.class, self, self.date]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACTuple.h
New file @@ -0,0 +1,159 @@ // // RACTuple.h // ReactiveCocoa // // Created by Josh Abernathy on 4/12/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> #import "RACmetamacros.h" @class RACSequence; /// Creates a new tuple with the given values. At least one value must be given. /// Values can be nil. #define RACTuplePack(...) \ RACTuplePack_(__VA_ARGS__) /// Declares new object variables and unpacks a RACTuple into them. /// /// This macro should be used on the left side of an assignment, with the /// tuple on the right side. Nothing else should appear on the same line, and the /// macro should not be the only statement in a conditional or loop body. /// /// If the tuple has more values than there are variables listed, the excess /// values are ignored. /// /// If the tuple has fewer values than there are variables listed, the excess /// variables are initialized to nil. /// /// Examples /// /// RACTupleUnpack(NSString *string, NSNumber *num) = [RACTuple tupleWithObjects:@"foo", @5, nil]; /// NSLog(@"string: %@", string); /// NSLog(@"num: %@", num); /// /// /* The above is equivalent to: */ /// RACTuple *t = [RACTuple tupleWithObjects:@"foo", @5, nil]; /// NSString *string = t[0]; /// NSNumber *num = t[1]; /// NSLog(@"string: %@", string); /// NSLog(@"num: %@", num); #define RACTupleUnpack(...) \ RACTupleUnpack_(__VA_ARGS__) /// A sentinel object that represents nils in the tuple. /// /// It should never be necessary to create a tuple nil yourself. Just use /// +tupleNil. @interface RACTupleNil : NSObject <NSCopying, NSCoding> /// A singleton instance. + (RACTupleNil *)tupleNil; @end /// A tuple is an ordered collection of objects. It may contain nils, represented /// by RACTupleNil. @interface RACTuple : NSObject <NSCoding, NSCopying, NSFastEnumeration> @property (nonatomic, readonly) NSUInteger count; /// These properties all return the object at that index or nil if the number of /// objects is less than the index. @property (nonatomic, readonly) id first; @property (nonatomic, readonly) id second; @property (nonatomic, readonly) id third; @property (nonatomic, readonly) id fourth; @property (nonatomic, readonly) id fifth; @property (nonatomic, readonly) id last; /// Creates a new tuple out of the array. Does not convert nulls to nils. + (instancetype)tupleWithObjectsFromArray:(NSArray *)array; /// Creates a new tuple out of the array. If `convert` is YES, it also converts /// every NSNull to RACTupleNil. + (instancetype)tupleWithObjectsFromArray:(NSArray *)array convertNullsToNils:(BOOL)convert; /// Creates a new tuple with the given objects. Use RACTupleNil to represent /// nils. + (instancetype)tupleWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION; /// Returns the object at `index` or nil if the object is a RACTupleNil. Unlike /// NSArray and friends, it's perfectly fine to ask for the object at an index /// past the tuple's count - 1. It will simply return nil. - (id)objectAtIndex:(NSUInteger)index; /// Returns an array of all the objects. RACTupleNils are converted to NSNulls. - (NSArray *)allObjects; /// Appends `obj` to the receiver. /// /// obj - The object to add to the tuple. This argument may be nil. /// /// Returns a new tuple. - (instancetype)tupleByAddingObject:(id)obj; @end @interface RACTuple (RACSequenceAdditions) /// Returns a sequence of all the objects. RACTupleNils are converted to NSNulls. @property (nonatomic, copy, readonly) RACSequence *rac_sequence; @end @interface RACTuple (ObjectSubscripting) /// Returns the object at that index or nil if the number of objects is less /// than the index. - (id)objectAtIndexedSubscript:(NSUInteger)idx; @end /// This and everything below is for internal use only. /// /// See RACTuplePack() and RACTupleUnpack() instead. #define RACTuplePack_(...) \ ([RACTuple tupleWithObjectsFromArray:@[ metamacro_foreach(RACTuplePack_object_or_ractuplenil,, __VA_ARGS__) ]]) #define RACTuplePack_object_or_ractuplenil(INDEX, ARG) \ (ARG) ?: RACTupleNil.tupleNil, #define RACTupleUnpack_(...) \ metamacro_foreach(RACTupleUnpack_decl,, __VA_ARGS__) \ \ int RACTupleUnpack_state = 0; \ \ RACTupleUnpack_after: \ ; \ metamacro_foreach(RACTupleUnpack_assign,, __VA_ARGS__) \ if (RACTupleUnpack_state != 0) RACTupleUnpack_state = 2; \ \ while (RACTupleUnpack_state != 2) \ if (RACTupleUnpack_state == 1) { \ goto RACTupleUnpack_after; \ } else \ for (; RACTupleUnpack_state != 1; RACTupleUnpack_state = 1) \ [RACTupleUnpackingTrampoline trampoline][ @[ metamacro_foreach(RACTupleUnpack_value,, __VA_ARGS__) ] ] #define RACTupleUnpack_state metamacro_concat(RACTupleUnpack_state, __LINE__) #define RACTupleUnpack_after metamacro_concat(RACTupleUnpack_after, __LINE__) #define RACTupleUnpack_loop metamacro_concat(RACTupleUnpack_loop, __LINE__) #define RACTupleUnpack_decl_name(INDEX) \ metamacro_concat(metamacro_concat(RACTupleUnpack, __LINE__), metamacro_concat(_var, INDEX)) #define RACTupleUnpack_decl(INDEX, ARG) \ __strong id RACTupleUnpack_decl_name(INDEX); #define RACTupleUnpack_assign(INDEX, ARG) \ __strong ARG = RACTupleUnpack_decl_name(INDEX); #define RACTupleUnpack_value(INDEX, ARG) \ [NSValue valueWithPointer:&RACTupleUnpack_decl_name(INDEX)], @interface RACTupleUnpackingTrampoline : NSObject + (instancetype)trampoline; - (void)setObject:(RACTuple *)tuple forKeyedSubscript:(NSArray *)variables; @end Pods/ReactiveCocoa/ReactiveCocoa/RACTuple.m
New file @@ -0,0 +1,252 @@ // // RACTuple.m // ReactiveCocoa // // Created by Josh Abernathy on 4/12/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACTuple.h" #import "RACEXTKeyPathCoding.h" #import "RACTupleSequence.h" @implementation RACTupleNil + (RACTupleNil *)tupleNil { static dispatch_once_t onceToken; static RACTupleNil *tupleNil = nil; dispatch_once(&onceToken, ^{ tupleNil = [[self alloc] init]; }); return tupleNil; } #pragma mark NSCopying - (id)copyWithZone:(NSZone *)zone { return self; } #pragma mark NSCoding - (id)initWithCoder:(NSCoder *)coder { // Always return the singleton. return self.class.tupleNil; } - (void)encodeWithCoder:(NSCoder *)coder { } @end @interface RACTuple () @property (nonatomic, strong) NSArray *backingArray; @end @implementation RACTuple - (instancetype)init { self = [super init]; if (self == nil) return nil; self.backingArray = [NSArray array]; return self; } - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, self.allObjects]; } - (BOOL)isEqual:(RACTuple *)object { if (object == self) return YES; if (![object isKindOfClass:self.class]) return NO; return [self.backingArray isEqual:object.backingArray]; } - (NSUInteger)hash { return self.backingArray.hash; } #pragma mark NSFastEnumeration - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len { return [self.backingArray countByEnumeratingWithState:state objects:buffer count:len]; } #pragma mark NSCopying - (instancetype)copyWithZone:(NSZone *)zone { // we're immutable, bitches! return self; } #pragma mark NSCoding - (id)initWithCoder:(NSCoder *)coder { self = [self init]; if (self == nil) return nil; self.backingArray = [coder decodeObjectForKey:@keypath(self.backingArray)]; return self; } - (void)encodeWithCoder:(NSCoder *)coder { if (self.backingArray != nil) [coder encodeObject:self.backingArray forKey:@keypath(self.backingArray)]; } #pragma mark API + (instancetype)tupleWithObjectsFromArray:(NSArray *)array { return [self tupleWithObjectsFromArray:array convertNullsToNils:NO]; } + (instancetype)tupleWithObjectsFromArray:(NSArray *)array convertNullsToNils:(BOOL)convert { RACTuple *tuple = [[self alloc] init]; if (convert) { NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:array.count]; for (id object in array) { [newArray addObject:(object == NSNull.null ? RACTupleNil.tupleNil : object)]; } tuple.backingArray = newArray; } else { tuple.backingArray = [array copy]; } return tuple; } + (instancetype)tupleWithObjects:(id)object, ... { RACTuple *tuple = [[self alloc] init]; va_list args; va_start(args, object); NSUInteger count = 0; for (id currentObject = object; currentObject != nil; currentObject = va_arg(args, id)) { ++count; } va_end(args); if (count == 0) { tuple.backingArray = @[]; return tuple; } NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:count]; va_start(args, object); for (id currentObject = object; currentObject != nil; currentObject = va_arg(args, id)) { [objects addObject:currentObject]; } va_end(args); tuple.backingArray = objects; return tuple; } - (id)objectAtIndex:(NSUInteger)index { if (index >= self.count) return nil; id object = self.backingArray[index]; return (object == RACTupleNil.tupleNil ? nil : object); } - (NSArray *)allObjects { NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:self.backingArray.count]; for (id object in self.backingArray) { [newArray addObject:(object == RACTupleNil.tupleNil ? NSNull.null : object)]; } return newArray; } - (instancetype)tupleByAddingObject:(id)obj { NSArray *newArray = [self.backingArray arrayByAddingObject:obj ?: RACTupleNil.tupleNil]; return [self.class tupleWithObjectsFromArray:newArray]; } - (NSUInteger)count { return self.backingArray.count; } - (id)first { return self[0]; } - (id)second { return self[1]; } - (id)third { return self[2]; } - (id)fourth { return self[3]; } - (id)fifth { return self[4]; } - (id)last { return self[self.count - 1]; } @end @implementation RACTuple (RACSequenceAdditions) - (RACSequence *)rac_sequence { return [RACTupleSequence sequenceWithTupleBackingArray:self.backingArray offset:0]; } @end @implementation RACTuple (ObjectSubscripting) - (id)objectAtIndexedSubscript:(NSUInteger)idx { return [self objectAtIndex:idx]; } @end @implementation RACTupleUnpackingTrampoline #pragma mark Lifecycle + (instancetype)trampoline { static dispatch_once_t onceToken; static id trampoline = nil; dispatch_once(&onceToken, ^{ trampoline = [[self alloc] init]; }); return trampoline; } - (void)setObject:(RACTuple *)tuple forKeyedSubscript:(NSArray *)variables { NSCParameterAssert(variables != nil); [variables enumerateObjectsUsingBlock:^(NSValue *value, NSUInteger index, BOOL *stop) { __strong id *ptr = (__strong id *)value.pointerValue; *ptr = tuple[index]; }]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACTupleSequence.h
New file @@ -0,0 +1,18 @@ // // RACTupleSequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-05-01. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSequence.h" // Private class that adapts a RACTuple to the RACSequence interface. @interface RACTupleSequence : RACSequence // Returns a sequence for enumerating over the given backing array (from a // RACTuple), starting from the given offset. + (instancetype)sequenceWithTupleBackingArray:(NSArray *)backingArray offset:(NSUInteger)offset; @end Pods/ReactiveCocoa/ReactiveCocoa/RACTupleSequence.m
New file @@ -0,0 +1,68 @@ // // RACTupleSequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-05-01. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACTupleSequence.h" #import "RACTuple.h" @interface RACTupleSequence () // The array being sequenced, as taken from RACTuple.backingArray. @property (nonatomic, strong, readonly) NSArray *tupleBackingArray; // The index in the array from which the sequence starts. @property (nonatomic, assign, readonly) NSUInteger offset; @end @implementation RACTupleSequence #pragma mark Lifecycle + (instancetype)sequenceWithTupleBackingArray:(NSArray *)backingArray offset:(NSUInteger)offset { NSCParameterAssert(offset <= backingArray.count); if (offset == backingArray.count) return self.empty; RACTupleSequence *seq = [[self alloc] init]; seq->_tupleBackingArray = backingArray; seq->_offset = offset; return seq; } #pragma mark RACSequence - (id)head { id object = self.tupleBackingArray[self.offset]; return (object == RACTupleNil.tupleNil ? NSNull.null : object); } - (RACSequence *)tail { RACSequence *sequence = [self.class sequenceWithTupleBackingArray:self.tupleBackingArray offset:self.offset + 1]; sequence.name = self.name; return sequence; } - (NSArray *)array { NSRange range = NSMakeRange(self.offset, self.tupleBackingArray.count - self.offset); NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:range.length]; [self.tupleBackingArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range] options:0 usingBlock:^(id object, NSUInteger index, BOOL *stop) { id mappedObject = (object == RACTupleNil.tupleNil ? NSNull.null : object); [array addObject:mappedObject]; }]; return array; } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>{ name = %@, tuple = %@ }", self.class, self, self.name, self.tupleBackingArray]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACUnarySequence.h
New file @@ -0,0 +1,14 @@ // // RACUnarySequence.h // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-05-01. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACSequence.h" // Private class representing a sequence of exactly one value. @interface RACUnarySequence : RACSequence @end Pods/ReactiveCocoa/ReactiveCocoa/RACUnarySequence.m
New file @@ -0,0 +1,81 @@ // // RACUnarySequence.m // ReactiveCocoa // // Created by Justin Spahr-Summers on 2013-05-01. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "RACUnarySequence.h" #import "RACEXTKeyPathCoding.h" #import "NSObject+RACDescription.h" @interface RACUnarySequence () // The single value stored in this sequence. @property (nonatomic, strong, readwrite) id head; @end @implementation RACUnarySequence #pragma mark Properties @synthesize head = _head; #pragma mark Lifecycle + (instancetype)return:(id)value { RACUnarySequence *sequence = [[self alloc] init]; sequence.head = value; return [sequence setNameWithFormat:@"+return: %@", [value rac_description]]; } #pragma mark RACSequence - (RACSequence *)tail { return nil; } - (instancetype)bind:(RACStreamBindBlock (^)(void))block { RACStreamBindBlock bindBlock = block(); BOOL stop = NO; RACSequence *result = (id)[bindBlock(self.head, &stop) setNameWithFormat:@"[%@] -bind:", self.name]; return result ?: self.class.empty; } #pragma mark NSCoding - (Class)classForCoder { // Unary sequences should be encoded as themselves, not array sequences. return self.class; } - (id)initWithCoder:(NSCoder *)coder { id value = [coder decodeObjectForKey:@keypath(self.head)]; return [self.class return:value]; } - (void)encodeWithCoder:(NSCoder *)coder { if (self.head != nil) [coder encodeObject:self.head forKey:@keypath(self.head)]; } #pragma mark NSObject - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>{ name = %@, head = %@ }", self.class, self, self.name, self.head]; } - (NSUInteger)hash { return [self.head hash]; } - (BOOL)isEqual:(RACUnarySequence *)seq { if (self == seq) return YES; if (![seq isKindOfClass:RACUnarySequence.class]) return NO; return self.head == seq.head || [(NSObject *)self.head isEqual:seq.head]; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACUnit.h
New file @@ -0,0 +1,19 @@ // // RACUnit.h // ReactiveCocoa // // Created by Josh Abernathy on 3/27/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> /// A unit represents an empty value. /// /// It should never be necessary to create a unit yourself. Just use +defaultUnit. @interface RACUnit : NSObject /// A singleton instance. + (RACUnit *)defaultUnit; @end Pods/ReactiveCocoa/ReactiveCocoa/RACUnit.m
New file @@ -0,0 +1,25 @@ // // RACUnit.m // ReactiveCocoa // // Created by Josh Abernathy on 3/27/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACUnit.h" @implementation RACUnit #pragma mark API + (RACUnit *)defaultUnit { static dispatch_once_t onceToken; static RACUnit *defaultUnit = nil; dispatch_once(&onceToken, ^{ defaultUnit = [[self alloc] init]; }); return defaultUnit; } @end Pods/ReactiveCocoa/ReactiveCocoa/RACValueTransformer.h
New file @@ -0,0 +1,16 @@ // // RACValueTransformer.h // ReactiveCocoa // // Created by Josh Abernathy on 3/6/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> // A private block based transformer. @interface RACValueTransformer : NSValueTransformer + (instancetype)transformerWithBlock:(id (^)(id value))block; @end Pods/ReactiveCocoa/ReactiveCocoa/RACValueTransformer.m
New file @@ -0,0 +1,42 @@ // // RACValueTransformer.m // ReactiveCocoa // // Created by Josh Abernathy on 3/6/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "RACValueTransformer.h" @interface RACValueTransformer () @property (nonatomic, copy) id (^transformBlock)(id value); @end @implementation RACValueTransformer #pragma mark NSValueTransformer + (BOOL)allowsReverseTransformation { return NO; } - (id)transformedValue:(id)value { return self.transformBlock(value); } #pragma mark API @synthesize transformBlock; + (instancetype)transformerWithBlock:(id (^)(id value))block { NSCParameterAssert(block != NULL); RACValueTransformer *transformer = [[self alloc] init]; transformer.transformBlock = block; return transformer; } @end Pods/ReactiveCocoa/ReactiveCocoa/ReactiveCocoa.h
New file @@ -0,0 +1,89 @@ // // ReactiveCocoa.h // ReactiveCocoa // // Created by Josh Abernathy on 3/5/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <Foundation/Foundation.h> //! Project version number for ReactiveCocoa. FOUNDATION_EXPORT double ReactiveCocoaVersionNumber; //! Project version string for ReactiveCocoa. FOUNDATION_EXPORT const unsigned char ReactiveCocoaVersionString[]; #import <ReactiveCocoa/RACEXTKeyPathCoding.h> #import <ReactiveCocoa/RACEXTScope.h> #import <ReactiveCocoa/NSArray+RACSequenceAdditions.h> #import <ReactiveCocoa/NSData+RACSupport.h> #import <ReactiveCocoa/NSDictionary+RACSequenceAdditions.h> #import <ReactiveCocoa/NSEnumerator+RACSequenceAdditions.h> #import <ReactiveCocoa/NSFileHandle+RACSupport.h> #import <ReactiveCocoa/NSNotificationCenter+RACSupport.h> #import <ReactiveCocoa/NSObject+RACDeallocating.h> #import <ReactiveCocoa/NSObject+RACLifting.h> #import <ReactiveCocoa/NSObject+RACPropertySubscribing.h> #import <ReactiveCocoa/NSObject+RACSelectorSignal.h> #import <ReactiveCocoa/NSOrderedSet+RACSequenceAdditions.h> #import <ReactiveCocoa/NSSet+RACSequenceAdditions.h> #import <ReactiveCocoa/NSString+RACSequenceAdditions.h> #import <ReactiveCocoa/NSString+RACSupport.h> #import <ReactiveCocoa/NSIndexSet+RACSequenceAdditions.h> #import <ReactiveCocoa/NSURLConnection+RACSupport.h> #import <ReactiveCocoa/NSUserDefaults+RACSupport.h> #import <ReactiveCocoa/RACBehaviorSubject.h> #import <ReactiveCocoa/RACChannel.h> #import <ReactiveCocoa/RACCommand.h> #import <ReactiveCocoa/RACCompoundDisposable.h> #import <ReactiveCocoa/RACDisposable.h> #import <ReactiveCocoa/RACEvent.h> #import <ReactiveCocoa/RACGroupedSignal.h> #import <ReactiveCocoa/RACKVOChannel.h> #import <ReactiveCocoa/RACMulticastConnection.h> #import <ReactiveCocoa/RACQueueScheduler.h> #import <ReactiveCocoa/RACQueueScheduler+Subclass.h> #import <ReactiveCocoa/RACReplaySubject.h> #import <ReactiveCocoa/RACScheduler.h> #import <ReactiveCocoa/RACScheduler+Subclass.h> #import <ReactiveCocoa/RACScopedDisposable.h> #import <ReactiveCocoa/RACSequence.h> #import <ReactiveCocoa/RACSerialDisposable.h> #import <ReactiveCocoa/RACSignal+Operations.h> #import <ReactiveCocoa/RACSignal.h> #import <ReactiveCocoa/RACStream.h> #import <ReactiveCocoa/RACSubject.h> #import <ReactiveCocoa/RACSubscriber.h> #import <ReactiveCocoa/RACSubscriptingAssignmentTrampoline.h> #import <ReactiveCocoa/RACTargetQueueScheduler.h> #import <ReactiveCocoa/RACTestScheduler.h> #import <ReactiveCocoa/RACTuple.h> #import <ReactiveCocoa/RACUnit.h> #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED #import <ReactiveCocoa/MKAnnotationView+RACSignalSupport.h> #import <ReactiveCocoa/UIActionSheet+RACSignalSupport.h> #import <ReactiveCocoa/UIAlertView+RACSignalSupport.h> #import <ReactiveCocoa/UIBarButtonItem+RACCommandSupport.h> #import <ReactiveCocoa/UIButton+RACCommandSupport.h> #import <ReactiveCocoa/UICollectionReusableView+RACSignalSupport.h> #import <ReactiveCocoa/UIControl+RACSignalSupport.h> #import <ReactiveCocoa/UIDatePicker+RACSignalSupport.h> #import <ReactiveCocoa/UIGestureRecognizer+RACSignalSupport.h> #import <ReactiveCocoa/UIImagePickerController+RACSignalSupport.h> #import <ReactiveCocoa/UIRefreshControl+RACCommandSupport.h> #import <ReactiveCocoa/UISegmentedControl+RACSignalSupport.h> #import <ReactiveCocoa/UISlider+RACSignalSupport.h> #import <ReactiveCocoa/UIStepper+RACSignalSupport.h> #import <ReactiveCocoa/UISwitch+RACSignalSupport.h> #import <ReactiveCocoa/UITableViewCell+RACSignalSupport.h> #import <ReactiveCocoa/UITableViewHeaderFooterView+RACSignalSupport.h> #import <ReactiveCocoa/UITextField+RACSignalSupport.h> #import <ReactiveCocoa/UITextView+RACSignalSupport.h> #elif TARGET_OS_MAC #import <ReactiveCocoa/NSControl+RACCommandSupport.h> #import <ReactiveCocoa/NSControl+RACTextSignalSupport.h> #import <ReactiveCocoa/NSObject+RACAppKitBindings.h> #import <ReactiveCocoa/NSText+RACSignalSupport.h> #endif Pods/ReactiveCocoa/ReactiveCocoa/UIActionSheet+RACSignalSupport.h
New file @@ -0,0 +1,32 @@ // // UIActionSheet+RACSignalSupport.h // ReactiveCocoa // // Created by Dave Lee on 2013-06-22. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACDelegateProxy; @class RACSignal; @interface UIActionSheet (RACSignalSupport) /// A delegate proxy which will be set as the receiver's delegate when any of the /// methods in this category are used. @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; /// Creates a signal for button clicks on the receiver. /// /// When this method is invoked, the `rac_delegateProxy` will become the /// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy /// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't /// know how to handle. Setting the receiver's `delegate` afterward is /// considered undefined behavior. /// /// Returns a signal which will send the index of the specific button clicked. /// The signal will complete when the receiver is deallocated. - (RACSignal *)rac_buttonClickedSignal; @end Pods/ReactiveCocoa/ReactiveCocoa/UIActionSheet+RACSignalSupport.m
New file @@ -0,0 +1,49 @@ // // UIActionSheet+RACSignalSupport.m // ReactiveCocoa // // Created by Dave Lee on 2013-06-22. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIActionSheet+RACSignalSupport.h" #import "RACDelegateProxy.h" #import "RACSignal+Operations.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import <objc/runtime.h> @implementation UIActionSheet (RACSignalSupport) static void RACUseDelegateProxy(UIActionSheet *self) { if (self.delegate == self.rac_delegateProxy) return; self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; self.delegate = (id)self.rac_delegateProxy; } - (RACDelegateProxy *)rac_delegateProxy { RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); if (proxy == nil) { proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIActionSheetDelegate)]; objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return proxy; } - (RACSignal *)rac_buttonClickedSignal { RACSignal *signal = [[[[self.rac_delegateProxy signalForSelector:@selector(actionSheet:clickedButtonAtIndex:)] reduceEach:^(UIActionSheet *actionSheet, NSNumber *buttonIndex) { return buttonIndex; }] takeUntil:self.rac_willDeallocSignal] setNameWithFormat:@"%@ -rac_buttonClickedSignal", self.rac_description]; RACUseDelegateProxy(self); return signal; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIAlertView+RACSignalSupport.h
New file @@ -0,0 +1,47 @@ // // UIAlertView+RACSignalSupport.h // ReactiveCocoa // // Created by Henrik Hodne on 6/16/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACDelegateProxy; @class RACSignal; @interface UIAlertView (RACSignalSupport) /// A delegate proxy which will be set as the receiver's delegate when any of the /// methods in this category are used. @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; /// Creates a signal for button clicks on the receiver. /// /// When this method is invoked, the `rac_delegateProxy` will become the /// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy /// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't /// know how to handle. Setting the receiver's `delegate` afterward is considered /// undefined behavior. /// /// Note that this signal will not send a value when the alert is dismissed /// programatically. /// /// Returns a signal which will send the index of the specific button clicked. /// The signal will complete itself when the receiver is deallocated. - (RACSignal *)rac_buttonClickedSignal; /// Creates a signal for dismissal of the receiver. /// /// When this method is invoked, the `rac_delegateProxy` will become the /// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy /// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't /// know how to handle. Setting the receiver's `delegate` afterward is considered /// undefined behavior. /// /// Returns a signal which will send the index of the button associated with the /// dismissal. The signal will complete itself when the receiver is deallocated. - (RACSignal *)rac_willDismissSignal; @end Pods/ReactiveCocoa/ReactiveCocoa/UIAlertView+RACSignalSupport.m
New file @@ -0,0 +1,63 @@ // // UIAlertView+RACSignalSupport.m // ReactiveCocoa // // Created by Henrik Hodne on 6/16/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIAlertView+RACSignalSupport.h" #import "RACDelegateProxy.h" #import "RACSignal+Operations.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import <objc/runtime.h> @implementation UIAlertView (RACSignalSupport) static void RACUseDelegateProxy(UIAlertView *self) { if (self.delegate == self.rac_delegateProxy) return; self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; self.delegate = (id)self.rac_delegateProxy; } - (RACDelegateProxy *)rac_delegateProxy { RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); if (proxy == nil) { proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIAlertViewDelegate)]; objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return proxy; } - (RACSignal *)rac_buttonClickedSignal { RACSignal *signal = [[[[self.rac_delegateProxy signalForSelector:@selector(alertView:clickedButtonAtIndex:)] reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex) { return buttonIndex; }] takeUntil:self.rac_willDeallocSignal] setNameWithFormat:@"%@ -rac_buttonClickedSignal", self.rac_description]; RACUseDelegateProxy(self); return signal; } - (RACSignal *)rac_willDismissSignal { RACSignal *signal = [[[[self.rac_delegateProxy signalForSelector:@selector(alertView:willDismissWithButtonIndex:)] reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex) { return buttonIndex; }] takeUntil:self.rac_willDeallocSignal] setNameWithFormat:@"%@ -rac_willDismissSignal", self.rac_description]; RACUseDelegateProxy(self); return signal; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIBarButtonItem+RACCommandSupport.h
New file @@ -0,0 +1,22 @@ // // UIBarButtonItem+RACCommandSupport.h // ReactiveCocoa // // Created by Kyle LeNeau on 3/27/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACCommand; @interface UIBarButtonItem (RACCommandSupport) /// Sets the control's command. When the control is clicked, the command is /// executed with the sender of the event. The control's enabledness is bound /// to the command's `canExecute`. /// /// Note: this will reset the control's target and action. @property (nonatomic, strong) RACCommand *rac_command; @end Pods/ReactiveCocoa/ReactiveCocoa/UIBarButtonItem+RACCommandSupport.m
New file @@ -0,0 +1,54 @@ // // UIBarButtonItem+RACCommandSupport.m // ReactiveCocoa // // Created by Kyle LeNeau on 3/27/13. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIBarButtonItem+RACCommandSupport.h" #import "RACEXTKeyPathCoding.h" #import "RACCommand.h" #import "RACDisposable.h" #import "RACSignal+Operations.h" #import <objc/runtime.h> static void *UIControlRACCommandKey = &UIControlRACCommandKey; static void *UIControlEnabledDisposableKey = &UIControlEnabledDisposableKey; @implementation UIBarButtonItem (RACCommandSupport) - (RACCommand *)rac_command { return objc_getAssociatedObject(self, UIControlRACCommandKey); } - (void)setRac_command:(RACCommand *)command { objc_setAssociatedObject(self, UIControlRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC); // Check for stored signal in order to remove it and add a new one RACDisposable *disposable = objc_getAssociatedObject(self, UIControlEnabledDisposableKey); [disposable dispose]; if (command == nil) return; disposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self]; objc_setAssociatedObject(self, UIControlEnabledDisposableKey, disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [self rac_hijackActionAndTargetIfNeeded]; } - (void)rac_hijackActionAndTargetIfNeeded { SEL hijackSelector = @selector(rac_commandPerformAction:); if (self.target == self && self.action == hijackSelector) return; if (self.target != nil) NSLog(@"WARNING: UIBarButtonItem.rac_command hijacks the control's existing target and action."); self.target = self; self.action = hijackSelector; } - (void)rac_commandPerformAction:(id)sender { [self.rac_command execute:sender]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIButton+RACCommandSupport.h
New file @@ -0,0 +1,20 @@ // // UIButton+RACCommandSupport.h // ReactiveCocoa // // Created by Ash Furrow on 2013-06-06. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACCommand; @interface UIButton (RACCommandSupport) /// Sets the button's command. When the button is clicked, the command is /// executed with the sender of the event. The button's enabledness is bound /// to the command's `canExecute`. @property (nonatomic, strong) RACCommand *rac_command; @end Pods/ReactiveCocoa/ReactiveCocoa/UIButton+RACCommandSupport.m
New file @@ -0,0 +1,56 @@ // // UIButton+RACCommandSupport.m // ReactiveCocoa // // Created by Ash Furrow on 2013-06-06. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIButton+RACCommandSupport.h" #import "RACEXTKeyPathCoding.h" #import "RACCommand.h" #import "RACDisposable.h" #import "RACSignal+Operations.h" #import <objc/runtime.h> static void *UIButtonRACCommandKey = &UIButtonRACCommandKey; static void *UIButtonEnabledDisposableKey = &UIButtonEnabledDisposableKey; @implementation UIButton (RACCommandSupport) - (RACCommand *)rac_command { return objc_getAssociatedObject(self, UIButtonRACCommandKey); } - (void)setRac_command:(RACCommand *)command { objc_setAssociatedObject(self, UIButtonRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC); // Check for stored signal in order to remove it and add a new one RACDisposable *disposable = objc_getAssociatedObject(self, UIButtonEnabledDisposableKey); [disposable dispose]; if (command == nil) return; disposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self]; objc_setAssociatedObject(self, UIButtonEnabledDisposableKey, disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [self rac_hijackActionAndTargetIfNeeded]; } - (void)rac_hijackActionAndTargetIfNeeded { SEL hijackSelector = @selector(rac_commandPerformAction:); for (NSString *selector in [self actionsForTarget:self forControlEvent:UIControlEventTouchUpInside]) { if (hijackSelector == NSSelectorFromString(selector)) { return; } } [self addTarget:self action:hijackSelector forControlEvents:UIControlEventTouchUpInside]; } - (void)rac_commandPerformAction:(id)sender { [self.rac_command execute:sender]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UICollectionReusableView+RACSignalSupport.h
New file @@ -0,0 +1,29 @@ // // UICollectionReusableView+RACSignalSupport.h // ReactiveCocoa // // Created by Kent Wong on 2013-10-04. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACSignal; // This category is only applicable to iOS >= 6.0. @interface UICollectionReusableView (RACSignalSupport) /// A signal which will send a RACUnit whenever -prepareForReuse is invoked upon /// the receiver. /// /// Examples /// /// [[[self.cancelButton /// rac_signalForControlEvents:UIControlEventTouchUpInside] /// takeUntil:self.rac_prepareForReuseSignal] /// subscribeNext:^(UIButton *x) { /// // do other things /// }]; @property (nonatomic, strong, readonly) RACSignal *rac_prepareForReuseSignal; @end Pods/ReactiveCocoa/ReactiveCocoa/UICollectionReusableView+RACSignalSupport.m
New file @@ -0,0 +1,31 @@ // // UICollectionReusableView+RACSignalSupport.m // ReactiveCocoa // // Created by Kent Wong on 2013-10-04. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UICollectionReusableView+RACSignalSupport.h" #import "NSObject+RACDescription.h" #import "NSObject+RACSelectorSignal.h" #import "RACSignal+Operations.h" #import "RACUnit.h" #import <objc/runtime.h> @implementation UICollectionReusableView (RACSignalSupport) - (RACSignal *)rac_prepareForReuseSignal { RACSignal *signal = objc_getAssociatedObject(self, _cmd); if (signal != nil) return signal; signal = [[[self rac_signalForSelector:@selector(prepareForReuse)] mapReplace:RACUnit.defaultUnit] setNameWithFormat:@"%@ -rac_prepareForReuseSignal", self.rac_description]; objc_setAssociatedObject(self, _cmd, signal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); return signal; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIControl+RACSignalSupport.h
New file @@ -0,0 +1,19 @@ // // UIControl+RACSignalSupport.h // ReactiveCocoa // // Created by Josh Abernathy on 4/17/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACSignal; @interface UIControl (RACSignalSupport) /// Creates and returns a signal that sends the sender of the control event /// whenever one of the control events is triggered. - (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents; @end Pods/ReactiveCocoa/ReactiveCocoa/UIControl+RACSignalSupport.m
New file @@ -0,0 +1,40 @@ // // UIControl+RACSignalSupport.m // ReactiveCocoa // // Created by Josh Abernathy on 4/17/12. // Copyright (c) 2012 GitHub, Inc. All rights reserved. // #import "UIControl+RACSignalSupport.h" #import "RACEXTScope.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACSignal.h" #import "RACSubscriber.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" @implementation UIControl (RACSignalSupport) - (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents { @weakify(self); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { @strongify(self); [self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ [subscriber sendCompleted]; }]]; return [RACDisposable disposableWithBlock:^{ @strongify(self); [self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; }]; }] setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", self.rac_description, (unsigned long)controlEvents]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIControl+RACSignalSupportPrivate.h
New file @@ -0,0 +1,29 @@ // // UIControl+RACSignalSupportPrivate.h // ReactiveCocoa // // Created by Uri Baghin on 06/08/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACChannelTerminal; @interface UIControl (RACSignalSupportPrivate) // Adds a RACChannel-based interface to the receiver for the given // UIControlEvents and exposes it. // // controlEvents - A mask of UIControlEvents on which to send new values. // key - The key whose value should be read and set when a control // event fires and when a value is sent to the // RACChannelTerminal respectively. // nilValue - The value to be assigned to the key when `nil` is sent to the // RACChannelTerminal. // // Returns a RACChannelTerminal which will send future values from the receiver, // and update the receiver when values are sent to the terminal. - (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(id)nilValue; @end Pods/ReactiveCocoa/ReactiveCocoa/UIControl+RACSignalSupportPrivate.m
New file @@ -0,0 +1,48 @@ // // UIControl+RACSignalSupportPrivate.m // ReactiveCocoa // // Created by Uri Baghin on 06/08/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIControl+RACSignalSupportPrivate.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACLifting.h" #import "RACChannel.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACSignal+Operations.h" #import "UIControl+RACSignalSupport.h" @implementation UIControl (RACSignalSupportPrivate) - (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(id)nilValue { NSCParameterAssert(key.length > 0); key = [key copy]; RACChannel *channel = [[RACChannel alloc] init]; [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ [channel.followingTerminal sendCompleted]; }]]; RACSignal *eventSignal = [[[self rac_signalForControlEvents:controlEvents] mapReplace:key] takeUntil:[[channel.followingTerminal ignoreValues] catchTo:RACSignal.empty]]; [[self rac_liftSelector:@selector(valueForKey:) withSignals:eventSignal, nil] subscribe:channel.followingTerminal]; RACSignal *valuesSignal = [channel.followingTerminal map:^(id value) { return value ?: nilValue; }]; [self rac_liftSelector:@selector(setValue:forKey:) withSignals:valuesSignal, [RACSignal return:key], nil]; return channel.leadingTerminal; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIDatePicker+RACSignalSupport.h
New file @@ -0,0 +1,24 @@ // // UIDatePicker+RACSignalSupport.h // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACChannelTerminal; @interface UIDatePicker (RACSignalSupport) /// Creates a new RACChannel-based binding to the receiver. /// /// nilValue - The date to set when the terminal receives `nil`. /// /// Returns a RACChannelTerminal that sends the receiver's date whenever the /// UIControlEventValueChanged control event is fired, and sets the date to the /// values it receives. - (RACChannelTerminal *)rac_newDateChannelWithNilValue:(NSDate *)nilValue; @end Pods/ReactiveCocoa/ReactiveCocoa/UIDatePicker+RACSignalSupport.m
New file @@ -0,0 +1,19 @@ // // UIDatePicker+RACSignalSupport.m // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIDatePicker+RACSignalSupport.h" #import "RACEXTKeyPathCoding.h" #import "UIControl+RACSignalSupportPrivate.h" @implementation UIDatePicker (RACSignalSupport) - (RACChannelTerminal *)rac_newDateChannelWithNilValue:(NSDate *)nilValue { return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.date) nilValue:nilValue]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIGestureRecognizer+RACSignalSupport.h
New file @@ -0,0 +1,18 @@ // // UIGestureRecognizer+RACSignalSupport.h // ReactiveCocoa // // Created by Josh Vera on 5/5/13. // Copyright (c) 2013 GitHub. All rights reserved. // #import <UIKit/UIKit.h> @class RACSignal; @interface UIGestureRecognizer (RACSignalSupport) /// Returns a signal that sends the receiver when its gesture occurs. - (RACSignal *)rac_gestureSignal; @end Pods/ReactiveCocoa/ReactiveCocoa/UIGestureRecognizer+RACSignalSupport.m
New file @@ -0,0 +1,40 @@ // // UIGestureRecognizer+RACSignalSupport.m // ReactiveCocoa // // Created by Josh Vera on 5/5/13. // Copyright (c) 2013 GitHub. All rights reserved. // #import "UIGestureRecognizer+RACSignalSupport.h" #import "RACEXTScope.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACSignal.h" #import "RACSubscriber.h" @implementation UIGestureRecognizer (RACSignalSupport) - (RACSignal *)rac_gestureSignal { @weakify(self); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { @strongify(self); [self addTarget:subscriber action:@selector(sendNext:)]; [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ [subscriber sendCompleted]; }]]; return [RACDisposable disposableWithBlock:^{ @strongify(self); [self removeTarget:subscriber action:@selector(sendNext:)]; }]; }] setNameWithFormat:@"%@ -rac_gestureSignal", self.rac_description]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIImagePickerController+RACSignalSupport.h
New file @@ -0,0 +1,33 @@ // // UIImagePickerController+RACSignalSupport.h // ReactiveCocoa // // Created by Timur Kuchkarov on 28.03.14. // Copyright (c) 2014 GitHub. All rights reserved. // #import <UIKit/UIKit.h> @class RACDelegateProxy; @class RACSignal; @interface UIImagePickerController (RACSignalSupport) /// A delegate proxy which will be set as the receiver's delegate when any of the /// methods in this category are used. @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; /// Creates a signal for every new selected image. /// /// When this method is invoked, the `rac_delegateProxy` will become the /// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy /// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't /// know how to handle. Setting the receiver's `delegate` afterward is considered /// undefined behavior. /// /// Returns a signal which will send the dictionary with info for the selected image. /// Caller is responsible for picker controller dismissal. The signal will complete /// itself when the receiver is deallocated or when user cancels selection. - (RACSignal *)rac_imageSelectedSignal; @end Pods/ReactiveCocoa/ReactiveCocoa/UIImagePickerController+RACSignalSupport.m
New file @@ -0,0 +1,53 @@ // // UIImagePickerController+RACSignalSupport.m // ReactiveCocoa // // Created by Timur Kuchkarov on 28.03.14. // Copyright (c) 2014 GitHub. All rights reserved. // #import "UIImagePickerController+RACSignalSupport.h" #import "RACDelegateProxy.h" #import "RACSignal+Operations.h" #import "NSObject+RACDeallocating.h" #import "NSObject+RACDescription.h" #import <objc/runtime.h> @implementation UIImagePickerController (RACSignalSupport) static void RACUseDelegateProxy(UIImagePickerController *self) { if (self.delegate == self.rac_delegateProxy) return; self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; self.delegate = (id)self.rac_delegateProxy; } - (RACDelegateProxy *)rac_delegateProxy { RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); if (proxy == nil) { proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIImagePickerControllerDelegate)]; objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return proxy; } - (RACSignal *)rac_imageSelectedSignal { RACSignal *pickerCancelledSignal = [[self.rac_delegateProxy signalForSelector:@selector(imagePickerControllerDidCancel:)] merge:self.rac_willDeallocSignal]; RACSignal *imagePickerSignal = [[[[self.rac_delegateProxy signalForSelector:@selector(imagePickerController:didFinishPickingMediaWithInfo:)] reduceEach:^(UIImagePickerController *pickerController, NSDictionary *userInfo) { return userInfo; }] takeUntil:pickerCancelledSignal] setNameWithFormat:@"%@ -rac_imageSelectedSignal", self.rac_description]; RACUseDelegateProxy(self); return imagePickerSignal; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIRefreshControl+RACCommandSupport.h
New file @@ -0,0 +1,22 @@ // // UIRefreshControl+RACCommandSupport.h // ReactiveCocoa // // Created by Dave Lee on 2013-10-17. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACCommand; @interface UIRefreshControl (RACCommandSupport) /// Manipulate the RACCommand property associated with this refresh control. /// /// When this refresh control is activated by the user, the command will be /// executed. Upon completion or error of the execution signal, -endRefreshing /// will be invoked. @property (nonatomic, strong) RACCommand *rac_command; @end Pods/ReactiveCocoa/ReactiveCocoa/UIRefreshControl+RACCommandSupport.m
New file @@ -0,0 +1,58 @@ // // UIRefreshControl+RACCommandSupport.m // ReactiveCocoa // // Created by Dave Lee on 2013-10-17. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIRefreshControl+RACCommandSupport.h" #import "RACEXTKeyPathCoding.h" #import "RACCommand.h" #import "RACCompoundDisposable.h" #import "RACDisposable.h" #import "RACSignal.h" #import "RACSignal+Operations.h" #import "UIControl+RACSignalSupport.h" #import <objc/runtime.h> static void *UIRefreshControlRACCommandKey = &UIRefreshControlRACCommandKey; static void *UIRefreshControlDisposableKey = &UIRefreshControlDisposableKey; @implementation UIRefreshControl (RACCommandSupport) - (RACCommand *)rac_command { return objc_getAssociatedObject(self, UIRefreshControlRACCommandKey); } - (void)setRac_command:(RACCommand *)command { objc_setAssociatedObject(self, UIRefreshControlRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC); // Dispose of any active command associations. [objc_getAssociatedObject(self, UIRefreshControlDisposableKey) dispose]; if (command == nil) return; // Like RAC(self, enabled) = command.enabled; but with access to disposable. RACDisposable *enabledDisposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self]; RACDisposable *executionDisposable = [[[[self rac_signalForControlEvents:UIControlEventValueChanged] map:^(UIRefreshControl *x) { return [[[command execute:x] catchTo:[RACSignal empty]] then:^{ return [RACSignal return:x]; }]; }] concat] subscribeNext:^(UIRefreshControl *x) { [x endRefreshing]; }]; RACDisposable *commandDisposable = [RACCompoundDisposable compoundDisposableWithDisposables:@[ enabledDisposable, executionDisposable ]]; objc_setAssociatedObject(self, UIRefreshControlDisposableKey, commandDisposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end Pods/ReactiveCocoa/ReactiveCocoa/UISegmentedControl+RACSignalSupport.h
New file @@ -0,0 +1,24 @@ // // UISegmentedControl+RACSignalSupport.h // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACChannelTerminal; @interface UISegmentedControl (RACSignalSupport) /// Creates a new RACChannel-based binding to the receiver. /// /// nilValue - The segment to select when the terminal receives `nil`. /// /// Returns a RACChannelTerminal that sends the receiver's currently selected /// segment's index whenever the UIControlEventValueChanged control event is /// fired, and sets the selected segment index to the values it receives. - (RACChannelTerminal *)rac_newSelectedSegmentIndexChannelWithNilValue:(NSNumber *)nilValue; @end Pods/ReactiveCocoa/ReactiveCocoa/UISegmentedControl+RACSignalSupport.m
New file @@ -0,0 +1,19 @@ // // UISegmentedControl+RACSignalSupport.m // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UISegmentedControl+RACSignalSupport.h" #import "RACEXTKeyPathCoding.h" #import "UIControl+RACSignalSupportPrivate.h" @implementation UISegmentedControl (RACSignalSupport) - (RACChannelTerminal *)rac_newSelectedSegmentIndexChannelWithNilValue:(NSNumber *)nilValue { return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.selectedSegmentIndex) nilValue:nilValue]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UISlider+RACSignalSupport.h
New file @@ -0,0 +1,24 @@ // // UISlider+RACSignalSupport.h // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACChannelTerminal; @interface UISlider (RACSignalSupport) /// Creates a new RACChannel-based binding to the receiver. /// /// nilValue - The value to set when the terminal receives `nil`. /// /// Returns a RACChannelTerminal that sends the receiver's value whenever the /// UIControlEventValueChanged control event is fired, and sets the value to the /// values it receives. - (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue; @end Pods/ReactiveCocoa/ReactiveCocoa/UISlider+RACSignalSupport.m
New file @@ -0,0 +1,19 @@ // // UISlider+RACSignalSupport.m // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UISlider+RACSignalSupport.h" #import "RACEXTKeyPathCoding.h" #import "UIControl+RACSignalSupportPrivate.h" @implementation UISlider (RACSignalSupport) - (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue { return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.value) nilValue:nilValue]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UIStepper+RACSignalSupport.h
New file @@ -0,0 +1,24 @@ // // UIStepper+RACSignalSupport.h // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACChannelTerminal; @interface UIStepper (RACSignalSupport) /// Creates a new RACChannel-based binding to the receiver. /// /// nilValue - The value to set when the terminal receives `nil`. /// /// Returns a RACChannelTerminal that sends the receiver's value whenever the /// UIControlEventValueChanged control event is fired, and sets the value to the /// values it receives. - (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue; @end Pods/ReactiveCocoa/ReactiveCocoa/UIStepper+RACSignalSupport.m
New file @@ -0,0 +1,19 @@ // // UIStepper+RACSignalSupport.m // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UIStepper+RACSignalSupport.h" #import "RACEXTKeyPathCoding.h" #import "UIControl+RACSignalSupportPrivate.h" @implementation UIStepper (RACSignalSupport) - (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue { return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.value) nilValue:nilValue]; } @end Pods/ReactiveCocoa/ReactiveCocoa/UISwitch+RACSignalSupport.h
New file @@ -0,0 +1,22 @@ // // UISwitch+RACSignalSupport.h // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import <UIKit/UIKit.h> @class RACChannelTerminal; @interface UISwitch (RACSignalSupport) /// Creates a new RACChannel-based binding to the receiver. /// /// Returns a RACChannelTerminal that sends whether the receiver is on whenever /// the UIControlEventValueChanged control event is fired, and sets it on or off /// when it receives @YES or @NO respectively. - (RACChannelTerminal *)rac_newOnChannel; @end Pods/ReactiveCocoa/ReactiveCocoa/UISwitch+RACSignalSupport.m
New file @@ -0,0 +1,19 @@ // // UISwitch+RACSignalSupport.m // ReactiveCocoa // // Created by Uri Baghin on 20/07/2013. // Copyright (c) 2013 GitHub, Inc. All rights reserved. // #import "UISwitch+RACSignalSupport.h" #import "RACEXTKeyPathCoding.h" #import "UIControl+RACSignalSupportPrivate.h" @implementation UISwitch (RACSignalSupport) - (RACChannelTerminal *)rac_newOnChannel { return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.on) nilValue:@NO]; } @end Diff truncated after the above file
Pods/ReactiveCocoa/ReactiveCocoa/UITableViewCell+RACSignalSupport.h Pods/ReactiveCocoa/ReactiveCocoa/UITableViewCell+RACSignalSupport.m Pods/ReactiveCocoa/ReactiveCocoa/UITableViewHeaderFooterView+RACSignalSupport.h Pods/ReactiveCocoa/ReactiveCocoa/UITableViewHeaderFooterView+RACSignalSupport.m Pods/ReactiveCocoa/ReactiveCocoa/UITextField+RACSignalSupport.h Pods/ReactiveCocoa/ReactiveCocoa/UITextField+RACSignalSupport.m Pods/ReactiveCocoa/ReactiveCocoa/UITextView+RACSignalSupport.h Pods/ReactiveCocoa/ReactiveCocoa/UITextView+RACSignalSupport.m Pods/ReactiveCocoa/ReactiveCocoa/extobjc/RACEXTKeyPathCoding.h Pods/ReactiveCocoa/ReactiveCocoa/extobjc/RACEXTRuntimeExtensions.h Pods/ReactiveCocoa/ReactiveCocoa/extobjc/RACEXTRuntimeExtensions.m Pods/ReactiveCocoa/ReactiveCocoa/extobjc/RACEXTScope.h Pods/ReactiveCocoa/ReactiveCocoa/extobjc/RACmetamacros.h Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-acknowledgements.markdown Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-acknowledgements.plist Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-frameworks.sh Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.debug.xcconfig Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.release.xcconfig Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa-Info.plist Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa-dummy.m Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa-prefix.pch Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa-umbrella.h Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa.debug.xcconfig Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa.modulemap Pods/Target Support Files/ReactiveCocoa/ReactiveCocoa.release.xcconfig