[
  {
    "path": "AppStoreDemo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        setStatusBarColor(.white)        \n        return true\n    }\n\n}\n\n"
  },
  {
    "path": "AppStoreDemo/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      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppStore-120.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppStore-180.png\",\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": "AppStoreDemo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/logo_broadcast.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_broadcast.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/logo_car.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_car.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/logo_game.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_game.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/logo_jump.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_jump.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/logo_smile.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_smile.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/app_logo/logo_weibo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_weibo.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/circle_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"circle_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"circle_download@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/close_button.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"close_button@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"close_button@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/demo_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"demo_icon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/detail_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"detail_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"detail_download@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/detail_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"detail_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"detail_more@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/common/navigation_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navigation_back.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover/cover_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_1.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover/cover_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_2.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover/cover_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_3.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover/cover_4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_4.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover/cover_5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_5.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover_detail/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover_detail/cover_detail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_detail.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover_detail/cover_detail1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_detail1.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/cover_detail/cover_detail2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_detail2.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/tabBar/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/tabBar/tabbar_apps.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_apps@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_apps@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/tabBar/tabbar_games.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_games@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_games@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/tabBar/tabbar_search.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_search@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_search@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/tabBar/tabbar_today.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_today@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_today@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Assets.xcassets/tabBar/tabbar_updates.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_updates@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_updates@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AppStoreDemo/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\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                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Common/CommonCollectionFlowLayout.swift",
    "content": "//\n//  GameCollectionFlowLayout.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass CommonCollectionFlowLayout: UICollectionViewFlowLayout {\n    \n    init(itemSize: CGSize) {\n        super.init()\n        self.itemSize = itemSize\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        scrollDirection = UICollectionView.ScrollDirection.horizontal\n        minimumInteritemSpacing = 0\n        minimumLineSpacing = 10\n        sectionInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)\n    }\n    \n    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {\n        // Page width used for estimating and calculating paging.\n        let pageWidth = itemSize.width + minimumLineSpacing\n        \n        // Make an estimation of the current page position.\n        let approximatePage = collectionView!.contentOffset.x/pageWidth\n        \n        // Determine the current page based on velocity.\n        let currentPage = (velocity.x < 0.0) ? floor(approximatePage) : ceil(approximatePage)\n        \n        // Create custom flickVelocity.\n        let flickVelocity = velocity.x * 0.3\n        \n        // Check how many pages the user flicked, if <= 1 then flickedPages should return 0.\n        let flickedPages = (abs(round(flickVelocity)) <= 1) ? 0 : round(flickVelocity)\n        \n        // Calculate newHorizontalOffset.\n        let newHorizontalOffset = ((currentPage + flickedPages) * pageWidth) - self.collectionView!.contentInset.left\n        \n        return CGPoint(x: newHorizontalOffset, y: proposedContentOffset.y)\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Common/CommonSectionHeaderView.swift",
    "content": "//\n//  CommonSectionHeaderView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/9.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass CommonSectionHeaderView: UIView {\n\n    let topicLabel = UILabel()\n    let seeAllBtn = UIButton()\n    let lineView = UIView()\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        lineView.backgroundColor = GlobalConstants.speratorLineColor\n        lineView.frame = CGRect(x: GlobalConstants.leftMargin, y: 0, width: kScreenW - 2 * GlobalConstants.leftMargin, height: 0.8)\n        \n        topicLabel.frame = CGRect(x: 20, y: 13, width: 200, height: 24)\n        topicLabel.font = UIFont.systemFont(ofSize: 22.0, weight: .medium)\n        topicLabel.textColor = UIColor.black\n        \n        seeAllBtn.setTitleColor(GlobalConstants.textBlueColor, for: .normal)\n        seeAllBtn.setTitle(\"See All\", for: .normal)\n        seeAllBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17)\n        seeAllBtn.frame = CGRect(x: kScreenW - GlobalConstants.leftMargin - 72, y: 16, width: 72, height: 22)\n        \n        addSubview(lineView)\n        addSubview(topicLabel)\n        addSubview(seeAllBtn)\n    }\n    \n    func changeSectionTitle(with title: String) {\n        topicLabel.text = title\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Extension/String+Extension.swift",
    "content": "//\n//  String+Extension.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\n\nextension String {\n    /// Calculate text's height from `width` and `front`.\n    func calculateHeightWith(width: CGFloat, font: UIFont)-> CGFloat {\n        let attr = [NSAttributedString.Key.font: font]\n        let maxSize: CGSize = CGSize(width: width, height: CGFloat(MAXFLOAT))\n        let option = NSStringDrawingOptions.usesLineFragmentOrigin\n        return self.boundingRect(with: (maxSize), options: option, attributes: attr, context: nil).size.height\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Extension/UIColor+Extension.swift",
    "content": "//\n//  UIColor+Extension.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nextension UIColor {\n    convenience init(r: CGFloat, g: CGFloat, b: CGFloat, alpha: CGFloat = 1.0) {\n        self.init(red: r/255.0, green: g/255.0, blue: b/255.0, alpha: alpha)\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Extension/UITableView+Extension.swift",
    "content": "//\n//  UITableView+Extension.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nextension UITableView {\n    // 注册有nib的cell\n    func ut_registerNibCell<T>(_ cellType: T.Type) where T: UITableViewCell {\n        let nib = UINib(nibName: \"\\(cellType)\", bundle: nil)\n        let identifier = \"\\(cellType)\"\n        register(nib, forCellReuseIdentifier: identifier)\n    }\n    // 注册无nib的cell\n    func ut_registerClassCell<T>(_ cellType: T.Type) where T: UITableViewCell {\n        let identifier = \"\\(cellType)\"\n        register(cellType, forCellReuseIdentifier: identifier)\n    }\n    // 从缓存池池出队已经存在的 cell\n    func ut_dequeueReusable<T: UITableViewCell>(_ cell: T.Type, for indexPath: IndexPath) -> T {\n        let cell = dequeueReusableCell(withIdentifier: \"\\(T.self)\", for: indexPath) as! T\n        return cell\n    }\n    \n    // 注册有nib的headerFooterView\n    func ut_registerNibHeaderFooterView<T>(_ viewType: T.Type) where T: UITableViewHeaderFooterView {\n        let nib = UINib(nibName: \"\\(viewType)\", bundle: nil)\n        let identifier = \"\\(viewType)\"\n        register(nib, forHeaderFooterViewReuseIdentifier: identifier)\n    }\n    \n    // 注册无nib的headerFooterView\n    func ut_registerClassHeaderFooterView<T>(_ viewType: T.Type) where T: UITableViewHeaderFooterView {\n        let identifier = \"\\(viewType)\"\n        register(viewType, forHeaderFooterViewReuseIdentifier: identifier)\n    }\n    \n    // 从缓存池里取出已注册的headerFooterView\n    func ut_dequeueReusableHeaderFooterView<T: UITableViewHeaderFooterView>(_ view: T.Type) -> T {\n        let headerFooterView = dequeueReusableHeaderFooterView(withIdentifier: \"\\(T.self)\") as! T\n        return headerFooterView\n    }\n}\n\nextension UICollectionView {\n    // 注册有nib的cell\n    func ut_registerNibCell<T>(_ cellType: T.Type) where T: UICollectionViewCell {\n        let nib = UINib(nibName: \"\\(cellType)\", bundle: nil)\n        let identifier = \"\\(cellType)\"\n        register(nib, forCellWithReuseIdentifier: identifier)\n    }\n    // 注册无nib的cell\n    func ut_registerClassCell<T>(_ cellType: T.Type) where T: UICollectionViewCell {\n        let identifier = \"\\(cellType)\"\n        register(cellType, forCellWithReuseIdentifier: identifier)\n    }\n    // 从缓存池池出队已经存在的 cell\n    func ut_dequeueReusable<T: UICollectionViewCell>(_ cell: T.Type, for indexPath: IndexPath) -> T {\n        let cell = dequeueReusableCell(withReuseIdentifier: \"\\(T.self)\", for: indexPath) as! T\n        return cell\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Extension/UIView+Extension.swift",
    "content": "//\n//  UIView+Extension.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nprotocol NibLoadable {}\n\nextension NibLoadable where Self: UIView {\n    static func loadViewFromNib() -> Self {\n        return Bundle.main.loadNibNamed(\"\\(self)\", owner: nil, options: nil)?.first as! Self\n    }\n}\n\n\nextension UIView {\n    \n    // Constrain 4 edges of `self` to specified `view`.\n    func edges(to view: UIView, top: CGFloat=0, left: CGFloat=0, bottom: CGFloat=0, right: CGFloat=0) {\n        NSLayoutConstraint.activate([\n            self.leftAnchor.constraint(equalTo: view.leftAnchor, constant: left),\n            self.rightAnchor.constraint(equalTo: view.rightAnchor, constant: right),\n            self.topAnchor.constraint(equalTo: view.topAnchor, constant: top),\n            self.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: bottom)\n            ])\n    }\n    \n    // Set view's cornerRadius\n    @IBInspectable var cornerRadius: CGFloat {\n        get {\n            return layer.cornerRadius\n        }\n        \n        set {\n            layer.cornerRadius = newValue\n            layer.masksToBounds = newValue > 0\n        }\n    }\n    \n    @IBInspectable var borderWidth: CGFloat {\n        get {\n            return layer.borderWidth\n        }\n        set {\n            layer.borderWidth = newValue\n        }\n    }\n    \n    @IBInspectable var borderColor: UIColor {\n        get {\n            return UIColor(cgColor: layer.borderColor ?? UIColor.black.cgColor)\n        }\n        set {\n            layer.borderColor = newValue.cgColor\n        }\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Extension/UIViewController+Extension.swift",
    "content": "//\n//  UIViewController+Extension.swift\n//  AppStoreDemo\n//\n//  Created by Erwin on 2019/8/4.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nextension UIViewController {\n    \n    private struct associateKeys {\n        static var iconButtonKey = \"UIViewController+Extension+iconButton\"\n    }\n    \n    //  We use `runtime` to add a iconButton for every UIViewController we want\n    var iconButton: UIButton? {\n        get {\n            return objc_getAssociatedObject(self, &associateKeys.iconButtonKey) as? UIButton\n        }\n        set {\n            objc_setAssociatedObject(self, &associateKeys.iconButtonKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    func setNavigationBarBottomLineHidden(_ isHidden: Bool) {\n        navigationController?.navigationBar.setValue(isHidden, forKey: \"hidesShadow\")\n    }\n    \n    /** Add icon button on navigationBar.\n        We can not use `UIBarButtonItem` here for adding a button on navigationBar,\n        because it will cause an unsuitable layout.\n        So I use a custom button instead.\n     */\n    func addIconButtonOnNavigationBar() {\n        guard let navController = navigationController else { return }\n        guard let classType = NSClassFromString(\"_UINavigationBarLargeTitleView\") else { return }\n        \n        if iconButton == nil {\n            iconButton = createIconButtonForNavigationBar()\n        }\n        \n        for subView in navController.navigationBar.subviews {\n            if subView.isKind(of: classType) {\n                subView.addSubview(iconButton!)\n                \n                guard let largeTitleLabel = subView.subviews.first as? UILabel else { return }\n                iconButton!.translatesAutoresizingMaskIntoConstraints = false\n                iconButton!.trailingAnchor.constraint(equalTo: subView.trailingAnchor, constant: -25).isActive = true\n                iconButton!.centerYAnchor.constraint(equalTo: largeTitleLabel.centerYAnchor, constant: -5).isActive = true\n                iconButton!.widthAnchor.constraint(equalToConstant: 35).isActive = true\n                iconButton!.heightAnchor.constraint(equalToConstant: 35).isActive = true\n            }\n        }\n    }\n    \n    // change navigationBar backgroundColor for iOS 13\n    func adjustNavigationForiOS13() {\n        if #available(iOS 13.0, *) {\n            let navBarAppearance = UINavigationBarAppearance()\n            navBarAppearance.configureWithOpaqueBackground()\n            navBarAppearance.backgroundColor = .white\n            navBarAppearance.shadowColor = nil\n            navigationController?.navigationBar.standardAppearance = navBarAppearance\n            navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance\n        }\n    }\n    \n    \n    // creat a button for navigationBar\n    private func createIconButtonForNavigationBar()-> UIButton {\n        let btn = UIButton()\n        btn.setImage(#imageLiteral(resourceName: \"demo_icon\"), for: .normal)\n        btn.setImage(#imageLiteral(resourceName: \"demo_icon\"), for: .highlighted)\n        btn.translatesAutoresizingMaskIntoConstraints = false\n        btn.layer.borderColor = GlobalConstants.iconBorderColor\n        btn.layer.borderWidth =  GlobalConstants.iconBorderWidth\n        btn.layer.cornerRadius = GlobalConstants.iconCornerRadius\n        btn.addTarget(self, action: #selector(presentUserTableViewController), for: .touchUpInside)\n        return btn\n    }\n    \n    @objc func presentUserTableViewController() {\n        let navController = UIStoryboard(name: \"User\", bundle: nil).instantiateViewController(withIdentifier: \"UserNavigationControllerID\")\n        present(navController, animated: true, completion: nil)\n    }\n}\n\nextension UIResponder {\n    func setStatusBarColor(_ color: UIColor) {\n        if #available(iOS 13.0, *) {\n            let tag = 38482\n            let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first\n\n            if let statusBar = keyWindow?.viewWithTag(tag) {\n                statusBar.backgroundColor = color\n            } else {\n                guard let statusBarFrame = keyWindow?.windowScene?.statusBarManager?.statusBarFrame else { return }\n                let statusBarView = UIView(frame: statusBarFrame)\n                statusBarView.tag = tag\n                statusBarView.backgroundColor = color\n                keyWindow?.addSubview(statusBarView)\n            }\n        } else if let statusBar = UIApplication.shared.value(forKeyPath: \"statusBarWindow.statusBar\") as? UIView {\n            statusBar.backgroundColor = color\n        }\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/Controller/DetailViewController.swift",
    "content": "//\n//  DetailViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/7.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nfileprivate let navigationViewH: CGFloat = statusBarH + navigationBarH\nfileprivate let tableViewTopInset: CGFloat = 200\nfileprivate let topImageViewHeight: CGFloat = 288\nfileprivate let originalContentOffSetY: CGFloat = tableViewTopInset + statusBarH\nfileprivate let alphaChangeProgress: CGFloat = (hasTopNotch() ? 112 : 84)\n\nclass DetailViewController: UIViewController {\n    \n    lazy var navigationView: DetailNavigationView = {\n        let it = DetailNavigationView()\n        it.frame = CGRect(x: 0, y: 0, width: kScreenW, height: navigationViewH)\n        return it\n    }()\n    \n    lazy var tableView: UITableView = {\n        let it = UITableView()\n        it.frame = CGRect(x: 0, y: -statusBarH, width: kScreenW, height: kScreenH + statusBarH)\n        it.backgroundColor = .white\n        it.delegate = self\n        it.dataSource = self\n        it.contentInset = UIEdgeInsets(top: tableViewTopInset, left: 0, bottom: 0, right: 0)\n        it.separatorInset = UIEdgeInsets(top: 0, left: GlobalConstants.leftMargin, bottom: 0, right: GlobalConstants.leftMargin)\n        it.ut_registerNibCell(DetailTopInfoCell.self)\n        it.ut_registerNibCell(DetailNewFeaturesCell.self)\n        it.ut_registerClassCell(DetailPreviewCell.self)\n        it.ut_registerClassCell(DetailInformationCell.self)\n        return it\n    }()\n    \n    lazy var topImageView: UIImageView = {\n        let it = UIImageView()\n        it.image = #imageLiteral(resourceName: \"cover_detail\")\n        it.contentMode = .scaleAspectFill\n        it.frame = CGRect(x: 0, y: -(topImageViewHeight) , width: kScreenW, height: topImageViewHeight)\n        it.layer.masksToBounds = true\n        return it\n    }()\n    \n    \n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        navigationController?.interactivePopGestureRecognizer?.delegate = nil\n        tableView.addSubview(topImageView)\n        view.addSubview(tableView)\n        \n        view.addSubview(navigationView)\n        navigationView.goBackClosure = { [weak self] in\n            guard let StrongSelf = self else { return }\n            StrongSelf.navigationController?.popViewController(animated: true)\n        }\n    }\n    \n\n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        navigationController?.setNavigationBarHidden(true, animated: true)\n        setStatusBarColor(UIColor.white.withAlphaComponent(0))\n    }\n    \n    override func viewWillDisappear(_ animated: Bool) {\n        super.viewWillDisappear(animated)\n        navigationController?.setNavigationBarHidden(false, animated: true)\n    }\n    \n    override func viewDidDisappear(_ animated: Bool) {\n        super.viewDidDisappear(animated)\n        setStatusBarColor(.white)\n    }\n    \n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(animated)\n        navigationController?.interactivePopGestureRecognizer?.isEnabled = true\n    }\n    \n    \n    \n}\n\nextension DetailViewController: UITableViewDataSource {\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return 4\n    }\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        switch indexPath.row {\n        case 0:\n            let cell = tableView.ut_dequeueReusable(DetailTopInfoCell.self, for: indexPath)\n            cell.selectionStyle = .none\n            return cell\n        case 1:\n            let cell = tableView.ut_dequeueReusable(DetailNewFeaturesCell.self, for: indexPath)\n            cell.selectionStyle = .none\n            return cell\n        case 2:\n            let cell = tableView.ut_dequeueReusable(DetailPreviewCell.self, for: indexPath)\n            cell.selectionStyle = .none\n            return cell\n        case 3:\n            let cell = tableView.ut_dequeueReusable(DetailInformationCell.self, for: indexPath)\n            cell.selectionStyle = .none\n            return cell\n        default:\n            return UITableViewCell()\n        }\n    }\n}\n\nextension DetailViewController: UITableViewDelegate {\n    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {\n        switch indexPath.row {\n        case 0:\n            return 230\n        case 1:\n            return 168\n        case 2:\n            return 227\n        case 3:\n            return 520\n        default:\n            return 0\n        }\n    }\n    \n    func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        \n        var offSetY = scrollView.contentOffset.y\n\n        // change topImageView frame\n        if offSetY < -originalContentOffSetY {\n            topImageView.frame.origin.y = offSetY - (hasTopNotch() ? 44 : 64)\n            topImageView.frame.size.height = -(offSetY - (hasTopNotch() ? 44 : 64))\n        }\n        \n        // change navigationView backgroundColor and goBackBtn color\n        //deal with offsetY to make sure alpha from 0 to 1\n        if offSetY > -(originalContentOffSetY - alphaChangeProgress) {\n            offSetY = -(originalContentOffSetY - alphaChangeProgress)\n        } else if offSetY < -originalContentOffSetY {\n            offSetY = -originalContentOffSetY\n        }\n        \n        let calculateY = offSetY + originalContentOffSetY\n        \n        navigationView.backgroundColor = UIColor.white.withAlphaComponent(calculateY/alphaChangeProgress)\n        \n        // values of targetRed and targetGreen are from GlobalConstants.textBlueColor\n        // blue is still 255.0, so we do not neet to change it\n        let targetRed: CGFloat = 0\n        let targetGreen: CGFloat = 122\n        \n        let color = UIColor(red: (255 - ((255.0 - targetRed)/alphaChangeProgress) * calculateY) / 255.0, green: (255 - ((255.0 - targetGreen)/alphaChangeProgress) * calculateY) / 255.0, blue: 255.0/255.0, alpha: 1)\n        \n        navigationView.goBackBtn.setTitleColor(color, for: .normal)\n        navigationView.goBackBtn.tintColor = color\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/Controller/DownloadPresentationController.swift",
    "content": "//\n//  DownloadPresentationController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/9/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DownloadPresentationController: UIPresentationController {\n    \n    private lazy var dimmingView: UIView = {\n        let view = UIView()\n        view.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.7)\n        view.alpha = 0\n        return view\n    }()\n    \n    override var shouldRemovePresentersView: Bool {\n        return false\n    }\n    \n    override func presentationTransitionWillBegin() {\n        guard\n            let containerView = containerView,\n            let presentedView = presentedView\n            else {\n                return\n        }\n        \n        dimmingView.frame = containerView.bounds\n        containerView.addSubview(dimmingView)\n        containerView.addSubview(presentedView)\n\n        \n        presentingViewController.beginAppearanceTransition(false, animated: false)\n        presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in\n            self.dimmingView.alpha = 1\n        }) { (ctx) in }\n    }\n    \n    override func presentationTransitionDidEnd(_ completed: Bool) {\n        presentingViewController.endAppearanceTransition()\n    }\n    \n    override func dismissalTransitionWillBegin() {\n        presentingViewController.beginAppearanceTransition(true, animated: true)\n        presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in\n            self.dimmingView.alpha = 0.0\n        }, completion: nil)\n    }\n    \n    override func dismissalTransitionDidEnd(_ completed: Bool) {\n        presentingViewController.endAppearanceTransition()\n        if completed {\n            dimmingView.removeFromSuperview()\n        }\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/Controller/DownloadViewController.swift",
    "content": "//\n//  DownloadViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/9/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DownloadViewController: UIViewController {\n    \n    var model: GameTopicModel?\n    \n    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {\n        super.init(nibName: nil, bundle: nil)\n        modalPresentationStyle = .custom\n        transitioningDelegate = self        \n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        setStatusBarColor(UIColor.white.withAlphaComponent(0))\n    }\n    \n    override func viewDidDisappear(_ animated: Bool) {\n        super.viewDidDisappear(animated)\n        setStatusBarColor(.white)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        if let model = model {\n            bottomView.model = model\n        }\n        \n        view.addSubview(bottomView)\n        \n        if #available(iOS 13.0, *) {\n            //在iOS13上，获取keywindow后，并不能将clickView加到屏幕最上方，因此将它加到view上。但这时的弹出动画就与系统不一样了。\n            //如果有知道如何做的朋友，麻烦给我提个issue，谢了\n            view.addSubview(clickView)\n        } else {\n            keyWindow.addSubview(clickView)\n        }\n        \n        \n        \n    }\n    \n    private lazy var bottomView: DownloadBottomView = {\n        let view = DownloadBottomView.loadViewFromNib()\n        let height = 260 + tabbarExtraH\n        view.frame = CGRect(x: 0, y: kScreenH - height, width: kScreenW, height: height)\n        view.delegate = self\n        return view\n    }()\n    \n    lazy var clickView: DownloadClickView = {\n        let view = DownloadClickView.loadViewFromNib()\n        view.frame = CGRect(x: kScreenW, y: 168, width: GlobalConstants.doubleClickViewW, height: 110)\n        return view\n    }()\n    \n}\n\nextension DownloadViewController: DownloadBottomViewDelegate {\n    func downloadBottomViewDidClickCancel(_ bottomView: DownloadBottomView) {\n        dismiss(animated: true, completion: nil)\n    }\n}\n\nextension DownloadViewController: UIViewControllerTransitioningDelegate {\n    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {\n        if presented == self {\n            return DownloadPresentationController(presentedViewController: presented, presenting: presenting)\n        }\n        return nil\n    }\n\n    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        return DownloadTransitioning(isPresenting: true, transitionDuration: 0.3)\n    }\n\n    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        return DownloadTransitioning(isPresenting: false, transitionDuration: 0.3)\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/Controller/GameTableViewController.swift",
    "content": "//\n//  GameTableViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\n\nclass GameTableViewController: UITableViewController {\n    \n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        adjustNavigationForiOS13()\n        setNavigationBarBottomLineHidden(true)\n        addIconButtonOnNavigationBar()\n        registerCells()\n    }\n    \n    private func registerCells() {\n        tableView.ut_registerClassCell(GameRecommandTableViewCell.self)\n        tableView.ut_registerClassCell(GameTopicTableViewCell.self)\n        tableView.ut_registerClassCell(GameLinkTableViewCell.self)\n    }\n    \n    private func pushToDetailController() {\n        navigationController?.pushViewController(DetailViewController(), animated: true)\n    }\n\n    // MARK: - Table view data source and delegate\n    \n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 3\n    }\n    \n    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {\n        if indexPath.section == 0 {\n            return GlobalConstants.recommandHeight\n        } else if indexPath.section == 1 {\n            return GlobalConstants.topicHeight\n        } else if indexPath.section == 2 {\n            return GlobalConstants.linkHeight\n        }\n        return 0\n    }\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        // #warning Incomplete implementation, return the number of rows\n        if section == 0 || section == 1 || section == 2 {\n            return 1\n        }\n        return 0\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        if indexPath.section == 0 {\n            let cell = tableView.ut_dequeueReusable(GameRecommandTableViewCell.self, for: indexPath)\n            cell.detailClosure = {\n                self.pushToDetailController()\n            }\n            return cell\n        } else if indexPath.section == 1 {\n            let cell = tableView.ut_dequeueReusable(GameTopicTableViewCell.self, for: indexPath)\n            cell.detailClosure = {\n                self.pushToDetailController()\n            }\n            cell.downloadClosure = { model in\n                let vc = DownloadViewController()\n                vc.model = model\n                self.present(vc, animated: true, completion: nil)\n            }\n            return cell\n        } else if indexPath.section == 2 {\n            let cell = tableView.ut_dequeueReusable(GameLinkTableViewCell.self, for: indexPath)\n            return cell\n        }\n        return UITableViewCell()\n    }\n\n    override func scrollViewDidScroll(_ scrollView: UIScrollView) {\n\n        if scrollView.contentOffset.y > 0 {\n            setNavigationBarBottomLineHidden(false)\n        } else {\n            setNavigationBarBottomLineHidden(true)\n        }        \n    }\n}\n\n"
  },
  {
    "path": "AppStoreDemo/Game/Model/DownloadTransitioning.swift",
    "content": "//\n//  DownloadTransitioning.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/9/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DownloadTransitioning: NSObject {\n    \n    let isPresenting: Bool\n    \n    let transitionDuration: TimeInterval\n    \n    //a height make animation more smoother when dismissing\n    let dismissHeight: CGFloat?\n    \n    init(isPresenting: Bool, transitionDuration: TimeInterval, dismissHeight: CGFloat? = nil) {\n        self.isPresenting = isPresenting\n        self.transitionDuration = transitionDuration\n        self.dismissHeight = dismissHeight\n        super.init()\n    }\n    \n}\n\nextension DownloadTransitioning: UIViewControllerAnimatedTransitioning {\n    \n    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {\n        return transitionDuration\n    }\n    \n    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {\n        \n        if isPresenting {\n            animationForPresent(using: transitionContext)\n        } else {\n            animationForDismiss(using: transitionContext)\n        }\n    }\n}\n\n// MARK: - Helper\nextension DownloadTransitioning {\n    \n    private func animationForPresent(using transitionContext: UIViewControllerContextTransitioning) {\n        \n        guard let presentedVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as? DownloadViewController else { return }\n        guard let presentedView = transitionContext.view(forKey: UITransitionContextViewKey.to) else { return }\n        let containerView = transitionContext.containerView\n        // Position the presented view off the top of the container view\n        presentedView.frame = transitionContext.finalFrame(for: presentedVC)\n        presentedView.center.y += containerView.bounds.size.height\n        \n        containerView.addSubview(presentedView)\n        \n        \n        UIView.animate(withDuration: transitionDuration, animations: {\n            presentedView.center.y -= containerView.bounds.size.height\n            presentedVC.clickView.frame.origin.x -= clickViewShowH\n        }) { (completed) in\n            transitionContext.completeTransition(completed)\n        }\n        \n        delay(0.5) {\n            presentedVC.clickView.startMoving()\n        }\n    }\n    \n    private func animationForDismiss(using transitionContext: UIViewControllerContextTransitioning) {\n        guard let presentedVC = transitionContext.viewController(forKey: .from) as? DownloadViewController else { return }\n        guard let presentedView = transitionContext.view(forKey: UITransitionContextViewKey.from) else { return }\n        \n        let containerView = transitionContext.containerView\n        \n        UIView.animate(withDuration: transitionDuration, animations: {\n            \n            if let height = self.dismissHeight {\n                presentedView.center.y += height\n            } else {\n                presentedView.center.y += containerView.bounds.size.height\n            }\n            \n            presentedVC.clickView.frame.origin.x += clickViewShowH\n        }) { (completed) in\n            transitionContext.completeTransition(completed)\n            presentedVC.clickView.removeFromSuperview()\n        }\n        \n        presentedVC.clickView.endMoving()\n    }\n}\n\nfileprivate let clickViewShowH: CGFloat = GlobalConstants.doubleClickViewW - GlobalConstants.clickBarWidth\n\n\n"
  },
  {
    "path": "AppStoreDemo/Game/Model/GameRecommandModel.swift",
    "content": "//\n//  GameRecommandModel.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport Foundation\n\nstruct GameRecommandModel {\n    let feature: String\n    let name: String\n    let desc: String\n    let coverImageName: String\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/Model/GameTopicModel.swift",
    "content": "//\n//  GameTopicModel.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport Foundation\n\nstruct GameTopicModel {\n    let name: String\n    let desc: String\n    let iconImageName: String    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailInfomationTableViewCell.swift",
    "content": "//\n//  DetailInfomationTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/9.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailInfomationTableViewCell: UITableViewCell {\n    \n    let nameLabel = UILabel()\n    let contentLabel = UILabel()\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        nameLabel.textColor = .lightGray\n        nameLabel.font = UIFont.systemFont(ofSize: 15)\n        nameLabel.textAlignment = .left\n        \n        contentLabel.textColor = UIColor.black\n        contentLabel.font = UIFont.systemFont(ofSize: 15)\n        contentLabel.textAlignment = .right\n        \n        nameLabel.translatesAutoresizingMaskIntoConstraints = false\n        contentView.addSubview(nameLabel)\n        \n        contentLabel.translatesAutoresizingMaskIntoConstraints = false\n        contentView.addSubview(contentLabel)\n        \n        nameLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true\n        nameLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20).isActive = true\n        contentLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true\n        contentLabel.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -20).isActive = true\n        contentLabel.leadingAnchor.constraint(greaterThanOrEqualTo: nameLabel.trailingAnchor, constant: 30).isActive = true\n        \n        nameLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 252), for: .horizontal)\n        contentLabel.setContentCompressionResistancePriority(UILayoutPriority(749), for: .horizontal)\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailInformationCell.swift",
    "content": "//\n//  DetailInformationCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/9.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailInformationCell: UITableViewCell {\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        contentView.addSubview(headerView)\n        contentView.addSubview(tableView)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private lazy var headerView: CommonSectionHeaderView = {\n        let frame = CGRect(x: 0, y: 0, width: kScreenW, height: 52)\n        let it = CommonSectionHeaderView(frame: frame)\n        it.changeSectionTitle(with: \"Information\")\n        it.lineView.isHidden = true\n        return it\n    }()\n    \n    private lazy var tableView: UITableView = {\n        let frame = CGRect(x: 0, y: self.headerView.frame.height, width: kScreenW, height: 400)\n        let it = UITableView(frame: frame)\n        it.separatorInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)\n        it.dataSource = self\n        it.ut_registerClassCell(DetailInfomationTableViewCell.self)\n        it.rowHeight = 50\n        return it\n    }()\n    \n}\n\nextension DetailInformationCell: UITableViewDataSource {\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return dataSource.count\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.ut_dequeueReusable(DetailInfomationTableViewCell.self, for: indexPath)\n        cell.nameLabel.text = dataSource[indexPath.row].0\n        cell.contentLabel.text = dataSource[indexPath.row].1\n        cell.selectionStyle = .none\n        return cell\n    }\n}\n\nfileprivate let dataSource: [(String,String)] = [\n    (\"Seller\", \"Hangzhou NetEase Leihuo Technology Co., Ltd.\"),\n    (\"Size\", \"2.5GB\"),\n    (\"Category\", \"Games: Strategy\"),\n    (\"Compatibility\", \"Works on this iphone\"),\n    (\"Languages\", \"Simplified Chinese\"),\n    (\"Age Rating\", \"9+\"),\n    (\"In-App Purchases\", \"Yes\"),\n    (\"Copyright\", \"©1997-2019 网易公司版权所有\")\n]\n\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailNavigationView.swift",
    "content": "//\n//  DetailNavigationView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/7.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailNavigationView: UIView {\n    \n    var goBackClosure: (()->())?\n    \n    let goBackBtn = UIButton()\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        setupUI()\n        backgroundColor = UIColor.white.withAlphaComponent(0)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        goBackBtn.setTitle(\"Games\", for: .normal)\n        goBackBtn.setTitleColor(UIColor.white, for: .normal)\n        let image = UIImage(named: \"navigation_back\")?.withRenderingMode(.alwaysTemplate)\n        goBackBtn.setImage(image, for: .normal)\n        goBackBtn.tintColor = UIColor.white\n        goBackBtn.frame = CGRect(x: 5, y: statusBarH + 5, width: 80, height: 30)\n        goBackBtn.addTarget(self, action: #selector(goBackAction), for: .touchUpInside)\n        addSubview(goBackBtn)\n    }\n    \n    @objc private func goBackAction() {\n        goBackClosure?()\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailNewFeaturesCell.swift",
    "content": "//\n//  DetailNewFeaturesCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/8.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailNewFeaturesCell: UITableViewCell {\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        // Initialization code\n    }\n\n    override func setSelected(_ selected: Bool, animated: Bool) {\n        super.setSelected(selected, animated: animated)\n\n        // Configure the view for the selected state\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailNewFeaturesCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"141\" id=\"KGk-i7-Jjw\" customClass=\"DetailNewFeaturesCell\" customModule=\"AppStoreTodayDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"311\" height=\"141\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"KGk-i7-Jjw\" id=\"H2p-sc-9uM\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"311\" height=\"140.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"What's News\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WYL-Ra-05C\">\n                        <rect key=\"frame\" x=\"20\" y=\"14\" width=\"129\" height=\"22\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"22\" id=\"2A0-JI-vso\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"22\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Version 1.0.5\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ivW-Y5-4Qt\">\n                        <rect key=\"frame\" x=\"20\" y=\"51\" width=\"87\" height=\"15\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"15\" id=\"gFX-W4-du9\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Version History\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c6v-Mp-5MT\">\n                        <rect key=\"frame\" x=\"174\" y=\"14.5\" width=\"117\" height=\"21\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <color key=\"textColor\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"two days ago\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0YL-Ny-Dnu\">\n                        <rect key=\"frame\" x=\"200\" y=\"49.5\" width=\"91\" height=\"18\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Here are more styles for playing. You can chose more than 2 characters for yourself. Just have a try!\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7GW-j5-owT\">\n                        <rect key=\"frame\" x=\"20\" y=\"80\" width=\"271\" height=\"40.5\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"0YL-Ny-Dnu\" secondAttribute=\"trailing\" constant=\"20\" id=\"57D-GZ-Kl6\"/>\n                    <constraint firstItem=\"c6v-Mp-5MT\" firstAttribute=\"centerY\" secondItem=\"WYL-Ra-05C\" secondAttribute=\"centerY\" id=\"61Y-lb-r1s\"/>\n                    <constraint firstItem=\"7GW-j5-owT\" firstAttribute=\"top\" secondItem=\"ivW-Y5-4Qt\" secondAttribute=\"bottom\" constant=\"14\" id=\"Imd-C3-ZnS\"/>\n                    <constraint firstItem=\"WYL-Ra-05C\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"Jxu-6Y-2oA\"/>\n                    <constraint firstItem=\"7GW-j5-owT\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"PAZ-JE-PXn\"/>\n                    <constraint firstItem=\"WYL-Ra-05C\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" constant=\"14\" id=\"Qci-kQ-hmb\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"7GW-j5-owT\" secondAttribute=\"trailing\" constant=\"20\" id=\"Uld-nK-B0x\"/>\n                    <constraint firstItem=\"0YL-Ny-Dnu\" firstAttribute=\"centerY\" secondItem=\"ivW-Y5-4Qt\" secondAttribute=\"centerY\" id=\"XNq-iK-C6P\"/>\n                    <constraint firstItem=\"ivW-Y5-4Qt\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"dVj-S6-tbb\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"c6v-Mp-5MT\" secondAttribute=\"trailing\" constant=\"20\" id=\"jEw-fb-ryV\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"7GW-j5-owT\" secondAttribute=\"bottom\" constant=\"20\" id=\"mFv-Cb-RYD\"/>\n                    <constraint firstItem=\"ivW-Y5-4Qt\" firstAttribute=\"top\" secondItem=\"WYL-Ra-05C\" secondAttribute=\"bottom\" constant=\"15\" id=\"v00-I7-hCn\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <viewLayoutGuide key=\"safeArea\" id=\"njF-e1-oar\"/>\n            <point key=\"canvasLocation\" x=\"-254\" y=\"79\"/>\n        </tableViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailPreviewCell.swift",
    "content": "//\n//  DetailPreviewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/8.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailPreviewCell: UITableViewCell {\n    \n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        contentView.addSubview(headerView)\n        contentView.addSubview(collectionView)\n    }\n    \n    private lazy var headerView: CommonSectionHeaderView = {\n        let frame = CGRect(x: 0, y: 0, width: kScreenW, height: 42)\n        let it = CommonSectionHeaderView(frame: frame)\n        it.changeSectionTitle(with: \"Review\")\n        it.lineView.isHidden = true\n        return it\n    }()\n    \n    private lazy var collectionView: DetailPreviewCollectionView = {\n        let itemSize = CGSize(width: kScreenW - 2 * GlobalConstants.leftMargin, height: GlobalConstants.detailPreviewImageH)\n        let frame = CGRect(x: 0, y: 52, width: kScreenW, height: GlobalConstants.detailPreviewImageH)\n        let layout = CommonCollectionFlowLayout(itemSize: itemSize)\n        let collectionView = DetailPreviewCollectionView(frame: frame, collectionViewLayout: layout)\n        collectionView.dataSource = self\n        collectionView.delegate = self\n        return collectionView\n    }()\n\n}\n\nextension DetailPreviewCell: UICollectionViewDataSource,UICollectionViewDelegate {\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return dataSource.count\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        let cell = collectionView.ut_dequeueReusable(DetailPreviewCollectionViewCell.self, for: indexPath)\n        cell.coverImageView.image = UIImage(named: dataSource[indexPath.item])\n        return cell\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\n        \n    }\n}\n\nfileprivate let dataSource: [String] = [\n    \"cover_detail1\",\n    \"cover_detail2\",\n    \"cover_detail\"\n]\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailPreviewCollectionView.swift",
    "content": "//\n//  DetailPreviewCollectionView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/8.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailPreviewCollectionView: UICollectionView {\n\n    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {\n        super.init(frame: frame, collectionViewLayout: layout)\n        config()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func config() {\n        backgroundColor = .white\n        \n        decelerationRate = UIScrollView.DecelerationRate.fast\n        ut_registerClassCell(DetailPreviewCollectionViewCell.self)\n        showsHorizontalScrollIndicator = false\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailPreviewCollectionViewCell.swift",
    "content": "//\n//  DetailPreviewCollectionViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/8.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailPreviewCollectionViewCell: UICollectionViewCell {\n    \n    let coverImageView = UIImageView()\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        coverImageView.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: GlobalConstants.detailPreviewImageH)\n        coverImageView.cornerRadius = 14.0\n        coverImageView.contentMode = .scaleAspectFill\n        contentView.addSubview(coverImageView)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailTopInfoCell.swift",
    "content": "//\n//  DetailTopInfoCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/8.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailTopInfoCell: UITableViewCell {\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        setupUI()\n    }\n    \n    private func setupUI() {\n        for index in 0...3 {\n            let star = StarView(frame: CGRect(x: index * (15 + 3), y: 0, width: 15, height: 15))\n            starBackView.addSubview(star)\n        }\n    }\n\n    @IBOutlet weak var starBackView: UIView!\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Detail/DetailTopInfoCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"226\" id=\"KGk-i7-Jjw\" customClass=\"DetailTopInfoCell\" customModule=\"AppStoreTodayDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"352\" height=\"226\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"KGk-i7-Jjw\" id=\"H2p-sc-9uM\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"352\" height=\"225.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"logo_game\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tiI-sU-Z6o\">\n                        <rect key=\"frame\" x=\"20\" y=\"20\" width=\"118\" height=\"118\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"118\" id=\"sNK-yB-9Bc\"/>\n                            <constraint firstAttribute=\"height\" constant=\"118\" id=\"uH5-sj-TUo\"/>\n                        </constraints>\n                        <userDefinedRuntimeAttributes>\n                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                <real key=\"value\" value=\"26\"/>\n                            </userDefinedRuntimeAttribute>\n                        </userDefinedRuntimeAttributes>\n                    </imageView>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Onmyoji \" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"d15-nB-2Mo\">\n                        <rect key=\"frame\" x=\"158\" y=\"30\" width=\"93\" height=\"25\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"25\" id=\"N5f-Md-Sbm\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" name=\"PingFangSC-Medium\" family=\"PingFang SC\" pointSize=\"22\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"The best game\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"G2w-No-SZn\">\n                        <rect key=\"frame\" x=\"158\" y=\"61\" width=\"105\" height=\"18\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"18\" id=\"AOh-ES-23M\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" name=\"PingFangSC-Regular\" family=\"PingFang SC\" pointSize=\"15\"/>\n                        <color key=\"textColor\" red=\"0.60392156862745094\" green=\"0.60271537303924561\" blue=\"0.60271537303924561\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BEu-g1-DnR\">\n                        <rect key=\"frame\" x=\"158\" y=\"108\" width=\"30\" height=\"30\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"4Wk-WY-NHU\"/>\n                            <constraint firstAttribute=\"width\" constant=\"30\" id=\"Ojo-Su-b9f\"/>\n                        </constraints>\n                        <state key=\"normal\" image=\"detail_download\"/>\n                    </button>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FHb-ar-fAV\">\n                        <rect key=\"frame\" x=\"20\" y=\"173\" width=\"90\" height=\"15\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"15\" id=\"3kI-7L-0C2\"/>\n                            <constraint firstAttribute=\"width\" constant=\"90\" id=\"52I-tz-OfJ\"/>\n                        </constraints>\n                    </view>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"4.0, 250rateings\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"F85-Ay-7P0\">\n                        <rect key=\"frame\" x=\"20\" y=\"198\" width=\"95.5\" height=\"14\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"14\" id=\"meS-bI-B2v\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"12\"/>\n                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"9+\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Svi-qZ-ImG\">\n                        <rect key=\"frame\" x=\"306.5\" y=\"166\" width=\"28\" height=\"22\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"22\" id=\"6F0-T3-qKz\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"22\"/>\n                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Age\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fPj-UT-IDK\">\n                        <rect key=\"frame\" x=\"309\" y=\"198\" width=\"23\" height=\"14\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"14\" id=\"AsL-9R-LdB\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"12\"/>\n                        <color key=\"textColor\" white=\"0.66666666669999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"strategy\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6Bz-mf-KEg\">\n                        <rect key=\"frame\" x=\"215.5\" y=\"198\" width=\"48.5\" height=\"14\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"14\" id=\"rGS-XF-rkm\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"12\"/>\n                        <color key=\"textColor\" white=\"0.66666666669999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"#31\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dOx-33-HFw\">\n                        <rect key=\"frame\" x=\"221\" y=\"165.5\" width=\"38\" height=\"22\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"22\" id=\"CAC-bT-V3S\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"22\"/>\n                        <color key=\"textColor\" white=\"0.66666666669999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"UGM-oL-VZP\">\n                        <rect key=\"frame\" x=\"302\" y=\"108\" width=\"30\" height=\"30\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"30\" id=\"Ke9-FR-rjR\"/>\n                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"SYW-hY-5G7\"/>\n                        </constraints>\n                        <state key=\"normal\" image=\"detail_more\"/>\n                    </button>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"fPj-UT-IDK\" firstAttribute=\"centerY\" secondItem=\"F85-Ay-7P0\" secondAttribute=\"centerY\" id=\"1hm-iv-oSq\"/>\n                    <constraint firstItem=\"d15-nB-2Mo\" firstAttribute=\"leading\" secondItem=\"tiI-sU-Z6o\" secondAttribute=\"trailing\" constant=\"20\" id=\"3Gy-1R-wMX\"/>\n                    <constraint firstItem=\"6Bz-mf-KEg\" firstAttribute=\"centerX\" secondItem=\"dOx-33-HFw\" secondAttribute=\"centerX\" id=\"8Yq-yi-8Qf\"/>\n                    <constraint firstItem=\"6Bz-mf-KEg\" firstAttribute=\"centerY\" secondItem=\"F85-Ay-7P0\" secondAttribute=\"centerY\" id=\"CiH-2C-9n5\"/>\n                    <constraint firstItem=\"BEu-g1-DnR\" firstAttribute=\"leading\" secondItem=\"tiI-sU-Z6o\" secondAttribute=\"trailing\" constant=\"20\" id=\"DFI-0o-8D9\"/>\n                    <constraint firstItem=\"UGM-oL-VZP\" firstAttribute=\"centerY\" secondItem=\"BEu-g1-DnR\" secondAttribute=\"centerY\" id=\"KFz-oV-X14\"/>\n                    <constraint firstItem=\"tiI-sU-Z6o\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"NL2-2w-P2g\"/>\n                    <constraint firstItem=\"G2w-No-SZn\" firstAttribute=\"leading\" secondItem=\"tiI-sU-Z6o\" secondAttribute=\"trailing\" constant=\"20\" id=\"Sum-cp-nHl\"/>\n                    <constraint firstItem=\"FHb-ar-fAV\" firstAttribute=\"top\" secondItem=\"tiI-sU-Z6o\" secondAttribute=\"bottom\" constant=\"35\" id=\"TIn-bc-cK7\"/>\n                    <constraint firstItem=\"fPj-UT-IDK\" firstAttribute=\"top\" secondItem=\"Svi-qZ-ImG\" secondAttribute=\"bottom\" constant=\"10\" id=\"Z5t-sB-Mms\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"UGM-oL-VZP\" secondAttribute=\"trailing\" constant=\"20\" id=\"bUf-oy-TTg\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"fPj-UT-IDK\" secondAttribute=\"trailing\" constant=\"20\" id=\"bnt-5w-p6N\"/>\n                    <constraint firstItem=\"BEu-g1-DnR\" firstAttribute=\"bottom\" secondItem=\"tiI-sU-Z6o\" secondAttribute=\"bottom\" id=\"cIf-jj-QLj\"/>\n                    <constraint firstItem=\"FHb-ar-fAV\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"eaO-Jm-qR9\"/>\n                    <constraint firstItem=\"G2w-No-SZn\" firstAttribute=\"top\" secondItem=\"d15-nB-2Mo\" secondAttribute=\"bottom\" constant=\"6\" id=\"gUB-jJ-4pw\"/>\n                    <constraint firstItem=\"Svi-qZ-ImG\" firstAttribute=\"centerX\" secondItem=\"fPj-UT-IDK\" secondAttribute=\"centerX\" id=\"iRi-GX-mLB\"/>\n                    <constraint firstItem=\"fPj-UT-IDK\" firstAttribute=\"leading\" secondItem=\"6Bz-mf-KEg\" secondAttribute=\"trailing\" constant=\"45\" id=\"ijW-JX-A80\"/>\n                    <constraint firstItem=\"tiI-sU-Z6o\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" constant=\"20\" id=\"rTB-35-R9r\"/>\n                    <constraint firstItem=\"F85-Ay-7P0\" firstAttribute=\"top\" secondItem=\"FHb-ar-fAV\" secondAttribute=\"bottom\" constant=\"10\" id=\"s7Q-ox-TxJ\"/>\n                    <constraint firstItem=\"F85-Ay-7P0\" firstAttribute=\"leading\" secondItem=\"FHb-ar-fAV\" secondAttribute=\"leading\" id=\"uAC-vI-p2v\"/>\n                    <constraint firstItem=\"d15-nB-2Mo\" firstAttribute=\"top\" secondItem=\"tiI-sU-Z6o\" secondAttribute=\"top\" constant=\"10\" id=\"vve-h4-9wJ\"/>\n                    <constraint firstItem=\"6Bz-mf-KEg\" firstAttribute=\"top\" secondItem=\"dOx-33-HFw\" secondAttribute=\"bottom\" constant=\"10.5\" id=\"y6m-oN-bsI\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <viewLayoutGuide key=\"safeArea\" id=\"njF-e1-oar\"/>\n            <connections>\n                <outlet property=\"starBackView\" destination=\"FHb-ar-fAV\" id=\"B2I-BD-jDX\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"95.652173913043484\" y=\"12.723214285714285\"/>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"detail_download\" width=\"30\" height=\"30\"/>\n        <image name=\"detail_more\" width=\"30\" height=\"30\"/>\n        <image name=\"logo_game\" width=\"800\" height=\"800\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Download/DownloadBottomView.swift",
    "content": "//\n//  DownloadBottomView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/9/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nprotocol DownloadBottomViewDelegate: class {\n    func downloadBottomViewDidClickCancel(_ bottomView: DownloadBottomView)\n}\n\nclass DownloadBottomView: UIView,NibLoadable {\n\n    weak var delegate: DownloadBottomViewDelegate?\n    \n    \n    @IBAction func cancelAction(_ sender: UIButton) {\n        delegate?.downloadBottomViewDidClickCancel(self)\n    }\n    \n    \n    @IBOutlet weak var nameLabel: UILabel!\n    @IBOutlet weak var descLabel: UILabel!\n    @IBOutlet weak var iconImageView: UIImageView!\n    \n    var model: GameTopicModel! {\n        didSet {\n            nameLabel.text = model.name\n            descLabel.text = model.desc\n            iconImageView.image = UIImage(named: model.iconImageName)\n        }\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Download/DownloadBottomView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\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=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\" customClass=\"DownloadBottomView\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"340\" height=\"287\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"App Store\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"87E-8y-Hmq\">\n                    <rect key=\"frame\" x=\"16\" y=\"11\" width=\"81\" height=\"24\"/>\n                    <fontDescription key=\"fontDescription\" name=\"PingFangSC-Medium\" family=\"PingFang SC\" pointSize=\"17\"/>\n                    <nil key=\"textColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DN7-AT-k3m\">\n                    <rect key=\"frame\" x=\"272\" y=\"7\" width=\"52\" height=\"32\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"16\"/>\n                    <state key=\"normal\" title=\"Cancel\"/>\n                    <connections>\n                        <action selector=\"cancelAction:\" destination=\"iN0-l3-epB\" eventType=\"touchUpInside\" id=\"vW2-jR-ifX\"/>\n                    </connections>\n                </button>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kxr-1J-Ugh\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"340\" height=\"0.5\"/>\n                    <color key=\"backgroundColor\" red=\"0.55686274509803924\" green=\"0.55686274509803924\" blue=\"0.5725490196078431\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"0.69999999999999996\" id=\"t9G-5S-avS\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yAp-G7-ISi\">\n                    <rect key=\"frame\" x=\"16\" y=\"120.5\" width=\"324\" height=\"0.5\"/>\n                    <color key=\"backgroundColor\" red=\"0.55686274509803924\" green=\"0.55686274509803924\" blue=\"0.5725490196078431\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"0.29999999999999999\" id=\"5pu-1N-dxz\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gm0-EC-Lnz\">\n                    <rect key=\"frame\" x=\"16\" y=\"166\" width=\"324\" height=\"0.5\"/>\n                    <color key=\"backgroundColor\" red=\"0.5568627451\" green=\"0.5568627451\" blue=\"0.57254901960000004\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"0.29999999999999999\" id=\"MC7-a8-4we\"/>\n                    </constraints>\n                </view>\n                <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RXj-2n-vDf\">\n                    <rect key=\"frame\" x=\"55\" y=\"63.5\" width=\"40\" height=\"40\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" constant=\"40\" id=\"FRC-nN-BHi\"/>\n                        <constraint firstAttribute=\"height\" constant=\"40\" id=\"Vvt-rT-lHA\"/>\n                    </constraints>\n                </imageView>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iUb-N3-zJQ\">\n                    <rect key=\"frame\" x=\"111\" y=\"58.5\" width=\"39.5\" height=\"17\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"17\" id=\"8S8-JH-31x\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                    <nil key=\"textColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"f6P-zA-4Z6\">\n                    <rect key=\"frame\" x=\"111\" y=\"75.5\" width=\"39.5\" height=\"17\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"17\" id=\"Heu-z5-cbp\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                    <color key=\"textColor\" red=\"0.5568627451\" green=\"0.5568627451\" blue=\"0.57254901960000004\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"OFFERS IN-APP PURCHASES\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oaH-fj-5IL\">\n                    <rect key=\"frame\" x=\"111\" y=\"92.5\" width=\"214\" height=\"17\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"17\" id=\"R8B-GB-78L\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                    <color key=\"textColor\" red=\"0.5568627451\" green=\"0.5568627451\" blue=\"0.57254901960000004\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"ACCOUNT\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"VyH-tv-SSg\">\n                    <rect key=\"frame\" x=\"31\" y=\"135\" width=\"64\" height=\"17\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"17\" id=\"fXZ-yf-qBo\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                    <color key=\"textColor\" red=\"0.5568627451\" green=\"0.5568627451\" blue=\"0.57254901960000004\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"hello@qq.com\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JCZ-Gk-LId\">\n                    <rect key=\"frame\" x=\"111\" y=\"135\" width=\"103.5\" height=\"17\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"17\" id=\"qFg-3Q-y0h\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"demo_icon\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"T3T-T0-BjE\">\n                    <rect key=\"frame\" x=\"148\" y=\"186.5\" width=\"44\" height=\"44\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" constant=\"44\" id=\"Ke6-vY-hfR\"/>\n                        <constraint firstAttribute=\"height\" constant=\"44\" id=\"dAW-Ao-aCP\"/>\n                    </constraints>\n                </imageView>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Confirm with Side Button\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kg6-VW-sWQ\">\n                    <rect key=\"frame\" x=\"74\" y=\"238.5\" width=\"192\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <nil key=\"textColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"Kg6-VW-sWQ\" firstAttribute=\"centerX\" secondItem=\"T3T-T0-BjE\" secondAttribute=\"centerX\" id=\"1mu-uI-WBs\"/>\n                <constraint firstItem=\"f6P-zA-4Z6\" firstAttribute=\"leading\" secondItem=\"iUb-N3-zJQ\" secondAttribute=\"leading\" id=\"4fO-Vb-c1b\"/>\n                <constraint firstItem=\"oaH-fj-5IL\" firstAttribute=\"top\" secondItem=\"f6P-zA-4Z6\" secondAttribute=\"bottom\" id=\"5pf-rY-nN2\"/>\n                <constraint firstItem=\"VyH-tv-SSg\" firstAttribute=\"top\" secondItem=\"yAp-G7-ISi\" secondAttribute=\"bottom\" constant=\"14\" id=\"8XY-LN-bWU\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"gm0-EC-Lnz\" secondAttribute=\"trailing\" id=\"9AL-vZ-n2U\"/>\n                <constraint firstItem=\"vUN-kp-3ea\" firstAttribute=\"trailing\" secondItem=\"yAp-G7-ISi\" secondAttribute=\"trailing\" id=\"AXA-qv-kkz\"/>\n                <constraint firstItem=\"87E-8y-Hmq\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" constant=\"11\" id=\"BIU-fB-tRK\"/>\n                <constraint firstItem=\"RXj-2n-vDf\" firstAttribute=\"leading\" secondItem=\"vUN-kp-3ea\" secondAttribute=\"leading\" constant=\"55\" id=\"BzP-1P-eLN\"/>\n                <constraint firstItem=\"yAp-G7-ISi\" firstAttribute=\"top\" secondItem=\"Kxr-1J-Ugh\" secondAttribute=\"bottom\" constant=\"75\" id=\"EyY-qW-r0w\"/>\n                <constraint firstItem=\"vUN-kp-3ea\" firstAttribute=\"trailing\" secondItem=\"Kxr-1J-Ugh\" secondAttribute=\"trailing\" id=\"Eyp-kE-nzO\"/>\n                <constraint firstItem=\"Kxr-1J-Ugh\" firstAttribute=\"leading\" secondItem=\"vUN-kp-3ea\" secondAttribute=\"leading\" id=\"JTL-nt-Eik\"/>\n                <constraint firstItem=\"DN7-AT-k3m\" firstAttribute=\"centerY\" secondItem=\"87E-8y-Hmq\" secondAttribute=\"centerY\" id=\"LiF-o2-czQ\"/>\n                <constraint firstItem=\"VyH-tv-SSg\" firstAttribute=\"trailing\" secondItem=\"RXj-2n-vDf\" secondAttribute=\"trailing\" id=\"XHL-p4-hMl\"/>\n                <constraint firstItem=\"87E-8y-Hmq\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"16\" id=\"cbe-D7-ySr\"/>\n                <constraint firstItem=\"T3T-T0-BjE\" firstAttribute=\"top\" secondItem=\"gm0-EC-Lnz\" secondAttribute=\"bottom\" constant=\"20\" id=\"gOe-4k-Psx\"/>\n                <constraint firstItem=\"T3T-T0-BjE\" firstAttribute=\"centerX\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerX\" id=\"gsk-we-k6U\"/>\n                <constraint firstItem=\"f6P-zA-4Z6\" firstAttribute=\"top\" secondItem=\"iUb-N3-zJQ\" secondAttribute=\"bottom\" id=\"gzv-x0-4O2\"/>\n                <constraint firstItem=\"JCZ-Gk-LId\" firstAttribute=\"leading\" secondItem=\"oaH-fj-5IL\" secondAttribute=\"leading\" id=\"iB1-6h-Q9f\"/>\n                <constraint firstItem=\"Kg6-VW-sWQ\" firstAttribute=\"top\" secondItem=\"T3T-T0-BjE\" secondAttribute=\"bottom\" constant=\"8\" id=\"j93-sE-NGH\"/>\n                <constraint firstItem=\"gm0-EC-Lnz\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"16\" id=\"jW2-Kn-Iq5\"/>\n                <constraint firstItem=\"oaH-fj-5IL\" firstAttribute=\"leading\" secondItem=\"f6P-zA-4Z6\" secondAttribute=\"leading\" id=\"jkK-KZ-eo4\"/>\n                <constraint firstItem=\"RXj-2n-vDf\" firstAttribute=\"top\" secondItem=\"Kxr-1J-Ugh\" secondAttribute=\"bottom\" constant=\"18\" id=\"lbR-Bw-3fd\"/>\n                <constraint firstItem=\"JCZ-Gk-LId\" firstAttribute=\"centerY\" secondItem=\"VyH-tv-SSg\" secondAttribute=\"centerY\" id=\"lnM-Vy-ktN\"/>\n                <constraint firstItem=\"gm0-EC-Lnz\" firstAttribute=\"top\" secondItem=\"yAp-G7-ISi\" secondAttribute=\"bottom\" constant=\"45\" id=\"mp2-UH-eyk\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"DN7-AT-k3m\" secondAttribute=\"trailing\" constant=\"16\" id=\"tw5-dM-7Z4\"/>\n                <constraint firstItem=\"yAp-G7-ISi\" firstAttribute=\"leading\" secondItem=\"vUN-kp-3ea\" secondAttribute=\"leading\" constant=\"16\" id=\"uHW-W7-BEd\"/>\n                <constraint firstItem=\"iUb-N3-zJQ\" firstAttribute=\"top\" secondItem=\"Kxr-1J-Ugh\" secondAttribute=\"bottom\" constant=\"13\" id=\"vtD-3q-L3b\"/>\n                <constraint firstItem=\"iUb-N3-zJQ\" firstAttribute=\"leading\" secondItem=\"RXj-2n-vDf\" secondAttribute=\"trailing\" constant=\"16\" id=\"y4w-Ig-EE4\"/>\n                <constraint firstItem=\"Kxr-1J-Ugh\" firstAttribute=\"top\" secondItem=\"vUN-kp-3ea\" secondAttribute=\"top\" constant=\"45\" id=\"zHC-4Z-Gu7\"/>\n            </constraints>\n            <nil key=\"simulatedTopBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <viewLayoutGuide key=\"safeArea\" id=\"vUN-kp-3ea\"/>\n            <connections>\n                <outlet property=\"descLabel\" destination=\"f6P-zA-4Z6\" id=\"Uko-Rh-Hx9\"/>\n                <outlet property=\"iconImageView\" destination=\"RXj-2n-vDf\" id=\"kYd-UV-4wW\"/>\n                <outlet property=\"nameLabel\" destination=\"iUb-N3-zJQ\" id=\"kzc-aj-SmS\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"12.800000000000001\" y=\"31.934032983508249\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"demo_icon\" width=\"490\" height=\"490\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Download/DownloadClickView.swift",
    "content": "//\n//  DownloadClickView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/9/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DownloadClickView: UIView,NibLoadable {\n    \n    var timer: Timer?\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n    }\n\n    func startMoving() {\n        timer = Timer(timeInterval: 1.5, repeats: true, block: { _ in\n            self.animations()\n        })\n        timer?.fire()\n        RunLoop.main.add(timer!, forMode: .default)\n    }\n    \n    func endMoving() {\n        timer?.invalidate()\n        timer = nil\n    }\n    \n    private func animations() {\n        UIView.animateKeyframes(withDuration: 1, delay: 0, options: [], animations: {\n            UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.25, animations: {\n                self.frame.origin.x -= GlobalConstants.clickBarWidth\n            })\n            UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.5, animations: {\n                self.frame.origin.x += GlobalConstants.clickBarWidth\n            })\n            UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.75, animations: {\n                self.frame.origin.x -= GlobalConstants.clickBarWidth\n            })\n            UIView.addKeyframe(withRelativeStartTime: 0.75, relativeDuration: 1.0, animations: {\n                self.frame.origin.x += GlobalConstants.clickBarWidth\n            })\n        }, completion: nil)\n\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Download/DownloadClickView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\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=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\" customClass=\"DownloadClickView\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"140\" height=\"115\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Fb4-yR-I1B\">\n                    <rect key=\"frame\" x=\"128\" y=\"7.5\" width=\"12\" height=\"100\"/>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"100\" id=\"13A-aO-9xA\"/>\n                        <constraint firstAttribute=\"width\" constant=\"12\" id=\"bEK-Vj-e9T\"/>\n                    </constraints>\n                    <userDefinedRuntimeAttributes>\n                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                            <real key=\"value\" value=\"3\"/>\n                        </userDefinedRuntimeAttribute>\n                    </userDefinedRuntimeAttributes>\n                </view>\n                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Double Click to install\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" numberOfLines=\"2\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KaE-LV-hOw\">\n                    <rect key=\"frame\" x=\"10\" y=\"31\" width=\"113\" height=\"53.5\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" constant=\"113\" id=\"ABf-HV-B4c\"/>\n                    </constraints>\n                    <fontDescription key=\"fontDescription\" name=\"PingFangSC-Regular\" family=\"PingFang SC\" pointSize=\"19\"/>\n                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n            <constraints>\n                <constraint firstItem=\"Fb4-yR-I1B\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerY\" id=\"fD9-Mk-kIt\"/>\n                <constraint firstItem=\"vUN-kp-3ea\" firstAttribute=\"trailing\" secondItem=\"Fb4-yR-I1B\" secondAttribute=\"trailing\" id=\"fct-cv-ij0\"/>\n                <constraint firstItem=\"Fb4-yR-I1B\" firstAttribute=\"leading\" secondItem=\"KaE-LV-hOw\" secondAttribute=\"trailing\" constant=\"5\" id=\"hFq-4s-9bA\"/>\n                <constraint firstItem=\"KaE-LV-hOw\" firstAttribute=\"centerY\" secondItem=\"Fb4-yR-I1B\" secondAttribute=\"centerY\" id=\"hLR-4n-6z6\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <viewLayoutGuide key=\"safeArea\" id=\"vUN-kp-3ea\"/>\n            <point key=\"canvasLocation\" x=\"14.4\" y=\"-127.28635682158921\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Link/GameLinkTableView.swift",
    "content": "//\n//  GameLinkTableView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/7.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass GameLinkTableView: UITableView {\n    \n    override init(frame: CGRect, style: UITableView.Style) {\n        super.init(frame: frame, style: style)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        rowHeight = GlobalConstants.linkCellHeight\n        register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCellID)\n        dataSource = self\n        separatorInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)\n    }\n}\n\nextension GameLinkTableView: UITableViewDataSource {\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return linkDataSource.count\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = dequeueReusableCell(withIdentifier: UITableViewCellID, for: indexPath)\n        cell.textLabel?.font = UIFont.systemFont(ofSize: 22)\n        cell.textLabel?.text = linkDataSource[indexPath.row]\n        cell.textLabel?.textColor = GlobalConstants.textBlueColor\n        return cell\n    }\n\n}\n\nfileprivate let UITableViewCellID = \"UITableViewCellID\"\nfileprivate let linkDataSource: [String] = [\n    \"Add a Payment Method\",\n    \"Parents' Guide to the App\",\n    \"About In-App Purchases\",\n    \"About Apps & Games for Your Kids\",\n    \"About Personalisation\",\n    \"New to the App Store\",\n]\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Link/GameLinkTableViewCell.swift",
    "content": "//\n//  GameLinkTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/7.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass GameLinkTableViewCell: UITableViewCell {\n    \n    private lazy var headerView: CommonSectionHeaderView = {\n        let frame = CGRect(x: 0, y: 0, width: kScreenW, height: 42)\n        let it = CommonSectionHeaderView(frame: frame)\n        it.changeSectionTitle(with: \"Quick Links\")\n        return it\n    }()\n    \n    private lazy var tableView: GameLinkTableView = {\n        let frame = CGRect(x: 0, y: 42, width: kScreenW, height: GlobalConstants.linkCellHeight * 6)\n        let it = GameLinkTableView(frame: frame)\n        return it\n    }()\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        contentView.addSubview(headerView)\n        contentView.addSubview(tableView)\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Recommand/GameRecommandCollectionView.swift",
    "content": "//\n//  GameRecommandCollectionView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass GameRecommandCollectionView: UICollectionView {\n\n    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {\n        super.init(frame: frame, collectionViewLayout: layout)\n        config()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func config() {\n        backgroundColor = .white\n        \n        decelerationRate = UIScrollView.DecelerationRate.fast\n        ut_registerNibCell(RecommandCollectionViewCell.self)\n        showsHorizontalScrollIndicator = false\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Recommand/GameRecommandTableViewCell.swift",
    "content": "//\n//  GameRecommandTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass GameRecommandTableViewCell: UITableViewCell {\n    \n    var detailClosure: (()->())?\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        contentView.addSubview(recommandCollectionView)\n    }\n    \n    private lazy var recommandCollectionView: GameRecommandCollectionView = {\n        let itemSize = CGSize(width: kScreenW - 2 * GlobalConstants.leftMargin, height: GlobalConstants.recommandHeight)\n        let frame = CGRect(x: 0, y: 0, width: kScreenW, height: GlobalConstants.recommandHeight)\n        let layout = CommonCollectionFlowLayout(itemSize: itemSize)\n        let collectionView = GameRecommandCollectionView(frame: frame, collectionViewLayout: layout)\n        collectionView.dataSource = self\n        collectionView.delegate = self\n        return collectionView\n    }()\n\n}\n\nextension GameRecommandTableViewCell: UICollectionViewDataSource,UICollectionViewDelegate {\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        if collectionView == recommandCollectionView {\n            return RecommandDataSource.count\n        }\n        return 0\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        if collectionView == recommandCollectionView {\n            let cell = collectionView.ut_dequeueReusable(RecommandCollectionViewCell.self, for: indexPath)\n            cell.model = RecommandDataSource[indexPath.row]\n            return cell\n        }\n        return UICollectionViewCell()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\n        detailClosure?()\n    }\n}\n\nfileprivate let RecommandDataSource: [GameRecommandModel] = [\n    GameRecommandModel(feature: \"MAJOR UPDATE\", name: \"Onmyoji\", desc: \"Cards\", coverImageName: \"cover_1\"),\n    GameRecommandModel(feature: \"NEW GAME\", name: \"Clash Royale\", desc: \"Strategy\", coverImageName: \"cover_2\"),\n    GameRecommandModel(feature: \"REDISCOVER THIS\", name: \"Fantasy Westward Journey\", desc: \"Adventure\", coverImageName: \"cover_3\")\n]\n\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Recommand/RecommandCollectionViewCell.swift",
    "content": "//\n//  RecommandCollectionViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass RecommandCollectionViewCell: UICollectionViewCell {\n    \n    @IBOutlet weak var featureLabel: UILabel!\n    @IBOutlet weak var nameLabel: UILabel!\n    @IBOutlet weak var descLabel: UILabel!\n    @IBOutlet weak var coverImageView: UIImageView!\n    \n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        // Initialization code\n    }\n\n    var model: GameRecommandModel! {\n        didSet {\n            featureLabel.text = model.feature\n            nameLabel.text = model.name\n            descLabel.text = model.desc\n            coverImageView.image = UIImage(named: model.coverImageName)\n        }\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Recommand/RecommandCollectionViewCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"gTV-IL-0wX\" customClass=\"RecommandCollectionViewCell\" customModule=\"AppStoreTodayDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"269\" height=\"312\"/>\n            <autoresizingMask key=\"autoresizingMask\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"269\" height=\"312\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ksh-3O-JUB\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"12\" width=\"264\" height=\"14\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"14\" id=\"4XY-mK-22K\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"11\"/>\n                        <color key=\"textColor\" red=\"0.039215686274509803\" green=\"0.37254901960784315\" blue=\"0.99607843137254903\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FOr-7j-iyZ\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"31\" width=\"264\" height=\"27\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"27\" id=\"n6e-19-2uq\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"22\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4pJ-qq-aqw\" userLabel=\"lineView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"1\" width=\"269\" height=\"1\"/>\n                        <color key=\"backgroundColor\" red=\"0.8784313725490196\" green=\"0.8784313725490196\" blue=\"0.8784313725490196\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"0.80000000000000004\" id=\"fj9-Ef-W9Y\"/>\n                        </constraints>\n                    </view>\n                    <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ihz-tS-UsA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"101\" width=\"269\" height=\"179\"/>\n                        <userDefinedRuntimeAttributes>\n                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                <real key=\"value\" value=\"5\"/>\n                            </userDefinedRuntimeAttribute>\n                        </userDefinedRuntimeAttributes>\n                    </imageView>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qhw-hX-BZR\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"63\" width=\"264\" height=\"24\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"24\" id=\"rKO-B0-0eC\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"20\"/>\n                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n            <constraints>\n                <constraint firstItem=\"FOr-7j-iyZ\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"1Y4-vd-dz4\"/>\n                <constraint firstItem=\"4pJ-qq-aqw\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"3Fa-af-gJH\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"Ihz-tS-UsA\" secondAttribute=\"bottom\" constant=\"32\" id=\"Bxp-Tm-a5r\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"FOr-7j-iyZ\" secondAttribute=\"trailing\" constant=\"5\" id=\"Gc0-fT-9Ru\"/>\n                <constraint firstItem=\"Ihz-tS-UsA\" firstAttribute=\"top\" secondItem=\"qhw-hX-BZR\" secondAttribute=\"bottom\" constant=\"14\" id=\"JWg-A9-dRk\"/>\n                <constraint firstItem=\"Ksh-3O-JUB\" firstAttribute=\"top\" secondItem=\"4pJ-qq-aqw\" secondAttribute=\"bottom\" constant=\"10\" id=\"O6P-vZ-Ocb\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"Ihz-tS-UsA\" secondAttribute=\"trailing\" id=\"YHp-Bp-4ca\"/>\n                <constraint firstItem=\"FOr-7j-iyZ\" firstAttribute=\"top\" secondItem=\"Ksh-3O-JUB\" secondAttribute=\"bottom\" constant=\"5\" id=\"eSP-eV-t3d\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"qhw-hX-BZR\" secondAttribute=\"trailing\" constant=\"5\" id=\"ih9-ZX-L1O\"/>\n                <constraint firstItem=\"Ksh-3O-JUB\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"oGY-mn-e6K\"/>\n                <constraint firstItem=\"qhw-hX-BZR\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"onC-st-p5f\"/>\n                <constraint firstItem=\"4pJ-qq-aqw\" firstAttribute=\"top\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"top\" constant=\"1\" id=\"rhi-Gx-9h1\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"Ksh-3O-JUB\" secondAttribute=\"trailing\" constant=\"5\" id=\"skl-Hg-3BK\"/>\n                <constraint firstItem=\"qhw-hX-BZR\" firstAttribute=\"top\" secondItem=\"FOr-7j-iyZ\" secondAttribute=\"bottom\" constant=\"5\" id=\"smI-Wd-jyA\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"4pJ-qq-aqw\" secondAttribute=\"trailing\" id=\"tdh-Mf-2QG\"/>\n                <constraint firstItem=\"Ihz-tS-UsA\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"yIh-WX-jLS\"/>\n            </constraints>\n            <viewLayoutGuide key=\"safeArea\" id=\"ZTg-uK-7eu\"/>\n            <size key=\"customSize\" width=\"269\" height=\"312\"/>\n            <connections>\n                <outlet property=\"coverImageView\" destination=\"Ihz-tS-UsA\" id=\"eBd-Va-pFq\"/>\n                <outlet property=\"descLabel\" destination=\"qhw-hX-BZR\" id=\"xJb-nK-dtz\"/>\n                <outlet property=\"featureLabel\" destination=\"Ksh-3O-JUB\" id=\"8oH-Te-0jx\"/>\n                <outlet property=\"nameLabel\" destination=\"FOr-7j-iyZ\" id=\"VAX-qu-7T4\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"100.72463768115942\" y=\"-205.58035714285714\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Topic/GameTopicCollectionView.swift",
    "content": "//\n//  GameTopicCollectionView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass GameTopicCollectionView: UICollectionView {\n\n    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {\n        super.init(frame: frame, collectionViewLayout: layout)\n        config()\n        \n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func config() {\n        backgroundColor = .white\n        \n        decelerationRate = UIScrollView.DecelerationRate.fast\n        ut_registerNibCell(GameTopicCollectionViewCell.self)\n        showsHorizontalScrollIndicator = false\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Topic/GameTopicCollectionViewCell.swift",
    "content": "//\n//  GameTopicCollectionViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nprotocol GameTopicCollectionViewCellDelegate: class {\n    func gameTopicCollectionViewCellDidClickGet(_ topicCell: GameTopicCollectionViewCell)\n}\n\nclass GameTopicCollectionViewCell: UICollectionViewCell {\n\n    @IBOutlet weak var iconImageView: UIImageView!\n    @IBOutlet weak var nameLabel: UILabel!\n    @IBOutlet weak var descLabel: UILabel!\n    @IBOutlet weak var lineView: UIView!\n    \n    weak var delegate: GameTopicCollectionViewCellDelegate?\n    \n    var model: GameTopicModel! {\n        didSet {\n            iconImageView.image = UIImage(named: model.iconImageName)\n            nameLabel.text = model.name\n            descLabel.text = model.desc\n        }\n    }\n    \n    \n    @IBAction func getAction(_ sender: UIButton) {\n        delegate?.gameTopicCollectionViewCellDidClickGet(self)\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Topic/GameTopicCollectionViewCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"gTV-IL-0wX\" customClass=\"GameTopicCollectionViewCell\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"322\" height=\"87\"/>\n            <autoresizingMask key=\"autoresizingMask\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"322\" height=\"87\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                <subviews>\n                    <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EZb-bM-8Tl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"8\" width=\"62\" height=\"62\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"62\" id=\"Auj-Bl-al7\"/>\n                            <constraint firstAttribute=\"height\" constant=\"62\" id=\"fUm-d0-x2g\"/>\n                        </constraints>\n                    </imageView>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OZk-FT-FLd\">\n                        <rect key=\"frame\" x=\"70\" y=\"18\" width=\"42\" height=\"21\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kua-jD-qdJ\">\n                        <rect key=\"frame\" x=\"70\" y=\"44\" width=\"33\" height=\"16\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hXZ-EQ-7Aq\">\n                        <rect key=\"frame\" x=\"249\" y=\"28.5\" width=\"73\" height=\"30\"/>\n                        <color key=\"backgroundColor\" red=\"0.94117647059999998\" green=\"0.94117647059999998\" blue=\"0.96862745100000003\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"73\" id=\"TeE-4c-m8T\"/>\n                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"q7e-kw-wlV\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"15\"/>\n                        <state key=\"normal\" title=\"Get\"/>\n                        <userDefinedRuntimeAttributes>\n                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                <real key=\"value\" value=\"15\"/>\n                            </userDefinedRuntimeAttribute>\n                        </userDefinedRuntimeAttributes>\n                        <connections>\n                            <action selector=\"getAction:\" destination=\"gTV-IL-0wX\" eventType=\"touchUpInside\" id=\"qki-Wa-ztp\"/>\n                        </connections>\n                    </button>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0hw-LK-ltQ\">\n                        <rect key=\"frame\" x=\"70\" y=\"86\" width=\"252\" height=\"1\"/>\n                        <color key=\"backgroundColor\" red=\"0.8784313725490196\" green=\"0.8784313725490196\" blue=\"0.8784313725490196\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"0.80000000000000004\" id=\"fBJ-Wf-tCA\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n            </view>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n            <constraints>\n                <constraint firstItem=\"Kua-jD-qdJ\" firstAttribute=\"leading\" secondItem=\"EZb-bM-8Tl\" secondAttribute=\"trailing\" constant=\"8\" id=\"1fP-XW-KK8\"/>\n                <constraint firstItem=\"OZk-FT-FLd\" firstAttribute=\"leading\" secondItem=\"EZb-bM-8Tl\" secondAttribute=\"trailing\" constant=\"8\" id=\"Aq5-3u-nud\"/>\n                <constraint firstItem=\"0hw-LK-ltQ\" firstAttribute=\"leading\" secondItem=\"Kua-jD-qdJ\" secondAttribute=\"leading\" id=\"DXU-bD-tus\"/>\n                <constraint firstItem=\"EZb-bM-8Tl\" firstAttribute=\"top\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"top\" constant=\"8\" id=\"Gfe-B6-xje\"/>\n                <constraint firstItem=\"EZb-bM-8Tl\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"T3H-lW-2vV\"/>\n                <constraint firstItem=\"Kua-jD-qdJ\" firstAttribute=\"top\" secondItem=\"OZk-FT-FLd\" secondAttribute=\"bottom\" constant=\"5\" id=\"W9I-x6-Shc\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"0hw-LK-ltQ\" secondAttribute=\"bottom\" id=\"aGQ-fl-JXo\"/>\n                <constraint firstItem=\"hXZ-EQ-7Aq\" firstAttribute=\"centerY\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerY\" id=\"dOk-bg-CQ1\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"hXZ-EQ-7Aq\" secondAttribute=\"trailing\" id=\"f9Q-r1-Sk4\"/>\n                <constraint firstItem=\"OZk-FT-FLd\" firstAttribute=\"top\" secondItem=\"EZb-bM-8Tl\" secondAttribute=\"top\" constant=\"10\" id=\"mh0-MW-V4J\"/>\n                <constraint firstItem=\"ZTg-uK-7eu\" firstAttribute=\"trailing\" secondItem=\"0hw-LK-ltQ\" secondAttribute=\"trailing\" id=\"w09-oG-70H\"/>\n            </constraints>\n            <viewLayoutGuide key=\"safeArea\" id=\"ZTg-uK-7eu\"/>\n            <size key=\"customSize\" width=\"322\" height=\"87\"/>\n            <connections>\n                <outlet property=\"descLabel\" destination=\"Kua-jD-qdJ\" id=\"7nY-rM-5mQ\"/>\n                <outlet property=\"iconImageView\" destination=\"EZb-bM-8Tl\" id=\"juN-9O-5EN\"/>\n                <outlet property=\"lineView\" destination=\"0hw-LK-ltQ\" id=\"SoG-rm-mez\"/>\n                <outlet property=\"nameLabel\" destination=\"OZk-FT-FLd\" id=\"g87-eP-RwD\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"131.8840579710145\" y=\"62.611607142857139\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Game/View/Topic/GameTopicTableViewCell.swift",
    "content": "//\n//  GameTopicTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/6.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass GameTopicTableViewCell: UITableViewCell {\n    \n    var detailClosure: (()->())?\n    var downloadClosure: ((_ model: GameTopicModel)->())?\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        contentView.addSubview(headerView)\n        contentView.addSubview(topicCollectionView)\n    }\n    \n    private lazy var headerView: CommonSectionHeaderView = {\n        let frame = CGRect(x: 0, y: 0, width: kScreenW, height: 42)\n        let it = CommonSectionHeaderView(frame: frame)\n        it.changeSectionTitle(with: \"What We're Playing\")\n        return it\n    }()\n    \n    private lazy var topicCollectionView: GameTopicCollectionView = {\n        let itemSize = CGSize(width: kScreenW - 2 * GlobalConstants.leftMargin, height: 80)\n        let frame = CGRect(x: 0, y: 42, width: kScreenW, height: 80 * 3)\n        let layout = CommonCollectionFlowLayout(itemSize: itemSize)\n        let collectionView = GameTopicCollectionView(frame: frame, collectionViewLayout: layout)\n        collectionView.dataSource = self\n        collectionView.delegate = self\n        return collectionView\n    }()\n}\n\nextension GameTopicTableViewCell: UICollectionViewDataSource,UICollectionViewDelegate {\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        if collectionView == topicCollectionView {\n            return TopicDataSource.count\n        }\n        return 0\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        if collectionView == topicCollectionView {\n            let cell = collectionView.ut_dequeueReusable(GameTopicCollectionViewCell.self, for: indexPath)\n            cell.delegate = self\n            cell.model = TopicDataSource[indexPath.row]\n            cell.lineView.isHidden = (((indexPath.row + 1) % 3 == 0) || (indexPath.row == TopicDataSource.count - 1))\n            return cell\n        }\n        return UICollectionViewCell()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\n        detailClosure?()\n    }\n}\n\nextension GameTopicTableViewCell: GameTopicCollectionViewCellDelegate {\n    \n    func gameTopicCollectionViewCellDidClickGet(_ topicCell: GameTopicCollectionViewCell) {\n        guard let indexPath = topicCollectionView.indexPath(for: topicCell) else { return }\n        downloadClosure?(TopicDataSource[indexPath.item])\n    }\n}\n\nfileprivate let TopicDataSource: [GameTopicModel] = [\n    GameTopicModel(name: \"Bullet Hell\", desc: \"Casual\", iconImageName: \"logo_broadcast\"),\n    GameTopicModel(name: \"Hot Wheels\", desc: \"Strategy\", iconImageName: \"logo_car\"),\n    GameTopicModel(name: \"SpellForce - Heroes\", desc: \"Card\", iconImageName: \"logo_jump\"),\n    GameTopicModel(name: \"Farm Punks\", desc: \"Role-Playing\", iconImageName: \"logo_smile\"),\n    GameTopicModel(name: \"Super Spinball\", desc: \"A musical journey awaits\", iconImageName: \"logo_weibo\"),\n]\n"
  },
  {
    "path": "AppStoreDemo/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>$(DEVELOPMENT_LANGUAGE)</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>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</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\t<key>UIUserInterfaceStyle</key>\n\t<string>Light</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "AppStoreDemo/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"15400\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"7gp-xX-vDA\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"15404\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Tab Bar Controller-->\n        <scene sceneID=\"YMh-JZ-4oj\">\n            <objects>\n                <tabBarController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"7gp-xX-vDA\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" id=\"VyS-0d-PkQ\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1000\" height=\"1000\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </tabBar>\n                    <connections>\n                        <segue destination=\"Aqn-rC-J8Q\" kind=\"relationship\" relationship=\"viewControllers\" id=\"nto-yd-aVS\"/>\n                        <segue destination=\"0bk-jh-Gf1\" kind=\"relationship\" relationship=\"viewControllers\" id=\"ZWJ-Ff-wnV\"/>\n                        <segue destination=\"sfx-ou-gVP\" kind=\"relationship\" relationship=\"viewControllers\" id=\"FEh-q6-so7\"/>\n                        <segue destination=\"gLP-mw-QVg\" kind=\"relationship\" relationship=\"viewControllers\" id=\"dm8-sU-NtG\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Zpc-zI-abD\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-458\" y=\"-306\"/>\n        </scene>\n        <!--Search-->\n        <scene sceneID=\"Owz-qb-slY\">\n            <objects>\n                <tableViewController id=\"Qxn-VB-fUK\" customClass=\"SearchTableViewController\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"QEW-sE-ETH\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <view key=\"tableFooterView\" contentMode=\"scaleToFill\" id=\"4ai-DU-AEW\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        </view>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Qxn-VB-fUK\" id=\"r8T-64-Iwg\"/>\n                            <outlet property=\"delegate\" destination=\"Qxn-VB-fUK\" id=\"fwu-HP-vV6\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Search\" largeTitleDisplayMode=\"always\" id=\"pP4-E8-Y0F\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Wp5-D3-Lwg\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2061\" y=\"806\"/>\n        </scene>\n        <!--Updates-->\n        <scene sceneID=\"5or-tl-5GI\">\n            <objects>\n                <tableViewController id=\"S1q-f5-Z8X\" customClass=\"UpdateTableViewController\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"none\" allowsSelection=\"NO\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"Zgl-og-TgX\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"756\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <inset key=\"separatorInset\" minX=\"20\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"S1q-f5-Z8X\" id=\"dmv-eC-fVg\"/>\n                            <outlet property=\"delegate\" destination=\"S1q-f5-Z8X\" id=\"zq0-ox-mKA\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Updates\" largeTitleDisplayMode=\"always\" id=\"Q6X-mc-MFL\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"gmK-MI-F1S\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"880\" y=\"1026\"/>\n        </scene>\n        <!--Today-->\n        <scene sceneID=\"ja9-Bk-QuO\">\n            <objects>\n                <tableViewController id=\"Aqn-rC-J8Q\" customClass=\"TodayViewController\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"zun-x5-pzu\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Aqn-rC-J8Q\" id=\"of2-9S-K8j\"/>\n                            <outlet property=\"delegate\" destination=\"Aqn-rC-J8Q\" id=\"Dmr-kZ-Fbf\"/>\n                        </connections>\n                    </tableView>\n                    <tabBarItem key=\"tabBarItem\" title=\"Today\" image=\"tabbar_today\" id=\"wO6-Bm-6Qm\"/>\n                    <navigationItem key=\"navigationItem\" id=\"DTm-bH-qfa\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"ReK-BJ-5vP\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1209\" y=\"-1187\"/>\n        </scene>\n        <!--Search-->\n        <scene sceneID=\"tOJ-8S-p6p\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"gLP-mw-QVg\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Search\" image=\"tabbar_search\" id=\"M1r-rh-aBa\"/>\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" largeTitles=\"YES\" id=\"lmM-4Y-70L\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"96\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"barTintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"Qxn-VB-fUK\" kind=\"relationship\" relationship=\"rootViewController\" id=\"KjB-XS-G6z\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"eGc-GV-yKt\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2061\" y=\"66\"/>\n        </scene>\n        <!--Updates-->\n        <scene sceneID=\"k4R-VK-LO4\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"sfx-ou-gVP\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Updates\" image=\"tabbar_updates\" id=\"ztJ-x8-NSN\"/>\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" translucent=\"NO\" largeTitles=\"YES\" id=\"d1t-VT-7Y5\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"96\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"barTintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"S1q-f5-Z8X\" kind=\"relationship\" relationship=\"rootViewController\" id=\"r9c-06-fFn\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"hY8-Hj-V9m\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"881\" y=\"291\"/>\n        </scene>\n        <!--Games-->\n        <scene sceneID=\"cjX-zC-40O\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"0bk-jh-Gf1\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Games\" image=\"tabbar_games\" id=\"f89-e2-CjX\"/>\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" translucent=\"NO\" largeTitles=\"YES\" id=\"txg-gB-TGy\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"96\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"barTintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"wxJ-JV-VGz\" kind=\"relationship\" relationship=\"rootViewController\" id=\"4ge-Hg-8WZ\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"efs-GP-7qb\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2060.8695652173915\" y=\"-938.16964285714278\"/>\n        </scene>\n        <!--Game-->\n        <scene sceneID=\"U3a-Wp-BNs\">\n            <objects>\n                <tableViewController id=\"wxJ-JV-VGz\" customClass=\"GameTableViewController\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"none\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"KJw-Rc-EV2\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"756\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"wxJ-JV-VGz\" id=\"hIa-3P-DDK\"/>\n                            <outlet property=\"delegate\" destination=\"wxJ-JV-VGz\" id=\"PaO-Wf-Xdj\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Game\" largeTitleDisplayMode=\"always\" id=\"d9w-dm-4CR\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"aNN-aQ-LD5\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2929\" y=\"-938\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"tabbar_games\" width=\"20\" height=\"22\"/>\n        <image name=\"tabbar_search\" width=\"22\" height=\"22\"/>\n        <image name=\"tabbar_today\" width=\"18\" height=\"22\"/>\n        <image name=\"tabbar_updates\" width=\"18\" height=\"22\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Search/Controller/SearchTableViewController.swift",
    "content": "//\n//  SearchTableViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass SearchTableViewController: UITableViewController {\n    \n    private var searchController: UISearchController!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        setNavigationBarBottomLineHidden(true)\n        setupSearchController()\n        \n        tableView.ut_registerClassCell(SearchTableViewCell.self)\n    }\n    \n    private func setupSearchController() {\n        \n        searchController = UISearchController(searchResultsController: nil)\n        searchController.searchBar.autocapitalizationType = .none\n        searchController.searchBar.placeholder = \"App Store\"\n        searchController.isActive = true\n        definesPresentationContext = true\n        \n        if #available(iOS 11.0, *) {\n            // For iOS 11 and later, place the search bar in the navigation bar.\n            navigationItem.searchController = searchController\n            \n            // Make the search bar always visible.\n            navigationItem.hidesSearchBarWhenScrolling = false\n        } else {\n            // For iOS 10 and earlier, place the search controller's search bar in the table view's header.\n            tableView.tableHeaderView = searchController.searchBar\n        }\n    }\n    \n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return dataList.count\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        \n        let cell = tableView.ut_dequeueReusable(SearchTableViewCell.self, for: indexPath)\n        cell.textLabel?.text = dataList[indexPath.row]\n        cell.canChangeHightlighted = (indexPath.row != 0)\n        \n        return cell\n    }\n\n}\n\nfileprivate let dataList: [String] = [\n    \"Hot Search\",\n    \"Daily life\",\n    \"League of Legends\",\n    \"Wechat\",\n    \"Game of Thrones\",\n    \"Hupu JRS\",\n    \"Game Center\",\n    \"QQ Music\"\n]\n"
  },
  {
    "path": "AppStoreDemo/Search/View/SearchTableViewCell.swift",
    "content": "//\n//  SearchTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass SearchTableViewCell: UITableViewCell {\n    \n    var canChangeHightlighted: Bool = false {\n        didSet {\n            if !canChangeHightlighted {\n                textLabel?.textColor = .black\n            }\n        }\n    }    \n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func setHighlighted(_ highlighted: Bool, animated: Bool) {\n        super.setHighlighted(highlighted, animated: animated)\n        \n        if !canChangeHightlighted { return }\n        \n        if highlighted {\n            textLabel?.textColor = .white\n            backgroundColor = GlobalConstants.textBlueColor\n        } else {\n            textLabel?.textColor = GlobalConstants.textBlueColor\n            backgroundColor = .white\n        }        \n    }        \n    \n    private func setupUI() {\n        textLabel?.textColor = GlobalConstants.textBlueColor\n        textLabel?.font = UIFont.systemFont(ofSize: 19)\n        selectionStyle = .none\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Today/Controller/CardDetailViewController.swift",
    "content": "//\n//  CardDetailViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass CardDetailViewController: UIViewController {\n    \n    override var prefersStatusBarHidden: Bool {\n        return true\n    }\n    \n    var dismissClosure: (()->())?\n    //the point when start to interactive\n    var interactiveStartingPoint: CGPoint? = nil\n\n    var draggingDownToDismiss = false\n    \n    let cell: TodayTableViewCell!\n    \n    private lazy var dismissPanGesture: UIPanGestureRecognizer = {\n        let ges = UIPanGestureRecognizer()\n        ges.maximumNumberOfTouches = 1\n        ges.addTarget(self, action: #selector(handleDismissPan(gesture:)))\n        ges.delegate = self\n        return ges\n    }()\n    \n    lazy var scrollView: DetailScrollView = {\n        let frame = self.view.bounds\n        let view = DetailScrollView(frame: frame)\n        view.delegate = self\n        return view\n    }()\n    \n    lazy var closeBtn: UIButton = {\n        let btn = UIButton()\n        btn.frame = CGRect(x: kScreenW - 20 - 30, y: 20, width: 30, height: 30)\n        btn.setImage(#imageLiteral(resourceName: \"close_button\"), for: .normal)\n        btn.addTarget(self, action: #selector(closeAction), for: .touchUpInside)\n        return btn\n    }()\n    \n    init(cell: TodayTableViewCell) {\n        self.cell = cell\n        super.init(nibName: nil, bundle: nil)\n        self.setupTranstion()\n    }\n    \n    private func setupTranstion() {\n        modalPresentationStyle = .custom\n        transitioningDelegate = self\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        setupUI()\n        getImageFromCell()\n    }\n    \n    private func setupUI() {\n        self.view.backgroundColor = .white\n        self.view.layer.masksToBounds = true\n        view.addSubview(scrollView)\n        view.addSubview(closeBtn)\n        view.addGestureRecognizer(dismissPanGesture)\n        \n        if #available(iOS 11.0, *) {\n            scrollView.contentInsetAdjustmentBehavior = .never\n        } else {\n            automaticallyAdjustsScrollViewInsets = false\n        }\n    }\n    \n    private func getImageFromCell() {\n        scrollView.imageView.image = cell.bgImageView.image\n    }\n    \n    @objc private func closeAction() {\n        dismiss(animated: true, completion: nil)\n        dismissClosure?()\n    }\n    \n    @objc private func handleDismissPan(gesture: UIPanGestureRecognizer) {\n        if !draggingDownToDismiss {\n            return\n        }\n        \n        let startingPoint: CGPoint\n        \n        if let p = interactiveStartingPoint {\n            startingPoint = p\n        } else {\n            startingPoint = gesture.location(in: nil)\n            interactiveStartingPoint = startingPoint\n        }\n\n        let currentLocation = gesture.location(in: nil)\n        \n        var progress = (currentLocation.y - startingPoint.y) / 100\n        \n        //prevent viewController bigger when scrolling up\n        if currentLocation.y <= startingPoint.y {\n            progress = 0\n        }\n        \n        if progress >= 1.0 {\n            dismiss(animated: true, completion: nil)\n            dismissClosure?()\n            stopDismissPanGesture(gesture)\n            return\n        }\n\n        let targetShrinkScale: CGFloat = 0.86\n        let currentScale: CGFloat = 1 - (1 - targetShrinkScale) * progress\n        \n        switch gesture.state {\n        case .began,.changed:\n            scrollView.isScrollEnabled = false\n            gesture.view?.transform = CGAffineTransform(scaleX: currentScale, y: currentScale)\n            gesture.view?.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius * (progress)\n            scrollView.showsVerticalScrollIndicator = false\n        case .cancelled,.ended:\n            scrollView.isScrollEnabled = true\n            stopDismissPanGesture(gesture)\n        default:\n            break\n        }\n    }\n    \n    //当下拉Offset超过100或取消下拉手势时，执行此方法\n    private func stopDismissPanGesture(_ gesture: UIPanGestureRecognizer) {\n        draggingDownToDismiss = false\n        interactiveStartingPoint = nil\n        scrollView.showsVerticalScrollIndicator = true\n        \n        UIView.animate(withDuration: 0.2) {\n            gesture.view?.transform = CGAffineTransform.identity\n        }\n    }\n\n}\n\nextension CardDetailViewController: UIViewControllerTransitioningDelegate {\n    \n    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        return TodayAnimationTransition(animationType: .present)\n    }\n    \n    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        return TodayAnimationTransition(animationType: .dismiss)\n    }\n    \n    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {\n        return CardPresentationController(presentedViewController: presented, presenting: presenting)\n    }\n}\n\nextension CardDetailViewController: UIScrollViewDelegate {\n    func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        \n        if scrollView.contentOffset.y < 0 {\n            scrollView.contentOffset = .zero\n            draggingDownToDismiss = true\n        }\n    }\n}\n\nextension CardDetailViewController: UIGestureRecognizerDelegate {\n    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {\n        return true\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Today/Controller/CardPresentationController.swift",
    "content": "//\n//  TodayPresentationController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\n\nimport UIKit\n\nclass CardPresentationController: UIPresentationController {\n    \n    private lazy var blurView = UIVisualEffectView(effect: nil)\n    \n    override var shouldRemovePresentersView: Bool {\n        return false\n    }\n    \n    override func presentationTransitionWillBegin() {\n        let container = containerView!\n        blurView.translatesAutoresizingMaskIntoConstraints = false\n        container.addSubview(blurView)\n        blurView.edges(to: container)\n        blurView.alpha = 0.0\n        \n        presentingViewController.beginAppearanceTransition(false, animated: false)\n        presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in\n            self.blurView.effect = UIBlurEffect(style: .light)\n            self.blurView.alpha = 1\n        }) { (ctx) in }\n    }\n    \n    override func presentationTransitionDidEnd(_ completed: Bool) {\n        presentingViewController.endAppearanceTransition()\n    }\n    \n    override func dismissalTransitionWillBegin() {\n        presentingViewController.beginAppearanceTransition(true, animated: true)\n        presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in\n            self.blurView.alpha = 0.0\n        }, completion: nil)\n    }\n    \n    override func dismissalTransitionDidEnd(_ completed: Bool) {\n        presentingViewController.endAppearanceTransition()\n        if completed {\n            blurView.removeFromSuperview()\n        }\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Today/Controller/TodayViewController.swift",
    "content": "//\n//  TodayViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass TodayViewController: UITableViewController {\n    \n    var selectedCell: TodayTableViewCell?\n    \n    var statusBarShouldBeHidden = false\n    //we need to set `View controller-based status bar appearance = YES` in info.plist.\n    //so we can be able to hide statusBar.\n    override var prefersStatusBarHidden: Bool {\n        return statusBarShouldBeHidden\n    }\n    \n    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {\n        return .slide\n    }\n    \n    lazy var headerView: TodayTableHeaderView = {\n        let frame = CGRect(x: 0, y: 0, width: kScreenW, height: 96)\n        let view = TodayTableHeaderView(frame: frame)\n        view.iconButtonClosure = { [weak self] in\n            guard let StrongSelf = self else { return }\n            StrongSelf.presentUserTableViewController()\n        }\n        return view\n    }()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        setupTableView()\n        \n        \n    }\n\n    private func setupTableView() {\n        tableView.ut_registerClassCell(TodayTableViewCell.self)\n        tableView.separatorStyle = .none\n        tableView.rowHeight = GlobalConstants.toDayCardRowH\n        tableView.tableHeaderView = headerView\n    }\n    \n    private func updateStatusBarAndTabbarFrame(visible: Bool) {\n        statusBarShouldBeHidden = !visible\n        UIView.animate(withDuration: 0.25) {\n            self.setNeedsStatusBarAppearanceUpdate()\n        }\n    }\n\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return 2\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.ut_dequeueReusable(TodayTableViewCell.self, for: indexPath)\n        cell.selectionStyle = .none\n        if indexPath.row == 0 {\n            cell.bgImageView.image = #imageLiteral(resourceName: \"cover_4\")\n        } else {\n            cell.bgImageView.image = #imageLiteral(resourceName: \"cover_5\")\n        }\n        return cell\n    }\n    \n    override func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {\n        guard let row = tableView.cellForRow(at: indexPath) as? TodayTableViewCell else { return }\n        UIView.animate(withDuration: 0.1) {\n            row.bgBackView.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)\n        }\n    }\n    \n    override func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) {\n        guard let row = tableView.cellForRow(at: indexPath) as? TodayTableViewCell else { return }\n        UIView.animate(withDuration: 0.3) {\n            row.bgBackView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)\n        }\n    }\n\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n\n        guard let cell = tableView.cellForRow(at: indexPath) as? TodayTableViewCell else { return }\n        selectedCell = cell\n        \n        let detailVC = CardDetailViewController(cell: cell)\n        \n        detailVC.dismissClosure = { [weak self] in\n            guard let StrongSelf = self else { return }\n            StrongSelf.updateStatusBarAndTabbarFrame(visible: true)\n        }\n        \n        updateStatusBarAndTabbarFrame(visible: false)\n        \n        present(detailVC, animated: true, completion: nil)        \n\n    }\n}\n\n\n"
  },
  {
    "path": "AppStoreDemo/Today/Model/TodayAnimationTransition.swift",
    "content": "//\n//  TodayAnimationTransition.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nfileprivate let transitonDuration: TimeInterval = 1.0\n\n\nenum AnimationType {\n    case present\n    case dismiss\n}\n\nclass TodayAnimationTransition: NSObject {\n    let animationType: AnimationType!\n    \n    init(animationType: AnimationType) {\n        self.animationType = animationType\n        super.init()\n    }\n}\n\nextension TodayAnimationTransition: UIViewControllerAnimatedTransitioning {\n    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {\n        return transitonDuration\n    }\n    \n    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {\n        if animationType == .present {\n            animationForPresent(using: transitionContext)\n        } else {\n            animationForDismiss(using: transitionContext)\n        }\n    }\n    \n    func animationForPresent(using transitionContext: UIViewControllerContextTransitioning) {\n        let containerView = transitionContext.containerView\n        //1.Get fromVC and toVC\n        guard let fromVC = transitionContext.viewController(forKey: .from) as? UITabBarController else { return }\n        guard let tableViewController = fromVC.viewControllers?.first as? TodayViewController else { return }\n        guard let toVC = transitionContext.viewController(forKey: .to) as? CardDetailViewController else { return }\n        guard let selectedCell = tableViewController.selectedCell else { return }\n        \n        let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: fromVC.view)        \n        //2.Set presentation original size.\n        toVC.view.frame = frame\n        toVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width\n        toVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height\n        \n        containerView.addSubview(toVC.view)\n        \n        //3.Change original size to final size with animation.\n        UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {\n            toVC.view.frame = UIScreen.main.bounds\n            toVC.scrollView.imageView.frame.size.width = kScreenW\n            toVC.scrollView.imageView.frame.size.height = GlobalConstants.cardDetailTopImageH\n            toVC.closeBtn.alpha = 1\n            \n            fromVC.tabBar.frame.origin.y = kScreenH\n        }) { (completed) in\n            transitionContext.completeTransition(completed)\n        }\n    }\n    \n    func animationForDismiss(using transitionContext: UIViewControllerContextTransitioning) {\n        guard let fromVC = transitionContext.viewController(forKey: .from) as? CardDetailViewController else { return }\n        guard let toVC = transitionContext.viewController(forKey: .to) as? UITabBarController else { return }\n        guard let tableViewController = toVC.viewControllers?.first as? TodayViewController else { return }\n        guard let selectedCell = tableViewController.selectedCell else { return }\n        \n        UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {\n            let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: toVC.view)\n            fromVC.view.frame = frame\n            fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius\n            fromVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width\n            fromVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height\n            fromVC.closeBtn.alpha = 0\n            \n            toVC.tabBar.frame.origin.y = kScreenH - toVC.tabBar.frame.height\n        }) { (completed) in\n            transitionContext.completeTransition(completed)\n            toVC.view.addSubview(toVC.tabBar)\n        }\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Today/View/DetailScrollView.swift",
    "content": "//\n//  DetailScrollView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass DetailScrollView: UIScrollView {\n    \n    let bgBackView = UIView()\n    let imageView = UIImageView()\n    let textView = UITextView()\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        bgBackView.frame = CGRect(x: 0, y: 0, width: kScreenW, height: GlobalConstants.cardDetailTopImageH)\n        bgBackView.layer.masksToBounds = true\n        \n        imageView.frame = bgBackView.bounds\n        imageView.isUserInteractionEnabled = true\n        imageView.contentMode = .scaleAspectFill                \n        \n        let textViewWidth = kScreenW - 2 * textViewLeftMargin\n        let font = UIFont.boldSystemFont(ofSize: 15)\n        let textHeight = textViewText.calculateHeightWith(width: textViewWidth, font: font)\n        textView.frame = CGRect(x: textViewLeftMargin, y: bgBackView.frame.height + textViewTopMargin, width: textViewWidth, height: textHeight + textViewBottomMargin)\n        textView.text = textViewText\n        textView.font = font\n        textView.textColor = .gray\n        \n        bgBackView.addSubview(imageView)\n        addSubview(bgBackView)\n        addSubview(textView)\n    \n        contentSize = CGSize(width: kScreenW, height: bgBackView.frame.height + textViewTopMargin + textView.frame.height + textViewBottomMargin)\n    }\n\n}\n\n\nfileprivate let textViewLeftMargin: CGFloat = 20\nfileprivate let textViewTopMargin: CGFloat = 40\nfileprivate let textViewBottomMargin: CGFloat = 50\nfileprivate let textViewText = \"Thank you. I'm honored to be with you today for your commencement from one of the finest universities in the world. Truth be told, i never graduated from college and this is the closest I've ever gotten to a college gradution. \\n\\nToday i want to tell you three stories from my life. That's it. No big deal. Just three stories. The first story is about connecting the dots. \\n\\ndropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out? \\n\\nIt started before I was born. My biological mother was a young,unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: 'We got an unexpected baby boy; do you want him?' They said: 'Of course.' My biological mother found out later that my mother had never graduated from college and  my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would  go to college.\"\n"
  },
  {
    "path": "AppStoreDemo/Today/View/TodayTableHeaderView.swift",
    "content": "//\n//  TodayTableHeaderView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass TodayTableHeaderView: UIView {\n\n    let dateLabel = UILabel()\n    let todayLabel = UILabel()\n    let iconButton = UIButton()\n    \n    var iconButtonClosure: (()->())?\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        dateLabel.text = \"TUESDAY, JULY 10\"\n        dateLabel.textColor = .gray\n        dateLabel.font = UIFont.boldSystemFont(ofSize: 13)\n        dateLabel.frame = CGRect(x: 20, y: 33, width: 200, height: 15)\n        \n        todayLabel.text = \"Today\"\n        todayLabel.font = UIFont.boldSystemFont(ofSize: 34)\n        todayLabel.frame = CGRect(x: 20, y: 48, width: 200, height: 40)\n        \n        iconButton.setImage(#imageLiteral(resourceName: \"demo_icon\"), for: .normal)\n        iconButton.setImage(#imageLiteral(resourceName: \"demo_icon\"), for: .highlighted)\n        iconButton.frame = CGRect(x: kScreenW - 20 - 40, y: 46, width: 35, height: 35)\n        iconButton.layer.cornerRadius = GlobalConstants.iconCornerRadius\n        iconButton.layer.borderColor = GlobalConstants.iconBorderColor\n        iconButton.layer.borderWidth = GlobalConstants.iconBorderWidth\n        iconButton.addTarget(self, action: #selector(iconButtonAction), for: .touchUpInside)\n        \n        addSubview(dateLabel)\n        addSubview(todayLabel)\n        addSubview(iconButton)\n    }\n    \n    @objc private func iconButtonAction() {\n        iconButtonClosure?()\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo/Today/View/TodayTableViewCell.swift",
    "content": "//\n//  TodayTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/7/31.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass TodayTableViewCell: UITableViewCell {\n    \n    let bgBackView = UIView()\n    let bgImageView = UIImageView()    \n    let emptyView = UIView()\n\n    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        setupUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func setupUI() {\n        \n        bgBackView.addSubview(bgImageView)\n        contentView.addSubview(bgBackView)\n        contentView.addSubview(emptyView)\n        \n        bgBackView.frame = CGRect(x: GlobalConstants.leftMargin, y: 0, width: GlobalConstants.todayCardSize.width, height: GlobalConstants.todayCardSize.height)\n        bgBackView.layer.shadowColor = UIColor.black.cgColor\n        bgBackView.layer.shadowOpacity = 0.4\n        bgBackView.layer.shadowOffset = CGSize(width: 0, height: 1)\n        \n        bgImageView.frame = bgBackView.bounds\n        bgImageView.contentMode = .scaleAspectFill\n        bgImageView.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius\n        bgImageView.layer.masksToBounds = true\n        \n        emptyView.backgroundColor = UIColor.white.withAlphaComponent(0)\n        emptyView.frame = CGRect(x: 0, y: bgImageView.frame.size.height, width: GlobalConstants.todayCardSize.width, height: GlobalConstants.toDayCardRowH - GlobalConstants.todayCardSize.height)\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Update/Controller/UpdateTableViewController.swift",
    "content": "//\n//  UpdateTableViewController.swift\n//  AppStoreDemo\n//\n//  Created by Erwin on 2019/8/4.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass UpdateTableViewController: UITableViewController {\n    \n    var dataSource = DataSource\n    \n    //record cellHeight to prevent flickering when tapped `more`\n    var cellHeights: [IndexPath: CGFloat] = [:]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        adjustNavigationForiOS13()\n        setNavigationBarBottomLineHidden(true)\n        addIconButtonOnNavigationBar()\n        configTableView()\n    }\n    \n    private func configTableView() {\n        tableView.ut_registerNibCell(UpdateTableViewCell.self)\n    }\n    \n    //add iconButton to LargeTitleView\n    \n    @objc func rightButtonTapped(_ btn: UIButton) {\n        presentUserTableViewController()\n    }\n\n    // MARK: - Table view data source\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        // #warning Incomplete implementation, return the number of rows\n        return dataSource.count\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.ut_dequeueReusable(UpdateTableViewCell.self, for: indexPath)\n        cell.isFirstCell = (indexPath.row == 0)\n        cell.updateClosure = { [weak self] tappedCell in\n            guard let StrongSelf = self else { return }\n            StrongSelf.dataSource[indexPath.row].showMore = true\n            StrongSelf.tableView.reloadRows(at: [indexPath], with: .none)\n            print(indexPath)\n        }\n        cell.model = dataSource[indexPath.row]\n        return cell\n    }\n    \n    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {\n        cellHeights[indexPath] = cell.frame.size.height\n    }\n    \n    override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {\n        if let height = cellHeights[indexPath] {\n            return height\n        } else {\n            return UITableView.automaticDimension\n        }\n    }\n    \n    override func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        if scrollView.contentOffset.y > 0 {\n            setNavigationBarBottomLineHidden(false)\n        } else {\n            setNavigationBarBottomLineHidden(true)\n        }\n    }\n\n}\n\n\nfileprivate let DataSource: [UpdateModel] = [\n    UpdateModel(appName: \"Huajiao Live\", updateDate: \"Today\", iconImageStr: \"logo_broadcast\", updateContent: \"[Play] Music radio broadcasting page revision, more immersed in music exploration \\n\\n[Mine] Rewriting sets the position of the night mode \\n\\n[Radio] Let's go with DJ and get up!\", version: \"2.0.0\", size: 35.7, showMore: false),\n    UpdateModel(appName: \"Sina Weibo\", updateDate: \"Today\", iconImageStr: \"logo_weibo\", updateContent: \"-Performance improvements and bug fixed\", version: \"5.3.3\", size: 32.5, showMore: false),\n    UpdateModel(appName: \"Sougou-input\", updateDate: \"Yesterday\", iconImageStr: \"logo_smile\", updateContent: \"Fix bug and to be better for you\", version: \"2.1.1\", size: 42.2, showMore: false),\n    UpdateModel(appName: \"Guazi Car\", updateDate: \"Yesterday\", iconImageStr: \"logo_car\", updateContent: \"Sometimes, a polish is all you need. No big chages, just a shine\", version: \"1.5.0\", size: 28.0, showMore: false),\n    UpdateModel(appName: \"Fly-chat\", updateDate: \"2019/08/02\", iconImageStr: \"logo_jump\", updateContent: \"This update includes bug fixed and user interface improvements\", version: \"1.5.6\", size: 33.0, showMore: false),\n]\n"
  },
  {
    "path": "AppStoreDemo/Update/Model/UpdateModel.swift",
    "content": "//\n//  UpdateModel.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport Foundation\n\nstruct UpdateModel {\n    let appName: String\n    let updateDate: String\n    let iconImageStr: String\n    let updateContent: String\n    let version: String\n    let size: Float\n    var showMore: Bool\n}\n"
  },
  {
    "path": "AppStoreDemo/Update/View/UpdateTableViewCell.swift",
    "content": "//\n//  UpdateTableViewCell.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass UpdateTableViewCell: UITableViewCell {\n\n    // MARK: - IBOutlets\n    @IBOutlet weak var topLeftLabel: UILabel!\n    @IBOutlet weak var updateAllBtn: UIButton!\n    @IBOutlet weak var contentLabel: UILabel!\n    @IBOutlet weak var showMoreBtn: UIButton!\n    @IBOutlet weak var iconImageView: UIImageView!\n    @IBOutlet weak var nameLabel: UILabel!\n    @IBOutlet weak var dateLabel: UILabel!\n    @IBOutlet weak var versionAndSizeLabel: UILabel!\n    \n    \n    // MARK: - Constraint\n    @IBOutlet weak var iconImageViewTopMargin: NSLayoutConstraint!\n    @IBOutlet weak var contentLabelBottomMargin: NSLayoutConstraint!\n    \n    \n    \n    // MARK: - Properties\n    // if the cell is the first cell in tableView, it would show more content than other cells\n    var isFirstCell: Bool = false {\n        didSet {\n            iconImageViewTopMargin.constant = isFirstCell ? 48 : 16\n            topLeftLabel.isHidden = !isFirstCell\n            updateAllBtn.isHidden = !isFirstCell\n        }\n    }\n    var model: UpdateModel! {\n        didSet {\n            iconImageView.image = UIImage(named: model.iconImageStr)\n            nameLabel.text = model.appName\n            dateLabel.text = model.updateDate\n            contentLabel.text = model.updateContent\n            versionAndSizeLabel.text = \"Version \" + model.version + \" · \" + String(model.size) + \" MB\"\n            \n            showMoreBtn.isHidden = model.showMore\n            contentLabel.numberOfLines = model.showMore ? 0 : 1\n            contentLabelBottomMargin.constant = model.showMore ? 60 : 20\n            versionAndSizeLabel.isHidden = !model.showMore\n        }\n    }\n    \n    var updateClosure: ((UpdateTableViewCell)->())?\n    \n    \n    // MARK: - IBAction\n    @IBAction func updateAllBtnAction(_ sender: UIButton) {\n        \n    }\n    @IBAction func showMoreBtnAction(_ sender: UIButton) {\n        updateClosure?(self)\n    }\n    \n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n    }\n    \n}\n"
  },
  {
    "path": "AppStoreDemo/Update/View/UpdateTableViewCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"171\" id=\"KGk-i7-Jjw\" customClass=\"UpdateTableViewCell\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"460\" height=\"168\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"KGk-i7-Jjw\" id=\"H2p-sc-9uM\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"460\" height=\"167.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CBp-XE-tH2\" userLabel=\"topLine\">\n                        <rect key=\"frame\" x=\"20\" y=\"1\" width=\"420\" height=\"0.5\"/>\n                        <color key=\"backgroundColor\" red=\"0.8784313725490196\" green=\"0.8784313725490196\" blue=\"0.8784313725490196\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"0.5\" id=\"if4-Fh-NQt\"/>\n                        </constraints>\n                    </view>\n                    <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"logo_weibo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TqU-LX-Ops\">\n                        <rect key=\"frame\" x=\"20\" y=\"17.5\" width=\"62\" height=\"62\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"62\" id=\"LbP-RU-7nB\"/>\n                            <constraint firstAttribute=\"height\" constant=\"62\" id=\"tbN-0b-D21\"/>\n                        </constraints>\n                    </imageView>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CKm-YC-TFA\">\n                        <rect key=\"frame\" x=\"94\" y=\"30.5\" width=\"262\" height=\"21\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hrX-rc-0n3\">\n                        <rect key=\"frame\" x=\"94\" y=\"54.5\" width=\"33\" height=\"16\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                        <color key=\"textColor\" red=\"0.56862745098039214\" green=\"0.56862745098039214\" blue=\"0.58039215686274503\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bKo-X1-PHr\">\n                        <rect key=\"frame\" x=\"366\" y=\"33.5\" width=\"74\" height=\"30\"/>\n                        <color key=\"backgroundColor\" red=\"0.94117647058823528\" green=\"0.94117647058823528\" blue=\"0.96862745098039216\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"74\" id=\"GWP-J9-IBB\"/>\n                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"GhT-m1-HQB\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" name=\"Helvetica-Bold\" family=\"Helvetica\" pointSize=\"14\"/>\n                        <state key=\"normal\" title=\"UPDATE\"/>\n                        <userDefinedRuntimeAttributes>\n                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                <real key=\"value\" value=\"15\"/>\n                            </userDefinedRuntimeAttribute>\n                        </userDefinedRuntimeAttributes>\n                    </button>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"ContentLabel\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jbI-7A-QXF\" userLabel=\"contentLabel\">\n                        <rect key=\"frame\" x=\"20\" y=\"102.5\" width=\"382\" height=\"32\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Pending\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"URh-dw-PlV\">\n                        <rect key=\"frame\" x=\"20\" y=\"14.5\" width=\"77.5\" height=\"24\"/>\n                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"20\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"wV8-ap-qcL\">\n                        <rect key=\"frame\" x=\"356\" y=\"9.5\" width=\"84\" height=\"34\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                        <state key=\"normal\" title=\"Update All\"/>\n                        <connections>\n                            <action selector=\"updateAllBtnAction:\" destination=\"KGk-i7-Jjw\" eventType=\"touchUpInside\" id=\"syz-AN-flT\"/>\n                        </connections>\n                    </button>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"psI-hH-YSr\">\n                        <rect key=\"frame\" x=\"20\" y=\"128.5\" width=\"40\" height=\"20\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                        <color key=\"textColor\" red=\"0.55686274509803924\" green=\"0.55686274509803924\" blue=\"0.5725490196078431\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uHz-PH-qrY\">\n                        <rect key=\"frame\" x=\"404\" y=\"103.5\" width=\"36\" height=\"30\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"36\" id=\"VvL-68-2C4\"/>\n                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"t1j-5p-qYx\"/>\n                        </constraints>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <state key=\"normal\" title=\"more\"/>\n                        <connections>\n                            <action selector=\"showMoreBtnAction:\" destination=\"KGk-i7-Jjw\" eventType=\"touchUpInside\" id=\"sMp-zR-WoG\"/>\n                        </connections>\n                    </button>\n                </subviews>\n                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                <constraints>\n                    <constraint firstItem=\"uHz-PH-qrY\" firstAttribute=\"leading\" secondItem=\"jbI-7A-QXF\" secondAttribute=\"trailing\" constant=\"2\" id=\"1PO-qm-MMz\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"wV8-ap-qcL\" secondAttribute=\"trailing\" constant=\"20\" id=\"1rT-bS-hqn\"/>\n                    <constraint firstItem=\"wV8-ap-qcL\" firstAttribute=\"centerY\" secondItem=\"URh-dw-PlV\" secondAttribute=\"centerY\" id=\"2ZZ-n3-jcW\"/>\n                    <constraint firstItem=\"URh-dw-PlV\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"7Ro-Su-ilD\"/>\n                    <constraint firstItem=\"CKm-YC-TFA\" firstAttribute=\"leading\" secondItem=\"TqU-LX-Ops\" secondAttribute=\"trailing\" constant=\"12\" id=\"AF2-ao-2by\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"psI-hH-YSr\" secondAttribute=\"bottom\" constant=\"19\" id=\"AKu-nb-rza\"/>\n                    <constraint firstItem=\"CKm-YC-TFA\" firstAttribute=\"top\" secondItem=\"TqU-LX-Ops\" secondAttribute=\"top\" constant=\"13\" id=\"BnW-bk-nGq\"/>\n                    <constraint firstItem=\"jbI-7A-QXF\" firstAttribute=\"top\" secondItem=\"TqU-LX-Ops\" secondAttribute=\"bottom\" constant=\"23\" id=\"EV6-Ii-AM5\"/>\n                    <constraint firstItem=\"CBp-XE-tH2\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"HQJ-md-mYn\"/>\n                    <constraint firstItem=\"jbI-7A-QXF\" firstAttribute=\"leading\" secondItem=\"TqU-LX-Ops\" secondAttribute=\"leading\" id=\"L8C-DI-Jrc\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"bKo-X1-PHr\" secondAttribute=\"trailing\" constant=\"20\" id=\"XdE-at-J52\"/>\n                    <constraint firstItem=\"uHz-PH-qrY\" firstAttribute=\"centerY\" secondItem=\"jbI-7A-QXF\" secondAttribute=\"centerY\" id=\"XhY-Rf-LzJ\"/>\n                    <constraint firstItem=\"psI-hH-YSr\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"aFb-q8-jis\"/>\n                    <constraint firstItem=\"TqU-LX-Ops\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" constant=\"20\" id=\"cQf-2A-W4y\"/>\n                    <constraint firstItem=\"uHz-PH-qrY\" firstAttribute=\"trailing\" secondItem=\"bKo-X1-PHr\" secondAttribute=\"trailing\" id=\"duf-53-E2N\"/>\n                    <constraint firstItem=\"bKo-X1-PHr\" firstAttribute=\"leading\" secondItem=\"CKm-YC-TFA\" secondAttribute=\"trailing\" constant=\"10\" id=\"hEe-oK-XYM\"/>\n                    <constraint firstItem=\"TqU-LX-Ops\" firstAttribute=\"top\" secondItem=\"CBp-XE-tH2\" secondAttribute=\"bottom\" constant=\"16\" id=\"jHi-Qu-oam\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"CBp-XE-tH2\" secondAttribute=\"trailing\" constant=\"20\" id=\"ktk-sm-4k7\"/>\n                    <constraint firstItem=\"bKo-X1-PHr\" firstAttribute=\"centerY\" secondItem=\"TqU-LX-Ops\" secondAttribute=\"centerY\" id=\"pyc-um-xTf\"/>\n                    <constraint firstItem=\"CBp-XE-tH2\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" constant=\"1\" id=\"r0t-E3-cr9\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"jbI-7A-QXF\" secondAttribute=\"bottom\" priority=\"999\" constant=\"33\" id=\"sxX-bu-Yav\"/>\n                    <constraint firstItem=\"hrX-rc-0n3\" firstAttribute=\"leading\" secondItem=\"CKm-YC-TFA\" secondAttribute=\"leading\" id=\"x9w-8q-CM9\"/>\n                    <constraint firstItem=\"hrX-rc-0n3\" firstAttribute=\"top\" secondItem=\"CKm-YC-TFA\" secondAttribute=\"bottom\" constant=\"3\" id=\"ylY-A5-zrQ\"/>\n                    <constraint firstItem=\"URh-dw-PlV\" firstAttribute=\"top\" secondItem=\"CBp-XE-tH2\" secondAttribute=\"bottom\" constant=\"13\" id=\"zWl-xg-Sta\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <viewLayoutGuide key=\"safeArea\" id=\"njF-e1-oar\"/>\n            <connections>\n                <outlet property=\"contentLabel\" destination=\"jbI-7A-QXF\" id=\"CnO-ea-CwT\"/>\n                <outlet property=\"contentLabelBottomMargin\" destination=\"sxX-bu-Yav\" id=\"zY6-nK-0NO\"/>\n                <outlet property=\"dateLabel\" destination=\"hrX-rc-0n3\" id=\"sfd-m0-XhE\"/>\n                <outlet property=\"iconImageView\" destination=\"TqU-LX-Ops\" id=\"ptV-5I-FMI\"/>\n                <outlet property=\"iconImageViewTopMargin\" destination=\"jHi-Qu-oam\" id=\"MnC-Ct-NEh\"/>\n                <outlet property=\"nameLabel\" destination=\"CKm-YC-TFA\" id=\"HmV-QQ-pcB\"/>\n                <outlet property=\"showMoreBtn\" destination=\"uHz-PH-qrY\" id=\"ryN-Dc-czo\"/>\n                <outlet property=\"topLeftLabel\" destination=\"URh-dw-PlV\" id=\"jZH-sF-xJ7\"/>\n                <outlet property=\"updateAllBtn\" destination=\"wV8-ap-qcL\" id=\"uju-09-cVn\"/>\n                <outlet property=\"versionAndSizeLabel\" destination=\"psI-hH-YSr\" id=\"YmG-Wd-cvR\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-636.23188405797111\" y=\"-91.741071428571431\"/>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"logo_weibo\" width=\"658\" height=\"658\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/User/Controller/UserTableViewController.swift",
    "content": "//\n//  UserTableViewController.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/5.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass UserTableViewController: UITableViewController {\n\n    @IBAction func completeAction(_ sender: UIBarButtonItem) {\n        dismiss(animated: true, completion: nil)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        setNavigationBarBottomLineHidden(true)\n    }\n\n    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return (section == 0 ? 36 : 29)\n    }\n    override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {\n        return 0.1\n    }\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        tableView.deselectRow(at: indexPath, animated: true)\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/User/View/User.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Account-->\n        <scene sceneID=\"wR4-ki-8mG\">\n            <objects>\n                <tableViewController id=\"YGI-SE-3qW\" customClass=\"UserTableViewController\" customModule=\"AppStoreDemo\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"grouped\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"18\" sectionFooterHeight=\"18\" id=\"wMT-zV-4VX\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" cocoaTouchSystemColor=\"groupTableViewBackgroundColor\"/>\n                        <inset key=\"separatorInset\" minX=\"15\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                        <sections>\n                            <tableViewSection id=\"VIy-FH-Jax\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" rowHeight=\"70\" id=\"P9z-pW-jNv\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"35\" width=\"414\" height=\"70\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"P9z-pW-jNv\" id=\"4LX-2J-pHI\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"376\" height=\"69.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"demo_icon\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Yb8-pw-pIE\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"7.5\" width=\"55\" height=\"55\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"55\" id=\"6Yq-Fg-WQC\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"55\" id=\"SAc-AY-BWj\"/>\n                                                    </constraints>\n                                                    <userDefinedRuntimeAttributes>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                            <real key=\"value\" value=\"27.5\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"number\" keyPath=\"borderWidth\">\n                                                            <real key=\"value\" value=\"0.80000000000000004\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                        <userDefinedRuntimeAttribute type=\"color\" keyPath=\"borderColor\">\n                                                            <color key=\"value\" red=\"0.93725490199999995\" green=\"0.94117647059999998\" blue=\"0.94509803920000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                        </userDefinedRuntimeAttribute>\n                                                    </userDefinedRuntimeAttributes>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Allen long\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BzQ-Ft-QO5\">\n                                                    <rect key=\"frame\" x=\"88\" y=\"13\" width=\"76\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"hello@qq.com\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3cN-EH-MnO\">\n                                                    <rect key=\"frame\" x=\"88\" y=\"38\" width=\"87\" height=\"16\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666669999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"Yb8-pw-pIE\" firstAttribute=\"leading\" secondItem=\"4LX-2J-pHI\" secondAttribute=\"leading\" constant=\"20\" id=\"BEA-FZ-KaA\"/>\n                                                <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"3cN-EH-MnO\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"KUe-ka-QGJ\"/>\n                                                <constraint firstItem=\"BzQ-Ft-QO5\" firstAttribute=\"top\" secondItem=\"4LX-2J-pHI\" secondAttribute=\"top\" constant=\"13\" id=\"PiM-OO-pHR\"/>\n                                                <constraint firstItem=\"BzQ-Ft-QO5\" firstAttribute=\"leading\" secondItem=\"Yb8-pw-pIE\" secondAttribute=\"trailing\" constant=\"13\" id=\"ZdT-ze-2RH\"/>\n                                                <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"BzQ-Ft-QO5\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"eIn-Gs-okz\"/>\n                                                <constraint firstItem=\"3cN-EH-MnO\" firstAttribute=\"leading\" secondItem=\"Yb8-pw-pIE\" secondAttribute=\"trailing\" constant=\"13\" id=\"fVs-VB-PI8\"/>\n                                                <constraint firstItem=\"Yb8-pw-pIE\" firstAttribute=\"centerY\" secondItem=\"4LX-2J-pHI\" secondAttribute=\"centerY\" id=\"fnc-7W-jX2\"/>\n                                                <constraint firstItem=\"3cN-EH-MnO\" firstAttribute=\"top\" secondItem=\"BzQ-Ft-QO5\" secondAttribute=\"bottom\" constant=\"4\" id=\"nNq-of-87p\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <inset key=\"separatorInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection id=\"KdZ-IK-0Bo\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" rowHeight=\"50\" id=\"hFb-iX-rpB\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"141\" width=\"414\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"hFb-iX-rpB\" id=\"jjq-Gw-gDO\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"376\" height=\"49.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Purchased\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"u5P-sB-A4I\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14.5\" width=\"336\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"u5P-sB-A4I\" firstAttribute=\"leading\" secondItem=\"jjq-Gw-gDO\" secondAttribute=\"leading\" constant=\"20\" id=\"3xc-Al-uO8\"/>\n                                                <constraint firstItem=\"u5P-sB-A4I\" firstAttribute=\"centerY\" secondItem=\"jjq-Gw-gDO\" secondAttribute=\"centerY\" id=\"8Sz-nG-FXI\"/>\n                                                <constraint firstAttribute=\"trailing\" relation=\"lessThanOrEqual\" secondItem=\"u5P-sB-A4I\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"alc-pl-ffn\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <inset key=\"separatorInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection id=\"8jh-fK-cK8\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" rowHeight=\"50\" id=\"IF6-vd-A0w\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"227\" width=\"414\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"IF6-vd-A0w\" id=\"eoS-c1-FqX\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"376\" height=\"49.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Personalised Recommendations\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OP9-Iq-wle\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14.5\" width=\"336\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"OP9-Iq-wle\" firstAttribute=\"centerY\" secondItem=\"eoS-c1-FqX\" secondAttribute=\"centerY\" id=\"GPL-yV-Rnv\"/>\n                                                <constraint firstItem=\"OP9-Iq-wle\" firstAttribute=\"leading\" secondItem=\"eoS-c1-FqX\" secondAttribute=\"leading\" constant=\"20\" id=\"bsP-w7-nix\"/>\n                                                <constraint firstAttribute=\"trailing\" relation=\"lessThanOrEqual\" secondItem=\"OP9-Iq-wle\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"nil-F7-QIQ\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <inset key=\"separatorInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection id=\"DPn-TB-0bP\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"50\" id=\"6a0-CJ-XGX\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"313\" width=\"414\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"6a0-CJ-XGX\" id=\"Lqi-S8-wpa\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"49.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Redeem Gift Card or Code\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"78n-yC-IBD\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14.5\" width=\"374\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"78n-yC-IBD\" firstAttribute=\"centerY\" secondItem=\"Lqi-S8-wpa\" secondAttribute=\"centerY\" id=\"e5o-KH-oy8\"/>\n                                                <constraint firstAttribute=\"trailing\" relation=\"lessThanOrEqual\" secondItem=\"78n-yC-IBD\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"je6-bu-KHA\"/>\n                                                <constraint firstItem=\"78n-yC-IBD\" firstAttribute=\"leading\" secondItem=\"Lqi-S8-wpa\" secondAttribute=\"leading\" constant=\"20\" id=\"rS8-Zm-rzw\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <inset key=\"separatorInset\" minX=\"20\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"50\" id=\"MJD-q6-zHw\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"363\" width=\"414\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"MJD-q6-zHw\" id=\"pFf-c2-EfR\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"49.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Add Funds to Apple ID\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lww-1G-S4T\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14.5\" width=\"374\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailing\" relation=\"lessThanOrEqual\" secondItem=\"Lww-1G-S4T\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"8Gx-sQ-QA1\"/>\n                                                <constraint firstItem=\"Lww-1G-S4T\" firstAttribute=\"leading\" secondItem=\"pFf-c2-EfR\" secondAttribute=\"leading\" constant=\"20\" id=\"Gm7-of-mhc\"/>\n                                                <constraint firstItem=\"Lww-1G-S4T\" firstAttribute=\"centerY\" secondItem=\"pFf-c2-EfR\" secondAttribute=\"centerY\" id=\"MhX-7x-ZWc\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <inset key=\"separatorInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection id=\"LRl-xE-nKN\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"50\" id=\"Wsw-XD-ufY\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"449\" width=\"414\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"Wsw-XD-ufY\" id=\"lzJ-54-yhE\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"49.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Sign Out\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kY1-Ke-TXD\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14.5\" width=\"374\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"kY1-Ke-TXD\" firstAttribute=\"leading\" secondItem=\"lzJ-54-yhE\" secondAttribute=\"leading\" constant=\"20\" id=\"HuN-w5-egW\"/>\n                                                <constraint firstItem=\"kY1-Ke-TXD\" firstAttribute=\"centerY\" secondItem=\"lzJ-54-yhE\" secondAttribute=\"centerY\" id=\"WHx-Ie-zNw\"/>\n                                                <constraint firstAttribute=\"trailing\" relation=\"lessThanOrEqual\" secondItem=\"kY1-Ke-TXD\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"vLE-Tl-aLk\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <inset key=\"separatorInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"YGI-SE-3qW\" id=\"KUn-VY-mxQ\"/>\n                            <outlet property=\"delegate\" destination=\"YGI-SE-3qW\" id=\"5uj-Ul-owv\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Account\" id=\"lAT-Du-WUT\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Done\" id=\"j6V-ta-NEW\">\n                            <connections>\n                                <action selector=\"completeAction:\" destination=\"YGI-SE-3qW\" id=\"bOp-o0-LDw\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"ooV-LZ-V45\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"4651\" y=\"560\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"UzC-aw-4VH\">\n            <objects>\n                <navigationController storyboardIdentifier=\"UserNavigationControllerID\" automaticallyAdjustsScrollViewInsets=\"NO\" id=\"Qdl-M8-Gs8\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" id=\"QY5-Sz-eR8\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"barTintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"YGI-SE-3qW\" kind=\"relationship\" relationship=\"rootViewController\" id=\"lph-WA-tlb\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"775-5h-10L\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"3886\" y=\"560\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"demo_icon\" width=\"490\" height=\"490\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "AppStoreDemo/Utils/GlobalConstants.swift",
    "content": "//\n//  GlobalConstants.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nenum GlobalConstants {\n    static let leftMargin: CGFloat = 20\n    \n    static let toDayCardRowH: CGFloat = 440\n    static let toDayCardCornerRadius: CGFloat = 15.0\n    static let todayCardSize: CGSize = CGSize(width: kScreenW - 2 * 20, height: 410)\n \n    static let cardDetailTopImageH: CGFloat = 500\n    \n    static let iconBorderColor: CGColor = UIColor(red: 239/255.0, green: 240/255.0, blue: 241/255.0, alpha: 1).cgColor\n    static let iconBorderWidth: CGFloat = 0.8\n    static let iconCornerRadius: CGFloat = 17.5\n    \n    static let textBlueColor = UIColor(red: 0/255.0, green: 122/255.0, blue: 255/255.0, alpha: 1.0)   //007AFF\n    static let speratorLineColor = UIColor(red: 224/255.0, green: 224/255.0, blue: 224/255.0, alpha: 1)\n    \n    //GameTableViewController\n    static let recommandHeight: CGFloat = 336\n    static let topicHeight: CGFloat = 282\n    static let linkHeight: CGFloat = 312\n    static let sectionHeaderH: CGFloat = 42\n    static let linkCellHeight: CGFloat = 45\n    \n    //DetailViewController\n    static let detailPreviewImageH: CGFloat = 155\n    \n    //DownloadViewController\n    static let doubleClickViewW: CGFloat = 140\n    static let clickBarWidth: CGFloat = 6\n}\n\n\nlet kScreenH = UIScreen.main.bounds.size.height\nlet kScreenW = UIScreen.main.bounds.size.width\nlet statusBarH = UIApplication.shared.statusBarFrame.height\nlet navigationBarH: CGFloat = 44\nlet tabbarExtraH: CGFloat = hasTopNotch() ? 34 : 0\nvar keyWindow: UIWindow {\n    if #available(iOS 13.0, *) {\n        return UIApplication.shared.windows.first { $0.isKeyWindow }!\n    } else {\n        return UIApplication.shared.keyWindow!\n    }\n}\n\n"
  },
  {
    "path": "AppStoreDemo/Utils/GlobalFunctions.swift",
    "content": "//\n//  GlobalFunctions.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/2.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\n/// Judge whether the phone has a top notch\nfunc hasTopNotch()-> Bool {\n    if #available(iOS 11.0, *) {\n        let top = UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0\n        return top < CGFloat(24) ? false : true\n    } else {\n        return false\n    }\n}\n\n/// delay action\nfunc delay(_ timeInterval: TimeInterval, closure: @escaping()->()) {\n    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeInterval) {\n        closure()\n    }\n}\n"
  },
  {
    "path": "AppStoreDemo/Utils/StarView.swift",
    "content": "//\n//  StarView.swift\n//  AppStoreDemo\n//\n//  Created by Allen long on 2019/8/8.\n//  Copyright © 2019 Utimes. All rights reserved.\n//\n\nimport UIKit\n\nclass StarView: UIView {\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        backgroundColor = .white\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func draw(_ rect: CGRect) {\n        super.draw(rect)\n        self.backgroundColor = UIColor.clear\n        var points: [CGPoint] = []\n        let context = UIGraphicsGetCurrentContext()\n        context?.setStrokeColor(UIColor.clear.cgColor)\n        let grayColor = UIColor(red: 123/255.0, green: 124/255.0, blue: 128/255.0, alpha: 1)\n        context?.setFillColor(grayColor.cgColor)\n        context?.setLineWidth(1)\n        let radius = Float(self.bounds.width / 2)\n        let angel = Double.pi * 2 / 5\n        for i in 1...5 { //这里是获取五角星的五个定点的坐标点位置\n            let x = Float(self.bounds.width / 2) - sinf(Float(i) * Float(angel)) * radius\n            let y = Float(self.bounds.height / 2) - cosf(Float(i) * Float(angel)) * radius\n            points.append(CGPoint(x: CGFloat(x), y: CGFloat(y)))\n        }\n        context?.move(to: points.first!)\n        for i in 1...5 {\n            let index = (2 * i) % 5\n            context?.addLine(to: points[index])\n        }\n        context?.closePath()\n        context?.drawPath(using: CGPathDrawingMode.fillStroke)\n    }\n\n}\n"
  },
  {
    "path": "AppStoreDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t06B0FB9A2320A6EF0004A4E4 /* DownloadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B0FB992320A6EF0004A4E4 /* DownloadViewController.swift */; };\n\t\t06B0FB9E2320ABB10004A4E4 /* DownloadPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B0FB9D2320ABB10004A4E4 /* DownloadPresentationController.swift */; };\n\t\t06B0FBA02320AE730004A4E4 /* DownloadTransitioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B0FB9F2320AE730004A4E4 /* DownloadTransitioning.swift */; };\n\t\t06B0FBA32320B3120004A4E4 /* DownloadBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B0FBA22320B3120004A4E4 /* DownloadBottomView.swift */; };\n\t\t06B0FBA52320B3490004A4E4 /* DownloadBottomView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06B0FBA42320B3490004A4E4 /* DownloadBottomView.xib */; };\n\t\t06B0FBA72320EC0B0004A4E4 /* DownloadClickView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06B0FBA62320EC0B0004A4E4 /* DownloadClickView.swift */; };\n\t\t06B0FBA92320EC140004A4E4 /* DownloadClickView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06B0FBA82320EC140004A4E4 /* DownloadClickView.xib */; };\n\t\t06C2460E23161330005B6EB7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 06C2460C23161330005B6EB7 /* LaunchScreen.storyboard */; };\n\t\t06C2466323161377005B6EB7 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461623161377005B6EB7 /* UIColor+Extension.swift */; };\n\t\t06C2466423161377005B6EB7 /* UIView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461723161377005B6EB7 /* UIView+Extension.swift */; };\n\t\t06C2466523161377005B6EB7 /* UIViewController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461823161377005B6EB7 /* UIViewController+Extension.swift */; };\n\t\t06C2466623161377005B6EB7 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461923161377005B6EB7 /* String+Extension.swift */; };\n\t\t06C2466723161377005B6EB7 /* UITableView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461A23161377005B6EB7 /* UITableView+Extension.swift */; };\n\t\t06C2466823161377005B6EB7 /* SearchTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461D23161377005B6EB7 /* SearchTableViewController.swift */; };\n\t\t06C2466923161377005B6EB7 /* SearchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2461F23161377005B6EB7 /* SearchTableViewCell.swift */; };\n\t\t06C2466A23161377005B6EB7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462023161377005B6EB7 /* AppDelegate.swift */; };\n\t\t06C2466B23161377005B6EB7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 06C2462123161377005B6EB7 /* Main.storyboard */; };\n\t\t06C2466C23161377005B6EB7 /* StarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462323161377005B6EB7 /* StarView.swift */; };\n\t\t06C2466D23161377005B6EB7 /* GlobalConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462423161377005B6EB7 /* GlobalConstants.swift */; };\n\t\t06C2466E23161377005B6EB7 /* GlobalFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462523161377005B6EB7 /* GlobalFunctions.swift */; };\n\t\t06C2466F23161377005B6EB7 /* CardDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462823161377005B6EB7 /* CardDetailViewController.swift */; };\n\t\t06C2467023161377005B6EB7 /* TodayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462923161377005B6EB7 /* TodayViewController.swift */; };\n\t\t06C2467123161377005B6EB7 /* CardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462A23161377005B6EB7 /* CardPresentationController.swift */; };\n\t\t06C2467223161377005B6EB7 /* TodayAnimationTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462C23161377005B6EB7 /* TodayAnimationTransition.swift */; };\n\t\t06C2467323161377005B6EB7 /* DS_Store in Resources */ = {isa = PBXBuildFile; fileRef = 06C2462D23161377005B6EB7 /* DS_Store */; };\n\t\t06C2467423161377005B6EB7 /* DetailScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2462F23161377005B6EB7 /* DetailScrollView.swift */; };\n\t\t06C2467523161377005B6EB7 /* TodayTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463023161377005B6EB7 /* TodayTableViewCell.swift */; };\n\t\t06C2467623161377005B6EB7 /* TodayTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463123161377005B6EB7 /* TodayTableHeaderView.swift */; };\n\t\t06C2467723161377005B6EB7 /* GameTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463423161377005B6EB7 /* GameTableViewController.swift */; };\n\t\t06C2467823161377005B6EB7 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463523161377005B6EB7 /* DetailViewController.swift */; };\n\t\t06C2467923161377005B6EB7 /* GameTopicModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463723161377005B6EB7 /* GameTopicModel.swift */; };\n\t\t06C2467A23161377005B6EB7 /* GameRecommandModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463823161377005B6EB7 /* GameRecommandModel.swift */; };\n\t\t06C2467B23161377005B6EB7 /* RecommandCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06C2463B23161377005B6EB7 /* RecommandCollectionViewCell.xib */; };\n\t\t06C2467C23161377005B6EB7 /* GameRecommandTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463C23161377005B6EB7 /* GameRecommandTableViewCell.swift */; };\n\t\t06C2467D23161377005B6EB7 /* RecommandCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463D23161377005B6EB7 /* RecommandCollectionViewCell.swift */; };\n\t\t06C2467E23161377005B6EB7 /* GameRecommandCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2463E23161377005B6EB7 /* GameRecommandCollectionView.swift */; };\n\t\t06C2467F23161377005B6EB7 /* GameTopicCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06C2464023161377005B6EB7 /* GameTopicCollectionViewCell.xib */; };\n\t\t06C2468023161377005B6EB7 /* GameTopicCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464123161377005B6EB7 /* GameTopicCollectionView.swift */; };\n\t\t06C2468123161377005B6EB7 /* GameTopicCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464223161377005B6EB7 /* GameTopicCollectionViewCell.swift */; };\n\t\t06C2468223161377005B6EB7 /* GameTopicTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464323161377005B6EB7 /* GameTopicTableViewCell.swift */; };\n\t\t06C2468323161377005B6EB7 /* DetailTopInfoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06C2464523161377005B6EB7 /* DetailTopInfoCell.xib */; };\n\t\t06C2468423161377005B6EB7 /* DetailNewFeaturesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464623161377005B6EB7 /* DetailNewFeaturesCell.swift */; };\n\t\t06C2468523161377005B6EB7 /* DetailPreviewCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464723161377005B6EB7 /* DetailPreviewCollectionViewCell.swift */; };\n\t\t06C2468623161377005B6EB7 /* DetailInfomationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464823161377005B6EB7 /* DetailInfomationTableViewCell.swift */; };\n\t\t06C2468723161377005B6EB7 /* DetailPreviewCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464923161377005B6EB7 /* DetailPreviewCollectionView.swift */; };\n\t\t06C2468823161377005B6EB7 /* DetailTopInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464A23161377005B6EB7 /* DetailTopInfoCell.swift */; };\n\t\t06C2468923161377005B6EB7 /* DetailNewFeaturesCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06C2464B23161377005B6EB7 /* DetailNewFeaturesCell.xib */; };\n\t\t06C2468A23161377005B6EB7 /* DetailInformationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464C23161377005B6EB7 /* DetailInformationCell.swift */; };\n\t\t06C2468B23161377005B6EB7 /* DetailPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464D23161377005B6EB7 /* DetailPreviewCell.swift */; };\n\t\t06C2468C23161377005B6EB7 /* DetailNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2464E23161377005B6EB7 /* DetailNavigationView.swift */; };\n\t\t06C2468D23161377005B6EB7 /* GameLinkTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465023161377005B6EB7 /* GameLinkTableViewCell.swift */; };\n\t\t06C2468E23161377005B6EB7 /* GameLinkTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465123161377005B6EB7 /* GameLinkTableView.swift */; };\n\t\t06C2468F23161377005B6EB7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 06C2465223161377005B6EB7 /* Assets.xcassets */; };\n\t\t06C2469023161377005B6EB7 /* CommonSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465423161377005B6EB7 /* CommonSectionHeaderView.swift */; };\n\t\t06C2469123161377005B6EB7 /* CommonCollectionFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465523161377005B6EB7 /* CommonCollectionFlowLayout.swift */; };\n\t\t06C2469223161377005B6EB7 /* UpdateTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465823161377005B6EB7 /* UpdateTableViewController.swift */; };\n\t\t06C2469323161377005B6EB7 /* UpdateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465A23161377005B6EB7 /* UpdateModel.swift */; };\n\t\t06C2469423161377005B6EB7 /* UpdateTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2465C23161377005B6EB7 /* UpdateTableViewCell.swift */; };\n\t\t06C2469523161377005B6EB7 /* UpdateTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 06C2465D23161377005B6EB7 /* UpdateTableViewCell.xib */; };\n\t\t06C2469623161377005B6EB7 /* UserTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C2466023161377005B6EB7 /* UserTableViewController.swift */; };\n\t\t06C2469723161377005B6EB7 /* User.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 06C2466223161377005B6EB7 /* User.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t06B0FB992320A6EF0004A4E4 /* DownloadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadViewController.swift; sourceTree = \"<group>\"; };\n\t\t06B0FB9D2320ABB10004A4E4 /* DownloadPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadPresentationController.swift; sourceTree = \"<group>\"; };\n\t\t06B0FB9F2320AE730004A4E4 /* DownloadTransitioning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadTransitioning.swift; sourceTree = \"<group>\"; };\n\t\t06B0FBA22320B3120004A4E4 /* DownloadBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadBottomView.swift; sourceTree = \"<group>\"; };\n\t\t06B0FBA42320B3490004A4E4 /* DownloadBottomView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DownloadBottomView.xib; sourceTree = \"<group>\"; };\n\t\t06B0FBA62320EC0B0004A4E4 /* DownloadClickView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadClickView.swift; sourceTree = \"<group>\"; };\n\t\t06B0FBA82320EC140004A4E4 /* DownloadClickView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DownloadClickView.xib; sourceTree = \"<group>\"; };\n\t\t06C246002316132F005B6EB7 /* AppStoreDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppStoreDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t06C2460D23161330005B6EB7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t06C2460F23161330005B6EB7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t06C2461623161377005B6EB7 /* UIColor+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIColor+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t06C2461723161377005B6EB7 /* UIView+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIView+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t06C2461823161377005B6EB7 /* UIViewController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UIViewController+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t06C2461923161377005B6EB7 /* String+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"String+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t06C2461A23161377005B6EB7 /* UITableView+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"UITableView+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t06C2461D23161377005B6EB7 /* SearchTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchTableViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2461F23161377005B6EB7 /* SearchTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2462023161377005B6EB7 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t06C2462123161377005B6EB7 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = \"<group>\"; };\n\t\t06C2462323161377005B6EB7 /* StarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarView.swift; sourceTree = \"<group>\"; };\n\t\t06C2462423161377005B6EB7 /* GlobalConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalConstants.swift; sourceTree = \"<group>\"; };\n\t\t06C2462523161377005B6EB7 /* GlobalFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalFunctions.swift; sourceTree = \"<group>\"; };\n\t\t06C2462823161377005B6EB7 /* CardDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardDetailViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2462923161377005B6EB7 /* TodayViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2462A23161377005B6EB7 /* CardPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardPresentationController.swift; sourceTree = \"<group>\"; };\n\t\t06C2462C23161377005B6EB7 /* TodayAnimationTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayAnimationTransition.swift; sourceTree = \"<group>\"; };\n\t\t06C2462D23161377005B6EB7 /* DS_Store */ = {isa = PBXFileReference; lastKnownFileType = file; path = DS_Store; sourceTree = \"<group>\"; };\n\t\t06C2462F23161377005B6EB7 /* DetailScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailScrollView.swift; sourceTree = \"<group>\"; };\n\t\t06C2463023161377005B6EB7 /* TodayTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2463123161377005B6EB7 /* TodayTableHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayTableHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t06C2463423161377005B6EB7 /* GameTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTableViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2463523161377005B6EB7 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2463723161377005B6EB7 /* GameTopicModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTopicModel.swift; sourceTree = \"<group>\"; };\n\t\t06C2463823161377005B6EB7 /* GameRecommandModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameRecommandModel.swift; sourceTree = \"<group>\"; };\n\t\t06C2463B23161377005B6EB7 /* RecommandCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RecommandCollectionViewCell.xib; sourceTree = \"<group>\"; };\n\t\t06C2463C23161377005B6EB7 /* GameRecommandTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameRecommandTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2463D23161377005B6EB7 /* RecommandCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecommandCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2463E23161377005B6EB7 /* GameRecommandCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameRecommandCollectionView.swift; sourceTree = \"<group>\"; };\n\t\t06C2464023161377005B6EB7 /* GameTopicCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GameTopicCollectionViewCell.xib; sourceTree = \"<group>\"; };\n\t\t06C2464123161377005B6EB7 /* GameTopicCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTopicCollectionView.swift; sourceTree = \"<group>\"; };\n\t\t06C2464223161377005B6EB7 /* GameTopicCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTopicCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464323161377005B6EB7 /* GameTopicTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTopicTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464523161377005B6EB7 /* DetailTopInfoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DetailTopInfoCell.xib; sourceTree = \"<group>\"; };\n\t\t06C2464623161377005B6EB7 /* DetailNewFeaturesCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailNewFeaturesCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464723161377005B6EB7 /* DetailPreviewCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailPreviewCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464823161377005B6EB7 /* DetailInfomationTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailInfomationTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464923161377005B6EB7 /* DetailPreviewCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailPreviewCollectionView.swift; sourceTree = \"<group>\"; };\n\t\t06C2464A23161377005B6EB7 /* DetailTopInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailTopInfoCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464B23161377005B6EB7 /* DetailNewFeaturesCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DetailNewFeaturesCell.xib; sourceTree = \"<group>\"; };\n\t\t06C2464C23161377005B6EB7 /* DetailInformationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailInformationCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464D23161377005B6EB7 /* DetailPreviewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailPreviewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2464E23161377005B6EB7 /* DetailNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailNavigationView.swift; sourceTree = \"<group>\"; };\n\t\t06C2465023161377005B6EB7 /* GameLinkTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameLinkTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2465123161377005B6EB7 /* GameLinkTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameLinkTableView.swift; sourceTree = \"<group>\"; };\n\t\t06C2465223161377005B6EB7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t06C2465423161377005B6EB7 /* CommonSectionHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonSectionHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t06C2465523161377005B6EB7 /* CommonCollectionFlowLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonCollectionFlowLayout.swift; sourceTree = \"<group>\"; };\n\t\t06C2465823161377005B6EB7 /* UpdateTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateTableViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2465A23161377005B6EB7 /* UpdateModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateModel.swift; sourceTree = \"<group>\"; };\n\t\t06C2465C23161377005B6EB7 /* UpdateTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateTableViewCell.swift; sourceTree = \"<group>\"; };\n\t\t06C2465D23161377005B6EB7 /* UpdateTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UpdateTableViewCell.xib; sourceTree = \"<group>\"; };\n\t\t06C2466023161377005B6EB7 /* UserTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserTableViewController.swift; sourceTree = \"<group>\"; };\n\t\t06C2466223161377005B6EB7 /* User.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = User.storyboard; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t06C245FD2316132F005B6EB7 /* 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\t06B0FBA12320B2F30004A4E4 /* Download */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06B0FBA22320B3120004A4E4 /* DownloadBottomView.swift */,\n\t\t\t\t06B0FBA42320B3490004A4E4 /* DownloadBottomView.xib */,\n\t\t\t\t06B0FBA62320EC0B0004A4E4 /* DownloadClickView.swift */,\n\t\t\t\t06B0FBA82320EC140004A4E4 /* DownloadClickView.xib */,\n\t\t\t);\n\t\t\tpath = Download;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C245F72316132F005B6EB7 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C246022316132F005B6EB7 /* AppStoreDemo */,\n\t\t\t\t06C246012316132F005B6EB7 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C246012316132F005B6EB7 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C246002316132F005B6EB7 /* AppStoreDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C246022316132F005B6EB7 /* AppStoreDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2462023161377005B6EB7 /* AppDelegate.swift */,\n\t\t\t\t06C2465223161377005B6EB7 /* Assets.xcassets */,\n\t\t\t\t06C2465323161377005B6EB7 /* Common */,\n\t\t\t\t06C2461523161377005B6EB7 /* Extension */,\n\t\t\t\t06C2463223161377005B6EB7 /* Game */,\n\t\t\t\t06C2462123161377005B6EB7 /* Main.storyboard */,\n\t\t\t\t06C2461B23161377005B6EB7 /* Search */,\n\t\t\t\t06C2462623161377005B6EB7 /* Today */,\n\t\t\t\t06C2465623161377005B6EB7 /* Update */,\n\t\t\t\t06C2465E23161377005B6EB7 /* User */,\n\t\t\t\t06C2462223161377005B6EB7 /* Utils */,\n\t\t\t\t06C2460C23161330005B6EB7 /* LaunchScreen.storyboard */,\n\t\t\t\t06C2460F23161330005B6EB7 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = AppStoreDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2461523161377005B6EB7 /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2461623161377005B6EB7 /* UIColor+Extension.swift */,\n\t\t\t\t06C2461723161377005B6EB7 /* UIView+Extension.swift */,\n\t\t\t\t06C2461823161377005B6EB7 /* UIViewController+Extension.swift */,\n\t\t\t\t06C2461923161377005B6EB7 /* String+Extension.swift */,\n\t\t\t\t06C2461A23161377005B6EB7 /* UITableView+Extension.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2461B23161377005B6EB7 /* Search */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2461C23161377005B6EB7 /* Controller */,\n\t\t\t\t06C2461E23161377005B6EB7 /* View */,\n\t\t\t);\n\t\t\tpath = Search;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2461C23161377005B6EB7 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2461D23161377005B6EB7 /* SearchTableViewController.swift */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2461E23161377005B6EB7 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2461F23161377005B6EB7 /* SearchTableViewCell.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2462223161377005B6EB7 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2462323161377005B6EB7 /* StarView.swift */,\n\t\t\t\t06C2462423161377005B6EB7 /* GlobalConstants.swift */,\n\t\t\t\t06C2462523161377005B6EB7 /* GlobalFunctions.swift */,\n\t\t\t);\n\t\t\tpath = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2462623161377005B6EB7 /* Today */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2462723161377005B6EB7 /* Controller */,\n\t\t\t\t06C2462B23161377005B6EB7 /* Model */,\n\t\t\t\t06C2462E23161377005B6EB7 /* View */,\n\t\t\t);\n\t\t\tpath = Today;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2462723161377005B6EB7 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2462923161377005B6EB7 /* TodayViewController.swift */,\n\t\t\t\t06C2462823161377005B6EB7 /* CardDetailViewController.swift */,\n\t\t\t\t06C2462A23161377005B6EB7 /* CardPresentationController.swift */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2462B23161377005B6EB7 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2462C23161377005B6EB7 /* TodayAnimationTransition.swift */,\n\t\t\t\t06C2462D23161377005B6EB7 /* DS_Store */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2462E23161377005B6EB7 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2462F23161377005B6EB7 /* DetailScrollView.swift */,\n\t\t\t\t06C2463023161377005B6EB7 /* TodayTableViewCell.swift */,\n\t\t\t\t06C2463123161377005B6EB7 /* TodayTableHeaderView.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2463223161377005B6EB7 /* Game */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2463323161377005B6EB7 /* Controller */,\n\t\t\t\t06C2463623161377005B6EB7 /* Model */,\n\t\t\t\t06C2463923161377005B6EB7 /* View */,\n\t\t\t);\n\t\t\tpath = Game;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2463323161377005B6EB7 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2463423161377005B6EB7 /* GameTableViewController.swift */,\n\t\t\t\t06C2463523161377005B6EB7 /* DetailViewController.swift */,\n\t\t\t\t06B0FB992320A6EF0004A4E4 /* DownloadViewController.swift */,\n\t\t\t\t06B0FB9D2320ABB10004A4E4 /* DownloadPresentationController.swift */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2463623161377005B6EB7 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2463723161377005B6EB7 /* GameTopicModel.swift */,\n\t\t\t\t06C2463823161377005B6EB7 /* GameRecommandModel.swift */,\n\t\t\t\t06B0FB9F2320AE730004A4E4 /* DownloadTransitioning.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2463923161377005B6EB7 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06B0FBA12320B2F30004A4E4 /* Download */,\n\t\t\t\t06C2463A23161377005B6EB7 /* Recommand */,\n\t\t\t\t06C2463F23161377005B6EB7 /* Topic */,\n\t\t\t\t06C2464423161377005B6EB7 /* Detail */,\n\t\t\t\t06C2464F23161377005B6EB7 /* Link */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2463A23161377005B6EB7 /* Recommand */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2463B23161377005B6EB7 /* RecommandCollectionViewCell.xib */,\n\t\t\t\t06C2463C23161377005B6EB7 /* GameRecommandTableViewCell.swift */,\n\t\t\t\t06C2463D23161377005B6EB7 /* RecommandCollectionViewCell.swift */,\n\t\t\t\t06C2463E23161377005B6EB7 /* GameRecommandCollectionView.swift */,\n\t\t\t);\n\t\t\tpath = Recommand;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2463F23161377005B6EB7 /* Topic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2464223161377005B6EB7 /* GameTopicCollectionViewCell.swift */,\n\t\t\t\t06C2464023161377005B6EB7 /* GameTopicCollectionViewCell.xib */,\n\t\t\t\t06C2464123161377005B6EB7 /* GameTopicCollectionView.swift */,\n\t\t\t\t06C2464323161377005B6EB7 /* GameTopicTableViewCell.swift */,\n\t\t\t);\n\t\t\tpath = Topic;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2464423161377005B6EB7 /* Detail */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2464A23161377005B6EB7 /* DetailTopInfoCell.swift */,\n\t\t\t\t06C2464523161377005B6EB7 /* DetailTopInfoCell.xib */,\n\t\t\t\t06C2464623161377005B6EB7 /* DetailNewFeaturesCell.swift */,\n\t\t\t\t06C2464723161377005B6EB7 /* DetailPreviewCollectionViewCell.swift */,\n\t\t\t\t06C2464823161377005B6EB7 /* DetailInfomationTableViewCell.swift */,\n\t\t\t\t06C2464923161377005B6EB7 /* DetailPreviewCollectionView.swift */,\n\t\t\t\t06C2464B23161377005B6EB7 /* DetailNewFeaturesCell.xib */,\n\t\t\t\t06C2464C23161377005B6EB7 /* DetailInformationCell.swift */,\n\t\t\t\t06C2464D23161377005B6EB7 /* DetailPreviewCell.swift */,\n\t\t\t\t06C2464E23161377005B6EB7 /* DetailNavigationView.swift */,\n\t\t\t);\n\t\t\tpath = Detail;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2464F23161377005B6EB7 /* Link */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465023161377005B6EB7 /* GameLinkTableViewCell.swift */,\n\t\t\t\t06C2465123161377005B6EB7 /* GameLinkTableView.swift */,\n\t\t\t);\n\t\t\tpath = Link;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465323161377005B6EB7 /* Common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465423161377005B6EB7 /* CommonSectionHeaderView.swift */,\n\t\t\t\t06C2465523161377005B6EB7 /* CommonCollectionFlowLayout.swift */,\n\t\t\t);\n\t\t\tpath = Common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465623161377005B6EB7 /* Update */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465723161377005B6EB7 /* Controller */,\n\t\t\t\t06C2465923161377005B6EB7 /* Model */,\n\t\t\t\t06C2465B23161377005B6EB7 /* View */,\n\t\t\t);\n\t\t\tpath = Update;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465723161377005B6EB7 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465823161377005B6EB7 /* UpdateTableViewController.swift */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465923161377005B6EB7 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465A23161377005B6EB7 /* UpdateModel.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465B23161377005B6EB7 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465C23161377005B6EB7 /* UpdateTableViewCell.swift */,\n\t\t\t\t06C2465D23161377005B6EB7 /* UpdateTableViewCell.xib */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465E23161377005B6EB7 /* User */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2465F23161377005B6EB7 /* Controller */,\n\t\t\t\t06C2466123161377005B6EB7 /* View */,\n\t\t\t);\n\t\t\tpath = User;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2465F23161377005B6EB7 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2466023161377005B6EB7 /* UserTableViewController.swift */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t06C2466123161377005B6EB7 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2466223161377005B6EB7 /* User.storyboard */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t06C245FF2316132F005B6EB7 /* AppStoreDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 06C2461223161330005B6EB7 /* Build configuration list for PBXNativeTarget \"AppStoreDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t06C245FC2316132F005B6EB7 /* Sources */,\n\t\t\t\t06C245FD2316132F005B6EB7 /* Frameworks */,\n\t\t\t\t06C245FE2316132F005B6EB7 /* 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 = AppStoreDemo;\n\t\t\tproductName = AppStoreDemo;\n\t\t\tproductReference = 06C246002316132F005B6EB7 /* AppStoreDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t06C245F82316132F005B6EB7 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1030;\n\t\t\t\tLastUpgradeCheck = 1030;\n\t\t\t\tORGANIZATIONNAME = Utimes;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t06C245FF2316132F005B6EB7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.3;\n\t\t\t\t\t\tLastSwiftMigration = 1030;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 06C245FB2316132F005B6EB7 /* Build configuration list for PBXProject \"AppStoreDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\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 = 06C245F72316132F005B6EB7;\n\t\t\tproductRefGroup = 06C246012316132F005B6EB7 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t06C245FF2316132F005B6EB7 /* AppStoreDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t06C245FE2316132F005B6EB7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t06C2460E23161330005B6EB7 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t06C2469723161377005B6EB7 /* User.storyboard in Resources */,\n\t\t\t\t06C2467B23161377005B6EB7 /* RecommandCollectionViewCell.xib in Resources */,\n\t\t\t\t06C2468323161377005B6EB7 /* DetailTopInfoCell.xib in Resources */,\n\t\t\t\t06C2467F23161377005B6EB7 /* GameTopicCollectionViewCell.xib in Resources */,\n\t\t\t\t06C2469523161377005B6EB7 /* UpdateTableViewCell.xib in Resources */,\n\t\t\t\t06C2466B23161377005B6EB7 /* Main.storyboard in Resources */,\n\t\t\t\t06C2467323161377005B6EB7 /* DS_Store in Resources */,\n\t\t\t\t06C2468F23161377005B6EB7 /* Assets.xcassets in Resources */,\n\t\t\t\t06C2468923161377005B6EB7 /* DetailNewFeaturesCell.xib in Resources */,\n\t\t\t\t06B0FBA52320B3490004A4E4 /* DownloadBottomView.xib in Resources */,\n\t\t\t\t06B0FBA92320EC140004A4E4 /* DownloadClickView.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t06C245FC2316132F005B6EB7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t06C2468523161377005B6EB7 /* DetailPreviewCollectionViewCell.swift in Sources */,\n\t\t\t\t06C2468A23161377005B6EB7 /* DetailInformationCell.swift in Sources */,\n\t\t\t\t06C2467C23161377005B6EB7 /* GameRecommandTableViewCell.swift in Sources */,\n\t\t\t\t06C2468C23161377005B6EB7 /* DetailNavigationView.swift in Sources */,\n\t\t\t\t06C2467A23161377005B6EB7 /* GameRecommandModel.swift in Sources */,\n\t\t\t\t06C2468023161377005B6EB7 /* GameTopicCollectionView.swift in Sources */,\n\t\t\t\t06C2466E23161377005B6EB7 /* GlobalFunctions.swift in Sources */,\n\t\t\t\t06C2468823161377005B6EB7 /* DetailTopInfoCell.swift in Sources */,\n\t\t\t\t06C2468123161377005B6EB7 /* GameTopicCollectionViewCell.swift in Sources */,\n\t\t\t\t06C2466F23161377005B6EB7 /* CardDetailViewController.swift in Sources */,\n\t\t\t\t06C2466C23161377005B6EB7 /* StarView.swift in Sources */,\n\t\t\t\t06B0FBA32320B3120004A4E4 /* DownloadBottomView.swift in Sources */,\n\t\t\t\t06C2469023161377005B6EB7 /* CommonSectionHeaderView.swift in Sources */,\n\t\t\t\t06B0FBA72320EC0B0004A4E4 /* DownloadClickView.swift in Sources */,\n\t\t\t\t06C2468723161377005B6EB7 /* DetailPreviewCollectionView.swift in Sources */,\n\t\t\t\t06B0FB9A2320A6EF0004A4E4 /* DownloadViewController.swift in Sources */,\n\t\t\t\t06C2467923161377005B6EB7 /* GameTopicModel.swift in Sources */,\n\t\t\t\t06C2466A23161377005B6EB7 /* AppDelegate.swift in Sources */,\n\t\t\t\t06C2466D23161377005B6EB7 /* GlobalConstants.swift in Sources */,\n\t\t\t\t06C2466623161377005B6EB7 /* String+Extension.swift in Sources */,\n\t\t\t\t06C2469423161377005B6EB7 /* UpdateTableViewCell.swift in Sources */,\n\t\t\t\t06C2468223161377005B6EB7 /* GameTopicTableViewCell.swift in Sources */,\n\t\t\t\t06C2467523161377005B6EB7 /* TodayTableViewCell.swift in Sources */,\n\t\t\t\t06C2468623161377005B6EB7 /* DetailInfomationTableViewCell.swift in Sources */,\n\t\t\t\t06C2469223161377005B6EB7 /* UpdateTableViewController.swift in Sources */,\n\t\t\t\t06C2469123161377005B6EB7 /* CommonCollectionFlowLayout.swift in Sources */,\n\t\t\t\t06C2469323161377005B6EB7 /* UpdateModel.swift in Sources */,\n\t\t\t\t06B0FB9E2320ABB10004A4E4 /* DownloadPresentationController.swift in Sources */,\n\t\t\t\t06C2467823161377005B6EB7 /* DetailViewController.swift in Sources */,\n\t\t\t\t06C2466823161377005B6EB7 /* SearchTableViewController.swift in Sources */,\n\t\t\t\t06C2467023161377005B6EB7 /* TodayViewController.swift in Sources */,\n\t\t\t\t06C2467223161377005B6EB7 /* TodayAnimationTransition.swift in Sources */,\n\t\t\t\t06C2467623161377005B6EB7 /* TodayTableHeaderView.swift in Sources */,\n\t\t\t\t06C2466523161377005B6EB7 /* UIViewController+Extension.swift in Sources */,\n\t\t\t\t06C2469623161377005B6EB7 /* UserTableViewController.swift in Sources */,\n\t\t\t\t06C2466723161377005B6EB7 /* UITableView+Extension.swift in Sources */,\n\t\t\t\t06C2466423161377005B6EB7 /* UIView+Extension.swift in Sources */,\n\t\t\t\t06C2466323161377005B6EB7 /* UIColor+Extension.swift in Sources */,\n\t\t\t\t06C2467D23161377005B6EB7 /* RecommandCollectionViewCell.swift in Sources */,\n\t\t\t\t06C2468423161377005B6EB7 /* DetailNewFeaturesCell.swift in Sources */,\n\t\t\t\t06C2467123161377005B6EB7 /* CardPresentationController.swift in Sources */,\n\t\t\t\t06C2467E23161377005B6EB7 /* GameRecommandCollectionView.swift in Sources */,\n\t\t\t\t06C2467723161377005B6EB7 /* GameTableViewController.swift in Sources */,\n\t\t\t\t06C2467423161377005B6EB7 /* DetailScrollView.swift in Sources */,\n\t\t\t\t06C2466923161377005B6EB7 /* SearchTableViewCell.swift in Sources */,\n\t\t\t\t06C2468B23161377005B6EB7 /* DetailPreviewCell.swift in Sources */,\n\t\t\t\t06B0FBA02320AE730004A4E4 /* DownloadTransitioning.swift in Sources */,\n\t\t\t\t06C2468D23161377005B6EB7 /* GameLinkTableViewCell.swift in Sources */,\n\t\t\t\t06C2468E23161377005B6EB7 /* GameLinkTableView.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\t06C2460C23161330005B6EB7 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t06C2460D23161330005B6EB7 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t06C2461023161330005B6EB7 /* 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_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES;\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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"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 = gnu11;\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 = 12.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t06C2461123161330005B6EB7 /* 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_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES;\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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"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 = gnu11;\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 = 12.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t06C2461323161330005B6EB7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = FXRUS8AN42;\n\t\t\t\tINFOPLIST_FILE = AppStoreDemo/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cc.utimes.AppStoreDemo;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t06C2461423161330005B6EB7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = FXRUS8AN42;\n\t\t\t\tINFOPLIST_FILE = AppStoreDemo/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cc.utimes.AppStoreDemo;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t06C245FB2316132F005B6EB7 /* Build configuration list for PBXProject \"AppStoreDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t06C2461023161330005B6EB7 /* Debug */,\n\t\t\t\t06C2461123161330005B6EB7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t06C2461223161330005B6EB7 /* Build configuration list for PBXNativeTarget \"AppStoreDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t06C2461323161330005B6EB7 /* Debug */,\n\t\t\t\t06C2461423161330005B6EB7 /* 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 = 06C245F82316132F005B6EB7 /* Project object */;\n}\n"
  },
  {
    "path": "AppStoreDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:AppStoreDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "AppStoreDemo.xcodeproj/project.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": "AppStoreDemo.xcodeproj/xcuserdata/fengbufang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"30E1E68A-18E1-48F7-BC71-4D838AD72221\"\n   type = \"1\"\n   version = \"2.0\">\n</Bucket>\n"
  },
  {
    "path": "AppStoreDemo.xcodeproj/xcuserdata/fengbufang.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>AppStoreDemo.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</dict>\n</plist>\n"
  },
  {
    "path": "README.md",
    "content": "# appstore-clone\n\nan awesome clone of iOS App Store.[中文简介](https://github.com/DragonTnT/appstore-clone/blob/master/%E4%B8%AD%E6%96%87%E7%AE%80%E4%BB%8B.md)\n\n\n## Screenshots\n\n![](https://github.com/DragonTnT/Resource/blob/master/AppStore/cover_appstore.png)\n\n## Description\n\nApp Store is always my favorite app in iphone. As a iOS developer, i decide to make a clone for it.\nIt took me a few days to do this work, and i have not finished it yet. In the future, i will add more contents on it.  \nIf you are interested in the project, you can also submit your content.\n\n\n## GIF \n\n| ![](https://github.com/DragonTnT/Resource/blob/master/AppStore/showcase1.gif) | ![](https://github.com/DragonTnT/Resource/blob/master/AppStore/showcase2.gif) | ![](https://github.com/DragonTnT/Resource/blob/master/AppStore/showcase3.gif)| ![](https://github.com/DragonTnT/Resource/blob/master/AppStore/showcase4.gif)\n|:-|:-|:-|:-|\n\n\n\n## Features\n\n- No other link libraries, so just download the project and run the app\n- No network, only load resource locally\n- The project has a clear structure, you can find the code you want easily\n\n## Finals\n\nIf you like this project, you can give me a **star**. Thanks~\n"
  },
  {
    "path": "中文简介.md",
    "content": "# appstore-clone\n\n本项目是对iOS中的软件App Store的模仿\n\n\n\n## 介绍\n\nApp Store应该是大家在iphone里最常用的软件之一。作为一名iOS开发者，我一直有模仿App Store的想法。我花了一些业余时间来做这个demo，目前还有一些内容没有完成。剩下的部分，我会慢慢补齐。\n\n如果你对这个项目有兴趣的话，欢迎提交你的代码，让我们一起来完成它~\n\n\n\n## 特点\n\n- 没有任何第三方的库，下载下来直接运行就OK了。真机运行的话，改下证书就好了。\n- 没有任何的网络请求，所以的资源都是加载自本地。(也确实没法拿到苹果的数据😓)\n- 项目结构很清晰，你可以轻易找到如何实现的代码。\n\n\n\n## 最后\n\n如果你觉得项目还不错的话，可以给我一个**Star**。谢谢。"
  }
]