[
  {
    "path": ".gitignore",
    "content": "TBEmptyDataSet.xcworkspace/xcuserdata\n"
  },
  {
    "path": ".swift-version",
    "content": "5.0\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules: # rule identifiers to exclude from running\n  - line_length\n  - nesting\n  - variable_name_min_length\n  - cyclomatic_complexity\n  - class_delegate_protocol\n  - multiple_closures_with_trailing_closure\nincluded: # paths to include during linting. `--path` is ignored if present. takes precendence over `excluded`.\nexcluded: # paths to ignore during linting. overridden by `included`.\n  - Carthage\n# parameterized rules are first parameterized as a warning level, then error level.\nline_length: 150\ntype_name:\n  min_length: 3 # only warning\n  max_length: # warning and error\n    warning: 100\n    error: 200\n\nfunction_parameter_count: 10\nfunction_body_length:\n  - 100\n  - 200\ntype_body_length:\n  - 300 # warning\n  - 400 # error\nfile_length:\n  - 1000 # warning\n  - 1500 # error\nvariable_name:\n  min_length: 2\n  max_length: 40\n"
  },
  {
    "path": "Example/.swiftlint.yml",
    "content": "disabled_rules: # rule identifiers to exclude from running\n  - line_length\n  - nesting\nincluded: # paths to include during linting. `--path` is ignored if present. takes precendence over `excluded`.\nexcluded: # paths to ignore during linting. overridden by `included`.\n  - Carthage\n# parameterized rules can be customized from this configuration file\nline_length: 150\n# parameterized rules are first parameterized as a warning level, then error level.\ntype_body_length:\n  - 300 # warning\n  - 400 # error\n"
  },
  {
    "path": "Example/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  TBEmptyDataSetExample\n//\n//  Created by 洪鑫 on 15/11/19.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n\n    }\n}\n"
  },
  {
    "path": "Example/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Assets.xcassets/icon-empty-events.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-empty-events.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Assets.xcassets/icon-empty-message.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-empty-message.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Assets.xcassets/icon-empty-photos.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-empty-photos.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Assets.xcassets/loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"loading.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"kbE-4i-otZ\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13173\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Empty Data Demo Table View Controller-->\n        <scene sceneID=\"5qx-c9-kQh\">\n            <objects>\n                <tableViewController id=\"Lch-ZU-4Kb\" customClass=\"EmptyDataDemoTableViewController\" customModule=\"TBEmptyDataSetExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"qN0-9C-fAP\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Lch-ZU-4Kb\" id=\"7Ht-DJ-jpu\"/>\n                            <outlet property=\"delegate\" destination=\"Lch-ZU-4Kb\" id=\"Ehn-JM-S7A\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" id=\"ScQ-bM-CdO\"/>\n                    <refreshControl key=\"refreshControl\" opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"center\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" id=\"p9X-og-oGO\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </refreshControl>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"LQ9-uv-mnW\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2372\" y=\"220\"/>\n        </scene>\n        <!--Empty Data Demo Collection View Controller-->\n        <scene sceneID=\"OLg-ZA-g8n\">\n            <objects>\n                <collectionViewController id=\"FIk-rG-V0x\" customClass=\"EmptyDataDemoCollectionViewController\" customModule=\"TBEmptyDataSetExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <collectionView key=\"view\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" dataMode=\"prototypes\" id=\"WoI-bx-7tf\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" minimumInteritemSpacing=\"10\" id=\"AN4-8s-pSk\">\n                            <size key=\"itemSize\" width=\"160\" height=\"118\"/>\n                            <size key=\"headerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                            <size key=\"footerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                            <inset key=\"sectionInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                        </collectionViewFlowLayout>\n                        <cells>\n                            <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" reuseIdentifier=\"Cell\" id=\"hIW-pB-eH7\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"160\" height=\"118\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"160\" height=\"118\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Click to delete\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BEj-6c-73Q\">\n                                            <rect key=\"frame\" x=\"25.5\" y=\"48\" width=\"109.5\" height=\"21\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                            <color key=\"textColor\" red=\"0.2196078431372549\" green=\"0.2196078431372549\" blue=\"0.2196078431372549\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </view>\n                                <color key=\"backgroundColor\" red=\"0.86611149850000002\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"BEj-6c-73Q\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"hIW-pB-eH7\" secondAttribute=\"leading\" id=\"JOd-4d-wJP\"/>\n                                    <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"BEj-6c-73Q\" secondAttribute=\"trailing\" id=\"dv6-Kt-w7I\"/>\n                                    <constraint firstItem=\"BEj-6c-73Q\" firstAttribute=\"centerY\" secondItem=\"hIW-pB-eH7\" secondAttribute=\"centerY\" id=\"qrx-KL-dJl\"/>\n                                    <constraint firstItem=\"BEj-6c-73Q\" firstAttribute=\"centerX\" secondItem=\"hIW-pB-eH7\" secondAttribute=\"centerX\" id=\"uh9-Xc-Hvo\"/>\n                                </constraints>\n                            </collectionViewCell>\n                        </cells>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"FIk-rG-V0x\" id=\"Ie5-4i-wFd\"/>\n                            <outlet property=\"delegate\" destination=\"FIk-rG-V0x\" id=\"p57-cM-0vu\"/>\n                        </connections>\n                    </collectionView>\n                </collectionViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"CUf-YB-2wt\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2372\" y=\"969\"/>\n        </scene>\n        <!--Demo View Controller-->\n        <scene sceneID=\"KuL-DV-c3x\">\n            <objects>\n                <tableViewController id=\"0UU-b8-JN0\" customClass=\"DemoViewController\" customModule=\"TBEmptyDataSetExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"6n3-iw-5uM\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"0UU-b8-JN0\" id=\"kMW-9Q-Sq7\"/>\n                            <outlet property=\"delegate\" destination=\"0UU-b8-JN0\" id=\"QxC-zl-gDt\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" id=\"XiQ-GK-l0D\"/>\n                    <connections>\n                        <segue destination=\"Lch-ZU-4Kb\" kind=\"show\" identifier=\"ShowEmptyDataDemoTableView\" id=\"roH-Lu-khf\"/>\n                        <segue destination=\"FIk-rG-V0x\" kind=\"show\" identifier=\"ShowEmptyDataDemoCollectionView\" id=\"pHA-i3-d8D\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"4v7-ty-bFt\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1533\" y=\"562\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"Dg0-w9-0qB\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"kbE-4i-otZ\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"aL2-C2-A5C\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"375\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"0UU-b8-JN0\" kind=\"relationship\" relationship=\"rootViewController\" id=\"FIc-3B-1LF\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"tDd-z5-ifx\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"721\" y=\"562\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/DemoViewController.swift",
    "content": "//\n//  DemoViewController.swift\n//  TBEmptyDataSetExample\n//\n//  Created by 洪鑫 on 15/11/26.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\npublic struct EmptyData {\n    static let images = [#imageLiteral(resourceName: \"icon-empty-photos\"), #imageLiteral(resourceName: \"icon-empty-events\"), #imageLiteral(resourceName: \"icon-empty-message\")]\n    static let titles = [\"无照片\", \"无日程\", \"无新消息\"]\n    static let descriptions = [\"你可以添加一些照片哦，让生活更精彩！\", \"暂时没有日程哦，添加一些日程吧！\", \"没有新消息哦，去找朋友聊聊天吧!\"]\n}\n\nclass DemoViewController: UITableViewController {\n    // MARK: - Structs\n    fileprivate struct Data {\n        static let examples = [\"Empty Photos\", \"Empty Events\", \"Empty Message\"]\n        static let sectionTitles = [\"TableView\", \"CollectionView\"]\n    }\n\n    fileprivate struct SegueIdentifier {\n        static let showTableView = \"ShowEmptyDataDemoTableView\"\n        static let showCollectionView = \"ShowEmptyDataDemoCollectionView\"\n    }\n\n    fileprivate struct CellIdentifier {\n        static let reuseIdentifier = \"Cell\"\n    }\n\n    // MARK: - Properties\n    var selectedIndexPath = IndexPath()\n\n    // MARK: - View life cycle\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        navigationItem.title = \"EmptyDataSet Example\"\n        let backButton = UIBarButtonItem()\n        backButton.title = \"Back\"\n        navigationItem.backBarButtonItem = backButton\n        tableView.tableFooterView = UIView()\n    }\n\n    // MARK: - Table view data source and delegate\n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return Data.sectionTitles.count\n    }\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return Data.examples.count\n    }\n\n    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {\n        return Data.sectionTitles[section]\n    }\n\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        var cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier.reuseIdentifier)\n        if cell == nil {\n            cell = UITableViewCell(style: .default, reuseIdentifier: CellIdentifier.reuseIdentifier)\n        }\n        cell!.accessoryType = .disclosureIndicator\n        cell!.textLabel!.text = Data.examples[indexPath.row]\n\n        return cell!\n    }\n\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        selectedIndexPath = indexPath\n        if indexPath.section == 0 {\n            performSegue(withIdentifier: SegueIdentifier.showTableView, sender: self)\n        } else if indexPath.section == 1 {\n            performSegue(withIdentifier: SegueIdentifier.showCollectionView, sender: self)\n        }\n\n        tableView.deselectRow(at: indexPath, animated: true)\n    }\n\n    // MARK: - Navigation\n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        if segue.identifier == SegueIdentifier.showTableView {\n            if let emptyDataDemoTableViewController = segue.destination as? EmptyDataDemoTableViewController {\n                emptyDataDemoTableViewController.indexPath = selectedIndexPath\n            }\n        } else if segue.identifier == SegueIdentifier.showCollectionView {\n            if let emptyDataDemoCollectionViewController = segue.destination as? EmptyDataDemoCollectionViewController {\n                emptyDataDemoCollectionViewController.indexPath = selectedIndexPath\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Example/EmptyDataDemoCollectionViewController.swift",
    "content": "//\n//  EmptyDataDemoCollectionViewController.swift\n//  TBEmptyDataSetExample\n//\n//  Created by 洪鑫 on 15/11/24.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\nimport TBEmptyDataSet\n\nclass EmptyDataDemoCollectionViewController: UICollectionViewController {\n    // MARK: - Structs\n    fileprivate struct CellIdentifier {\n        static let reuseIdentifier = \"Cell\"\n    }\n\n    // MARK: - Properties\n    var indexPath = IndexPath()\n    fileprivate var isLoading = false\n    fileprivate var dataCount = 0\n\n    // MARK: - View life cycle\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        navigationItem.title = \"CollectionView\"\n        collectionView?.backgroundColor = .white\n\n        collectionView?.emptyDataSetDataSource = self\n        collectionView?.emptyDataSetDelegate = self\n\n        if indexPath.row != 0 {\n            loadData(self)\n        }\n    }\n\n    // MARK: - Helper\n    func loadData(_ sender: Any) {\n        isLoading = true\n        let delayTime = DispatchTime.now() + Double(Int64(2 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)\n        DispatchQueue.main.asyncAfter(deadline: delayTime) { () -> Void in\n            self.dataCount = 4\n            self.isLoading = false\n            self.collectionView?.reloadData()\n        }\n    }\n\n    // MARK: - Collection view data source\n    override func numberOfSections(in collectionView: UICollectionView) -> Int {\n        return 1\n    }\n\n    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return dataCount\n    }\n\n    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellIdentifier.reuseIdentifier, for: indexPath)\n\n        let maskLayer = CAShapeLayer()\n        let maskRect = cell.bounds\n        maskLayer.frame = maskRect\n        let cornerRadii = CGSize(width: 5, height: 5)\n        let maskPath = UIBezierPath(roundedRect: maskRect, byRoundingCorners: .allCorners, cornerRadii: cornerRadii)\n        maskLayer.path = maskPath.cgPath\n        cell.layer.mask = maskLayer\n\n        return cell\n    }\n\n    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\n        self.dataCount -= 1\n        collectionView.performBatchUpdates({\n            self.collectionView?.deleteItems(at: [indexPath])\n            }) { (_) in\n\n        }\n    }\n}\n\nextension EmptyDataDemoCollectionViewController: TBEmptyDataSetDataSource, TBEmptyDataSetDelegate {\n    // MARK: - TBEmptyDataSet data source\n    func imageForEmptyDataSet(in scrollView: UIScrollView) -> UIImage? {\n        return EmptyData.images[indexPath.row]\n    }\n\n    func titleForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n        let title = EmptyData.titles[indexPath.row]\n        var attributes: [NSAttributedString.Key: Any]?\n        if indexPath.row == 1 {\n            attributes = [.font: UIFont.systemFont(ofSize: 22),\n                          .foregroundColor: UIColor.gray]\n        } else if indexPath.row == 2 {\n            attributes = [.font: UIFont.systemFont(ofSize: 24),\n                          .foregroundColor: UIColor.gray]\n        }\n        return NSAttributedString(string: title, attributes: attributes)\n    }\n\n    func descriptionForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n        let description = EmptyData.descriptions[indexPath.row]\n        var attributes: [NSAttributedString.Key: Any]?\n        if indexPath.row == 1 {\n            attributes = [.font: UIFont.systemFont(ofSize: 17),\n                          .foregroundColor: UIColor(red: 3 / 255, green: 169 / 255, blue: 244 / 255, alpha: 1)]\n        } else if indexPath.row == 2 {\n            attributes = [.font: UIFont.systemFont(ofSize: 18),\n                          .foregroundColor: UIColor.purple]\n        }\n        return NSAttributedString(string: description, attributes: attributes)\n    }\n\n    func backgroundColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor? {\n        return UIColor(white: 0.95, alpha: 1)\n    }\n\n    func verticalOffsetForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n        if let navigationBar = navigationController?.navigationBar {\n            return -navigationBar.frame.height * 0.75\n        }\n        return 0\n    }\n\n    func customViewForEmptyDataSet(in scrollView: UIScrollView) -> UIView? {\n        let loadingView: UIView = {\n            if indexPath.row == 2 {\n                return ExampleCustomView(frame: CGRect.zero)\n            }\n\n            let loadingImageView = UIImageView(image: #imageLiteral(resourceName: \"loading\"))\n            let view = UIView(frame: loadingImageView.frame)\n            view.addSubview(loadingImageView)\n\n            let animation: CABasicAnimation = {\n                let animation = CABasicAnimation(keyPath: \"transform\")\n                animation.fromValue = NSValue(caTransform3D: CATransform3DIdentity)\n                animation.toValue = NSValue(caTransform3D: CATransform3DMakeRotation(.pi / 2, 0, 0, 1))\n                animation.duration = 0.3\n                animation.isCumulative = true\n                animation.repeatCount = .greatestFiniteMagnitude\n                return animation\n            }()\n            loadingImageView.layer.add(animation, forKey: \"loading\")\n\n            return view\n        }()\n\n        if isLoading {\n            return loadingView\n        } else {\n            return nil\n        }\n    }\n\n    // MARK: - TBEmptyDataSet delegate\n    func emptyDataSetShouldDisplay(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetTapEnabled(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetScrollEnabled(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetDidTapEmptyView(in scrollView: UIScrollView) {\n        let alert = UIAlertController(title: nil, message: \"Did Tap EmptyDataView!\", preferredStyle: .alert)\n        let cancelAction = UIAlertAction(title: \"OK\", style: .cancel, handler: nil)\n        alert.addAction(cancelAction)\n        present(alert, animated: true, completion: nil)\n    }\n\n    func emptyDataSetWillAppear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Will Appear!\")\n    }\n\n    func emptyDataSetDidAppear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Did Appear!\")\n    }\n\n    func emptyDataSetWillDisappear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Will Disappear!\")\n    }\n\n    func emptyDataSetDidDisappear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Did Disappear!\")\n    }\n}\n\nextension EmptyDataDemoCollectionViewController: UICollectionViewDelegateFlowLayout {\n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {\n        return CGSize(width: 150, height: 90)\n    }\n\n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {\n        return UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)\n    }\n\n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {\n        return 20\n    }\n\n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {\n        return 20\n    }\n\n    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {\n        super.viewWillTransition(to: size, with: coordinator)\n\n        collectionViewLayout.invalidateLayout()\n        coordinator.animate(alongsideTransition: { (_) -> Void in\n\n            }) { (_) -> Void in\n\n        }\n    }\n}\n\nclass ExampleCustomView: UIView {\n    fileprivate lazy var contentLabel: UILabel = {\n        let contentLabel = UILabel()\n        contentLabel.numberOfLines = 0\n        contentLabel.textColor = .white\n        contentLabel.translatesAutoresizingMaskIntoConstraints = false\n        return contentLabel\n    }()\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        commonInit()\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        commonInit()\n    }\n\n    fileprivate func commonInit() {\n        backgroundColor = .lightGray\n        layer.cornerRadius = 6\n\n        let activityIndicatorView = UIActivityIndicatorView(style: .whiteLarge)\n        activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false\n        activityIndicatorView.startAnimating()\n        contentLabel.text = \"Loading... Please wait a moment...\\n\\n(This is a custom empty data view, which is using pure AutoLayout)\"\n        addSubview(activityIndicatorView)\n        addSubview(contentLabel)\n\n        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: \"V:|-15-[activityIndicatorView]-20-[contentLabel]-15-|\", options: [], metrics: nil, views: [\"activityIndicatorView\": activityIndicatorView, \"contentLabel\": contentLabel]))\n        addConstraint(NSLayoutConstraint(item: activityIndicatorView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0))\n        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: \"H:|-15-[contentLabel]-15-|\", options: [], metrics: nil, views: [\"contentLabel\": contentLabel]))\n\n        translatesAutoresizingMaskIntoConstraints = false\n    }\n}\n"
  },
  {
    "path": "Example/EmptyDataDemoTableViewController.swift",
    "content": "//\n//  EmptyDataDemoTableViewController.swift\n//  TBEmptyDataSetExample\n//\n//  Created by 洪鑫 on 15/11/24.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\nimport TBEmptyDataSet\n\nclass EmptyDataDemoTableViewController: UITableViewController {\n    // MARK: - Structs\n    fileprivate struct CellIdentifier {\n        static let reuseIdentifier = \"Cell\"\n    }\n\n    // MARK: - Properties\n    var indexPath = IndexPath()\n    fileprivate var isLoading = false\n    fileprivate var dataCount = 0\n\n    // MARK: - View life cycle\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        navigationItem.title = \"TableView\"\n        tableView.tableFooterView = UIView()\n        refreshControl?.addTarget(self, action: #selector(fetchData(_:)), for: .valueChanged)\n\n        tableView.emptyDataSetDataSource = self\n        tableView.emptyDataSetDelegate = self\n\n        if indexPath.row != 0 {\n            loadData(self)\n        }\n    }\n\n    // MARK: - Helper\n    @objc func fetchData(_ sender: Any) {\n        let delayTime = DispatchTime.now() + Double(Int64(1.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)\n        DispatchQueue.main.asyncAfter(deadline: delayTime) { () -> Void in\n            self.dataCount = 7\n            self.tableView.reloadData()\n            self.refreshControl?.endRefreshing()\n        }\n    }\n\n    func loadData(_ sender: Any) {\n        isLoading = true\n        let delayTime = DispatchTime.now() + Double(Int64(1.75 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)\n        DispatchQueue.main.asyncAfter(deadline: delayTime) { () -> Void in\n            self.isLoading = false\n            self.tableView.reloadData()\n        }\n    }\n\n    // MARK: - Table view data source and delegate\n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return dataCount\n    }\n\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        var cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier.reuseIdentifier)\n        if cell == nil {\n            cell = UITableViewCell(style: .value1, reuseIdentifier: CellIdentifier.reuseIdentifier)\n        }\n        cell!.textLabel?.text = \"Cell\"\n        cell!.detailTextLabel?.text = \"Click to delete\"\n        return cell!\n    }\n\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        tableView.deselectRow(at: indexPath, animated: true)\n        tableView.beginUpdates()\n        dataCount -= 1\n        tableView.deleteRows(at: [indexPath], with: .fade)\n        tableView.endUpdates()\n    }\n}\n\nextension EmptyDataDemoTableViewController: TBEmptyDataSetDataSource, TBEmptyDataSetDelegate {\n    // MARK: - TBEmptyDataSet data source\n    func imageForEmptyDataSet(in scrollView: UIScrollView) -> UIImage? {\n        return EmptyData.images[indexPath.row]\n    }\n\n    func titleForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n        let title = EmptyData.titles[indexPath.row]\n        var attributes: [NSAttributedString.Key: Any]?\n        if indexPath.row == 1 {\n            attributes = [.font: UIFont.systemFont(ofSize: 22),\n                          .foregroundColor: UIColor.gray]\n        } else if indexPath.row == 2 {\n            attributes = [.font: UIFont.systemFont(ofSize: 24),\n                          .foregroundColor: UIColor.gray]\n        }\n        return NSAttributedString(string: title, attributes: attributes)\n    }\n\n    func descriptionForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n        let description = EmptyData.descriptions[indexPath.row]\n        var attributes: [NSAttributedString.Key: Any]?\n        if indexPath.row == 1 {\n            attributes = [.font: UIFont.systemFont(ofSize: 17),\n                          .foregroundColor: UIColor(red: 3 / 255, green: 169 / 255, blue: 244 / 255, alpha: 1)]\n        } else if indexPath.row == 2 {\n            attributes = [.font: UIFont.systemFont(ofSize: 18),\n                          .foregroundColor: UIColor.purple]\n        }\n        return NSAttributedString(string: description, attributes: attributes)\n    }\n\n    func verticalOffsetForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n        if let navigationBar = navigationController?.navigationBar {\n            return -navigationBar.frame.height * 0.75\n        }\n        return 0\n    }\n\n    func verticalSpacesForEmptyDataSet(in scrollView: UIScrollView) -> [CGFloat] {\n        return [25, 8]\n    }\n\n    func customViewForEmptyDataSet(in scrollView: UIScrollView) -> UIView? {\n        if isLoading {\n            let activityIndicator = UIActivityIndicatorView(style: .gray)\n            activityIndicator.startAnimating()\n            return activityIndicator\n        }\n        return nil\n    }\n\n    // MARK: - TBEmptyDataSet delegate\n    func emptyDataSetShouldDisplay(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetTapEnabled(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetScrollEnabled(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetDidTapEmptyView(in scrollView: UIScrollView) {\n        let alert = UIAlertController(title: nil, message: \"Did Tap EmptyDataView!\", preferredStyle: .alert)\n        let cancelAction = UIAlertAction(title: \"OK\", style: .cancel, handler: nil)\n        alert.addAction(cancelAction)\n        present(alert, animated: true, completion: nil)\n    }\n\n    func emptyDataSetWillAppear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Will Appear!\")\n    }\n\n    func emptyDataSetDidAppear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Did Appear!\")\n    }\n\n    func emptyDataSetWillDisappear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Will Disappear!\")\n    }\n\n    func emptyDataSetDidDisappear(in scrollView: UIScrollView) {\n        print(\"EmptyDataSet Did Disappear!\")\n    }\n}\n"
  },
  {
    "path": "Example/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>3.0.2</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>23</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Teambition\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# TBEmptyDataSet\nTBEmptyDataSet is an extension of UITableView/UICollectionView's super class, it will  display a placeholder emptyDataSet when the data of tableView/collectionView is empty.\n\nTBEmptyDataSet can be composed of an image, a title and a description, or you can set it as a custom view.\n\n\n![Example](Screenshots/Example.gif \"Example\")\n\n\n## How To Get Started\n### Carthage\nSpecify \"TBEmptyDataSet\" in your ```Cartfile```:\n```ogdl \ngithub \"teambition/TBEmptyDataSet\"\n```\n\n### CocoaPods\nSpecify \"TBEmptyDataSet\" in your ```Podfile```:\n```ruby \nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '8.0'\nuse_frameworks!\n\npod 'TBEmptyDataSet'\n```\n\n### Usage\n##### 1.  Assign the data source and delegate\n```swift\ntableView.emptyDataSetDataSource = self\ntableView.emptyDataSetDelegate = self\n```\n##### 2.  Implement the data source and delegate\nData source functions:\n```swift \nfunc imageForEmptyDataSet(in scrollView: UIScrollView) -> UIImage? {\n    // return the image for EmptyDataSet\n}\n\nfunc titleForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n    // return the title for EmptyDataSet\n}\n\nfunc descriptionForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n    // return the description for EmptyDataSet\n}\n\nfunc imageTintColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor? {\n    // return the image tint color for EmptyDataSet\n}\n\nfunc backgroundColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor? {\n    // return the backgroundColor for EmptyDataSet\n}\n\nfunc verticalOffsetForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n    // return the vertical offset for EmptyDataSet, default is 0\n}\n\nfunc verticalSpacesForEmptyDataSet(in scrollView: UIScrollView) -> [CGFloat] {\n    // return the vertical spaces from top to bottom for EmptyDataSet, default is [12, 12]\n}\n\nfunc titleMarginForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n    // return the minimum horizontal margin space for title, default is 15\n}\n\nfunc descriptionMarginForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n    // return the minimum horizontal margin space for description, default is 15\n}\n\nfunc customViewForEmptyDataSet(in scrollView: UIScrollView) -> UIView? {\n    // return an UIView instance for EmptyDataSet\n}\n``` \nDelegate functions:\n```swift\nfunc emptyDataSetShouldDisplay(in scrollView: UIScrollView) -> Bool {\n    // should display EmptyDataSet or not, default is true\n}\n\nfunc emptyDataSetTapEnabled(in scrollView: UIScrollView) -> Bool {\n    // enable tap gesture or not, default is true\n}\n\nfunc emptyDataSetScrollEnabled(in scrollView: UIScrollView) -> Bool {\n    // scrollView can scroll or not, default is false\n}\n\nfunc emptyDataSetDidTapEmptyView(in scrollView: UIScrollView) {\n    // do something\n}\n\nfunc emptyDataSetWillAppear(in scrollView: UIScrollView) {\n    // do something\n}\n\nfunc emptyDataSetDidAppear(in scrollView: UIScrollView) {\n    // do something\n}\n\nfunc emptyDataSetWillDisappear(in scrollView: UIScrollView) {\n    // do something\n}\n\nfunc emptyDataSetDidDisappear(in scrollView: UIScrollView) {\n    // do something\n}\n```\n##### 3.  Data source events (inserting, deleting, reloading, etc.)\nTBEmptyDataSet will update automatically when the data source of table view or collection view changes.\n\nTo be specific:\n* For UITableView, it updates when ```endUpdates()``` is called.\n* For both UITableView and UICollectionView, it updates when ```performBatchUpdates(_:completion:)``` is completed.\n* For both UITableView and UICollectionView, it updates when ```reloadData()``` is called.\n\n## Minimum Requirement\niOS 8.0\n\n## Release Notes\n* [Release Notes](https://github.com/teambition/TBEmptyDataSet/releases)\n\n## License\nTBEmptyDataSet is released under the MIT license. See [LICENSE](https://github.com/teambition/TBEmptyDataSet/blob/master/LICENSE.md) for details.\n\n## More Info\nHave a question? Please [open an issue](https://github.com/teambition/TBEmptyDataSet/issues/new)!\n"
  },
  {
    "path": "TBEmptyDataSet/Constants.swift",
    "content": "//\n//  Constants.swift\n//  TBEmptyDataSet\n//\n//  Created by Xin Hong on 15/11/19.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\n// swiftlint:disable variable_name\ninternal struct AssociatedKeys {\n    static var emptyDataSetDataSource = \"emptyDataSetDataSource\"\n    static var emptyDataSetDelegate = \"emptyDataSetDelegate\"\n    static var emptyDataView = \"emptyDataView\"\n}\n\ninternal struct Selectors {\n    static let tableViewSwizzledReloadData = #selector(UIScrollView.tb_tableViewSwizzledReloadData)\n    static let tableViewSwizzledEndUpdates = #selector(UIScrollView.tb_tableViewSwizzledEndUpdates)\n    @available(iOS 11.0, *)\n    static let tableViewSwizzledPerformBatchUpdates = #selector(UIScrollView.tb_tableViewSwizzledPerformBatchUpdates(_:completion:))\n    static let collectionViewSwizzledReloadData = #selector(UIScrollView.tb_collectionViewSwizzledReloadData)\n    static let collectionViewSwizzledPerformBatchUpdates = #selector(UIScrollView.tb_collectionViewSwizzledPerformBatchUpdates(_:completion:))\n}\n\ninternal struct TableViewSelectors {\n    static let reloadData = #selector(UITableView.reloadData)\n    static let endUpdates = #selector(UITableView.endUpdates)\n    static let numberOfSections = #selector(UITableViewDataSource.numberOfSections(in:))\n    @available(iOS 11.0, *)\n    static let performBatchUpdates = #selector(UITableView.performBatchUpdates(_:completion:))\n}\n\ninternal struct CollectionViewSelectors {\n    static let reloadData = #selector(UICollectionView.reloadData)\n    static let numberOfSections = #selector(UICollectionViewDataSource.numberOfSections(in:))\n    static let performBatchUpdates = #selector(UICollectionView.performBatchUpdates(_:completion:))\n}\n\ninternal struct DefaultValues {\n    static let verticalOffset: CGFloat = 0\n    static let verticalSpace: CGFloat = 12\n    static let verticalSpaces = [verticalSpace, verticalSpace]\n    static let titleMargin: CGFloat = 15\n    static let descriptionMargin: CGFloat = 15\n}\n"
  },
  {
    "path": "TBEmptyDataSet/EmptyDataView.swift",
    "content": "//\n//  EmptyDataView.swift\n//  TBEmptyDataSet\n//\n//  Created by Xin Hong on 15/11/19.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\ninternal class EmptyDataView: UIView {\n    fileprivate struct ViewStrings {\n        static let contentView = \"contentView\"\n        static let imageView = \"imageView\"\n        static let titleLabel = \"titleLabel\"\n        static let descriptionLabel = \"descriptionLabel\"\n        static let customView = \"customView\"\n    }\n\n    // MARK: - Properties\n    internal lazy var contentView: UIView = {\n        let contentView = UIView()\n        contentView.translatesAutoresizingMaskIntoConstraints = false\n        contentView.backgroundColor = .clear\n        contentView.alpha = 0\n        return contentView\n    }()\n\n    internal lazy var imageView: UIImageView = { [unowned self] in\n        let imageView = UIImageView()\n        imageView.translatesAutoresizingMaskIntoConstraints = false\n        imageView.backgroundColor = .clear\n        imageView.contentMode = .scaleAspectFill\n        self.contentView.addSubview(imageView)\n        return imageView\n    }()\n\n    internal lazy var titleLabel: UILabel = { [unowned self] in\n        let titleLabel = UILabel()\n        titleLabel.translatesAutoresizingMaskIntoConstraints = false\n        titleLabel.backgroundColor = .clear\n        titleLabel.font = .systemFont(ofSize: 27)\n        titleLabel.textColor = UIColor(white: 0.6, alpha: 1)\n        titleLabel.textAlignment = .center\n        titleLabel.lineBreakMode = .byWordWrapping\n        titleLabel.numberOfLines = 0\n        self.contentView.addSubview(titleLabel)\n        return titleLabel\n    }()\n\n    internal lazy var descriptionLabel: UILabel = { [unowned self] in\n        let descriptionLabel = UILabel()\n        descriptionLabel.translatesAutoresizingMaskIntoConstraints = false\n        descriptionLabel.backgroundColor = .clear\n        descriptionLabel.font = .systemFont(ofSize: 17)\n        descriptionLabel.textColor = UIColor(white: 0.6, alpha: 1)\n        descriptionLabel.textAlignment = .center\n        descriptionLabel.lineBreakMode = .byWordWrapping\n        descriptionLabel.numberOfLines = 0\n        self.contentView.addSubview(descriptionLabel)\n        return descriptionLabel\n    }()\n\n    internal var customView: UIView? {\n        willSet {\n            if let customView = customView {\n                customView.removeFromSuperview()\n            }\n        }\n        didSet {\n            if let customView = customView {\n                contentView.addSubview(customView)\n            }\n        }\n    }\n    internal var tapGesture: UITapGestureRecognizer?\n    internal var verticalOffset = DefaultValues.verticalOffset\n    internal var verticalSpaces = DefaultValues.verticalSpaces\n    internal var titleMargin = DefaultValues.titleMargin\n    internal var descriptionMargin = DefaultValues.descriptionMargin\n\n    // MARK: - Helper\n    fileprivate func shouldShowImageView() -> Bool {\n        return imageView.image != nil\n    }\n\n    fileprivate func shouldShowTitleLabel() -> Bool {\n        if let title = titleLabel.attributedText {\n            return title.length > 0\n        }\n        return false\n    }\n\n    fileprivate func shouldShowDescriptionLabel() -> Bool {\n        if let description = descriptionLabel.attributedText {\n            return description.length > 0\n        }\n        return false\n    }\n\n    fileprivate func removeAllConstraints() {\n        contentView.removeConstraints(contentView.constraints)\n        removeConstraints(constraints)\n    }\n\n    // MARK: - View life cycle\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        addSubview(self.contentView)\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n    }\n\n    override func didMoveToSuperview() {\n        frame = super.bounds\n        UIView.animate(withDuration: 0.25, animations: { () -> Void in\n            self.contentView.alpha = 1\n        })\n    }\n\n    // MARK: - Actions\n    internal func setConstraints() {\n        let centerX = NSLayoutConstraint(item: contentView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0)\n        let centerY = NSLayoutConstraint(item: contentView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: verticalOffset)\n        addConstraint(centerX)\n        addConstraint(centerY)\n        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: \"H:|[\\(ViewStrings.contentView)]|\", options: [], metrics: nil, views: [ViewStrings.contentView: contentView]))\n\n        if let customView = customView {\n            let translatesFrameIntoConstraints = customView.translatesAutoresizingMaskIntoConstraints\n            customView.translatesAutoresizingMaskIntoConstraints = false\n\n            if translatesFrameIntoConstraints {\n                contentView.addConstraint(NSLayoutConstraint(item: customView, attribute: .width, relatedBy: .equal, toItem: .none, attribute: .notAnAttribute, multiplier: 1, constant: customView.frame.width))\n                contentView.addConstraint(NSLayoutConstraint(item: customView, attribute: .height, relatedBy: .equal, toItem: .none, attribute: .notAnAttribute, multiplier: 1, constant: customView.frame.height))\n\n                contentView.addConstraint(NSLayoutConstraint(item: customView, attribute: .centerX, relatedBy: .equal, toItem: contentView, attribute: .centerX, multiplier: 1, constant: 0))\n                contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: \"V:|[\\(ViewStrings.customView)]|\", options: [], metrics: nil, views: [ViewStrings.customView: customView]))\n            } else {\n                contentView.addConstraint(NSLayoutConstraint(item: customView, attribute: .centerX, relatedBy: .equal, toItem: contentView, attribute: .centerX, multiplier: 1, constant: 0))\n                contentView.addConstraint(NSLayoutConstraint(item: customView, attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: contentView, attribute: .leading, multiplier: 1, constant: 0))\n                contentView.addConstraint(NSLayoutConstraint(item: customView, attribute: .trailing, relatedBy: .lessThanOrEqual, toItem: contentView, attribute: .trailing, multiplier: 1, constant: 0))\n\n                contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: \"V:|[\\(ViewStrings.customView)]|\", options: [], metrics: nil, views: [ViewStrings.customView: customView]))\n            }\n        } else {\n            var viewStrings = [String]()\n            var views = [String: UIView]()\n\n            if shouldShowImageView() {\n                if imageView.superview == nil {\n                    contentView.addSubview(imageView)\n                }\n                let viewString = ViewStrings.imageView\n                viewStrings.append(viewString)\n                views[viewString] = imageView\n\n                contentView.addConstraint(NSLayoutConstraint(item: imageView, attribute: .centerX, relatedBy: .equal, toItem: contentView, attribute: .centerX, multiplier: 1, constant: 0))\n            } else {\n                imageView.removeFromSuperview()\n            }\n\n            if shouldShowTitleLabel() {\n                if titleLabel.superview == nil {\n                    contentView.addSubview(titleLabel)\n                }\n                let viewString = ViewStrings.titleLabel\n                viewStrings.append(viewString)\n                views[viewString] = titleLabel\n                contentView.addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .centerX, relatedBy: .equal, toItem: contentView, attribute: .centerX, multiplier: 1, constant: 0))\n                contentView.addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: contentView, attribute: .leading, multiplier: 1, constant: titleMargin))\n                contentView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .trailing, relatedBy: .greaterThanOrEqual, toItem: titleLabel, attribute: .trailing, multiplier: 1, constant: titleMargin))\n            } else {\n                titleLabel.removeFromSuperview()\n            }\n\n            if shouldShowDescriptionLabel() {\n                if descriptionLabel.superview == nil {\n                    contentView.addSubview(descriptionLabel)\n                }\n                let viewString = ViewStrings.descriptionLabel\n                viewStrings.append(viewString)\n                views[viewString] = descriptionLabel\n                contentView.addConstraint(NSLayoutConstraint(item: descriptionLabel, attribute: .centerX, relatedBy: .equal, toItem: contentView, attribute: .centerX, multiplier: 1, constant: 0))\n                contentView.addConstraint(NSLayoutConstraint(item: descriptionLabel, attribute: .leading, relatedBy: .greaterThanOrEqual, toItem: contentView, attribute: .leading, multiplier: 1, constant: descriptionMargin))\n                contentView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .trailing, relatedBy: .greaterThanOrEqual, toItem: descriptionLabel, attribute: .trailing, multiplier: 1, constant: descriptionMargin))\n            } else {\n                descriptionLabel.removeFromSuperview()\n            }\n\n            var verticalFormat = String()\n            for (index, viewString) in viewStrings.enumerated() {\n                verticalFormat += \"[\\(viewString)]\"\n                if index != viewStrings.count - 1 {\n                    let verticalSpace = index < verticalSpaces.count ? verticalSpaces[index] : DefaultValues.verticalSpace\n                    verticalFormat += \"-(\\(verticalSpace))-\"\n                }\n            }\n\n            if !verticalFormat.isEmpty {\n                contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: \"V:|\\(verticalFormat)|\", options: [], metrics: nil, views: views))\n            }\n        }\n    }\n\n    internal func prepareForDisplay() {\n        imageView.image = nil\n        titleLabel.attributedText = nil\n        descriptionLabel.attributedText = nil\n        customView = nil\n        removeAllConstraints()\n    }\n\n    internal func reset() {\n        imageView.image = nil\n        titleLabel.attributedText = nil\n        descriptionLabel.attributedText = nil\n        customView = nil\n        tapGesture = nil\n        removeAllConstraints()\n    }\n}\n"
  },
  {
    "path": "TBEmptyDataSet/Protocols.swift",
    "content": "//\n//  Protocols.swift\n//  TBEmptyDataSet\n//\n//  Created by Xin Hong on 15/11/19.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\npublic protocol TBEmptyDataSetDataSource {\n    func imageForEmptyDataSet(in scrollView: UIScrollView) -> UIImage?\n    func titleForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString?\n    func descriptionForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString?\n\n    func imageTintColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor?\n    func backgroundColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor?\n\n    func verticalOffsetForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat\n    func verticalSpacesForEmptyDataSet(in scrollView: UIScrollView) -> [CGFloat]\n    func titleMarginForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat\n    func descriptionMarginForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat\n\n    func customViewForEmptyDataSet(in scrollView: UIScrollView) -> UIView?\n}\n\npublic protocol TBEmptyDataSetDelegate {\n    func emptyDataSetShouldDisplay(in scrollView: UIScrollView) -> Bool\n    func emptyDataSetTapEnabled(in scrollView: UIScrollView) -> Bool\n    func emptyDataSetScrollEnabled(in scrollView: UIScrollView) -> Bool\n\n    func emptyDataSetDidTapEmptyView(in scrollView: UIScrollView)\n\n    func emptyDataSetWillAppear(in scrollView: UIScrollView)\n    func emptyDataSetDidAppear(in scrollView: UIScrollView)\n    func emptyDataSetWillDisappear(in scrollView: UIScrollView)\n    func emptyDataSetDidDisappear(in scrollView: UIScrollView)\n}\n\npublic extension TBEmptyDataSetDataSource {\n    func imageForEmptyDataSet(in scrollView: UIScrollView) -> UIImage? {\n        return nil\n    }\n\n    func titleForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n        return nil\n    }\n\n    func descriptionForEmptyDataSet(in scrollView: UIScrollView) -> NSAttributedString? {\n        return nil\n    }\n\n    func imageTintColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor? {\n        return nil\n    }\n\n    func backgroundColorForEmptyDataSet(in scrollView: UIScrollView) -> UIColor? {\n        return nil\n    }\n\n    func verticalOffsetForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n        return DefaultValues.verticalOffset\n    }\n\n    func verticalSpacesForEmptyDataSet(in scrollView: UIScrollView) -> [CGFloat] {\n        return DefaultValues.verticalSpaces\n    }\n\n    func titleMarginForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n        return DefaultValues.titleMargin\n    }\n\n    func descriptionMarginForEmptyDataSet(in scrollView: UIScrollView) -> CGFloat {\n        return DefaultValues.descriptionMargin\n    }\n\n    func customViewForEmptyDataSet(in scrollView: UIScrollView) -> UIView? {\n        return nil\n    }\n}\n\npublic extension TBEmptyDataSetDelegate {\n    func emptyDataSetShouldDisplay(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetTapEnabled(in scrollView: UIScrollView) -> Bool {\n        return true\n    }\n\n    func emptyDataSetScrollEnabled(in scrollView: UIScrollView) -> Bool {\n        return false\n    }\n\n    func emptyDataSetDidTapEmptyView(in scrollView: UIScrollView) {\n\n    }\n\n    func emptyDataSetWillAppear(in scrollView: UIScrollView) {\n\n    }\n\n    func emptyDataSetDidAppear(in scrollView: UIScrollView) {\n\n    }\n\n    func emptyDataSetWillDisappear(in scrollView: UIScrollView) {\n\n    }\n\n    func emptyDataSetDidDisappear(in scrollView: UIScrollView) {\n\n    }\n}\n"
  },
  {
    "path": "TBEmptyDataSet/Supporting Files/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>3.0.2</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "TBEmptyDataSet/TBEmptyDataSet.swift",
    "content": "//\n//  TBEmptyDataSet.swift\n//  TBEmptyDataSet\n//\n//  Created by Xin Hong on 15/11/19.\n//  Copyright © 2015年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\nextension UIScrollView {\n    // MARK: - Properties\n    public var emptyDataSetDataSource: TBEmptyDataSetDataSource? {\n        get {\n            let container = objc_getAssociatedObject(self, &AssociatedKeys.emptyDataSetDataSource) as? WeakObjectContainer\n            return container?.object as? TBEmptyDataSetDataSource\n        }\n        set {\n            if let newValue = newValue {\n                objc_setAssociatedObject(self, &AssociatedKeys.emptyDataSetDataSource, WeakObjectContainer(object: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n\n                switch self {\n                case is UITableView:\n                    UITableView.tb_swizzleTableViewReloadData\n                    UITableView.tb_swizzleTableViewEndUpdates\n                    if #available(iOS 11.0, *) {\n                        UITableView.tb_swizzleTableViewPerformBatchUpdates\n                    }\n                case is UICollectionView:\n                    UICollectionView.tb_swizzleCollectionViewReloadData\n                    UICollectionView.tb_swizzleCollectionViewPerformBatchUpdates\n                default:\n                    break\n                }\n            } else {\n                handlingInvalidEmptyDataSet()\n            }\n        }\n    }\n\n    public var emptyDataSetDelegate: TBEmptyDataSetDelegate? {\n        get {\n            let container = objc_getAssociatedObject(self, &AssociatedKeys.emptyDataSetDelegate) as? WeakObjectContainer\n            return container?.object as? TBEmptyDataSetDelegate\n        }\n        set {\n            if let newValue = newValue {\n                objc_setAssociatedObject(self, &AssociatedKeys.emptyDataSetDelegate, WeakObjectContainer(object: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            } else {\n                handlingInvalidEmptyDataSet()\n            }\n        }\n    }\n\n    internal var emptyDataView: EmptyDataView? {\n        get {\n            return objc_getAssociatedObject(self, &AssociatedKeys.emptyDataView) as? EmptyDataView\n        }\n        set {\n            objc_setAssociatedObject(self, &AssociatedKeys.emptyDataView, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n\n    // MARK: - Public\n    public var emptyDataViewVisible: Bool {\n        if let emptyDataView = emptyDataView {\n            return !emptyDataView.isHidden\n        }\n        return false\n    }\n\n    public func updateEmptyDataSetIfNeeded() {\n        reloadEmptyDataSet()\n    }\n\n    // MARK: - Data source and delegate getters\n    fileprivate func emptyDataSetImage() -> UIImage? {\n        return emptyDataSetDataSource?.imageForEmptyDataSet(in: self)\n    }\n\n    fileprivate func emptyDataSetTitle() -> NSAttributedString? {\n        return emptyDataSetDataSource?.titleForEmptyDataSet(in: self)\n    }\n\n    fileprivate func emptyDataSetDescription() -> NSAttributedString? {\n        return emptyDataSetDataSource?.descriptionForEmptyDataSet(in: self)\n    }\n\n    fileprivate func emptyDataSetImageTintColor() -> UIColor? {\n        return emptyDataSetDataSource?.imageTintColorForEmptyDataSet(in: self)\n    }\n\n    fileprivate func emptyDataSetBackgroundColor() -> UIColor? {\n        return emptyDataSetDataSource?.backgroundColorForEmptyDataSet(in: self)\n    }\n\n    fileprivate func emptyDataSetVerticalOffset() -> CGFloat {\n        return emptyDataSetDataSource?.verticalOffsetForEmptyDataSet(in: self) ?? DefaultValues.verticalOffset\n    }\n\n    fileprivate func emptyDataSetVerticalSpaces() -> [CGFloat] {\n        return emptyDataSetDataSource?.verticalSpacesForEmptyDataSet(in: self) ?? DefaultValues.verticalSpaces\n    }\n\n    fileprivate func emptyDataSetTitleMargin() -> CGFloat {\n        return emptyDataSetDataSource?.titleMarginForEmptyDataSet(in: self) ?? DefaultValues.titleMargin\n    }\n\n    fileprivate func emptyDataSetDescriptionMargin() -> CGFloat {\n        return emptyDataSetDataSource?.descriptionMarginForEmptyDataSet(in: self) ?? DefaultValues.descriptionMargin\n    }\n\n    fileprivate func emptyDataSetCustomView() -> UIView? {\n        return emptyDataSetDataSource?.customViewForEmptyDataSet(in: self)\n    }\n\n    fileprivate func emptyDataSetShouldDisplay() -> Bool {\n        return emptyDataSetDelegate?.emptyDataSetShouldDisplay(in: self) ?? true\n    }\n\n    fileprivate func emptyDataSetTapEnabled() -> Bool {\n        return emptyDataSetDelegate?.emptyDataSetTapEnabled(in: self) ?? true\n    }\n\n    fileprivate func emptyDataSetScrollEnabled() -> Bool {\n        return emptyDataSetDelegate?.emptyDataSetScrollEnabled(in: self) ?? false\n    }\n\n    // MARK: - Helper\n    @objc func didTapEmptyDataView(_ sender: Any) {\n        emptyDataSetDelegate?.emptyDataSetDidTapEmptyView(in: self)\n    }\n\n    fileprivate func makeEmptyDataView() -> EmptyDataView {\n        let emptyDataView = EmptyDataView(frame: frame)\n        emptyDataView.autoresizingMask = [.flexibleHeight, .flexibleWidth]\n        emptyDataView.isHidden = true\n        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapEmptyDataView(_:)))\n        emptyDataView.addGestureRecognizer(tapGesture)\n        emptyDataView.tapGesture = tapGesture\n        return emptyDataView\n    }\n\n    fileprivate func emptyDataSetAvailable() -> Bool {\n        if emptyDataSetDataSource != nil {\n            return (self is UITableView) || (self is UICollectionView)\n        }\n        return false\n    }\n\n    fileprivate func cellsCount() -> Int {\n        var count = 0\n        if let tableView = self as? UITableView {\n            if let dataSource = tableView.dataSource {\n                if dataSource.responds(to: TableViewSelectors.numberOfSections) {\n                    let sections = dataSource.numberOfSections?(in: tableView) ?? 0\n                    for section in 0..<sections {\n                        count += dataSource.tableView(tableView, numberOfRowsInSection: section)\n                    }\n                }\n            }\n        } else if let collectionView = self as? UICollectionView {\n            if let dataSource = collectionView.dataSource {\n                if dataSource.responds(to: CollectionViewSelectors.numberOfSections) {\n                    let sections = dataSource.numberOfSections?(in: collectionView) ?? 0\n                    for section in 0..<sections {\n                        count += dataSource.collectionView(collectionView, numberOfItemsInSection: section)\n                    }\n                }\n            }\n        }\n\n        return count\n    }\n\n    fileprivate func handlingInvalidEmptyDataSet() {\n        emptyDataSetDelegate?.emptyDataSetWillDisappear(in: self)\n\n        emptyDataView?.reset()\n        emptyDataView?.removeFromSuperview()\n        emptyDataView = nil\n        isScrollEnabled = true\n\n        emptyDataSetDelegate?.emptyDataSetDidDisappear(in: self)\n    }\n\n    // MARK: - Display\n    fileprivate func reloadEmptyDataSet() {\n        guard emptyDataSetAvailable() else {\n            return\n        }\n\n        guard emptyDataSetShouldDisplay() && cellsCount() == 0 else {\n            if emptyDataViewVisible {\n                handlingInvalidEmptyDataSet()\n            }\n            return\n        }\n\n        let emptyDataView: EmptyDataView = {\n            if let emptyDataView = self.emptyDataView {\n                return emptyDataView\n            } else {\n                let emptyDataView = makeEmptyDataView()\n                self.emptyDataView = emptyDataView\n                return emptyDataView\n            }\n        }()\n        emptyDataSetDelegate?.emptyDataSetWillAppear(in: self)\n\n        if emptyDataView.superview == nil {\n            if (self is UITableView || self is UICollectionView) && subviews.count > 1 {\n                insertSubview(emptyDataView, at: 0)\n            } else {\n                addSubview(emptyDataView)\n            }\n        }\n\n        emptyDataView.prepareForDisplay()\n\n        emptyDataView.verticalOffset = emptyDataSetVerticalOffset()\n        emptyDataView.verticalSpaces = emptyDataSetVerticalSpaces()\n        emptyDataView.titleMargin = emptyDataSetTitleMargin()\n        emptyDataView.descriptionMargin = emptyDataSetDescriptionMargin()\n\n        if let customView = emptyDataSetCustomView() {\n            emptyDataView.customView = customView\n        } else {\n            if let imageTintColor = emptyDataSetImageTintColor() {\n                emptyDataView.imageView.image = emptyDataSetImage()?.withRenderingMode(.alwaysTemplate)\n                emptyDataView.imageView.tintColor = imageTintColor\n            } else {\n                emptyDataView.imageView.image = emptyDataSetImage()?.withRenderingMode(.alwaysOriginal)\n            }\n\n            emptyDataView.titleLabel.attributedText = emptyDataSetTitle()\n            emptyDataView.descriptionLabel.attributedText = emptyDataSetDescription()\n        }\n\n        emptyDataView.backgroundColor = emptyDataSetBackgroundColor()\n        emptyDataView.isHidden = false\n        emptyDataView.clipsToBounds = true\n        emptyDataView.tapGesture?.isEnabled = emptyDataSetTapEnabled()\n        isScrollEnabled = emptyDataSetScrollEnabled()\n\n        emptyDataView.setConstraints()\n        emptyDataView.layoutIfNeeded()\n\n        emptyDataSetDelegate?.emptyDataSetDidAppear(in: self)\n    }\n\n    // MARK: - Method swizzling\n    fileprivate class func tb_swizzleMethod(for aClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {\n        guard let originalMethod = class_getInstanceMethod(aClass, originalSelector), let swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector) else {\n            return\n        }\n\n        let didAddMethod = class_addMethod(aClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))\n\n        if didAddMethod {\n            class_replaceMethod(aClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))\n        } else {\n            method_exchangeImplementations(originalMethod, swizzledMethod)\n        }\n    }\n\n    // swiftlint:disable variable_name\n    fileprivate static let tb_swizzleTableViewReloadData: () = {\n        let originalSelector = TableViewSelectors.reloadData\n        let swizzledSelector = Selectors.tableViewSwizzledReloadData\n\n        tb_swizzleMethod(for: UITableView.self, originalSelector: originalSelector, swizzledSelector: swizzledSelector)\n    }()\n\n    // swiftlint:disable variable_name\n    fileprivate static let tb_swizzleTableViewEndUpdates: () = {\n        let originalSelector = TableViewSelectors.endUpdates\n        let swizzledSelector = Selectors.tableViewSwizzledEndUpdates\n\n        tb_swizzleMethod(for: UITableView.self, originalSelector: originalSelector, swizzledSelector: swizzledSelector)\n    }()\n\n    // swiftlint:disable variable_name\n    @available(iOS 11.0, *)\n    fileprivate static let tb_swizzleTableViewPerformBatchUpdates: () = {\n        let originalSelector = TableViewSelectors.performBatchUpdates\n        let swizzledSelector = Selectors.tableViewSwizzledPerformBatchUpdates\n\n        tb_swizzleMethod(for: UITableView.self, originalSelector: originalSelector, swizzledSelector: swizzledSelector)\n    }()\n\n    // swiftlint:disable variable_name\n    fileprivate static let tb_swizzleCollectionViewReloadData: () = {\n        let originalSelector = CollectionViewSelectors.reloadData\n        let swizzledSelector = Selectors.collectionViewSwizzledReloadData\n\n        tb_swizzleMethod(for: UICollectionView.self, originalSelector: originalSelector, swizzledSelector: swizzledSelector)\n    }()\n\n    // swiftlint:disable variable_name\n    fileprivate static let tb_swizzleCollectionViewPerformBatchUpdates: () = {\n        let originalSelector = CollectionViewSelectors.performBatchUpdates\n        let swizzledSelector = Selectors.collectionViewSwizzledPerformBatchUpdates\n\n        tb_swizzleMethod(for: UICollectionView.self, originalSelector: originalSelector, swizzledSelector: swizzledSelector)\n    }()\n\n    @objc\n    func tb_tableViewSwizzledReloadData() {\n        tb_tableViewSwizzledReloadData()\n        reloadEmptyDataSet()\n    }\n\n    @objc\n    func tb_tableViewSwizzledEndUpdates() {\n        tb_tableViewSwizzledEndUpdates()\n        reloadEmptyDataSet()\n    }\n\n    @available(iOS 11.0, *)\n    @objc\n    func tb_tableViewSwizzledPerformBatchUpdates(_ updates: (() -> Void)?, completion: ((Bool) -> Void)?) {\n        tb_tableViewSwizzledPerformBatchUpdates(updates) { [weak self](completed) in\n            completion?(completed)\n            self?.reloadEmptyDataSet()\n        }\n    }\n\n    @objc\n    func tb_collectionViewSwizzledReloadData() {\n        tb_collectionViewSwizzledReloadData()\n        reloadEmptyDataSet()\n    }\n\n    @objc\n    func tb_collectionViewSwizzledPerformBatchUpdates(_ updates: (() -> Void)?, completion: ((Bool) -> Void)?) {\n        tb_collectionViewSwizzledPerformBatchUpdates(updates) { [weak self](completed) in\n            completion?(completed)\n            self?.reloadEmptyDataSet()\n        }\n    }\n}\n"
  },
  {
    "path": "TBEmptyDataSet/WeakObjectContainer.swift",
    "content": "//\n//  WeakObjectContainer.swift\n//  TBEmptyDataSet\n//\n//  Created by Xin Hong on 2016/11/4.\n//  Copyright © 2016年 Teambition. All rights reserved.\n//\n\nimport UIKit\n\nclass WeakObjectContainer: NSObject {\n    weak var object: AnyObject?\n\n    init(object: Any) {\n        super.init()\n        self.object = object as AnyObject\n    }\n}\n"
  },
  {
    "path": "TBEmptyDataSet.podspec",
    "content": "Pod::Spec.new do |s|\n\n  s.name         = \"TBEmptyDataSet\"\n  s.version      = \"3.0.2\"\n  s.summary      = \"An extension of UITableView/UICollectionView's super class, it will display a placeholder when the data is empty.\"\n\n  s.homepage     = \"https://github.com/teambition/TBEmptyDataSet\"\n  s.license      = { :type => \"MIT\", :file => \"LICENSE.md\" }\n  s.author       = \"Xin Hong\"\n\n  s.source       = { :git => \"https://github.com/teambition/TBEmptyDataSet.git\", :tag => s.version.to_s }\n  s.source_files = \"TBEmptyDataSet/*.swift\"\n\n  s.platform     = :ios, \"8.0\"\n  s.requires_arc = true\n\n  s.frameworks   = \"Foundation\", \"UIKit\"\n\nend\n"
  },
  {
    "path": "TBEmptyDataSet.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tD331287B1DCC259C00773E72 /* WeakObjectContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D331287A1DCC259C00773E72 /* WeakObjectContainer.swift */; };\n\t\tD33C7C741C44DCA000E1687A /* TBEmptyDataSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33C7C731C44DCA000E1687A /* TBEmptyDataSet.swift */; };\n\t\tD33C7C781C44DF0A00E1687A /* EmptyDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33C7C771C44DF0A00E1687A /* EmptyDataView.swift */; };\n\t\tD33C7C7A1C44E17000E1687A /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33C7C791C44E17000E1687A /* Constants.swift */; };\n\t\tD33C7C7C1C44E21700E1687A /* Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = D33C7C7B1C44E21700E1687A /* Protocols.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tD331287A1DCC259C00773E72 /* WeakObjectContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeakObjectContainer.swift; sourceTree = \"<group>\"; };\n\t\tD33C7C671C44DBED00E1687A /* TBEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TBEmptyDataSet.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD33C7C731C44DCA000E1687A /* TBEmptyDataSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TBEmptyDataSet.swift; sourceTree = \"<group>\"; };\n\t\tD33C7C751C44DCC200E1687A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD33C7C771C44DF0A00E1687A /* EmptyDataView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmptyDataView.swift; sourceTree = \"<group>\"; };\n\t\tD33C7C791C44E17000E1687A /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = \"<group>\"; };\n\t\tD33C7C7B1C44E21700E1687A /* Protocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Protocols.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD33C7C631C44DBED00E1687A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tD33C7C5D1C44DBED00E1687A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD33C7C691C44DBED00E1687A /* TBEmptyDataSet */,\n\t\t\t\tD33C7C721C44DC8B00E1687A /* Supporting Files */,\n\t\t\t\tD33C7C681C44DBED00E1687A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD33C7C681C44DBED00E1687A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD33C7C671C44DBED00E1687A /* TBEmptyDataSet.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD33C7C691C44DBED00E1687A /* TBEmptyDataSet */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD33C7C791C44E17000E1687A /* Constants.swift */,\n\t\t\t\tD33C7C7B1C44E21700E1687A /* Protocols.swift */,\n\t\t\t\tD33C7C771C44DF0A00E1687A /* EmptyDataView.swift */,\n\t\t\t\tD33C7C731C44DCA000E1687A /* TBEmptyDataSet.swift */,\n\t\t\t\tD331287A1DCC259C00773E72 /* WeakObjectContainer.swift */,\n\t\t\t);\n\t\t\tpath = TBEmptyDataSet;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD33C7C721C44DC8B00E1687A /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD33C7C751C44DCC200E1687A /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tpath = \"TBEmptyDataSet/Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\tD33C7C641C44DBED00E1687A /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\tD33C7C661C44DBED00E1687A /* TBEmptyDataSet */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D33C7C6F1C44DBED00E1687A /* Build configuration list for PBXNativeTarget \"TBEmptyDataSet\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD33C7C621C44DBED00E1687A /* Sources */,\n\t\t\t\tD33C7C631C44DBED00E1687A /* Frameworks */,\n\t\t\t\tD33C7C641C44DBED00E1687A /* Headers */,\n\t\t\t\tD33C7C651C44DBED00E1687A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TBEmptyDataSet;\n\t\t\tproductName = TBEmptyDataSet;\n\t\t\tproductReference = D33C7C671C44DBED00E1687A /* TBEmptyDataSet.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD33C7C5E1C44DBED00E1687A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = Teambition;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD33C7C661C44DBED00E1687A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D33C7C611C44DBED00E1687A /* Build configuration list for PBXProject \"TBEmptyDataSet\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = D33C7C5D1C44DBED00E1687A;\n\t\t\tproductRefGroup = D33C7C681C44DBED00E1687A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD33C7C661C44DBED00E1687A /* TBEmptyDataSet */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD33C7C651C44DBED00E1687A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD33C7C621C44DBED00E1687A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD33C7C781C44DF0A00E1687A /* EmptyDataView.swift in Sources */,\n\t\t\t\tD331287B1DCC259C00773E72 /* WeakObjectContainer.swift in Sources */,\n\t\t\t\tD33C7C7C1C44E21700E1687A /* Protocols.swift in Sources */,\n\t\t\t\tD33C7C741C44DCA000E1687A /* TBEmptyDataSet.swift in Sources */,\n\t\t\t\tD33C7C7A1C44E17000E1687A /* Constants.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD33C7C6D1C44DBED00E1687A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD33C7C6E1C44DBED00E1687A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD33C7C701C44DBED00E1687A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/TBEmptyDataSet/Supporting Files/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Teambition.TBEmptyDataSet;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD33C7C711C44DBED00E1687A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/TBEmptyDataSet/Supporting Files/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Teambition.TBEmptyDataSet;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD33C7C611C44DBED00E1687A /* Build configuration list for PBXProject \"TBEmptyDataSet\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD33C7C6D1C44DBED00E1687A /* Debug */,\n\t\t\t\tD33C7C6E1C44DBED00E1687A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD33C7C6F1C44DBED00E1687A /* Build configuration list for PBXNativeTarget \"TBEmptyDataSet\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD33C7C701C44DBED00E1687A /* Debug */,\n\t\t\t\tD33C7C711C44DBED00E1687A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = D33C7C5E1C44DBED00E1687A /* Project object */;\n}\n"
  },
  {
    "path": "TBEmptyDataSet.xcodeproj/xcshareddata/xcschemes/TBEmptyDataSet.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D33C7C661C44DBED00E1687A\"\n               BuildableName = \"TBEmptyDataSet.framework\"\n               BlueprintName = \"TBEmptyDataSet\"\n               ReferencedContainer = \"container:TBEmptyDataSet.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D33C7C661C44DBED00E1687A\"\n            BuildableName = \"TBEmptyDataSet.framework\"\n            BlueprintName = \"TBEmptyDataSet\"\n            ReferencedContainer = \"container:TBEmptyDataSet.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D33C7C661C44DBED00E1687A\"\n            BuildableName = \"TBEmptyDataSet.framework\"\n            BlueprintName = \"TBEmptyDataSet\"\n            ReferencedContainer = \"container:TBEmptyDataSet.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "TBEmptyDataSet.xcodeproj/xcuserdata/hongxin.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>TBEmptyDataSet.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>D33C7C661C44DBED00E1687A</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "TBEmptyDataSet.xcodeproj/xcuserdata/zetasq.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>TBEmptyDataSet.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>D33C7C661C44DBED00E1687A</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "TBEmptyDataSet.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:TBEmptyDataSet.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:TBEmptyDataSetExample.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "TBEmptyDataSet.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "TBEmptyDataSetExample.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tD3013DFB1C06B7FA00266EE2 /* DemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3013DFA1C06B7FA00266EE2 /* DemoViewController.swift */; };\n\t\tD33C7C801C44E9A800E1687A /* TBEmptyDataSet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D33C7C7F1C44E9A800E1687A /* TBEmptyDataSet.framework */; };\n\t\tD33C7C811C44E9A800E1687A /* TBEmptyDataSet.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D33C7C7F1C44E9A800E1687A /* TBEmptyDataSet.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tD3565AA31BFD9449002CFA16 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3565AA21BFD9449002CFA16 /* AppDelegate.swift */; };\n\t\tD3565AA81BFD9449002CFA16 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D3565AA61BFD9449002CFA16 /* Main.storyboard */; };\n\t\tD3565AAA1BFD9449002CFA16 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D3565AA91BFD9449002CFA16 /* Assets.xcassets */; };\n\t\tD39EBFCA1C040C040089B394 /* EmptyDataDemoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39EBFC91C040C040089B394 /* EmptyDataDemoTableViewController.swift */; };\n\t\tD39EBFCC1C040F220089B394 /* EmptyDataDemoCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39EBFCB1C040F220089B394 /* EmptyDataDemoCollectionViewController.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tD33C7C821C44E9A800E1687A /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\tD33C7C811C44E9A800E1687A /* TBEmptyDataSet.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\tD3013DFA1C06B7FA00266EE2 /* DemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoViewController.swift; sourceTree = \"<group>\"; };\n\t\tD33C7C7F1C44E9A800E1687A /* TBEmptyDataSet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = TBEmptyDataSet.framework; path = \"/Users/hongxin/Library/Developer/Xcode/DerivedData/TBEmptyDataSet-cgdivxseqtlgnzctplvlotcjtyby/Build/Products/Debug-iphoneos/TBEmptyDataSet.framework\"; sourceTree = \"<absolute>\"; };\n\t\tD3565A9F1BFD9449002CFA16 /* TBEmptyDataSetExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TBEmptyDataSetExample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD3565AA21BFD9449002CFA16 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tD3565AA71BFD9449002CFA16 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\tD3565AA91BFD9449002CFA16 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tD3565AAE1BFD9449002CFA16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD39EBFC91C040C040089B394 /* EmptyDataDemoTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmptyDataDemoTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tD39EBFCB1C040F220089B394 /* EmptyDataDemoCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmptyDataDemoCollectionViewController.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD3565A9C1BFD9449002CFA16 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD33C7C801C44E9A800E1687A /* TBEmptyDataSet.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tD3565A961BFD9449002CFA16 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD33C7C7F1C44E9A800E1687A /* TBEmptyDataSet.framework */,\n\t\t\t\tD3565AA11BFD9449002CFA16 /* Example */,\n\t\t\t\tD3565AA01BFD9449002CFA16 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD3565AA01BFD9449002CFA16 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD3565A9F1BFD9449002CFA16 /* TBEmptyDataSetExample.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD3565AA11BFD9449002CFA16 /* Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD3565AA21BFD9449002CFA16 /* AppDelegate.swift */,\n\t\t\t\tD3013DFA1C06B7FA00266EE2 /* DemoViewController.swift */,\n\t\t\t\tD39EBFC91C040C040089B394 /* EmptyDataDemoTableViewController.swift */,\n\t\t\t\tD39EBFCB1C040F220089B394 /* EmptyDataDemoCollectionViewController.swift */,\n\t\t\t\tD3565AA61BFD9449002CFA16 /* Main.storyboard */,\n\t\t\t\tD3565AA91BFD9449002CFA16 /* Assets.xcassets */,\n\t\t\t\tD3565AAE1BFD9449002CFA16 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD3565A9E1BFD9449002CFA16 /* TBEmptyDataSetExample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D3565AB11BFD9449002CFA16 /* Build configuration list for PBXNativeTarget \"TBEmptyDataSetExample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD3565A9B1BFD9449002CFA16 /* Sources */,\n\t\t\t\tD3565A9C1BFD9449002CFA16 /* Frameworks */,\n\t\t\t\tD3565A9D1BFD9449002CFA16 /* Resources */,\n\t\t\t\tD3013DFC1C06E0D200266EE2 /* ShellScript */,\n\t\t\t\tD33C7C821C44E9A800E1687A /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TBEmptyDataSetExample;\n\t\t\tproductName = TBEmptyDataSet;\n\t\t\tproductReference = D3565A9F1BFD9449002CFA16 /* TBEmptyDataSetExample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD3565A971BFD9449002CFA16 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0710;\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = Teambition;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD3565A9E1BFD9449002CFA16 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.1.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D3565A9A1BFD9449002CFA16 /* Build configuration list for PBXProject \"TBEmptyDataSetExample\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = D3565A961BFD9449002CFA16;\n\t\t\tproductRefGroup = D3565AA01BFD9449002CFA16 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD3565A9E1BFD9449002CFA16 /* TBEmptyDataSetExample */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD3565A9D1BFD9449002CFA16 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD3565AAA1BFD9449002CFA16 /* Assets.xcassets in Resources */,\n\t\t\t\tD3565AA81BFD9449002CFA16 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tD3013DFC1C06E0D200266EE2 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"if which swiftlint >/dev/null; then\\n    swiftlint\\nelse\\n    echo \\\"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\\\"\\nfi\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD3565A9B1BFD9449002CFA16 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD3565AA31BFD9449002CFA16 /* AppDelegate.swift in Sources */,\n\t\t\t\tD39EBFCA1C040C040089B394 /* EmptyDataDemoTableViewController.swift in Sources */,\n\t\t\t\tD39EBFCC1C040F220089B394 /* EmptyDataDemoCollectionViewController.swift in Sources */,\n\t\t\t\tD3013DFB1C06B7FA00266EE2 /* DemoViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\tD3565AA61BFD9449002CFA16 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tD3565AA71BFD9449002CFA16 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD3565AAF1BFD9449002CFA16 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD3565AB01BFD9449002CFA16 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD3565AB21BFD9449002CFA16 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Example/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Teambition.TBEmptyDataSetExample;\n\t\t\t\tPRODUCT_NAME = TBEmptyDataSetExample;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD3565AB31BFD9449002CFA16 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Example/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Teambition.TBEmptyDataSetExample;\n\t\t\t\tPRODUCT_NAME = TBEmptyDataSetExample;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD3565A9A1BFD9449002CFA16 /* Build configuration list for PBXProject \"TBEmptyDataSetExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD3565AAF1BFD9449002CFA16 /* Debug */,\n\t\t\t\tD3565AB01BFD9449002CFA16 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD3565AB11BFD9449002CFA16 /* Build configuration list for PBXNativeTarget \"TBEmptyDataSetExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD3565AB21BFD9449002CFA16 /* Debug */,\n\t\t\t\tD3565AB31BFD9449002CFA16 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = D3565A971BFD9449002CFA16 /* Project object */;\n}\n"
  },
  {
    "path": "TBEmptyDataSetExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/hongxin/Developer/TBEmptyDataSet/Example/TBEmptyDataSetExample.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "TBEmptyDataSetExample.xcodeproj/xcuserdata/hongxin.xcuserdatad/xcschemes/TBEmptyDataSetExample.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n               BuildableName = \"TBEmptyDataSetExample.app\"\n               BlueprintName = \"TBEmptyDataSetExample\"\n               ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n            BuildableName = \"TBEmptyDataSetExample.app\"\n            BlueprintName = \"TBEmptyDataSetExample\"\n            ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n            BuildableName = \"TBEmptyDataSetExample.app\"\n            BlueprintName = \"TBEmptyDataSetExample\"\n            ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n            BuildableName = \"TBEmptyDataSetExample.app\"\n            BlueprintName = \"TBEmptyDataSetExample\"\n            ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "TBEmptyDataSetExample.xcodeproj/xcuserdata/hongxin.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>TBEmptyDataSetExample.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>D3565A9E1BFD9449002CFA16</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "TBEmptyDataSetExample.xcodeproj/xcuserdata/zetasq.xcuserdatad/xcschemes/TBEmptyDataSetExample.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n               BuildableName = \"TBEmptyDataSetExample.app\"\n               BlueprintName = \"TBEmptyDataSetExample\"\n               ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n            BuildableName = \"TBEmptyDataSetExample.app\"\n            BlueprintName = \"TBEmptyDataSetExample\"\n            ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n            BuildableName = \"TBEmptyDataSetExample.app\"\n            BlueprintName = \"TBEmptyDataSetExample\"\n            ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D3565A9E1BFD9449002CFA16\"\n            BuildableName = \"TBEmptyDataSetExample.app\"\n            BlueprintName = \"TBEmptyDataSetExample\"\n            ReferencedContainer = \"container:TBEmptyDataSetExample.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "TBEmptyDataSetExample.xcodeproj/xcuserdata/zetasq.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>TBEmptyDataSetExample.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>D3565A9E1BFD9449002CFA16</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  }
]